Merge "ETSI-NFV SOL 001 translation: ScalingPolicy"
This commit is contained in:
commit
ece660b232
@ -12,6 +12,8 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
import yaml
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import six
|
import six
|
||||||
@ -27,11 +29,20 @@ SECTIONS = (TYPE, PROPERTIES, MEDADATA, DEPENDS_ON, UPDATE_POLICY,
|
|||||||
('type', 'properties', 'metadata',
|
('type', 'properties', 'metadata',
|
||||||
'depends_on', 'update_policy', 'deletion_policy')
|
'depends_on', 'update_policy', 'deletion_policy')
|
||||||
|
|
||||||
|
HEAT_TEMPLATE_VERSION = '2013-05-23'
|
||||||
|
HEAT_DESCRIPTION = 'Scaling template'
|
||||||
|
|
||||||
policy_type = ['tosca.policies.Placement',
|
policy_type = ['tosca.policies.Placement',
|
||||||
'tosca.policies.Scaling',
|
'tosca.policies.Scaling',
|
||||||
'tosca.policies.Scaling.Cluster',
|
'tosca.policies.Scaling.Cluster',
|
||||||
'tosca.policies.Monitoring',
|
'tosca.policies.Monitoring',
|
||||||
'tosca.policies.Reservation']
|
'tosca.policies.Reservation',
|
||||||
|
'tosca.policies.nfv.InstantiationLevels',
|
||||||
|
'tosca.policies.nfv.ScalingAspects',
|
||||||
|
'tosca.policies.nfv.VduInitialDelta',
|
||||||
|
'tosca.policies.nfv.VduInstantiationLevels',
|
||||||
|
'tosca.policies.nfv.VduScalingAspectDeltas',
|
||||||
|
'tosca.policies.nfv.VirtualLinkInstantiationLevels']
|
||||||
log = logging.getLogger('heat-translator')
|
log = logging.getLogger('heat-translator')
|
||||||
|
|
||||||
|
|
||||||
@ -465,6 +476,47 @@ class HotResource(object):
|
|||||||
tosca_props[prop.name] = prop.value
|
tosca_props[prop.name] = prop.value
|
||||||
return tosca_props
|
return tosca_props
|
||||||
|
|
||||||
|
def represent_ordereddict(self, dumper, data):
|
||||||
|
nodes = []
|
||||||
|
for key, value in data.items():
|
||||||
|
node_key = dumper.represent_data(key)
|
||||||
|
node_value = dumper.represent_data(value)
|
||||||
|
nodes.append((node_key, node_value))
|
||||||
|
return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', nodes)
|
||||||
|
|
||||||
|
def _handle_nested_template(self, scale_res, yaml_name,
|
||||||
|
hot_template_parameters,
|
||||||
|
parameters=None):
|
||||||
|
template_dict = OrderedDict()
|
||||||
|
template_dict['heat_template_version'] = HEAT_TEMPLATE_VERSION
|
||||||
|
template_dict['description'] = HEAT_DESCRIPTION
|
||||||
|
|
||||||
|
if parameters is not None:
|
||||||
|
template_dict['parameters'] = parameters
|
||||||
|
|
||||||
|
if hot_template_parameters:
|
||||||
|
all_params = OrderedDict()
|
||||||
|
for parameter in hot_template_parameters:
|
||||||
|
all_params.update(parameter.get_dict_output())
|
||||||
|
template_dict.update({'parameters': all_params})
|
||||||
|
|
||||||
|
template_dict["resources"] = {}
|
||||||
|
dict_res = OrderedDict()
|
||||||
|
for res in scale_res:
|
||||||
|
dict_res = res.get_dict_output()
|
||||||
|
res_name = list(dict_res.keys())[0]
|
||||||
|
template_dict["resources"][res_name] = \
|
||||||
|
dict_res[res_name]
|
||||||
|
|
||||||
|
yaml.add_representer(OrderedDict, self.represent_ordereddict)
|
||||||
|
yaml.add_representer(dict, self.represent_ordereddict)
|
||||||
|
yaml_string = yaml.dump(template_dict, default_flow_style=False)
|
||||||
|
yaml_string = yaml_string.replace('\'', '').replace('\n\n', '\n')
|
||||||
|
nested_template = {
|
||||||
|
yaml_name: yaml_string
|
||||||
|
}
|
||||||
|
return nested_template
|
||||||
|
|
||||||
def remove_depends_on(self, depends_on_set):
|
def remove_depends_on(self, depends_on_set):
|
||||||
# Remove all depends_on including depends_on_set.
|
# Remove all depends_on including depends_on_set.
|
||||||
for rel, node in self.nodetemplate.relationships.items():
|
for rel, node in self.nodetemplate.relationships.items():
|
||||||
|
@ -0,0 +1,227 @@
|
|||||||
|
#
|
||||||
|
# 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 itertools import chain
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from translator.hot.syntax.hot_resource import HotResource
|
||||||
|
log = logging.getLogger('heat-translator')
|
||||||
|
|
||||||
|
# Name used to dynamically load appropriate map class.
|
||||||
|
TARGET_CLASS_NAME = 'ToscaNfvScalingAspect'
|
||||||
|
HEAT_NON_SCALING_RESOURCES = ['OS::Heat::ScalingPolicy',
|
||||||
|
'OS::Heat::AutoScalingGroup']
|
||||||
|
HOT_FLAVOR = 'OS::Nova::Flavor'
|
||||||
|
SCALING_ASPECT_DELTA = 'tosca.policies.nfv.VduScalingAspectDeltas'
|
||||||
|
VDU_CP = 'tosca.nodes.nfv.VduCp'
|
||||||
|
VDU_INITIAL_DELTA = 'tosca.policies.nfv.VduInitialDelta'
|
||||||
|
|
||||||
|
|
||||||
|
class ToscaNfvScalingAspect(HotResource):
|
||||||
|
"""Translate TOSCA policy type tosca.policies.nfv.ScalingAspects."""
|
||||||
|
|
||||||
|
toscatype = 'tosca.policies.nfv.ScalingAspects'
|
||||||
|
DESIRED_CAPACITY = 'DESIRED_CAPACITY'
|
||||||
|
|
||||||
|
def __init__(self, policy, aspect_name, csar_dir=None,
|
||||||
|
hot_template_parameters=None):
|
||||||
|
hot_type = "OS::Heat::ScalingPolicy"
|
||||||
|
self.aspect_name = aspect_name
|
||||||
|
super(ToscaNfvScalingAspect, self).__init__(
|
||||||
|
policy,
|
||||||
|
name=self.aspect_name,
|
||||||
|
type=hot_type,
|
||||||
|
csar_dir=csar_dir)
|
||||||
|
self.policy = policy
|
||||||
|
self.hot_template_parameters = hot_template_parameters
|
||||||
|
|
||||||
|
# default
|
||||||
|
self.scaling_adjustment = None
|
||||||
|
self.vdu_name = None
|
||||||
|
self.delta_name = None
|
||||||
|
|
||||||
|
def handle_properties(self, resources):
|
||||||
|
# Resources of non HotResource
|
||||||
|
# (Exclude derived)
|
||||||
|
non_hot_rsrcs = [r for r in resources if type(r) is not HotResource]
|
||||||
|
|
||||||
|
# Extract resource name from VduScalingAspectDeltas
|
||||||
|
vsad_rsrcs = [
|
||||||
|
r for r in non_hot_rsrcs if r.toscatype == SCALING_ASPECT_DELTA]
|
||||||
|
vsad_rsrcs = [
|
||||||
|
r for r in vsad_rsrcs if r.aspect == self.aspect_name]
|
||||||
|
vsad_rsrc = vsad_rsrcs[0]
|
||||||
|
|
||||||
|
# The names of the resource associated with the VDU.
|
||||||
|
# Supporting resources below.
|
||||||
|
# - tosca.nodes.nfv.Vdu.Compute
|
||||||
|
# - tosca.nodes.nfv.VduCp
|
||||||
|
# - tosca.nodes.nfv.Vdu.VirtualBlockStorage
|
||||||
|
vdu_infos = [
|
||||||
|
r for r in resources
|
||||||
|
if vsad_rsrc.targets is not None and r.name in vsad_rsrc.targets]
|
||||||
|
if vdu_infos == []:
|
||||||
|
log.warning('Can not create %s node '
|
||||||
|
'because target vdu does not defined.'
|
||||||
|
% self.aspect_name)
|
||||||
|
|
||||||
|
related_rsrc_names = []
|
||||||
|
related_vl_names = []
|
||||||
|
for vdu_info in vdu_infos:
|
||||||
|
vdu_name = vdu_info.name
|
||||||
|
port_rsrc_names = [p.name for p in vdu_info.assoc_port_resources]
|
||||||
|
strg_rsrc_names = [s for s in vdu_info.virtual_storages]
|
||||||
|
related_rsrc_names.append(vdu_name)
|
||||||
|
related_rsrc_names.extend(port_rsrc_names)
|
||||||
|
related_rsrc_names.extend(strg_rsrc_names)
|
||||||
|
|
||||||
|
# Extract virtual_link mapping to vdu_name
|
||||||
|
cp_rsrcs = [
|
||||||
|
r for r in non_hot_rsrcs
|
||||||
|
if r.toscatype == VDU_CP and r.virtual_binding == vdu_name]
|
||||||
|
related_vl_names.extend([
|
||||||
|
cp.virtual_link for cp in cp_rsrcs
|
||||||
|
if cp.virtual_link is not None])
|
||||||
|
|
||||||
|
# Parameters defined in referenced YAML
|
||||||
|
parameters = {}
|
||||||
|
|
||||||
|
# Resources of scaling/non-scaling
|
||||||
|
scl_rsrcs = []
|
||||||
|
non_scl_rsrcs = []
|
||||||
|
|
||||||
|
# Properties of :AutoScalingGroup
|
||||||
|
asg_props = {}
|
||||||
|
|
||||||
|
# Resources which are contain related_rsrc_names are not
|
||||||
|
# call handle_expansion(), so call here and add resources.
|
||||||
|
related_rsrcs = [
|
||||||
|
r for r in resources if r.name in related_rsrc_names]
|
||||||
|
exp_rsrcs = list(
|
||||||
|
chain.from_iterable([
|
||||||
|
r.handle_expansion()
|
||||||
|
for r in related_rsrcs
|
||||||
|
if r.handle_expansion() is not None]))
|
||||||
|
|
||||||
|
# Allocate resources generated by handle_expansion()
|
||||||
|
# to scaling or non-scaling resource.
|
||||||
|
# Flavor is non-scaling resource.
|
||||||
|
scl_rsrcs.extend([
|
||||||
|
r for r in exp_rsrcs
|
||||||
|
if r.type != HOT_FLAVOR])
|
||||||
|
non_scl_rsrcs.extend([
|
||||||
|
r for r in exp_rsrcs
|
||||||
|
if r.type == HOT_FLAVOR])
|
||||||
|
|
||||||
|
for resource in resources:
|
||||||
|
# Allocate resources to scaling or non-scaling resource.
|
||||||
|
if resource.type not in HEAT_NON_SCALING_RESOURCES and \
|
||||||
|
resource.name in related_rsrc_names:
|
||||||
|
scl_rsrcs.append(resource)
|
||||||
|
else:
|
||||||
|
non_scl_rsrcs.append(resource)
|
||||||
|
|
||||||
|
# Processing for VDU
|
||||||
|
if resource.name in related_rsrc_names and \
|
||||||
|
resource.type == 'OS::Nova::Server':
|
||||||
|
self.vdu_name = resource.name
|
||||||
|
|
||||||
|
# Target aspect
|
||||||
|
target_aspect = \
|
||||||
|
self.policy.properties['aspects'][self.aspect_name]
|
||||||
|
|
||||||
|
# Extract scaling_adjustment from VduScalingAspectDeltas.
|
||||||
|
# VduScalingAspectDeltas can specify a delta for each scaling
|
||||||
|
# step but only the first one is used and others are ignored.
|
||||||
|
delta_names = target_aspect['step_deltas']
|
||||||
|
self.delta_name = delta_names[0]
|
||||||
|
self.scaling_adjustment = vsad_rsrc.deltas.get(self.delta_name)
|
||||||
|
|
||||||
|
# Extract min_size from VduInitialDelta
|
||||||
|
vid_rsrcs = [
|
||||||
|
r for r in non_hot_rsrcs
|
||||||
|
if r.toscatype == VDU_INITIAL_DELTA]
|
||||||
|
initial_deltas = [
|
||||||
|
r for r in vid_rsrcs
|
||||||
|
if r.targets is not None and self.vdu_name in r.targets]
|
||||||
|
min_size = None \
|
||||||
|
if initial_deltas == [] else initial_deltas[0].num
|
||||||
|
|
||||||
|
res = {}
|
||||||
|
if min_size is not None and \
|
||||||
|
self.scaling_adjustment is not None:
|
||||||
|
# Calculate max_size
|
||||||
|
max_scale_level = target_aspect['max_scale_level']
|
||||||
|
max_size = \
|
||||||
|
min_size + max_scale_level * self.scaling_adjustment
|
||||||
|
res["min_size"] = min_size
|
||||||
|
res["max_size"] = max_size
|
||||||
|
else:
|
||||||
|
log.warning('No min_size or(and) max_size is found for '
|
||||||
|
'aspect_name:%s, VDU:%s' % (
|
||||||
|
self.aspect_name, self.vdu_name))
|
||||||
|
|
||||||
|
# desired_capacity needs to be replaced by users because it is
|
||||||
|
# calculated using scaling aspect and instantiation level given
|
||||||
|
# in instantiation VNF request.
|
||||||
|
res["desired_capacity"] = self.DESIRED_CAPACITY
|
||||||
|
res['resource'] = {'type': self.aspect_name + '.hot.yaml'}
|
||||||
|
|
||||||
|
props = {}
|
||||||
|
props['type'] = resource.type
|
||||||
|
props['properties'] = resource.properties
|
||||||
|
|
||||||
|
for vl_name in related_vl_names:
|
||||||
|
vl_id = '%s_id' % (vl_name.lower())
|
||||||
|
asg_props.update({
|
||||||
|
vl_id: '{ get_resource: %s }' % (vl_name)})
|
||||||
|
|
||||||
|
# Replace flavor id
|
||||||
|
flvr_name = resource.flavor_resource_name
|
||||||
|
flvr_id = '%s_id' % (flvr_name.lower())
|
||||||
|
asg_props.update({
|
||||||
|
flvr_id: '{ get_resource: %s }' % (flvr_name)})
|
||||||
|
resource.properties['flavor'] = \
|
||||||
|
'{ get_param: %s }' % (flvr_id)
|
||||||
|
parameters[flvr_id] = {'type': 'string'}
|
||||||
|
|
||||||
|
res['resource'].update({
|
||||||
|
'properties': asg_props
|
||||||
|
})
|
||||||
|
non_scl_rsrcs.append(
|
||||||
|
HotResource(resource,
|
||||||
|
type='OS::Heat::AutoScalingGroup',
|
||||||
|
name=self.aspect_name,
|
||||||
|
properties=res))
|
||||||
|
|
||||||
|
# Processing for CP related to target VDU
|
||||||
|
elif resource.name in related_rsrc_names and \
|
||||||
|
resource.type == 'OS::Neutron::Port':
|
||||||
|
for vl_name in related_vl_names:
|
||||||
|
if vl_name == resource.virtual_link:
|
||||||
|
# Replace network id
|
||||||
|
vl_id = '%s_id' % (vl_name.lower())
|
||||||
|
resource.properties['network'] = \
|
||||||
|
'{ get_param: %s }' % (vl_id)
|
||||||
|
parameters[vl_id] = {'type': 'string'}
|
||||||
|
|
||||||
|
# Create referenced YAML which is defined scaling resources
|
||||||
|
yaml_name = self.aspect_name + '.hot.yaml'
|
||||||
|
parameters = None if parameters == {} else parameters
|
||||||
|
nested_template = self._handle_nested_template(
|
||||||
|
scl_rsrcs,
|
||||||
|
yaml_name,
|
||||||
|
self.hot_template_parameters,
|
||||||
|
parameters=parameters)
|
||||||
|
|
||||||
|
return non_scl_rsrcs, nested_template
|
@ -0,0 +1,33 @@
|
|||||||
|
#
|
||||||
|
# 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 = 'ToscaNfvInstantiationLevels'
|
||||||
|
|
||||||
|
|
||||||
|
class ToscaNfvInstantiationLevels(HotResource):
|
||||||
|
"""Translate TOSCA policy type tosca.policies.nfv.InstantiationLevels."""
|
||||||
|
|
||||||
|
toscatype = 'tosca.policies.nfv.InstantiationLevels'
|
||||||
|
|
||||||
|
def __init__(self, policy, csar_dir=None, hot_template_parameters=None):
|
||||||
|
super(ToscaNfvInstantiationLevels, self).__init__(
|
||||||
|
policy,
|
||||||
|
csar_dir=csar_dir)
|
||||||
|
self.policy = policy
|
||||||
|
self.hot_template_parameters = hot_template_parameters
|
||||||
|
|
||||||
|
def handle_properties(self):
|
||||||
|
pass
|
@ -0,0 +1,124 @@
|
|||||||
|
#
|
||||||
|
# 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
|
||||||
|
from translator.hot.tosca.etsi_nfv.scalingaspect.\
|
||||||
|
tosca_policies_nfv_scalingaspect import ToscaNfvScalingAspect
|
||||||
|
log = logging.getLogger('heat-translator')
|
||||||
|
|
||||||
|
# Name used to dynamically load appropriate map class.
|
||||||
|
TARGET_CLASS_NAME = 'ToscaNfvScalingAspects'
|
||||||
|
|
||||||
|
|
||||||
|
class ToscaNfvScalingAspects(HotResource):
|
||||||
|
"""Translate TOSCA policy type tosca.policies.nfv.ScalingAspects."""
|
||||||
|
|
||||||
|
toscatype = 'tosca.policies.nfv.ScalingAspects'
|
||||||
|
|
||||||
|
def __init__(self, policy, csar_dir=None, hot_template_parameters=None,
|
||||||
|
nested_template=None,
|
||||||
|
extra_flg=None):
|
||||||
|
hot_type = "OS::Heat::ScalingPolicy"
|
||||||
|
|
||||||
|
if extra_flg is None:
|
||||||
|
# Multi aspects support
|
||||||
|
self.aspect_names = policy.properties['aspects'].keys()
|
||||||
|
self.scaling_aspect_objs = []
|
||||||
|
for aspect_name in self.aspect_names:
|
||||||
|
self.scaling_aspect_objs.append(
|
||||||
|
ToscaNfvScalingAspect(policy,
|
||||||
|
aspect_name,
|
||||||
|
csar_dir,
|
||||||
|
hot_template_parameters)
|
||||||
|
)
|
||||||
|
|
||||||
|
super(ToscaNfvScalingAspects, self).__init__(
|
||||||
|
policy,
|
||||||
|
type=hot_type,
|
||||||
|
csar_dir=csar_dir)
|
||||||
|
|
||||||
|
self.policy = policy
|
||||||
|
self.hot_template_parameters = hot_template_parameters
|
||||||
|
self.multi_nested_templates = {}
|
||||||
|
self.nested_template = \
|
||||||
|
{} if nested_template is None else nested_template
|
||||||
|
|
||||||
|
def handle_properties(self, resources):
|
||||||
|
for aspect_obj in self.scaling_aspect_objs:
|
||||||
|
resources, nstd_tmpt = aspect_obj.handle_properties(resources)
|
||||||
|
self.multi_nested_templates[aspect_obj.aspect_name] = nstd_tmpt
|
||||||
|
|
||||||
|
resources = self._create_scale_out_in_resources(resources)
|
||||||
|
return resources
|
||||||
|
|
||||||
|
def extract_substack_templates(self, base_filename, hot_template_version):
|
||||||
|
return self.nested_template
|
||||||
|
|
||||||
|
def _create_scale_out_in_resources(self, resources):
|
||||||
|
for asp_obj in self.scaling_aspect_objs:
|
||||||
|
asp_name = asp_obj.aspect_name
|
||||||
|
|
||||||
|
# Create scale_out and scale_in resources
|
||||||
|
scl_out_rsrc = ToscaNfvScalingAspects(
|
||||||
|
self.policy,
|
||||||
|
csar_dir=self.csar_dir,
|
||||||
|
hot_template_parameters=self.
|
||||||
|
hot_template_parameters,
|
||||||
|
nested_template=self.
|
||||||
|
multi_nested_templates[asp_name],
|
||||||
|
extra_flg=True
|
||||||
|
)
|
||||||
|
scl_in_rsrc = ToscaNfvScalingAspects(
|
||||||
|
self.policy,
|
||||||
|
csar_dir=self.csar_dir,
|
||||||
|
hot_template_parameters=self.
|
||||||
|
hot_template_parameters,
|
||||||
|
nested_template=self.
|
||||||
|
multi_nested_templates[asp_name],
|
||||||
|
extra_flg=True
|
||||||
|
)
|
||||||
|
scl_out_rsrc.name = asp_name + '_scale_out'
|
||||||
|
scl_in_rsrc.name = asp_name + '_scale_in'
|
||||||
|
|
||||||
|
if asp_obj.scaling_adjustment is not None:
|
||||||
|
scaling_adjustment = \
|
||||||
|
int(asp_obj.scaling_adjustment)
|
||||||
|
scl_out_rsrc.properties['scaling_adjustment'] = \
|
||||||
|
scaling_adjustment
|
||||||
|
scl_in_rsrc.properties['scaling_adjustment'] = \
|
||||||
|
-1 * scaling_adjustment
|
||||||
|
else:
|
||||||
|
log.warning('No ScalingAspectDelta for %s of %s, %s is found'
|
||||||
|
% (asp_obj.vdu_name, asp_name, asp_obj.delta_name))
|
||||||
|
|
||||||
|
scl_out_rsrc.properties["auto_scaling_group_id"] = {
|
||||||
|
'get_resource': asp_name
|
||||||
|
}
|
||||||
|
scl_out_rsrc.properties["adjustment_type"] = \
|
||||||
|
"change_in_capacity"
|
||||||
|
resources.append(scl_out_rsrc)
|
||||||
|
|
||||||
|
scl_in_rsrc.properties["auto_scaling_group_id"] = {
|
||||||
|
'get_resource': asp_name
|
||||||
|
}
|
||||||
|
scl_in_rsrc.properties["adjustment_type"] = \
|
||||||
|
"change_in_capacity"
|
||||||
|
resources.append(scl_in_rsrc)
|
||||||
|
|
||||||
|
# This resource has already created scale_out and
|
||||||
|
# scale_in resources, so remove it.
|
||||||
|
resources.remove(self)
|
||||||
|
|
||||||
|
return resources
|
@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# 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 = 'ToscaNfvVduInitialDelta'
|
||||||
|
|
||||||
|
|
||||||
|
class ToscaNfvVduInitialDelta(HotResource):
|
||||||
|
"""Translate TOSCA policy type tosca.policies.nfv.VduInitialDelta."""
|
||||||
|
|
||||||
|
toscatype = 'tosca.policies.nfv.VduInitialDelta'
|
||||||
|
|
||||||
|
def __init__(self, policy, csar_dir=None, hot_template_parameters=None):
|
||||||
|
super(ToscaNfvVduInitialDelta, self).__init__(
|
||||||
|
policy,
|
||||||
|
csar_dir=csar_dir)
|
||||||
|
self.policy = policy
|
||||||
|
self.hot_template_parameters = hot_template_parameters
|
||||||
|
|
||||||
|
# Extract number_of_instances
|
||||||
|
tosca_props = self.get_tosca_props()
|
||||||
|
self.num = tosca_props['initial_delta']['number_of_instances']
|
||||||
|
|
||||||
|
# Extract targets
|
||||||
|
self.targets = self.policy.targets
|
||||||
|
|
||||||
|
def handle_properties(self):
|
||||||
|
pass
|
@ -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 = 'ToscaNfvVduInstantiationLevels'
|
||||||
|
|
||||||
|
|
||||||
|
class ToscaNfvVduInstantiationLevels(HotResource):
|
||||||
|
"""Translate TOSCA policy type
|
||||||
|
|
||||||
|
tosca.policies.nfv.VduInstantiationLevels.
|
||||||
|
"""
|
||||||
|
|
||||||
|
toscatype = 'tosca.policies.nfv.VduInstantiationLevels'
|
||||||
|
|
||||||
|
def __init__(self, policy, csar_dir=None, hot_template_parameters=None):
|
||||||
|
super(ToscaNfvVduInstantiationLevels, self).__init__(
|
||||||
|
policy,
|
||||||
|
csar_dir=csar_dir)
|
||||||
|
self.policy = policy
|
||||||
|
self.hot_template_parameters = hot_template_parameters
|
||||||
|
|
||||||
|
def handle_properties(self):
|
||||||
|
pass
|
@ -0,0 +1,46 @@
|
|||||||
|
#
|
||||||
|
# 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 = 'ToscaNfvVduScalingAspectDeltas'
|
||||||
|
|
||||||
|
|
||||||
|
class ToscaNfvVduScalingAspectDeltas(HotResource):
|
||||||
|
"""Translate TOSCA policy type
|
||||||
|
|
||||||
|
tosca.policies.nfv.VduScalingAspectDeltas.
|
||||||
|
"""
|
||||||
|
|
||||||
|
toscatype = 'tosca.policies.nfv.VduScalingAspectDeltas'
|
||||||
|
|
||||||
|
def __init__(self, policy, csar_dir=None, hot_template_parameters=None):
|
||||||
|
super(ToscaNfvVduScalingAspectDeltas, self).__init__(
|
||||||
|
policy,
|
||||||
|
csar_dir=csar_dir)
|
||||||
|
self.policy = policy
|
||||||
|
self.hot_template_parameters = hot_template_parameters
|
||||||
|
|
||||||
|
# Extract aspect name and deltas
|
||||||
|
tosca_props = self.get_tosca_props()
|
||||||
|
self.aspect = tosca_props['aspect']
|
||||||
|
self.deltas = {}
|
||||||
|
for key, val in tosca_props['deltas'].items():
|
||||||
|
self.deltas[key] = val['number_of_instances']
|
||||||
|
|
||||||
|
# Extract target VDUs
|
||||||
|
self.targets = self.policy.targets
|
||||||
|
|
||||||
|
def handle_properties(self):
|
||||||
|
pass
|
@ -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 = 'VirtualLinkInstantiationLevels'
|
||||||
|
|
||||||
|
|
||||||
|
class VirtualLinkInstantiationLevels(HotResource):
|
||||||
|
"""Translate TOSCA policy type
|
||||||
|
|
||||||
|
tosca.policies.nfv.VirtualLinkInstantiationLevels.
|
||||||
|
"""
|
||||||
|
|
||||||
|
toscatype = 'tosca.policies.nfv.VirtualLinkInstantiationLevels'
|
||||||
|
|
||||||
|
def __init__(self, policy, csar_dir=None, hot_template_parameters=None):
|
||||||
|
super(VirtualLinkInstantiationLevels, self).__init__(
|
||||||
|
policy,
|
||||||
|
csar_dir=csar_dir)
|
||||||
|
self.policy = policy
|
||||||
|
self.hot_template_parameters = hot_template_parameters
|
||||||
|
|
||||||
|
def handle_properties(self):
|
||||||
|
pass
|
@ -138,7 +138,7 @@ class AutoscalingTest(TestCase):
|
|||||||
expected_nested_resource = {'heat_template_version':
|
expected_nested_resource = {'heat_template_version':
|
||||||
datetime.date(2013, 5, 23),
|
datetime.date(2013, 5, 23),
|
||||||
'description':
|
'description':
|
||||||
'Tacker Scaling template',
|
'Scaling template',
|
||||||
'parameters':
|
'parameters':
|
||||||
{'flavor':
|
{'flavor':
|
||||||
{'default': 'm1.tiny',
|
{'default': 'm1.tiny',
|
||||||
|
@ -11,16 +11,9 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
from collections import OrderedDict
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from translator.hot.syntax.hot_resource import HotResource
|
from translator.hot.syntax.hot_resource import HotResource
|
||||||
# Name used to dynamically load appropriate map class.
|
# Name used to dynamically load appropriate map class.
|
||||||
TARGET_CLASS_NAME = 'ToscaAutoscaling'
|
TARGET_CLASS_NAME = 'ToscaAutoscaling'
|
||||||
HEAT_TEMPLATE_BASE = """
|
|
||||||
heat_template_version: 2013-05-23
|
|
||||||
"""
|
|
||||||
ALARM_STATISTIC = {'mean': 'mean', 'median': 'median', 'summary': 'sum',
|
ALARM_STATISTIC = {'mean': 'mean', 'median': 'median', 'summary': 'sum',
|
||||||
'maximum': 'max', 'minimum': 'min', 'last': 'last',
|
'maximum': 'max', 'minimum': 'min', 'last': 'last',
|
||||||
'std': 'std', 'first': 'first', 'count': 'count'}
|
'std': 'std', 'first': 'first', 'count': 'count'}
|
||||||
@ -66,39 +59,6 @@ class ToscaAutoscaling(HotResource):
|
|||||||
hot_resources = [ceilometer_resources]
|
hot_resources = [ceilometer_resources]
|
||||||
return hot_resources
|
return hot_resources
|
||||||
|
|
||||||
def represent_ordereddict(self, dumper, data):
|
|
||||||
nodes = []
|
|
||||||
for key, value in data.items():
|
|
||||||
node_key = dumper.represent_data(key)
|
|
||||||
node_value = dumper.represent_data(value)
|
|
||||||
nodes.append((node_key, node_value))
|
|
||||||
return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', nodes)
|
|
||||||
|
|
||||||
def _handle_nested_template(self, scale_res):
|
|
||||||
template_dict = yaml.safe_load(HEAT_TEMPLATE_BASE)
|
|
||||||
template_dict['description'] = 'Tacker Scaling template'
|
|
||||||
if self.hot_template_parameters:
|
|
||||||
all_params = OrderedDict()
|
|
||||||
for parameter in self.hot_template_parameters:
|
|
||||||
all_params.update(parameter.get_dict_output())
|
|
||||||
template_dict.update({'parameters': all_params})
|
|
||||||
|
|
||||||
template_dict["resources"] = {}
|
|
||||||
dict_res = OrderedDict()
|
|
||||||
for res in scale_res:
|
|
||||||
dict_res = res.get_dict_output()
|
|
||||||
res_name = list(dict_res.keys())[0]
|
|
||||||
template_dict["resources"][res_name] = \
|
|
||||||
dict_res[res_name]
|
|
||||||
|
|
||||||
yaml.add_representer(OrderedDict, self.represent_ordereddict)
|
|
||||||
yaml.add_representer(dict, self.represent_ordereddict)
|
|
||||||
yaml_string = yaml.dump(template_dict, default_flow_style=False)
|
|
||||||
yaml_string = yaml_string.replace('\'', '').replace('\n\n', '\n')
|
|
||||||
self.nested_template = {
|
|
||||||
self.policy.name + '_res.yaml': yaml_string
|
|
||||||
}
|
|
||||||
|
|
||||||
def handle_properties(self, resources):
|
def handle_properties(self, resources):
|
||||||
self.properties = {}
|
self.properties = {}
|
||||||
self.properties["auto_scaling_group_id"] = {
|
self.properties["auto_scaling_group_id"] = {
|
||||||
@ -133,7 +93,11 @@ class ToscaAutoscaling(HotResource):
|
|||||||
if resource.type not in SCALING_RESOURCES:
|
if resource.type not in SCALING_RESOURCES:
|
||||||
delete_res_names.append(resource.name)
|
delete_res_names.append(resource.name)
|
||||||
scale_res.append(resource)
|
scale_res.append(resource)
|
||||||
self._handle_nested_template(scale_res)
|
yaml_name = self.policy.name + '_res.yaml'
|
||||||
|
self.nested_template = self._handle_nested_template(
|
||||||
|
scale_res,
|
||||||
|
yaml_name,
|
||||||
|
self.hot_template_parameters)
|
||||||
resources = [tmp_res
|
resources = [tmp_res
|
||||||
for tmp_res in resources
|
for tmp_res in resources
|
||||||
if tmp_res.name not in delete_res_names]
|
if tmp_res.name not in delete_res_names]
|
||||||
|
@ -141,9 +141,18 @@ TOSCA_TO_HOT_TYPE = _generate_type_map()
|
|||||||
|
|
||||||
BASE_TYPES = six.string_types + six.integer_types + (dict, OrderedDict)
|
BASE_TYPES = six.string_types + six.integer_types + (dict, OrderedDict)
|
||||||
|
|
||||||
|
BASE_POLICY_TYPES = [
|
||||||
|
'tosca.policies.Scaling',
|
||||||
|
'tosca.policies.Monitoring',
|
||||||
|
'tosca.policies.Placement',
|
||||||
|
'tosca.policies.Reservation',
|
||||||
|
]
|
||||||
|
|
||||||
HOT_SCALING_POLICY_TYPE = ["OS::Heat::AutoScalingGroup",
|
HOT_SCALING_POLICY_TYPE = ["OS::Heat::AutoScalingGroup",
|
||||||
"OS::Senlin::Profile"]
|
"OS::Senlin::Profile"]
|
||||||
|
|
||||||
|
TOSCA_SA = 'tosca.policies.nfv.ScalingAspects'
|
||||||
|
|
||||||
|
|
||||||
class TranslateNodeTemplates(object):
|
class TranslateNodeTemplates(object):
|
||||||
'''Translate TOSCA NodeTemplates to Heat Resources.'''
|
'''Translate TOSCA NodeTemplates to Heat Resources.'''
|
||||||
@ -188,7 +197,8 @@ class TranslateNodeTemplates(object):
|
|||||||
resource.handle_properties(self.hot_resources)
|
resource.handle_properties(self.hot_resources)
|
||||||
extra_hot_resources = []
|
extra_hot_resources = []
|
||||||
for res in self.hot_resources:
|
for res in self.hot_resources:
|
||||||
if res.type == 'OS::Heat::ScalingPolicy':
|
if res.type == 'OS::Heat::ScalingPolicy' and\
|
||||||
|
res.toscatype != TOSCA_SA:
|
||||||
extra_res = copy.deepcopy(res)
|
extra_res = copy.deepcopy(res)
|
||||||
scaling_adjustment = res.properties['scaling_adjustment']
|
scaling_adjustment = res.properties['scaling_adjustment']
|
||||||
if scaling_adjustment < 0:
|
if scaling_adjustment < 0:
|
||||||
@ -265,30 +275,26 @@ class TranslateNodeTemplates(object):
|
|||||||
|
|
||||||
for policy in self.policies:
|
for policy in self.policies:
|
||||||
policy_type = policy.type_definition
|
policy_type = policy.type_definition
|
||||||
if policy.is_derived_from('tosca.policies.Scaling') and \
|
own_policy_type = policy_type.type
|
||||||
policy_type.type != 'tosca.policies.Scaling.Cluster':
|
base_policy_type = self._get_supported_type(policy)
|
||||||
TOSCA_TO_HOT_TYPE[policy_type.type] = \
|
|
||||||
TOSCA_TO_HOT_TYPE['tosca.policies.Scaling']
|
if base_policy_type in BASE_POLICY_TYPES and \
|
||||||
if policy.is_derived_from('tosca.policies.Monitoring'):
|
own_policy_type != 'tosca.policies.Scaling.Cluster':
|
||||||
TOSCA_TO_HOT_TYPE[policy_type.type] = \
|
TOSCA_TO_HOT_TYPE[own_policy_type] = \
|
||||||
TOSCA_TO_HOT_TYPE['tosca.policies.Monitoring']
|
TOSCA_TO_HOT_TYPE[base_policy_type]
|
||||||
if policy.is_derived_from('tosca.policies.Placement'):
|
|
||||||
TOSCA_TO_HOT_TYPE[policy_type.type] = \
|
if own_policy_type == 'tosca.policies.Scaling.Cluster':
|
||||||
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':
|
|
||||||
self.hot_template_version = '2016-04-08'
|
self.hot_template_version = '2016-04-08'
|
||||||
if policy.is_derived_from('tosca.policies.Scaling') and \
|
|
||||||
policy_type.type != 'tosca.policies.Scaling.Cluster':
|
if (base_policy_type == 'tosca.policies.Scaling' or
|
||||||
policy_node = TOSCA_TO_HOT_TYPE[policy_type.type](
|
base_policy_type == 'tosca.policies.tacker.Scaling') and \
|
||||||
|
own_policy_type != 'tosca.policies.Scaling.Cluster':
|
||||||
|
policy_node = TOSCA_TO_HOT_TYPE[own_policy_type](
|
||||||
policy,
|
policy,
|
||||||
hot_template_parameters=self.hot_template.parameters)
|
hot_template_parameters=self.hot_template.parameters)
|
||||||
else:
|
else:
|
||||||
policy_node = TOSCA_TO_HOT_TYPE[policy_type.type](policy)
|
policy_node = TOSCA_TO_HOT_TYPE[own_policy_type](policy)
|
||||||
|
|
||||||
self.hot_resources.append(policy_node)
|
self.hot_resources.append(policy_node)
|
||||||
|
|
||||||
# Handle life cycle operations: this may expand each node
|
# Handle life cycle operations: this may expand each node
|
||||||
|
@ -0,0 +1,112 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_2
|
||||||
|
|
||||||
|
description: >
|
||||||
|
Template for scaling which deltas is not defined in tosca.policies.nfv.VduScalingAspectDeltas.
|
||||||
|
(Defined delta_2 in tosca.policies.nfv.ScalingAspects,
|
||||||
|
but defined delta_1 in tosca.policies.nfv.VduScalingAspectDeltas.)
|
||||||
|
In Addition, the following properties are not set in
|
||||||
|
<aspect_name>_scale_in and <aspect_name>_scale_out nodes.
|
||||||
|
->scaling_adjustment
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- etsi_nfv_sol001_common_types.yaml
|
||||||
|
- etsi_nfv_sol001_vnfd_types.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
VDU1:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU1
|
||||||
|
description: VDU1 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 1
|
||||||
|
max_number_of_instances: 3
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU1
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
|
||||||
|
CP1:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 0
|
||||||
|
vnic_type: direct-physical
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU1
|
||||||
|
|
||||||
|
policies:
|
||||||
|
- scaling_aspects:
|
||||||
|
type: tosca.policies.nfv.ScalingAspects
|
||||||
|
properties:
|
||||||
|
aspects:
|
||||||
|
worker_instance:
|
||||||
|
name: worker_instance_aspect
|
||||||
|
description: worker_instance scaling aspect
|
||||||
|
max_scale_level: 2
|
||||||
|
step_deltas:
|
||||||
|
- delta_2
|
||||||
|
|
||||||
|
- VDU1_initial_delta:
|
||||||
|
type: tosca.policies.nfv.VduInitialDelta
|
||||||
|
properties:
|
||||||
|
initial_delta:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- VDU1_scaling_aspect_deltas:
|
||||||
|
type: tosca.policies.nfv.VduScalingAspectDeltas
|
||||||
|
properties:
|
||||||
|
aspect: worker_instance
|
||||||
|
deltas:
|
||||||
|
delta_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.InstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
description: Smallest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 0
|
||||||
|
instantiation_level_2:
|
||||||
|
description: Largest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 2
|
||||||
|
default_level: instantiation_level_1
|
||||||
|
|
||||||
|
- VDU1_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VduInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
instantiation_level_2:
|
||||||
|
number_of_instances: 3
|
||||||
|
targets: [ VDU1 ]
|
@ -0,0 +1,112 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_2
|
||||||
|
|
||||||
|
description: >
|
||||||
|
Template for scaling which targets is not set in tosca.policies.nfv.VduScalingAspectDeltas.
|
||||||
|
The following nodes are not set in hot.
|
||||||
|
->OS::Heat::AutoScalingGroup
|
||||||
|
And create empty <aspect_name>.yaml.
|
||||||
|
In Addition, the following properties are not set in
|
||||||
|
<aspect_name>_scale_in and <aspect_name>_scale_out nodes.
|
||||||
|
->scaling_adjustment
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- etsi_nfv_sol001_common_types.yaml
|
||||||
|
- etsi_nfv_sol001_vnfd_types.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
VDU1:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU1
|
||||||
|
description: VDU1 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 1
|
||||||
|
max_number_of_instances: 3
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU1
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
|
||||||
|
CP1:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 0
|
||||||
|
vnic_type: direct-physical
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU1
|
||||||
|
|
||||||
|
policies:
|
||||||
|
- scaling_aspects:
|
||||||
|
type: tosca.policies.nfv.ScalingAspects
|
||||||
|
properties:
|
||||||
|
aspects:
|
||||||
|
worker_instance:
|
||||||
|
name: worker_instance_aspect
|
||||||
|
description: worker_instance scaling aspect
|
||||||
|
max_scale_level: 2
|
||||||
|
step_deltas:
|
||||||
|
- delta_1
|
||||||
|
|
||||||
|
- VDU1_initial_delta:
|
||||||
|
type: tosca.policies.nfv.VduInitialDelta
|
||||||
|
properties:
|
||||||
|
initial_delta:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- VDU1_scaling_aspect_deltas:
|
||||||
|
type: tosca.policies.nfv.VduScalingAspectDeltas
|
||||||
|
properties:
|
||||||
|
aspect: worker_instance
|
||||||
|
deltas:
|
||||||
|
delta_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
|
||||||
|
- instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.InstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
description: Smallest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 0
|
||||||
|
instantiation_level_2:
|
||||||
|
description: Largest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 2
|
||||||
|
default_level: instantiation_level_1
|
||||||
|
|
||||||
|
- VDU1_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VduInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
instantiation_level_2:
|
||||||
|
number_of_instances: 3
|
||||||
|
targets: [ VDU1 ]
|
@ -0,0 +1,109 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_2
|
||||||
|
|
||||||
|
description: >
|
||||||
|
Template for scaling which targets is not set in tosca.policies.nfv.VduInitialDelta.
|
||||||
|
The following properties are not set in <aspect_name>.
|
||||||
|
->min_size
|
||||||
|
->max_size
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- etsi_nfv_sol001_common_types.yaml
|
||||||
|
- etsi_nfv_sol001_vnfd_types.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
VDU1:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU1
|
||||||
|
description: VDU1 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 1
|
||||||
|
max_number_of_instances: 3
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU1
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
|
||||||
|
CP1:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 0
|
||||||
|
vnic_type: direct-physical
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU1
|
||||||
|
|
||||||
|
policies:
|
||||||
|
- scaling_aspects:
|
||||||
|
type: tosca.policies.nfv.ScalingAspects
|
||||||
|
properties:
|
||||||
|
aspects:
|
||||||
|
worker_instance:
|
||||||
|
name: worker_instance_aspect
|
||||||
|
description: worker_instance scaling aspect
|
||||||
|
max_scale_level: 2
|
||||||
|
step_deltas:
|
||||||
|
- delta_1
|
||||||
|
|
||||||
|
- VDU1_initial_delta:
|
||||||
|
type: tosca.policies.nfv.VduInitialDelta
|
||||||
|
properties:
|
||||||
|
initial_delta:
|
||||||
|
number_of_instances: 1
|
||||||
|
|
||||||
|
- VDU1_scaling_aspect_deltas:
|
||||||
|
type: tosca.policies.nfv.VduScalingAspectDeltas
|
||||||
|
properties:
|
||||||
|
aspect: worker_instance
|
||||||
|
deltas:
|
||||||
|
delta_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.InstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
description: Smallest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 0
|
||||||
|
instantiation_level_2:
|
||||||
|
description: Largest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 2
|
||||||
|
default_level: instantiation_level_1
|
||||||
|
|
||||||
|
- VDU1_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VduInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
instantiation_level_2:
|
||||||
|
number_of_instances: 3
|
||||||
|
targets: [ VDU1 ]
|
@ -0,0 +1,182 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_2
|
||||||
|
|
||||||
|
description: >
|
||||||
|
Template for deploying two VDU and two CP and one VirtualLink with scaling.
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- etsi_nfv_sol001_common_types.yaml
|
||||||
|
- etsi_nfv_sol001_vnfd_types.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
VDU1:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU1
|
||||||
|
description: VDU1 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 1
|
||||||
|
max_number_of_instances: 3
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU1
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
|
||||||
|
CP1:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 0
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU1
|
||||||
|
- virtual_link: VL1
|
||||||
|
|
||||||
|
VL1:
|
||||||
|
type: tosca.nodes.nfv.VnfVirtualLink
|
||||||
|
properties:
|
||||||
|
connectivity_type:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
description: Internal Virtual link in the VNF
|
||||||
|
vl_profile:
|
||||||
|
max_bitrate_requirements:
|
||||||
|
root: 1048576
|
||||||
|
leaf: 1048576
|
||||||
|
min_bitrate_requirements:
|
||||||
|
root: 1048576
|
||||||
|
leaf: 1048576
|
||||||
|
virtual_link_protocol_data:
|
||||||
|
- associated_layer_protocol: ipv4
|
||||||
|
l3_protocol_data:
|
||||||
|
ip_version: ipv4
|
||||||
|
cidr: 11.11.0.0/24
|
||||||
|
|
||||||
|
VDU2:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU2
|
||||||
|
description: VDU2 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 1
|
||||||
|
max_number_of_instances: 3
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU2
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
|
||||||
|
CP2:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 0
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU2
|
||||||
|
|
||||||
|
policies:
|
||||||
|
- scaling_aspects:
|
||||||
|
type: tosca.policies.nfv.ScalingAspects
|
||||||
|
properties:
|
||||||
|
aspects:
|
||||||
|
worker_instance:
|
||||||
|
name: worker_instance_aspect
|
||||||
|
description: worker_instance scaling aspect
|
||||||
|
max_scale_level: 2
|
||||||
|
step_deltas:
|
||||||
|
- delta_1
|
||||||
|
|
||||||
|
- VDU_initial_delta:
|
||||||
|
type: tosca.policies.nfv.VduInitialDelta
|
||||||
|
properties:
|
||||||
|
initial_delta:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1, VDU2 ]
|
||||||
|
|
||||||
|
- VDU_scaling_aspect_deltas:
|
||||||
|
type: tosca.policies.nfv.VduScalingAspectDeltas
|
||||||
|
properties:
|
||||||
|
aspect: worker_instance
|
||||||
|
deltas:
|
||||||
|
delta_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1, VDU2 ]
|
||||||
|
|
||||||
|
- instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.InstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
description: Smallest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 0
|
||||||
|
instantiation_level_2:
|
||||||
|
description: Largest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 2
|
||||||
|
default_level: instantiation_level_1
|
||||||
|
|
||||||
|
- VDU_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VduInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
instantiation_level_2:
|
||||||
|
number_of_instances: 3
|
||||||
|
targets: [ VDU1, VDU2 ]
|
||||||
|
|
||||||
|
- VL1_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VirtualLinkInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
bitrate_requirements:
|
||||||
|
root: 1048576
|
||||||
|
leaf: 1048576
|
||||||
|
instantiation_level_2:
|
||||||
|
bitrate_requirements:
|
||||||
|
root: 1048576
|
||||||
|
leaf: 1048576
|
||||||
|
targets: [ VL1 ]
|
@ -0,0 +1,187 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_2
|
||||||
|
|
||||||
|
description: >
|
||||||
|
Template for deploying one VDU and one CP with scaling.
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- etsi_nfv_sol001_common_types.yaml
|
||||||
|
- etsi_nfv_sol001_vnfd_types.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
VDU1:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU1
|
||||||
|
description: VDU1 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 1
|
||||||
|
max_number_of_instances: 3
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU1
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
|
||||||
|
CP1:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 0
|
||||||
|
vnic_type: direct-physical
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU1
|
||||||
|
|
||||||
|
VDU2:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU2
|
||||||
|
description: VDU2 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 2
|
||||||
|
max_number_of_instances: 10
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU2
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
|
||||||
|
CP2:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 1
|
||||||
|
vnic_type: direct-physical
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU2
|
||||||
|
|
||||||
|
policies:
|
||||||
|
- scaling_aspects:
|
||||||
|
type: tosca.policies.nfv.ScalingAspects
|
||||||
|
properties:
|
||||||
|
aspects:
|
||||||
|
worker_instance1:
|
||||||
|
name: worker_instance1_aspect
|
||||||
|
description: worker_instance1 scaling aspect
|
||||||
|
max_scale_level: 2
|
||||||
|
step_deltas:
|
||||||
|
- delta_1
|
||||||
|
worker_instance2:
|
||||||
|
name: worker_instance2_aspect
|
||||||
|
description: worker_instance2 scaling aspect
|
||||||
|
max_scale_level: 4
|
||||||
|
step_deltas:
|
||||||
|
- delta_2
|
||||||
|
|
||||||
|
- VDU1_initial_delta:
|
||||||
|
type: tosca.policies.nfv.VduInitialDelta
|
||||||
|
properties:
|
||||||
|
initial_delta:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- VDU1_scaling_aspect_deltas:
|
||||||
|
type: tosca.policies.nfv.VduScalingAspectDeltas
|
||||||
|
properties:
|
||||||
|
aspect: worker_instance1
|
||||||
|
deltas:
|
||||||
|
delta_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.InstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
description: Smallest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance1:
|
||||||
|
scale_level: 0
|
||||||
|
instantiation_level_2:
|
||||||
|
description: Middle size
|
||||||
|
scale_info:
|
||||||
|
worker_instance1:
|
||||||
|
scale_level: 2
|
||||||
|
instantiation_level_3:
|
||||||
|
description: Largest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance1:
|
||||||
|
scale_level: 4
|
||||||
|
default_level: instantiation_level_1
|
||||||
|
|
||||||
|
- VDU1_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VduInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
instantiation_level_2:
|
||||||
|
number_of_instances: 3
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- VDU2_initial_delta:
|
||||||
|
type: tosca.policies.nfv.VduInitialDelta
|
||||||
|
properties:
|
||||||
|
initial_delta:
|
||||||
|
number_of_instances: 2
|
||||||
|
targets: [ VDU2 ]
|
||||||
|
|
||||||
|
- VDU2_scaling_aspect_deltas:
|
||||||
|
type: tosca.policies.nfv.VduScalingAspectDeltas
|
||||||
|
properties:
|
||||||
|
aspect: worker_instance2
|
||||||
|
deltas:
|
||||||
|
delta_2:
|
||||||
|
number_of_instances: 2
|
||||||
|
targets: [ VDU2 ]
|
||||||
|
|
||||||
|
- VDU2_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VduInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
instantiation_level_2:
|
||||||
|
number_of_instances: 3
|
||||||
|
targets: [ VDU1 ]
|
@ -0,0 +1,169 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_2
|
||||||
|
|
||||||
|
description: >
|
||||||
|
Template for deploying one VNF and one VDU and one CP and one VirtualLink and BlockStorage with scaling.
|
||||||
|
|
||||||
|
imports:
|
||||||
|
- etsi_nfv_sol001_common_types.yaml
|
||||||
|
- etsi_nfv_sol001_vnfd_types.yaml
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
inputs:
|
||||||
|
selected_flavour:
|
||||||
|
type: string
|
||||||
|
default: simple
|
||||||
|
description: VNF deployment flavour selected by the consumer. It is provided in the API
|
||||||
|
|
||||||
|
node_templates:
|
||||||
|
VNF:
|
||||||
|
type: tosca.nodes.nfv.VNF
|
||||||
|
properties:
|
||||||
|
flavour_id: { get_input: selected_flavour }
|
||||||
|
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
|
||||||
|
provider: Sample company
|
||||||
|
product_name: Sample VNF
|
||||||
|
software_version: '1.0'
|
||||||
|
descriptor_version: '1.0'
|
||||||
|
vnfm_info:
|
||||||
|
- 00:sampleVNFM
|
||||||
|
flavour_description: A simple flavour
|
||||||
|
|
||||||
|
VDU1:
|
||||||
|
type: tosca.nodes.nfv.Vdu.Compute
|
||||||
|
properties:
|
||||||
|
name: VDU1
|
||||||
|
description: VDU1 compute node
|
||||||
|
vdu_profile:
|
||||||
|
min_number_of_instances: 1
|
||||||
|
max_number_of_instances: 3
|
||||||
|
sw_image_data:
|
||||||
|
name: Software of VDU1
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 1 GiB
|
||||||
|
size: 1 GiB
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: Files/images/cirros-0.4.0-x86_64-disk.img
|
||||||
|
|
||||||
|
capabilities:
|
||||||
|
virtual_compute:
|
||||||
|
properties:
|
||||||
|
virtual_memory:
|
||||||
|
virtual_mem_size: 512 MiB
|
||||||
|
virtual_cpu:
|
||||||
|
num_virtual_cpu: 1
|
||||||
|
virtual_local_storage:
|
||||||
|
- size_of_storage: 1 GiB
|
||||||
|
requirements:
|
||||||
|
- virtual_storage: VirtualStorage
|
||||||
|
|
||||||
|
VirtualStorage:
|
||||||
|
type: tosca.nodes.nfv.Vdu.VirtualBlockStorage
|
||||||
|
properties:
|
||||||
|
virtual_block_storage_data:
|
||||||
|
size_of_storage: 30 GiB
|
||||||
|
rdma_enabled: true
|
||||||
|
sw_image_data:
|
||||||
|
name: VrtualStorage
|
||||||
|
version: '0.4.0'
|
||||||
|
checksum:
|
||||||
|
algorithm: sha-256
|
||||||
|
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
|
||||||
|
container_format: bare
|
||||||
|
disk_format: qcow2
|
||||||
|
min_disk: 2 GiB
|
||||||
|
min_ram: 8192 MiB
|
||||||
|
size: 2 GiB
|
||||||
|
artifacts:
|
||||||
|
sw_image:
|
||||||
|
type: tosca.artifacts.nfv.SwImage
|
||||||
|
file: cirros-0.4.0-x86_64-disk.qcow2
|
||||||
|
|
||||||
|
CP1:
|
||||||
|
type: tosca.nodes.nfv.VduCp
|
||||||
|
properties:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
order: 0
|
||||||
|
requirements:
|
||||||
|
- virtual_binding: VDU1
|
||||||
|
- virtual_link: VL1
|
||||||
|
|
||||||
|
VL1:
|
||||||
|
type: tosca.nodes.nfv.VnfVirtualLink
|
||||||
|
properties:
|
||||||
|
connectivity_type:
|
||||||
|
layer_protocols: [ ipv4 ]
|
||||||
|
description: Internal Virtual link in the VNF
|
||||||
|
vl_profile:
|
||||||
|
max_bitrate_requirements:
|
||||||
|
root: 1048576
|
||||||
|
leaf: 1048576
|
||||||
|
min_bitrate_requirements:
|
||||||
|
root: 1048576
|
||||||
|
leaf: 1048576
|
||||||
|
virtual_link_protocol_data:
|
||||||
|
- associated_layer_protocol: ipv4
|
||||||
|
l3_protocol_data:
|
||||||
|
ip_version: ipv4
|
||||||
|
cidr: 11.11.0.0/24
|
||||||
|
|
||||||
|
policies:
|
||||||
|
- scaling_aspects:
|
||||||
|
type: tosca.policies.nfv.ScalingAspects
|
||||||
|
properties:
|
||||||
|
aspects:
|
||||||
|
worker_instance:
|
||||||
|
name: worker_instance_aspect
|
||||||
|
description: worker_instance scaling aspect
|
||||||
|
max_scale_level: 2
|
||||||
|
step_deltas:
|
||||||
|
- delta_1
|
||||||
|
|
||||||
|
- VDU1_initial_delta:
|
||||||
|
type: tosca.policies.nfv.VduInitialDelta
|
||||||
|
properties:
|
||||||
|
initial_delta:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- VDU1_scaling_aspect_deltas:
|
||||||
|
type: tosca.policies.nfv.VduScalingAspectDeltas
|
||||||
|
properties:
|
||||||
|
aspect: worker_instance
|
||||||
|
deltas:
|
||||||
|
delta_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
targets: [ VDU1 ]
|
||||||
|
|
||||||
|
- instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.InstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
description: Smallest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 0
|
||||||
|
instantiation_level_2:
|
||||||
|
description: Largest size
|
||||||
|
scale_info:
|
||||||
|
worker_instance:
|
||||||
|
scale_level: 2
|
||||||
|
default_level: instantiation_level_1
|
||||||
|
|
||||||
|
- VDU1_instantiation_levels:
|
||||||
|
type: tosca.policies.nfv.VduInstantiationLevels
|
||||||
|
properties:
|
||||||
|
levels:
|
||||||
|
instantiation_level_1:
|
||||||
|
number_of_instances: 1
|
||||||
|
instantiation_level_2:
|
||||||
|
number_of_instances: 3
|
||||||
|
targets: [ VDU1 ]
|
@ -1,5 +1,5 @@
|
|||||||
heat_template_version: 2013-05-23
|
heat_template_version: 2013-05-23
|
||||||
description: Tacker Scaling template
|
description: Scaling template
|
||||||
resources:
|
resources:
|
||||||
my_server_1:
|
my_server_1:
|
||||||
type: OS::Nova::Server
|
type: OS::Nova::Server
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: >
|
||||||
|
Template for scaling which deltas is not defined in tosca.policies.nfv.VduScalingAspectDeltas.
|
||||||
|
(Defined delta_2 in tosca.policies.nfv.ScalingAspects,
|
||||||
|
but defined delta_1 in tosca.policies.nfv.VduScalingAspectDeltas.)
|
||||||
|
In Addition, the following properties are not set in
|
||||||
|
<aspect_name>_scale_in and <aspect_name>_scale_out nodes.
|
||||||
|
->scaling_adjustment
|
||||||
|
parameters: {}
|
||||||
|
resources:
|
||||||
|
VDU1_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
worker_instance:
|
||||||
|
type: OS::Heat::AutoScalingGroup
|
||||||
|
properties:
|
||||||
|
resource:
|
||||||
|
type: worker_instance.hot.yaml
|
||||||
|
properties:
|
||||||
|
vdu1_flavor_id: { get_resource: VDU1_flavor }
|
||||||
|
desired_capacity: DESIRED_CAPACITY
|
||||||
|
worker_instance_scale_out:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
worker_instance_scale_in:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
outputs: {}
|
@ -0,0 +1,19 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: Scaling template
|
||||||
|
parameters:
|
||||||
|
vdu1_flavor_id:
|
||||||
|
type: string
|
||||||
|
resources:
|
||||||
|
CP1:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: #ADD_YOUR_NETWORK_HERE
|
||||||
|
binding:vnic_type: direct-physical
|
||||||
|
VDU1:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_param: vdu1_flavor_id }
|
||||||
|
name: VDU1
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP1 }
|
@ -0,0 +1,43 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: >
|
||||||
|
Template for scaling which targets is not set in tosca.policies.nfv.VduScalingAspectDeltas.
|
||||||
|
The following nodes are not set in hot.
|
||||||
|
->OS::Heat::AutoScalingGroup
|
||||||
|
And create empty <aspect_name>.yaml.
|
||||||
|
In Addition, the following properties are not set in
|
||||||
|
<aspect_name>_scale_in and <aspect_name>_scale_out nodes.
|
||||||
|
->scaling_adjustment
|
||||||
|
parameters: {}
|
||||||
|
resources:
|
||||||
|
CP1:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: #ADD_YOUR_NETWORK_HERE
|
||||||
|
binding:vnic_type: direct-physical
|
||||||
|
VDU1:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_resource: VDU1_flavor }
|
||||||
|
name: VDU1
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP1 }
|
||||||
|
VDU1_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
worker_instance_scale_out:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
worker_instance_scale_in:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
outputs: {}
|
@ -0,0 +1,3 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: Scaling template
|
||||||
|
resources: {}
|
@ -0,0 +1,37 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: >
|
||||||
|
Template for scaling which targets is not set in tosca.policies.nfv.VduInitialDelta.
|
||||||
|
The following properties are not set in <aspect_name>.
|
||||||
|
->min_size
|
||||||
|
->max_size
|
||||||
|
parameters: {}
|
||||||
|
resources:
|
||||||
|
VDU1_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
worker_instance:
|
||||||
|
type: OS::Heat::AutoScalingGroup
|
||||||
|
properties:
|
||||||
|
resource:
|
||||||
|
type: worker_instance.hot.yaml
|
||||||
|
properties:
|
||||||
|
vdu1_flavor_id: { get_resource: VDU1_flavor }
|
||||||
|
desired_capacity: DESIRED_CAPACITY
|
||||||
|
worker_instance_scale_out:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
scaling_adjustment: 1
|
||||||
|
worker_instance_scale_in:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
scaling_adjustment: -1
|
||||||
|
outputs: {}
|
@ -0,0 +1,19 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: Scaling template
|
||||||
|
parameters:
|
||||||
|
vdu1_flavor_id:
|
||||||
|
type: string
|
||||||
|
resources:
|
||||||
|
CP1:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: #ADD_YOUR_NETWORK_HERE
|
||||||
|
binding:vnic_type: direct-physical
|
||||||
|
VDU1:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_param: vdu1_flavor_id }
|
||||||
|
name: VDU1
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP1 }
|
@ -0,0 +1,61 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: >
|
||||||
|
Template for deploying two VDU and two CP and one VirtualLink with scaling.
|
||||||
|
parameters: {}
|
||||||
|
resources:
|
||||||
|
VDU1_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
VDU2_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
VL1:
|
||||||
|
type: OS::Neutron::Net
|
||||||
|
properties:
|
||||||
|
qos_policy: { get_resource: VL1_qospolicy }
|
||||||
|
VL1_subnet:
|
||||||
|
type: OS::Neutron::Subnet
|
||||||
|
properties:
|
||||||
|
network: { get_resource: VL1 }
|
||||||
|
ip_version: 4
|
||||||
|
cidr: 11.11.0.0/24
|
||||||
|
VL1_bandwidth:
|
||||||
|
type: OS::Neutron::QoSBandwidthLimitRule
|
||||||
|
properties:
|
||||||
|
max_kbps: 1024
|
||||||
|
policy: { get_resource: VL1_qospolicy }
|
||||||
|
VL1_qospolicy:
|
||||||
|
type: OS::Neutron::QoSPolicy
|
||||||
|
worker_instance:
|
||||||
|
type: OS::Heat::AutoScalingGroup
|
||||||
|
properties:
|
||||||
|
min_size: 1
|
||||||
|
max_size: 3
|
||||||
|
resource:
|
||||||
|
type: worker_instance.hot.yaml
|
||||||
|
properties:
|
||||||
|
vl1_id: { get_resource: VL1 }
|
||||||
|
vdu1_flavor_id: { get_resource: VDU1_flavor }
|
||||||
|
vdu2_flavor_id: { get_resource: VDU2_flavor }
|
||||||
|
desired_capacity: DESIRED_CAPACITY
|
||||||
|
worker_instance_scale_out:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
scaling_adjustment: 1
|
||||||
|
worker_instance_scale_in:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
scaling_adjustment: -1
|
||||||
|
outputs: {}
|
@ -0,0 +1,34 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: Scaling template
|
||||||
|
parameters:
|
||||||
|
vl1_id:
|
||||||
|
type: string
|
||||||
|
vdu1_flavor_id:
|
||||||
|
type: string
|
||||||
|
vdu2_flavor_id:
|
||||||
|
type: string
|
||||||
|
resources:
|
||||||
|
CP1:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: { get_param: vl1_id }
|
||||||
|
VDU1:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_param: vdu1_flavor_id }
|
||||||
|
name: VDU1
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP1 }
|
||||||
|
CP2:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: #ADD_YOUR_NETWORK_HERE
|
||||||
|
VDU2:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_param: vdu2_flavor_id }
|
||||||
|
name: VDU2
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP2 }
|
@ -0,0 +1,67 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: >
|
||||||
|
Template for deploying one VDU and one CP with scaling.
|
||||||
|
parameters: {}
|
||||||
|
resources:
|
||||||
|
VDU1_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
worker_instance1:
|
||||||
|
type: OS::Heat::AutoScalingGroup
|
||||||
|
properties:
|
||||||
|
min_size: 1
|
||||||
|
max_size: 3
|
||||||
|
resource:
|
||||||
|
type: worker_instance1.hot.yaml
|
||||||
|
properties:
|
||||||
|
vdu1_flavor_id: { get_resource: VDU1_flavor }
|
||||||
|
desired_capacity: DESIRED_CAPACITY
|
||||||
|
worker_instance1_scale_out:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance1
|
||||||
|
scaling_adjustment: 1
|
||||||
|
worker_instance1_scale_in:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance1
|
||||||
|
scaling_adjustment: -1
|
||||||
|
|
||||||
|
VDU2_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
worker_instance2:
|
||||||
|
type: OS::Heat::AutoScalingGroup
|
||||||
|
properties:
|
||||||
|
min_size: 2
|
||||||
|
max_size: 10
|
||||||
|
resource:
|
||||||
|
type: worker_instance2.hot.yaml
|
||||||
|
properties:
|
||||||
|
vdu2_flavor_id: { get_resource: VDU2_flavor }
|
||||||
|
desired_capacity: DESIRED_CAPACITY
|
||||||
|
worker_instance2_scale_out:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance2
|
||||||
|
scaling_adjustment: 2
|
||||||
|
worker_instance2_scale_in:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance2
|
||||||
|
scaling_adjustment: -2
|
||||||
|
outputs: {}
|
@ -0,0 +1,19 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: Scaling template
|
||||||
|
parameters:
|
||||||
|
vdu1_flavor_id:
|
||||||
|
type: string
|
||||||
|
resources:
|
||||||
|
CP1:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: #ADD_YOUR_NETWORK_HERE
|
||||||
|
binding:vnic_type: direct-physical
|
||||||
|
VDU1:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_param: vdu1_flavor_id }
|
||||||
|
name: VDU1
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP1 }
|
@ -0,0 +1,19 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: Scaling template
|
||||||
|
parameters:
|
||||||
|
vdu2_flavor_id:
|
||||||
|
type: string
|
||||||
|
resources:
|
||||||
|
CP2:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: #ADD_YOUR_NETWORK_HERE
|
||||||
|
binding:vnic_type: direct-physical
|
||||||
|
VDU2:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_param: vdu2_flavor_id }
|
||||||
|
name: VDU2
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP2 }
|
@ -0,0 +1,59 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: >
|
||||||
|
Template for deploying one VNF and one VDU and one CP and one VirtualLink and BlockStorage with scaling.
|
||||||
|
parameters:
|
||||||
|
selected_flavour:
|
||||||
|
type: string
|
||||||
|
description: VNF deployment flavour selected by the consumer. It is provided in
|
||||||
|
the API
|
||||||
|
default: simple
|
||||||
|
resources:
|
||||||
|
VDU1_flavor:
|
||||||
|
type: OS::Nova::Flavor
|
||||||
|
properties:
|
||||||
|
ram: 512
|
||||||
|
vcpus: 1
|
||||||
|
disk: 1
|
||||||
|
VL1:
|
||||||
|
type: OS::Neutron::Net
|
||||||
|
properties:
|
||||||
|
qos_policy: { get_resource: VL1_qospolicy }
|
||||||
|
VL1_subnet:
|
||||||
|
type: OS::Neutron::Subnet
|
||||||
|
properties:
|
||||||
|
network: { get_resource: VL1 }
|
||||||
|
ip_version: 4
|
||||||
|
cidr: 11.11.0.0/24
|
||||||
|
VL1_bandwidth:
|
||||||
|
type: OS::Neutron::QoSBandwidthLimitRule
|
||||||
|
properties:
|
||||||
|
max_kbps: 1024
|
||||||
|
policy: { get_resource: VL1_qospolicy }
|
||||||
|
VL1_qospolicy:
|
||||||
|
type: OS::Neutron::QoSPolicy
|
||||||
|
worker_instance:
|
||||||
|
type: OS::Heat::AutoScalingGroup
|
||||||
|
properties:
|
||||||
|
min_size: 1
|
||||||
|
max_size: 3
|
||||||
|
resource:
|
||||||
|
type: worker_instance.hot.yaml
|
||||||
|
properties:
|
||||||
|
vl1_id: { get_resource: VL1 }
|
||||||
|
vdu1_flavor_id: { get_resource: VDU1_flavor }
|
||||||
|
desired_capacity: DESIRED_CAPACITY
|
||||||
|
worker_instance_scale_out:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
scaling_adjustment: 1
|
||||||
|
worker_instance_scale_in:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id:
|
||||||
|
get_resource: worker_instance
|
||||||
|
scaling_adjustment: -1
|
||||||
|
outputs: {}
|
@ -0,0 +1,27 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
description: Scaling template
|
||||||
|
parameters:
|
||||||
|
vl1_id:
|
||||||
|
type: string
|
||||||
|
vdu1_flavor_id:
|
||||||
|
type: string
|
||||||
|
resources:
|
||||||
|
CP1:
|
||||||
|
type: OS::Neutron::Port
|
||||||
|
properties:
|
||||||
|
network: { get_param: vl1_id }
|
||||||
|
VDU1:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: { get_param: vdu1_flavor_id }
|
||||||
|
name: VDU1
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
||||||
|
networks:
|
||||||
|
- port: { get_resource: CP1 }
|
||||||
|
block_device_mapping_v2:
|
||||||
|
- volume_id: { get_resource: VirtualStorage }
|
||||||
|
VirtualStorage:
|
||||||
|
type: OS::Cinder::Volume
|
||||||
|
properties:
|
||||||
|
size: 30
|
||||||
|
image: #ADD_YOUR_IMAGE_HERE
|
@ -1,5 +1,5 @@
|
|||||||
heat_template_version: 2013-05-23
|
heat_template_version: 2013-05-23
|
||||||
description: Tacker Scaling template
|
description: Scaling template
|
||||||
resources:
|
resources:
|
||||||
my_server_1:
|
my_server_1:
|
||||||
type: OS::Nova::Server
|
type: OS::Nova::Server
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
heat_template_version: 2013-05-23
|
heat_template_version: 2013-05-23
|
||||||
description: Tacker Scaling template
|
description: Scaling template
|
||||||
resources:
|
resources:
|
||||||
VDU1:
|
VDU1:
|
||||||
type: OS::Nova::Server
|
type: OS::Nova::Server
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
heat_template_version: 2013-05-23
|
heat_template_version: 2013-05-23
|
||||||
description: Tacker Scaling template
|
description: Scaling template
|
||||||
|
|
||||||
parameters:
|
parameters:
|
||||||
flavor: {type: string, default: m1.tiny, description: Flavor Information}
|
flavor: {type: string, default: m1.tiny, description: Flavor Information}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
heat_template_version: 2013-05-23
|
heat_template_version: 2013-05-23
|
||||||
|
|
||||||
description: Tacker Scaling template
|
description: Scaling template
|
||||||
|
|
||||||
parameters:
|
parameters:
|
||||||
flavor: {type: string, description: Flavor Information}
|
flavor: {type: string, description: Flavor Information}
|
||||||
|
@ -200,3 +200,134 @@ class EtsiToscaHotTranslationTest(TestCase):
|
|||||||
'hot_nfv_blockstorage.yaml',
|
'hot_nfv_blockstorage.yaml',
|
||||||
]
|
]
|
||||||
self._test_successful_translation(tosca_file, hot_files, params={})
|
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||||
|
|
||||||
|
def test_hot_translate_etsi_nfv_vnf_vdu_cp_vl_blockstorage_with_scaling(
|
||||||
|
self):
|
||||||
|
tosca_file = '../tests/data/etsi_nfv/' \
|
||||||
|
'tosca_nfv_vnf_vdu_cp_vl_blockstorage_with_scaling.yaml'
|
||||||
|
hot_files = [
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'vnf_vdu_cp_vl_blockstorage_with_scaling/'
|
||||||
|
'hot_nfv_vnf_vdu_cp_vl_blockstorage_with_scaling.yaml',
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'vnf_vdu_cp_vl_blockstorage_with_scaling/'
|
||||||
|
'worker_instance.hot.yaml',
|
||||||
|
]
|
||||||
|
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||||
|
|
||||||
|
def test_hot_translate_etsi_nfv_vdu_cp_vl_with_mixed_scaling(
|
||||||
|
self):
|
||||||
|
tosca_file = '../tests/data/etsi_nfv/' \
|
||||||
|
'tosca_nfv_vdu_cp_vl_with_mixed_scaling.yaml'
|
||||||
|
hot_files = [
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'vdu_cp_vl_with_mixed_scaling/'
|
||||||
|
'hot_nfv_vdu_cp_vl_with_mixed_scaling.yaml',
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'vdu_cp_vl_with_mixed_scaling/'
|
||||||
|
'worker_instance.hot.yaml',
|
||||||
|
]
|
||||||
|
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||||
|
|
||||||
|
def test_hot_translate_etsi_nfv_vdu_cp_with_scaling_multi_aspects(
|
||||||
|
self):
|
||||||
|
tosca_file = '../tests/data/etsi_nfv/' \
|
||||||
|
'tosca_nfv_vdu_cp_with_scaling_multi_aspects.yaml'
|
||||||
|
hot_files = [
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'vdu_cp_with_scaling_multi_aspects/'
|
||||||
|
'hot_nfv_vdu_cp_with_scaling_multi_aspects.yaml',
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'vdu_cp_with_scaling_multi_aspects/'
|
||||||
|
'worker_instance1.hot.yaml',
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'vdu_cp_with_scaling_multi_aspects/'
|
||||||
|
'worker_instance2.hot.yaml',
|
||||||
|
]
|
||||||
|
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||||
|
|
||||||
|
def test_hot_translate_etsi_nfv_scaling_non_target_vdu_in_initial_delta(
|
||||||
|
self):
|
||||||
|
aspect_name = 'worker_instance'
|
||||||
|
vdu_name = 'VDU1'
|
||||||
|
tosca_file = '../tests/data/etsi_nfv/' \
|
||||||
|
'tosca_nfv_scaling_non_target_vdu_in_initial_delta.yaml'
|
||||||
|
hot_files = [
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'scaling_non_target_vdu_in_initial_delta/'
|
||||||
|
'hot_nfv_scaling_non_target_vdu_in_initial_delta.yaml',
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'scaling_non_target_vdu_in_initial_delta/'
|
||||||
|
'worker_instance.hot.yaml',
|
||||||
|
]
|
||||||
|
expected_msgs = (
|
||||||
|
'Can not set the required properties '
|
||||||
|
'min_size and max_size on HOT.'
|
||||||
|
'aspect_name:%s' % aspect_name,
|
||||||
|
)
|
||||||
|
expected_msgs = (
|
||||||
|
'No min_size or(and) max_size is found for '
|
||||||
|
'aspect_name:%s, VDU:%s' % (
|
||||||
|
aspect_name, vdu_name)
|
||||||
|
)
|
||||||
|
|
||||||
|
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||||
|
for expected_msg in expected_msgs:
|
||||||
|
self.assertIn(
|
||||||
|
expected_msg,
|
||||||
|
self.log_fixture.output
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_hot_translate_etsi_nfv_scaling_non_target_vdu_in_aspect_delta(
|
||||||
|
self):
|
||||||
|
aspect_name = 'worker_instance'
|
||||||
|
vdu_name = None
|
||||||
|
delta_name = None
|
||||||
|
tosca_file = '../tests/data/etsi_nfv/' \
|
||||||
|
'tosca_nfv_scaling_non_target_vdu_in_aspect_delta.yaml'
|
||||||
|
hot_files = [
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'scaling_non_target_vdu_in_aspect_delta/'
|
||||||
|
'hot_nfv_scaling_non_target_vdu_in_aspect_delta.yaml',
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'scaling_non_target_vdu_in_aspect_delta/'
|
||||||
|
'worker_instance.hot.yaml',
|
||||||
|
]
|
||||||
|
expected_msgs = (
|
||||||
|
'Can not create %s node '
|
||||||
|
'because target vdu does not defined.'
|
||||||
|
% aspect_name,
|
||||||
|
'No ScalingAspectDelta for %s of %s, %s is '
|
||||||
|
'found' % (vdu_name, aspect_name, delta_name)
|
||||||
|
)
|
||||||
|
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||||
|
for expected_msg in expected_msgs:
|
||||||
|
self.assertIn(
|
||||||
|
expected_msg,
|
||||||
|
self.log_fixture.output
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_hot_translate_etsi_nfv_scaling_non_deltas_in_aspect_delta(self):
|
||||||
|
aspect_name = 'worker_instance'
|
||||||
|
vdu_name = 'VDU1'
|
||||||
|
delta_name = 'delta_2'
|
||||||
|
tosca_file = '../tests/data/etsi_nfv/' \
|
||||||
|
'tosca_nfv_scaling_non_deltas_in_aspect_delta.yaml'
|
||||||
|
hot_files = [
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'scaling_non_deltas_in_aspect_delta/'
|
||||||
|
'hot_nfv_scaling_non_deltas_in_aspect_delta.yaml',
|
||||||
|
'../tests/data/hot_output/etsi_nfv/'
|
||||||
|
'scaling_non_deltas_in_aspect_delta/'
|
||||||
|
'worker_instance.hot.yaml',
|
||||||
|
]
|
||||||
|
expected_msgs = (
|
||||||
|
'No ScalingAspectDelta for %s of %s, %s is '
|
||||||
|
'found' % (vdu_name, aspect_name, delta_name)
|
||||||
|
)
|
||||||
|
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||||
|
for expected_msg in expected_msgs:
|
||||||
|
self.assertIn(
|
||||||
|
expected_msg,
|
||||||
|
self.log_fixture.output
|
||||||
|
)
|
||||||
|
@ -38,7 +38,13 @@ class TranslateNodeTemplatesTest(TestCase):
|
|||||||
'tosca.nodes.nfv.Vdu.Compute',
|
'tosca.nodes.nfv.Vdu.Compute',
|
||||||
'tosca.nodes.nfv.Vdu.VirtualBlockStorage',
|
'tosca.nodes.nfv.Vdu.VirtualBlockStorage',
|
||||||
'tosca.nodes.nfv.VduCp',
|
'tosca.nodes.nfv.VduCp',
|
||||||
'tosca.nodes.nfv.VnfVirtualLink'
|
'tosca.nodes.nfv.VnfVirtualLink',
|
||||||
|
'tosca.policies.nfv.InstantiationLevels',
|
||||||
|
'tosca.policies.nfv.ScalingAspects',
|
||||||
|
'tosca.policies.nfv.VduInitialDelta',
|
||||||
|
'tosca.policies.nfv.VduInstantiationLevels',
|
||||||
|
'tosca.policies.nfv.VduScalingAspectDeltas',
|
||||||
|
'tosca.policies.nfv.VirtualLinkInstantiationLevels'
|
||||||
]
|
]
|
||||||
actual_type_list = list(_generate_type_map())
|
actual_type_list = list(_generate_type_map())
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user