Merge "Provide parsing support for multiple policies"

This commit is contained in:
Jenkins 2017-01-18 19:39:35 +00:00 committed by Gerrit Code Review
commit e3aa060102
10 changed files with 578 additions and 10 deletions

@ -20,9 +20,10 @@ from toscaparser.utils.validateutils import TOSCAVersionProperty
class PolicyType(StatefulEntityType):
'''TOSCA built-in policies type.'''
SECTIONS = (DERIVED_FROM, METADATA, PROPERTIES, VERSION, DESCRIPTION, TARGETS, TYPE) = \
SECTIONS = (DERIVED_FROM, METADATA, PROPERTIES, VERSION, DESCRIPTION,
TARGETS, TRIGGERS, TYPE) = \
('derived_from', 'metadata', 'properties', 'version',
'description', 'targets', 'type')
'description', 'targets', 'triggers', 'type')
def __init__(self, ptype, custom_def=None):
super(PolicyType, self).__init__(ptype, self.POLICY_PREFIX,

@ -68,7 +68,6 @@ class EntityTemplate(object):
' a "type" ''attribute.') % dict(pname=name))
ExceptionCollector.appendException(
ValidationError(msg))
self.type_definition = PolicyType(type, custom_def)
if entity_name == 'group_type':
self.type_definition = GroupType(type, custom_def) \

