# Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
#
# 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.

# curl -H "xos-username: admin@opencord.org" -H "xos-password: letmein" -X POST --data-binary @onf-mcord-pod1-fabric.yaml http://10.90.0.131:30007/run

tosca_definitions_version: tosca_simple_yaml_1_0
imports:
  - custom_types/switch.yaml
  - custom_types/switchport.yaml
  - custom_types/portinterface.yaml
  - custom_types/fabricipaddress.yaml
  - custom_types/site.yaml
  - custom_types/deployment.yaml
  - custom_types/sitedeployment.yaml
  - custom_types/node.yaml
  - custom_types/vrouterservice.yaml
  - custom_types/vrouterserviceinstance.yaml

description: Configures the ONF SEBA POD with AT&T workflow

topology_template:
  node_templates:

    # Site deployment
    mySite:
      type: tosca.nodes.Site
      properties:
          name: mysite
          login_base: opencord
          abbreviated_name: ms
          site_url: http://opencord.org/
          hosts_nodes: true

    myDeployment:
      type: tosca.nodes.Deployment
      properties:
        name: mydeployment

    site_deployment:
      type: tosca.nodes.SiteDeployment
      requirements:
        - site:
            node: mySite
            relationship: tosca.relationships.BelongsToOne
        - deployment:
            node: myDeployment
            relationship: tosca.relationships.BelongsToOne

    # compute nodes
    node#node1:
        type: tosca.nodes.Node
        properties:
            dataPlaneIntf: eth2
            dataPlaneIp: 118.0.0.201
            name: node1
        requirements:
            - site_deployment:
                node: site_deployment
                relationship: tosca.relationships.BelongsToOne

    node#node2:
        type: tosca.nodes.Node
        properties:
            dataPlaneIntf: eth2
            dataPlaneIp: 118.0.0.202
            name: node2
        requirements:
            - site_deployment:
                node: site_deployment
                relationship: tosca.relationships.BelongsToOne

    node#node3:
        type: tosca.nodes.Node
        properties:
            dataPlaneIntf: eth2
            dataPlaneIp: 118.0.0.203
            name: node3
        requirements:
            - site_deployment:
                node: site_deployment
                relationship: tosca.relationships.BelongsToOne

    service#vrouter:
        type: tosca.nodes.VRouterService
        properties:
          name: vrouter
          must-exist: true

    vroutersi#calico:
        type: tosca.nodes.VRouterServiceInstance
        properties:
          name: calico
        requirements:
          - owner:
              node: service#vrouter
              relationship: tosca.relationships.BelongsToOne

    # Fabric configuration
    switch#leaf_1:
      type: tosca.nodes.Switch
      properties:
        driver: ofdpa3
        ipv4Loopback: 192.168.0.204
        ipv4NodeSid: 214
        isEdgeRouter: true
        name: Agg Switch
        ofId: of:0000000000000001
        routerMac: 54:87:de:ad:be:ef

    # Node1 Port
    port#node_1_port:
      type: tosca.nodes.SwitchPort
      properties:
        portId: 33
      requirements:
        - switch:
            node: switch#leaf_1
            relationship: tosca.relationships.BelongsToOne

    interface#port_1_interface:
      type: tosca.nodes.PortInterface
      properties:
        vlanUntagged: 20
        name: node_1
      requirements:
        - port:
            node: port#node_1_port
            relationship: tosca.relationships.BelongsToOne

    ip#port_1_ip_1:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 13.1.1.0/24
        description: node_1_ip_1
      requirements:
        - interface:
            node: interface#port_1_interface
            relationship: tosca.relationships.BelongsToOne

    ip#port_1_ip_2:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 119.0.0.254/24
        description: node_1_ip_2
      requirements:
        - interface:
            node: interface#port_1_interface
            relationship: tosca.relationships.BelongsToOne

    ip#port_1_ip_3:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 116.0.0.254/24
        description: node_1_ip_3
      requirements:
        - interface:
            node: interface#port_1_interface
            relationship: tosca.relationships.BelongsToOne

    # Node2 Port
    port#node_2_port:
      type: tosca.nodes.SwitchPort
      properties:
        portId: 34
      requirements:
        - switch:
            node: switch#leaf_1
            relationship: tosca.relationships.BelongsToOne

    interface#port_2_interface:
      type: tosca.nodes.PortInterface
      properties:
        vlanUntagged: 20
        name: node_2
      requirements:
        - port:
            node: port#node_2_port
            relationship: tosca.relationships.BelongsToOne

    ip#port_2_ip_1:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 13.1.1.0/24
        description: node_2_ip_1
      requirements:
        - interface:
            node: interface#port_2_interface
            relationship: tosca.relationships.BelongsToOne

    ip#port_2_ip_2:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 119.0.0.254/24
        description: node_2_ip_2
      requirements:
        - interface:
            node: interface#port_2_interface
            relationship: tosca.relationships.BelongsToOne

    ip#port_2_ip_3:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 116.0.0.254/24
        description: node_2_ip_3
      requirements:
        - interface:
            node: interface#port_2_interface
            relationship: tosca.relationships.BelongsToOne

    # Node3 Port
    port#node_3_port:
      type: tosca.nodes.SwitchPort
      properties:
        portId: 35
      requirements:
        - switch:
            node: switch#leaf_1
            relationship: tosca.relationships.BelongsToOne

    interface#port_3_interface:
      type: tosca.nodes.PortInterface
      properties:
        vlanUntagged: 20
        name: node_3
      requirements:
        - port:
            node: port#node_3_port
            relationship: tosca.relationships.BelongsToOne

    ip#port_3_ip_1:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 13.1.1.0/24
        description: node_3_ip_1
      requirements:
        - interface:
            node: interface#port_3_interface
            relationship: tosca.relationships.BelongsToOne

    ip#port_3_ip_2:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 119.0.0.254/24
        description: node_3_ip_2
      requirements:
        - interface:
            node: interface#port_3_interface
            relationship: tosca.relationships.BelongsToOne

    ip#port_3_ip_3:
      type: tosca.nodes.FabricIpAddress
      properties:
        ip: 116.0.0.254/24
        description: node_3_ip_2
      requirements:
        - interface:
            node: interface#port_3_interface
            relationship: tosca.relationships.BelongsToOne

