tosca_definitions_version: tosca_simple_yaml_1_0

description: Setup CORD-related services -- vOLT, vCPE, vBNG.

imports:
   - custom_types/xos.yaml

topology_template:
  node_templates:
    # CORD Services
    service_volt:
      type: tosca.nodes.Service
      requirements:
          - vcpe_tenant:
              node: service_vsg
              relationship: tosca.relationships.TenantOfService
          - lan_network:
              node: lan_network
              relationship: tosca.relationships.UsesNetwork
          - wan_network:
              node: wan_network
              relationship: tosca.relationships.UsesNetwork
      properties:
          view_url: /admin/cord/voltservice/$id$/
          kind: vOLT

    service_vsg:
      type: tosca.nodes.VSGService
      requirements:
          - vbng_tenant:
              node: service_vbng
              relationship: tosca.relationships.TenantOfService
      properties:
          view_url: /admin/cord/vsgservice/$id$/
          backend_network_label: hpc_client
          #public_key: { get_artifact: [ SELF, pubkey, LOCAL_FILE] }
          #private_key_fn: /opt/xos/synchronizers/vcpe/vcpe_private_key
      #artifacts:
          #pubkey: /opt/xos/synchronizers/vcpe/vcpe_public_key

    service_vbng:
      type: tosca.nodes.VBNGService
      properties:
          view_url: /admin/cord/vbngservice/$id$/
# if unspecified, vbng observer will look for an ONOSApp Tenant and
# generate a URL from its IP address
#          vbng_url: http://10.11.10.24:8181/onos/virtualbng/

    service_ONOS_vBNG:
      type: tosca.nodes.ONOSService
      requirements:
      properties:
          kind: onos
          view_url: /admin/onos/onosservice/$id$/
          #public_key: { get_artifact: [ SELF, pubkey, LOCAL_FILE] }
      #artifacts:
          #pubkey: /opt/xos/synchronizers/onos/onos_key.pub

#
# To actually bring up the vBNG app
# - Set up the dataplane using the ansible script
# - Log into the vBNG ONOS and run 'devices' to get switch dpID
# - Change the dpID values in vBNG ONOS app in XOS GUI
# - (Synchronizer should copy the files to ONOS container immediately)
# - Log into service_ONOS_vBNG VM and restart ONOS Docker container
#   (Should roll this step into a Synchronizer)
#f
    vBNG_ONOS_app:
      type: tosca.nodes.ONOSvBNGApp
      requirements:
          - onos_tenant:
              node: service_ONOS_vBNG
              relationship: tosca.relationships.TenantOfService
          - vbng_service:
              node: service_vbng
              relationship: tosca.relationships.UsedByService
      properties:
          dependencies: org.onosproject.proxyarp, org.onosproject.virtualbng, org.onosproject.openflow, org.onosproject.fwd
          config_network-cfg.json: >
            {
              "ports" : {
                "of:0000000000000001/1" : {
                  "interfaces" : [
                    {
                      "ips"  : [ "10.0.1.253/24" ],
                      "mac"  : "00:00:00:00:00:99"
                    }
                  ]
                },
                "of:0000000000000001/2" : {
                  "interfaces" : [
                    {
                      "ips"  : [ "10.254.0.2/24" ],
                      "mac"  : "00:00:00:00:00:98"
                    }
                  ]
                }
              }
            }
          #config_virtualbng.json: { get_artifact: [ SELF, virtualbng_json, LOCAL_FILE] }
      #artifacts:
          #virtualbng_json: /root/setup/virtualbng.json

    service_ONOS_vOLT:
      type: tosca.nodes.ONOSService
      requirements:
      properties:
          kind: onos
          view_url: /admin/onos/onosservice/$id$/
          #public_key: { get_artifact: [ SELF, pubkey, LOCAL_FILE] }
          rest_onos/v1/network/configuration/: >
            {
              "devices" : {
                "of:0000000000000001" : {
                  "accessDevice" : {
                    "uplink" : "2",
                    "vlan"   : "222",
                    "defaultVlan" : "1"
                  },
                  "basic" : {
                    "driver" : "pmc-olt"
                  }
                }
              }
            }
      #artifacts:
          #pubkey: /opt/xos/synchronizers/onos/onos_key.pub


    vOLT_ONOS_app:
      type: tosca.nodes.ONOSvOLTApp
      requirements:
          - onos_tenant:
              node: service_ONOS_vOLT
              relationship: tosca.relationships.TenantOfService
          - volt_service:
              node: service_volt
              relationship: tosca.relationships.UsedByService
      properties:
          install_dependencies: onos-ext-notifier-1.0-SNAPSHOT.oar, onos-ext-volt-event-publisher-1.0-SNAPSHOT.oar
          dependencies: org.onosproject.openflow-base, org.onosproject.olt, org.ciena.onos.ext_notifier, org.ciena.onos.volt_event_publisher
          component_config: >
             {
                "org.ciena.onos.ext_notifier.KafkaNotificationBridge":{
                   "rabbit.user": "<rabbit_user>",
                   "rabbit.password": "<rabbit_password>",
                   "rabbit.host": "<rabbit_host>",
                   "publish.rabbit": "true",
                   "volt.events.rabbit.topic": "notifications.info",
                   "volt.events.rabbit.exchange": "voltlistener",
                   "volt.events.opaque.info": "{project_id: <keystone_tenant_id>, user_id: <keystone_user_id>}",
                   "publish.volt.events": "true"
                }
             }
