Merge "Provide parsing support for multiple policies"
This commit is contained in:
commit
e3aa060102
@ -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:
|
||||
|
183
toscaparser/tests/data/policies/tacker_defs.yaml
Normal file
183
toscaparser/tests/data/policies/tacker_defs.yaml
Normal file
@ -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...
|
261
toscaparser/tests/data/policies/tacker_nfv_defs.yaml
Normal file
261
toscaparser/tests/data/policies/tacker_nfv_defs.yaml
Normal file
@ -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]
|
||||
|
Loading…
x
Reference in New Issue
Block a user