Orchestrating VNFs using Network Services Descriptor (NSD)

To enable dynamic composition of network services, NFV introduces Network Service Descriptors (NSDs) that specify the network service to be created. This usage guide describes lifecycle of Network service descriptors and services.

NSD in Ocata can be used for creating multiple (related) VNFs in one shot using a single TOSCA template. This is a first (big) step into NSD, few follow-on enhancements like: 1) Creating VLs / neutron networks using NSD (to support inter-VNF private VL) 2) VNFFGD support in NSD.

Creating the NSD

Once OpenStack along with Tacker has been successfully installed, deploy a sample VNFD templates using vnf1.yaml and vnf2.yaml as mentioned in reference section.

::

tacker vnfd-create –vnfd-file vnfd1.yaml VNFD1

tacker vnfd-create –vnfd-file vnfd2.yaml VNFD2

The following code represents sample NSD which instantiates the above VNFs

tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
imports:
  - VNFD1
  - VNFD2
topology_template:
  node_templates:
    VNF1:
      type: tosca.nodes.nfv.VNF1
      requirements:
        - virtualLink1: VL1
        - virtualLink2: VL2
    VNF2:
      type: tosca.nodes.nfv.VNF2
    VL1:
      type: tosca.nodes.nfv.VL
      properties:
      network_name: net0
      vendor: tacker
    VL2:
      type: tosca.nodes.nfv.VL
      properties:
          network_name: net_mgmt
          vendor: tacker

In above NSD template VL1 and VL2 are substituting the virtuallinks of VNF1. To onboard the above NSD:

tacker nsd-create –nsd-file <nsd file> <nsd name>

Creating the NS

To create a NS, you must have onboarded corresponding NSD and VNFDS(which NS is substituting)

Tacker provides the following CLI to create NS:

tacker ns-create –nsd-id <nsd-id> <ns-name>

Reference

VNF1 sample template for nsd named vnfd1.yaml:

tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
description: Demo example
node_types:
  tosca.nodes.nfv.VNF1:
    requirements:
      - virtualLink1:
          type: tosca.nodes.nfv.VL
          required: true
      - virtualLink2:
          type: tosca.nodes.nfv.VL
          required: true
    capabilities:
      forwader1:
        type: tosca.capabilities.nfv.Forwarder
      forwader2:
        type: tosca.capabilities.nfv.Forwarder

topology_template:
  substitution_mappings:
    node_type: tosca.nodes.nfv.VNF1
    requirements:
      virtualLink1: [CP11, virtualLink]
      virtualLink2: [CP14, virtualLink]
    capabilities:
      forwarder1: [CP11, forwarder]
      forwarder2: [CP14, forwarder]
  node_templates:
    VDU1:
      type: tosca.nodes.nfv.VDU.Tacker
      properties:
        image: cirros-0.3.4-x86_64-uec
        flavor: m1.tiny
        availability_zone: nova
        mgmt_driver: noop
        config: |
          param0: key1
          param1: key2
    CP11:
      type: tosca.nodes.nfv.CP.Tacker
      properties:
        management: true
        anti_spoofing_protection: false
      requirements:
        - virtualBinding:
            node: VDU1

    VDU2:
      type: tosca.nodes.nfv.VDU.Tacker
      properties:
        image: cirros-0.3.4-x86_64-uec
        flavor: m1.medium
        availability_zone: nova
        mgmt_driver: noop
        config: |
          param0: key1
          param1: key2
    CP13:
      type: tosca.nodes.nfv.CP.Tacker
      properties:
        management: true
        anti_spoofing_protection: false
      requirements:
        - virtualLink:
            node: VL1
        - virtualBinding:
            node: VDU2
    CP14:
      type: tosca.nodes.nfv.CP.Tacker
      properties:
        management: true
        anti_spoofing_protection: false
      requirements:
        - virtualBinding:
            node: VDU2
    VL1:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: net_mgmt
        vendor: Tacker
    VL2:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: net0
        vendor: Tacker

VNF2 sample template for nsd named vnfd2.yaml:

tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
description: Demo example

node_types:
  tosca.nodes.nfv.VNF2:
    capabilities:
      forwarder1:
        type: tosca.capabilities.nfv.Forwarder
topology_template:
  substitution_mappings:
    node_type: tosca.nodes.nfv.VNF2
    capabilities:
      forwarder1: [CP21, forwarder]
  node_templates:
    VDU1:
      type: tosca.nodes.nfv.VDU.Tacker
      properties:
        image: cirros-0.3.4-x86_64-uec
        flavor: m1.tiny
        availability_zone: nova
        mgmt_driver: noop
        config: |
          param0: key1
          param1: key2
    CP21:
      type: tosca.nodes.nfv.CP.Tacker
      properties:
        management: true
        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
        flavor: m1.medium
        availability_zone: nova
        mgmt_driver: noop
    CP22:
      type: tosca.nodes.nfv.CP.Tacker
      properties:
        management: true
        anti_spoofing_protection: false
      requirements:
        - virtualLink:
            node: VL2
        - virtualBinding:
            node: VDU2
    VL1:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: net_mgmt
        vendor: Tacker
    VL2:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: net0
        vendor: Tacker