#          config_network-cfg.json: >
#            {
#              "devices" : {
#                "of:0000000000000001" : {
#                  "accessDevice" : {
#                    "uplink" : "2",
#                    "vlan"   : "222",
#                    "defaultVlan" : "1"
#                  },
#                  "basic" : {
#                    "driver" : "default"
#                  }
#                }
#              }
#            }

    # Network templates
    Private:
      type: tosca.nodes.NetworkTemplate

    Public network hack:
      type: tosca.nodes.NetworkTemplate
      properties:
          visibility: private
          translation: NAT
          shared_network_name: tun0-net


    # Networks required by the CORD setup
    lan_network:
      type: tosca.nodes.network.Network
      properties:
          ip_version: 4
      requirements:
          - network_template:
              node: Private
              relationship: tosca.relationships.UsesNetworkTemplate
          - owner:
              node: mysite_vcpe
              relationship: tosca.relationships.MemberOfSlice
          - connection:
              node: mysite_vcpe
              relationship: tosca.relationships.ConnectsToSlice
          - connection:
              node: mysite_volt
              relationship: tosca.relationships.ConnectsToSlice

    wan_network:
      type: tosca.nodes.network.Network
      properties:
          ip_version: 4
      requirements:
          - network_template:
              node: Private
              relationship: tosca.relationships.UsesNetworkTemplate
          - owner:
              node: mysite_vcpe
              relationship: tosca.relationships.MemberOfSlice
          - connection:
              node: mysite_vcpe
              relationship: tosca.relationships.ConnectsToSlice
          - connection:
              node: mysite_vbng
              relationship: tosca.relationships.ConnectsToSlice

    Private-Direct:
      type: tosca.nodes.NetworkTemplate
      properties:
          access: direct

    Private-Indirect:
      type: tosca.nodes.NetworkTemplate
      properties:
          access: indirect

    subscriber_network:
      type: tosca.nodes.network.Network
      properties:
          ip_version: 4
      requirements:
          - network_template:
              node: Private
              relationship: tosca.relationships.UsesNetworkTemplate
          - owner:
              node: mysite_volt
              relationship: tosca.relationships.MemberOfSlice
          - connection:
              node: mysite_volt
              relationship: tosca.relationships.ConnectsToSlice
          - connection:
              node: mysite_clients
              relationship: tosca.relationships.ConnectsToSlice

    public_network:
      type: tosca.nodes.network.Network
      properties:
      requirements:
          - network_template:
              node: Public network hack
              relationship: tosca.relationships.UsesNetworkTemplate
          - owner:
              node: mysite_vbng
              relationship: tosca.relationships.MemberOfSlice
          - connection:
              node: mysite_vbng
              relationship: tosca.relationships.ConnectsToSlice


    mysite:
      type: tosca.nodes.Site


    # CORD Slices
    mysite_vcpe:
      description: vCPE Controller Slice
      type: tosca.nodes.Slice
      requirements:
          - vcpe_service:
              node: service_vsg
              relationship: tosca.relationships.MemberOfService
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite
          - vcpe_docker_image:
              node: docker-vcpe
              relationship: tosca.relationships.UsesImage