@ -29,7 +29,8 @@ log = logging.getLogger('tosca')
class Policy(EntityTemplate):
'''Policies defined in Topology template.'''
def __init__(self, name, policy, targets, targets_type, custom_def=None):
def __init__(self, name, policy, targets=None, targets_type=None,
custom_def=None):
super(Policy, self).__init__(name,
policy,
'policy_type',
@ -41,6 +42,9 @@ class Policy(EntityTemplate):
self.targets_list = targets
self.targets_type = targets_type
self.triggers = self._triggers(policy.get(TRIGGERS))
self.properties = None
if 'properties' in policy:
self.properties = policy['properties']
self._validate_keys()
@property

@ -90,6 +90,18 @@ class ParserShell(object):
for node in nodetemplates:
print("\t" + node.name)
# example of retrieving policy object
'''if hasattr(tosca, 'policies'):
policies = tosca.policies
if policies:
print("policies:")
for policy in policies:
print("\t" + policy.name)
if policy.triggers:
print("\ttriggers:")
for trigger in policy.triggers:
print ("\ttrigger name:" + trigger.name)'''
if hasattr(tosca, 'outputs'):
outputs = tosca.outputs
if outputs:

@ -0,0 +1,183 @@
tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
data_types:
tosca.datatypes.tacker.ActionMap:
properties:
trigger:
type: string
required: true
action:
type: string
required: true
params:
type: map
entry_schema:
type: string
required: false
tosca.datatypes.tacker.MonitoringParams:
properties:
monitoring_delay:
type: int
required: false
count:
type: int
required: false
interval:
type: int
required: false
timeout:
type: int
required: false
retry:
type: int
required: false
port:
type: int
required: false
tosca.datatypes.tacker.MonitoringType:
properties:
name:
type: string
required: true
actions:
type: map
required: true
parameters:
type: tosca.datatypes.tacker.MonitoringParams
required: false
tosca.datatypes.compute_properties:
properties:
num_cpus:
type: integer
required: false
mem_size:
type: string
required: false
disk_size:
type: string
required: false
mem_page_size:
type: string
required: false
numa_node_count:
type: integer
constraints:
- greater_or_equal: 2
required: false
numa_nodes:
type: map
required: false
cpu_allocation:
type: map
required: false
policy_types:
tosca.policies.tacker.Placement:
derived_from: tosca.policies.Root
tosca.policies.tacker.Failure:
derived_from: tosca.policies.Root
action:
type: string
tosca.policies.tacker.Failure.Respawn:
derived_from: tosca.policies.tacker.Failure
action: respawn
tosca.policies.tacker.Failure.Terminate:
derived_from: tosca.policies.tacker.Failure
action: log_and_kill
tosca.policies.tacker.Failure.Log:
derived_from: tosca.policies.tacker.Failure
action: log
tosca.policies.tacker.Monitoring:
derived_from: tosca.policies.Root
properties:
name:
type: string
required: true
parameters:
type: map
entry_schema:
type: string
required: false
actions:
type: map
entry_schema:
type: string
required: true
tosca.policies.tacker.Monitoring.NoOp:
derived_from: tosca.policies.tacker.Monitoring
properties:
name: noop
tosca.policies.tacker.Monitoring.Ping:
derived_from: tosca.policies.tacker.Monitoring
properties:
name: ping
tosca.policies.tacker.Monitoring.HttpPing:
derived_from: tosca.policies.tacker.Monitoring.Ping
properties:
name: http-ping
tosca.policies.tacker.Alarming:
derived_from: tosca.policies.Monitoring
triggers:
resize_compute:
event_type:
type: map
entry_schema:
type: string
required: true
metrics:
type: string
required: true
condition:
type: map
entry_schema:
type: string
required: false
action:
type: map
entry_schema:
type: string
required: true
tosca.policies.tacker.Scaling:
derived_from: tosca.policies.Scaling
description: Defines policy for scaling the given targets.
properties:
increment:
type: integer
required: true
description: Number of nodes to add or remove during the scale out/in.
targets:
type: list
entry_schema:
type: string
required: true
description: List of Scaling nodes.
min_instances:
type: integer
required: true
description: Minimum number of instances to scale in.
max_instances:
type: integer
required: true
description: Maximum number of instances to scale out.
default_instances:
type: integer
required: true
description: Initial number of instances.
cooldown:
type: integer
required: false
default: 120
description: Wait time (in seconds) between consecutive scaling operations. During the cooldown period...

@ -0,0 +1,261 @@
tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
data_types:
tosca.nfv.datatypes.pathType:
properties:
forwarder:
type: string
required: true
capability:
type: string
required: true
tosca.nfv.datatypes.aclType:
properties:
eth_type:
type: string
required: false
eth_src:
type: string
required: false
eth_dst:
type: string
required: false
vlan_id:
type: integer
constraints:
- in_range: [ 1, 4094 ]
required: false
vlan_pcp:
type: integer
constraints:
- in_range: [ 0, 7 ]
required: false
mpls_label:
type: integer
constraints:
- in_range: [ 16, 1048575]
required: false
mpls_tc:
type: integer
constraints:
- in_range: [ 0, 7 ]
required: false
ip_dscp:
type: integer
constraints:
- in_range: [ 0, 63 ]
required: false
ip_ecn:
type: integer
constraints:
- in_range: [ 0, 3 ]
required: false
ip_src_prefix:
type: string
required: false
ip_dst_prefix:
type: string
required: false
ip_proto:
type: integer
constraints:
- in_range: [ 1, 254 ]
required: false
destination_port_range:
type: string
required: false
source_port_range:
type: string
required: false
network_src_port_id:
type: string
required: false
network_dst_port_id:
type: string
required: false
network_id:
type: string
required: false
network_name:
type: string
required: false
tenant_id:
type: string
required: false
icmpv4_type:
type: integer
constraints:
- in_range: [ 0, 254 ]
required: false
icmpv4_code:
type: integer
constraints:
- in_range: [ 0, 15 ]
required: false
arp_op:
type: integer
constraints:
- in_range: [ 1, 25 ]
required: false
arp_spa:
type: string
required: false
arp_tpa:
type: string
required: false
arp_sha:
type: string
required: false
arp_tha:
type: string
required: false
ipv6_src:
type: string
required: false
ipv6_dst:
type: string
required: false
ipv6_flabel:
type: integer
constraints:
- in_range: [ 0, 1048575]
required: false
icmpv6_type:
type: integer
constraints:
- in_range: [ 0, 255]
required: false
icmpv6_code:
type: integer
constraints:
- in_range: [ 0, 7]
required: false
ipv6_nd_target:
type: string
required: false
ipv6_nd_sll:
type: string
required: false
ipv6_nd_tll:
type: string
required: false
tosca.nfv.datatypes.policyType:
properties:
type:
type: string
required: false
constraints:
- valid_values: [ ACL ]
criteria:
type: list
required: true
entry_schema:
type: tosca.nfv.datatypes.aclType
node_types:
tosca.nodes.nfv.VDU.Tacker:
derived_from: tosca.nodes.nfv.VDU
capabilities:
nfv_compute:
type: tosca.datatypes.compute_properties
properties:
name:
type: string
required: false
image:
# type: tosca.artifacts.Deployment.Image.VM
type: string
required: false
flavor:
type: string
required: false
availability_zone:
type: string
required: false
metadata:
type: map
entry_schema:
type: string
required: false
config_drive:
type: boolean
default: false
required: false
placement_policy:
# type: tosca.policies.tacker.Placement
type: string
required: false
monitoring_policy:
# type: tosca.policies.tacker.Monitoring
# type: tosca.datatypes.tacker.MonitoringType
type: map
required: false
config:
type: string
required: false
mgmt_driver:
type: string
default: noop
required: false
service_type:
type: string
required: false
user_data:
type: string
required: false
user_data_format:
type: string
required: false
key_name:
type: string
required: false
tosca.nodes.nfv.CP.Tacker:
derived_from: tosca.nodes.nfv.CP
properties:
mac_address:
type: string
required: false
name:
type: string
required: false
management:
type: boolean
required: false
anti_spoofing_protection:
type: boolean
required: false
security_groups:
type: list
required: false
type:
type: string
required: false
constraints:
- valid_values: [ sriov, vnic ]
tosca.nodes.nfv.FP.Tacker:
derived_from: tosca.nodes.Root
properties:
id:
type: integer
required: false
policy:
type: tosca.nfv.datatypes.policyType
required: true
description: policy to use to match traffic for this FP
path:
type: list
required: true
entry_schema:
type: tosca.nfv.datatypes.pathType

@ -0,0 +1,95 @@
tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
description: sample-tosca-vnfd-scaling
imports:
- tacker_defs.yaml
- tacker_nfv_defs.yaml
metadata:
template_name: sample-tosca-vnfd-scaling
topology_template:
node_templates:
VDU1:
type: tosca.nodes.nfv.VDU.Tacker
properties:
image: cirros-0.3.4-x86_64-uec
mgmt_driver: noop
availability_zone: nova
flavor: m1.tiny
CP1:
type: tosca.nodes.nfv.CP.Tacker
properties:
management: true
order: 0
anti_spoofing_protection: false
requirements:
- virtualLink:
node: VL1
- virtualBinding:
node: VDU1
VDU2:
type: tosca.nodes.nfv.VDU.Tacker
properties:
image: cirros-0.3.4-x86_64-uec
mgmt_driver: noop
availability_zone: nova
flavor: m1.tiny
CP2:
type: tosca.nodes.nfv.CP.Tacker
properties:
management: true
order: 0
anti_spoofing_protection: false
requirements:
- virtualLink:
node: VL1
- virtualBinding:
node: VDU2
VL1:
type: tosca.nodes.nfv.VL
properties:
network_name: net_mgmt
vendor: Tacker
policies:
- SP1:
type: tosca.policies.tacker.Scaling
targets: [VDU1]
properties:
increment: 1
cooldown: 120
min_instances: 1
max_instances: 2
default_instances: 1
- SP2:
type: tosca.policies.tacker.Scaling
targets: [VDU2]
properties:
increment: 1
cooldown: 120
min_instances: 1
max_instances: 2
default_instances: 1
- ALRM1:
type: tosca.policies.tacker.Monitoring
triggers:
resize_compute:
event_type:
type: tosca.events.resource.utilization
implementation: ceilometer
condition:
constraint: 50
period: 600
evaluations: 1
method: avg
action:
resize_compute:
action_name: SP1

@ -842,3 +842,12 @@ class ToscaTemplateTest(TestCase):
os.path.dirname(os.path.abspath(__file__)),
"data/dsl_definitions/test_nested_dsl_def.yaml")
self.assertIsNotNone(ToscaTemplate(tosca_tpl))
def test_multiple_policies(self):
tosca_tpl = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
"data/policies/test_tosca_nfv_multiple_policies.yaml")
tosca = ToscaTemplate(tosca_tpl)
self.assertEqual(
['ALRM1', 'SP1', 'SP2'],
sorted([policy.name for policy in tosca.policies]))

