{#
Copyright 2017-present Open Networking Foundation

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.
#}


tosca_definitions_version: tosca_simple_yaml_1_0

description: created by platform-install, need to add M-CORD services later

imports:
   - custom_types/xos.yaml
   - custom_types/sdncontroller.yaml

topology_template:
  node_templates:

# site, image, fully created in deployment.yaml
    {{ site_name }}:
      type: tosca.nodes.Site

    m1.small:
      type: tosca.nodes.Flavor
    m1.large:
      type: tosca.nodes.Flavor
    m1.medium:
      type: tosca.nodes.Flavor
    m1.xlarge:
      type: tosca.nodes.Flavor

    trusty-server-multi-nic:
      type: tosca.nodes.Image

# management networks, fully created in management-net.yaml
    management:
      type: tosca.nodes.network.Network.XOS
      properties:
        no-create: true
        no-delete: true
        no-update: true

{% if use_management_hosts %}
    management_hosts:
      type: tosca.nodes.network.Network.XOS
      properties:
        no-create: true
        no-delete: true
        no-update: true
{% endif %}

# sbi_network
    sbi_network:
      type: tosca.nodes.network.Network.XOS
      properties:
        no-create: true
        no-delete: true
        no-update: true

# nbi_network
    nbi_network:
      type: tosca.nodes.network.Network.XOS
      properties:
        no-create: true
        no-delete: true
        no-update: true


# CORD Services
    service#sdncontroller:
      type: tosca.nodes.SDNControllerService
      properties:
          public_key: { get_artifact: [ SELF, pubkey, LOCAL_FILE] }
          private_key_fn: /opt/xos/services/sdncontroller/keys/mcord_rsa
      artifacts:
          pubkey: /opt/cord_profile/key_import/mcord_rsa.pub

# CORD Slices
    {{ site_name }}_sdncontroller:
      description: SDN controller slice
      type: tosca.nodes.Slice
      properties:
          network: noauto
      requirements:
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite
          - sdncontroller_service:
              node: service#sdncontroller
              relationship: tosca.relationships.MemberOfService
          - default_image:
              node: trusty-server-multi-nic
              relationship: tosca.relationships.DefaultImage
          - default_flavor:
              node: m1.small
              relationship: tosca.relationships.DefaultFlavor
          - connection_to_management:
              node: management
              relationship: tosca.relationships.ConnectsToNetwork
          - connection_to_sbi_network:
              node: sbi_network
              relationship: tosca.relationships.ConnectsToNetwork
          - connection_to_nbi_network:
              node: nbi_network
              relationship: tosca.relationships.ConnectsToNetwork