#      properties:
#          default_isolation: container

    mysite_onos_vbng:
      description: ONOS Controller Slice for vBNG
      type: tosca.nodes.Slice
      requirements:
          - ONOS:
              node: service_ONOS_vBNG
              relationship: tosca.relationships.MemberOfService
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite

    mysite_onos_volt:
      description: ONOS Controller Slice for vOLT
      type: tosca.nodes.Slice
      requirements:
          - ONOS:
              node: service_ONOS_vOLT
              relationship: tosca.relationships.MemberOfService
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite

    mysite_vbng:
      description: slice running OVS controlled by vBNG
      type: tosca.nodes.Slice
      requirements:
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite

    mysite_volt:
      description: OVS controlled by vOLT
      type: tosca.nodes.Slice
      requirements:
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite

    mysite_clients:
      description: slice for clients at the subscriber
      type: tosca.nodes.Slice
      requirements:
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite


    # Virtual machines
    onos_app_1:
      type: tosca.nodes.Compute
      capabilities:
        # Host container properties
        host:
         properties:
           num_cpus: 1
           disk_size: 10 GB
           mem_size: 4 MB
        # Guest Operating System properties
        os:
          properties:
            # host Operating System image properties
            architecture: x86_64
            type: linux
            distribution: Ubuntu
            version: 14.10
      requirements:
          - slice:
                node: mysite_onos_vbng
                relationship: tosca.relationships.MemberOfSlice

    onos_app_2:
      type: tosca.nodes.Compute
      capabilities:
        # Host container properties
        host:
         properties:
           num_cpus: 1
           disk_size: 10 GB
           mem_size: 4 MB
        # Guest Operating System properties
        os:
          properties:
            # host Operating System image properties
            architecture: x86_64
            type: linux
            distribution: Ubuntu
            version: 14.10
      requirements:
          - slice:
                node: mysite_onos_volt
                relationship: tosca.relationships.MemberOfSlice

    # VM for running the OVS controlled by vBNG
    ovs_vbng:
      type: tosca.nodes.Compute
      capabilities:
        # Host container properties
        host:
         properties:
           num_cpus: 1
           disk_size: 10 GB
           mem_size: 4 MB
        # Guest Operating System properties
        os:
          properties:
            # host Operating System image properties
            architecture: x86_64
            type: linux
            distribution: ubuntu
            version: 14.04
      requirements:
          - slice:
                node: mysite_vbng
                relationship: tosca.relationships.MemberOfSlice

    # VM for running the OVS controlled by vOLT
    ovs_volt:
      type: tosca.nodes.Compute
      capabilities:
        # Host container properties
        host:
         properties:
           num_cpus: 1
           disk_size: 10 GB
           mem_size: 4 MB
        # Guest Operating System properties
        os:
          properties:
            # host Operating System image properties
            architecture: x86_64
            type: linux
            distribution: ubuntu
            version: 14.04
      requirements:
          - slice:
                node: mysite_volt
                relationship: tosca.relationships.MemberOfSlice

    # A subscriber client VM
    client1:
      type: tosca.nodes.Compute
      capabilities:
        # Host container properties
        host:
         properties:
           num_cpus: 1
           disk_size: 10 GB
           mem_size: 4 MB
        # Guest Operating System properties
        os:
          properties:
            # host Operating System image properties
            architecture: x86_64
            type: linux
            distribution: ubuntu
            version: 14.04
      requirements:
          - slice:
                node: mysite_clients
                relationship: tosca.relationships.MemberOfSlice

    # docker image for vcpe containers
    docker-vcpe:
      # TODO: need to attach this to mydeployment
      type: tosca.nodes.Image
      properties:
        kind: container
        container_format: na
        disk_format: na
        path: andybavier/docker-vcpe
        tag: develop

    # Let's add a user who can be administrator of the household
    johndoe@myhouse.com:
      type: tosca.nodes.User
      properties:
          password: letmein
          firstname: john
          lastname: doe
      requirements:
          - site:
              node: mysite
              relationship: tosca.relationships.MemberOfSite

    # A subscriber
    My House:
       type: tosca.nodes.CORDSubscriber
       properties:
           service_specific_id: 123
           firewall_enable: false
           cdn_enable: false
           url_filter_enable: false
           url_filter_level: R
       requirements:
          - house_admin:
              node: johndoe@myhouse.com
              relationship: tosca.relationships.AdminPrivilege

    Mom's PC:
       type: tosca.nodes.CORDUser
       properties:
           mac: 01:02:03:04:05:06
           level: PG_13
       requirements:
           - household:
               node: My House
               relationship: tosca.relationships.SubscriberDevice

    Dad's PC:
       type: tosca.nodes.CORDUser
       properties:
           mac: 90:E2:BA:82:F9:75
           level: PG_13
       requirements:
           - household:
               node: My House
               relationship: tosca.relationships.SubscriberDevice

    Jack's Laptop:
       type: tosca.nodes.CORDUser
       properties:
           mac: 68:5B:35:9D:91:D5
           level: PG_13
       requirements:
           - household:
               node: My House
               relationship: tosca.relationships.SubscriberDevice

    Jill's Laptop:
       type: tosca.nodes.CORDUser
       properties:
           mac: 34:36:3B:C9:B6:A6
           level: PG_13
       requirements:
           - household:
               node: My House
               relationship: tosca.relationships.SubscriberDevice

    My Volt:
        type: tosca.nodes.VOLTTenant
        properties:
            service_specific_id: 123
            s_tag: 222
            c_tag: 432
        requirements:
            - provider_service:
                node: service_volt
                relationship: tosca.relationships.MemberOfService
            - subscriber:
                node: My House
                relationship: tosca.relationships.BelongsToSubscriber

    # DASHBOARDS
    Customer Care:
      type: tosca.nodes.DashboardView
      properties:
          url: template:xosDiagnostic

    padmin@vicci.org:
      type: tosca.nodes.User
      properties:
          firstname: XOS
          lastname: admin
          is_admin: true
      requirements:
          - customer_care_dashboard:
              node: Customer Care
              relationship: tosca.relationships.UsesDashboard