@ -130,17 +130,17 @@ class TopologyTemplate(object):
for policy in self._tpl_policies():
for policy_name, policy_tpl in policy.items():
target_list = policy_tpl.get('targets')
target_objects = []
targets_type = "groups"
if target_list and len(target_list) >= 1:
target_objects = []
targets_type = "groups"
target_objects = self._get_policy_groups(target_list)
if not target_objects:
targets_type = "node_templates"
target_objects = self._get_group_members(target_list)
policyObj = Policy(policy_name, policy_tpl,
target_objects, targets_type,
self.custom_defs)
policies.append(policyObj)
policyObj = Policy(policy_name, policy_tpl,
target_objects, targets_type,
self.custom_defs)
policies.append(policyObj)
return policies
def _groups(self):

@ -105,6 +105,7 @@ class ToscaTemplate(object):
self.relationship_templates = self._relationship_templates()
self.nodetemplates = self._nodetemplates()
self.outputs = self._outputs()
self.policies = self._policies()
self._handle_nested_tosca_templates_with_topology()
self.graph = ToscaGraph(self.nodetemplates)
@ -160,6 +161,9 @@ class ToscaTemplate(object):
def _tpl_topology_template(self):
return self.tpl.get(TOPOLOGY_TEMPLATE)
def _policies(self):
return self.topology_template.policies
def _get_all_custom_defs(self, imports=None):
types = [IMPORTS, NODE_TYPES, CAPABILITY_TYPES, RELATIONSHIP_TYPES,
DATA_TYPES, INTERFACE_TYPES, POLICY_TYPES, GROUP_TYPES]