Merge "CORD-3045 Reoganize TOSCA for base-openstack profile"
diff --git a/xos-profiles/base-openstack/templates/_helpers.tpl b/xos-profiles/base-openstack/templates/_helpers.tpl
index 66a8e2d..bd4fcce 100644
--- a/xos-profiles/base-openstack/templates/_helpers.tpl
+++ b/xos-profiles/base-openstack/templates/_helpers.tpl
@@ -45,20 +45,3 @@
 {{- define "base-openstack.chart" -}}
 {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
 {{- end -}}
-
-{{/*
-The R-CORD synchronizer loads R-CORD-specific models into the core
-*/}}
-
-{{- define "rcord.serviceConfig" -}}
-name: rcord
-accessor:
-  username: {{ .Values.xosAdminUser | quote }}
-  password: {{ .Values.xosAdminPassword | quote }}
-  endpoint: xos-core:50051
-dependency_graph: "/opt/xos/synchronizers/rcord/model-deps"
-sys_dir: "/opt/xos/synchronizers/rcord/sys"
-models_dir: "/opt/xos/synchronizers/rcord/models"
-model_policies_dir: "/opt/xos/synchronizers/rcord/model_policies"
-{{- end -}}
-
diff --git a/xos-profiles/base-openstack/templates/_tosca.tpl b/xos-profiles/base-openstack/templates/_tosca.tpl
new file mode 100644
index 0000000..962047c
--- /dev/null
+++ b/xos-profiles/base-openstack/templates/_tosca.tpl
@@ -0,0 +1,150 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Copyright 2018-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.
+*/}}
+{{- define "base-openstack.fixtureTosca" -}}
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+  - custom_types/deployment.yaml
+  - custom_types/site.yaml
+  - custom_types/networktemplate.yaml
+  - custom_types/network.yaml
+  - custom_types/networkslice.yaml
+  - custom_types/sitedeployment.yaml
+
+description: set up site and deployment and link them
+
+topology_template:
+  node_templates:
+
+    {{ .Values.cordSiteName }}:
+      type: tosca.nodes.Site
+      properties:
+          name: {{ .Values.cordSiteName }}
+          site_url: http://mysite.opencord.us/
+          hosts_nodes: true
+
+    {{ .Values.cordDeploymentName }}:
+      type: tosca.nodes.Deployment
+      properties:
+        name: {{ .Values.cordDeploymentName }}
+{{- end -}}
+
+{{- define "base-openstack.serviceGraphTosca" -}}
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+   - custom_types/onosapp.yaml
+   - custom_types/servicegraphconstraint.yaml
+   - custom_types/serviceinstancelink.yaml
+   - custom_types/vtnservice.yaml
+
+description: Configures the base-openstack service graph
+
+topology_template:
+  node_templates:
+
+    service#vtn:
+      type: tosca.nodes.VTNService
+      properties:
+        name: vtn
+        must-exist: true
+        resync: false
+
+    VTN_ONOS_app:
+      type: tosca.nodes.ONOSApp
+      properties:
+          name: VTN_ONOS_app
+          must-exist: true
+
+    VTN_ONOS_app_VTN_Service:
+        type: tosca.nodes.ServiceInstanceLink
+        requirements:
+          - provider_service_instance:
+              node: VTN_ONOS_app
+              relationship: tosca.relationships.BelongsToOne
+          - subscriber_service:
+              node: service#vtn
+              relationship: tosca.relationships.BelongsToOne
+
+    constraints:
+      type: tosca.nodes.ServiceGraphConstraint
+      properties:
+        constraints: '[]'
+{{- end -}}
+
+{{- define "base-openstack.testTosca" -}}
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+  - custom_types/flavor.yaml
+  - custom_types/image.yaml
+  - custom_types/site.yaml
+  - custom_types/network.yaml
+  - custom_types/networkslice.yaml
+  - custom_types/slice.yaml
+
+description: for testing basic openstack functionality
+
+topology_template:
+  node_templates:
+
+    Ubuntu-14.04:
+      type: tosca.nodes.Image
+      properties:
+        name: "Ubuntu 14.04 64-bit"
+        disk_format: QCOW2
+        container_format: BARE
+        path: https://github.com/opencord/platform-install/releases/download/vms/trusty-server-cloudimg-amd64-disk1.img.20170201
+
+    {{ .Values.cordSiteName }}:
+      type: tosca.nodes.Site
+      properties:
+        name: {{ .Values.cordSiteName }}
+        must-exist: true
+
+# Define a test slice
+    {{ .Values.cordSiteName }}_test:
+      description: Test Slice
+      type: tosca.nodes.Slice
+      properties:
+        # network: noauto
+        name: {{ .Values.cordSiteName }}_test
+      requirements:
+        - site:
+            node: {{ .Values.cordSiteName }}
+            relationship: tosca.relationships.BelongsToOne
+        - default_image:
+            node: Ubuntu-14.04
+            relationship: tosca.relationships.BelongsToOne
+
+    management:
+      type: tosca.nodes.Network
+      properties:
+        name: management
+        must-exist: true
+
+# Connect test slice to management net
+    networkslice#management_to_{{ .Values.cordSiteName }}_test:
+        type: tosca.nodes.NetworkSlice
+        requirements:
+          - network:
+              node: management
+              relationship: tosca.relationships.BelongsToOne
+          - slice:
+              node: {{ .Values.cordSiteName }}_test
+              relationship: tosca.relationships.BelongsToOne
+{{- end -}}
\ No newline at end of file
diff --git a/xos-profiles/base-openstack/templates/tosca-configmap.yaml b/xos-profiles/base-openstack/templates/tosca-configmap.yaml
index 3d7edf8..6d4448e 100644
--- a/xos-profiles/base-openstack/templates/tosca-configmap.yaml
+++ b/xos-profiles/base-openstack/templates/tosca-configmap.yaml
@@ -19,10 +19,22 @@
 metadata:
   name: base-openstack-tosca
 data:
-  010-openstack.yaml: |
-{{ toYaml .Values.toscaRecipes.openstack | indent 4 }}
-  020-openstack-compute.yaml: |
+  010-fixtures.yaml: |
+{{ include "base-openstack.fixtureTosca" . | indent 4 }}
+  020-openstack-controller.yaml: |
+{{ include "openstack.controllerTosca" .Values | indent 4 }}
+  030-openstack-flavors.yaml: |
+{{ include "openstack.flavorTosca" .Values.openstack | indent 4 }}
+  040-vtn-service.yaml: |
+{{ include "vtn-service.serviceTosca" (index .Values "vtn-service") | indent 4 }}
+  050-openstack-compute.yaml: |
 {{ toYaml .Values.toscaRecipes.openstackCompute | indent 4 }}
-  030-vtn-service.yaml: |
-{{ toYaml .Values.toscaRecipes.vtnService | indent 4 }}
+  060-openstack-networks.yaml: |
+{{ include "openstack.networkTosca" .Values | indent 4 }}
+  070-onos-service-vtn-app.yaml: |
+{{ include "onos-service.vtnAppTosca" (index .Values "onos-service") | indent 4 }}
+  300-service-graph.yaml: |
+{{ include "base-openstack.serviceGraphTosca" . | indent 4 }}
+  400-openstack-test.yaml: |
+{{ include "base-openstack.testTosca" . | indent 4 }}
 
diff --git a/xos-profiles/base-openstack/values.yaml b/xos-profiles/base-openstack/values.yaml
index cc02e32..dbf6a9a 100644
--- a/xos-profiles/base-openstack/values.yaml
+++ b/xos-profiles/base-openstack/values.yaml
@@ -26,190 +26,19 @@
 
 httpieImage: "clue/httpie:latest"
 
-xosAdminUser: &adminuser "admin@opencord.org"
-xosAdminPassword: &adminpass "letmein"
+xosAdminUser: "admin@opencord.org"
+xosAdminPassword: "letmein"
+
+cordSiteName:  &site "mysite"
+cordDeploymentName: &deployment "mydeployment"
+
+keystoneAdminUser: "admin"
+keystoneAdminPassword: "password"
+keystoneAdminTenant: "admin"
+keystoneDomain: "Default"
 
 # TOSCA recipes for the tosca-loader
 toscaRecipes:
-  openstack:
-    tosca_definitions_version: tosca_simple_yaml_1_0
-
-    imports:
-      - custom_types/controller.yaml
-      - custom_types/controllersite.yaml
-      - custom_types/deployment.yaml
-      - custom_types/flavor.yaml
-      - custom_types/image.yaml
-      - custom_types/site.yaml
-      - custom_types/networktemplate.yaml
-      - custom_types/network.yaml
-      - custom_types/networkslice.yaml
-      - custom_types/slice.yaml
-      - custom_types/sitedeployment.yaml
-
-    description: openstack extensions to deployment
-
-    topology_template:
-      node_templates:
-
-    # Images and flavors
-        Ubuntu-14.04:
-          type: tosca.nodes.Image
-          properties:
-            name: "Ubuntu 14.04 64-bit"
-            disk_format: QCOW2
-            container_format: BARE
-            path: https://github.com/opencord/platform-install/releases/download/vms/trusty-server-cloudimg-amd64-disk1.img.20170201
-
-        m1.tiny:
-          type: tosca.nodes.Flavor
-          properties:
-            name: m1.tiny
-
-        m1.small:
-          type: tosca.nodes.Flavor
-          properties:
-            name: m1.small
-
-        m1.medium:
-          type: tosca.nodes.Flavor
-          properties:
-            name: m1.medium
-
-        m1.large:
-          type: tosca.nodes.Flavor
-          properties:
-            name: m1.large
-
-        m1.xlarge:
-          type: tosca.nodes.Flavor
-          properties:
-            name: m1.xlarge
-
-        MyDeployment:
-          type: tosca.nodes.Deployment
-          properties:
-            name: MyDeployment
-
-    # OpenStack Controller
-        mysite_MyDeployment_openstack:
-          type: tosca.nodes.Controller
-          requirements:
-            - deployment:
-                node: MyDeployment
-                relationship: tosca.relationships.BelongsToOne
-          properties:
-              name: mysite_MyDeployment_openstack
-              backend_type: OpenStack
-              version: Newton
-              auth_url: http://keystone.openstack.svc.cluster.local/v3
-              admin_user: admin
-              admin_password: password
-              admin_tenant: admin
-              domain: Default
-
-    # Site - adds openstack controller to site defined in deployment.yaml
-        mysite:
-          type: tosca.nodes.Site
-          properties:
-              name: mysite
-              must-exist: true
-              site_url: http://mysite.opencloud.us/
-              hosts_nodes: true
-
-        mysite_deployment_MyDeployment:
-            type: tosca.nodes.SiteDeployment
-            requirements:
-                - site:
-                    node: mysite
-                    relationship: tosca.relationships.BelongsToOne
-                - deployment:
-                    node: MyDeployment
-                    relationship: tosca.relationships.BelongsToOne
-                - controller:
-                    node: mysite_MyDeployment_openstack
-                    relationship: tosca.relationships.BelongsToOne
-
-        mysite_openstack_controller:
-            type: tosca.nodes.ControllerSite
-            requirements:
-                - site:
-                    node: mysite
-                    relationship: tosca.relationships.BelongsToOne
-                - controller:
-                    node: mysite_MyDeployment_openstack
-                    relationship: tosca.relationships.BelongsToOne
-
-    # For creating a test VM
-        mysite_test:
-          description: Test Slice
-          type: tosca.nodes.Slice
-          properties:
-            # network: noauto
-            name: mysite_test
-          requirements:
-            - site:
-                node: mysite
-                relationship: tosca.relationships.BelongsToOne
-            - default_image:
-                node: Ubuntu-14.04
-                relationship: tosca.relationships.BelongsToOne
-
-    # For private networks (e.g., per-slice)
-        private_template:
-          type: tosca.nodes.NetworkTemplate
-          properties:
-            name: Private
-            visibility: private
-            translation: none
-            vtn_kind: PRIVATE
-
-    # management (vtn: MANAGEMENT_LOCAL) network
-        management_template:
-          type: tosca.nodes.NetworkTemplate
-          properties:
-            name: management_template
-            visibility: private
-            translation: none
-            vtn_kind: MANAGEMENT_LOCAL
-
-        management:
-          type: tosca.nodes.Network
-          properties:
-            name: management
-            # ip_version: 4
-            subnet: 172.27.0.0/24
-            permit_all_slices: true
-          requirements:
-            - template:
-                node: management_template
-                relationship: tosca.relationships.BelongsToOne
-            - owner:
-                node: slice#mysite_management
-                relationship: tosca.relationships.BelongsToOne
-
-    # Slice to own management networks
-        slice#mysite_management:
-          description: This slice exists solely to own the management network(s)
-          type: tosca.nodes.Slice
-          properties:
-            network: noauto
-            name: mysite_management
-          requirements:
-            - site:
-                node: mysite
-                relationship: tosca.relationships.BelongsToOne
-
-    # Connect mysite_test to management net
-        networkslice#management_to_mysite_test:
-            type: tosca.nodes.NetworkSlice
-            requirements:
-              - network:
-                  node: management
-                  relationship: tosca.relationships.BelongsToOne
-              - slice:
-                  node: mysite_test
-                  relationship: tosca.relationships.BelongsToOne
   openstackCompute:
     tosca_definitions_version: tosca_simple_yaml_1_0
 
@@ -225,26 +54,26 @@
       node_templates:
 
     # Site/Deployment, fully defined in deployment.yaml
-        mysite:
+        site:
           type: tosca.nodes.Site
           properties:
-            name: mysite
+            name: *site
             must-exist: true
 
-        MyDeployment:
+        deployment:
           type: tosca.nodes.Deployment
           properties:
-            name: MyDeployment
+            name: *deployment
             must-exist: true
 
-        mysite_MyDeployment:
+        site_deployment:
           type: tosca.nodes.SiteDeployment
           requirements:
             - site:
-                node: mysite
+                node: site
                 relationship: tosca.relationships.BelongsToOne
             - deployment:
-                node: MyDeployment
+                node: deployment
                 relationship: tosca.relationships.BelongsToOne
 
     # OpenStack compute nodes
@@ -258,7 +87,7 @@
             dataPlaneIp: 10.6.1.1/24
           requirements:
             - site_deployment:
-                node:  mysite_MyDeployment
+                node:  site_deployment
                 relationship: tosca.relationships.BelongsToOne
 
         compute1:
@@ -270,7 +99,7 @@
             dataPlaneIp: 10.6.1.17/24
           requirements:
             - site_deployment:
-                node:  mysite_MyDeployment
+                node:  site_deployment
                 relationship: tosca.relationships.BelongsToOne
 
         compute2:
@@ -282,79 +111,5 @@
             dataPlaneIp: 10.6.1.18/24
           requirements:
             - site_deployment:
-                node:  mysite_MyDeployment
+                node:  site_deployment
                 relationship: tosca.relationships.BelongsToOne
-
-  vtnService:
-    tosca_definitions_version: tosca_simple_yaml_1_0
-
-    imports:
-       - custom_types/onosapp.yaml
-       - custom_types/onosservice.yaml
-       - custom_types/serviceinstanceattribute.yaml
-       - custom_types/serviceinstancelink.yaml
-       - custom_types/vtnservice.yaml
-
-    description: Configures the VTN ONOS service
-
-    topology_template:
-      node_templates:
-
-        service#ONOS_CORD:
-          type: tosca.nodes.ONOSService
-          properties:
-              name: ONOS_CORD
-              kind: platform
-              no_container: true
-              rest_hostname: onos-cord-ui
-              rest_port: 8181
-
-        service#vtn:
-          type: tosca.nodes.VTNService
-          properties:
-              name: vtn
-              kind: platform
-              view_url: /admin/vtn/vtnservice/$id$/
-              privateGatewayMac: 00:00:00:00:00:01
-              localManagementIp: 172.27.0.1/24
-              ovsdbPort: 6641
-              sshUser: vagrant
-              sshKeyFile: /root/node_key
-              sshPort: 22
-              xosEndpoint: xos-chameleon:9101
-              xosUser: *adminuser
-              xosPassword: *adminpass
-              vtnAPIVersion: 2
-              controllerPort: onos-cord-openflow:6653
-              resync: false
-
-        VTN_ONOS_app:
-          type: tosca.nodes.ONOSApp
-          requirements:
-              - owner:
-                  node: service#ONOS_CORD
-                  relationship: tosca.relationships.BelongsToOne
-          properties:
-              name: VTN_ONOS_app
-              install_dependencies: https://repo.maven.apache.org/maven2/org/opencord/cord-config/1.3.1/cord-config-1.3.1.oar, https://repo.maven.apache.org/maven2/org/opencord/vtn/1.5.0/vtn-1.5.0.oar
-              dependencies: org.onosproject.drivers, org.onosproject.drivers.ovsdb, org.onosproject.openflow-base, org.onosproject.ovsdb-base, org.onosproject.dhcp
-
-        VTN_ONOS_app_autogenerate:
-            type: tosca.nodes.ServiceInstanceAttribute
-            requirements:
-              - service_instance:
-                  node: VTN_ONOS_app
-                  relationship: tosca.relationships.BelongsToOne
-            properties:
-                name: autogenerate
-                value: vtn-network-cfg
-
-        VTN_ONOS_app_VTN_Service:
-            type: tosca.nodes.ServiceInstanceLink
-            requirements:
-              - provider_service_instance:
-                  node: VTN_ONOS_app
-                  relationship: tosca.relationships.BelongsToOne
-              - subscriber_service:
-                  node: service#vtn
-                  relationship: tosca.relationships.BelongsToOne
diff --git a/xos-services/openstack/templates/_helpers.tpl b/xos-services/openstack/templates/_helpers.tpl
index d0d413a..db369dd 100644
--- a/xos-services/openstack/templates/_helpers.tpl
+++ b/xos-services/openstack/templates/_helpers.tpl
@@ -45,7 +45,6 @@
 {{- define "openstack.chart" -}}
 {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
 {{- end -}}
-
 {{- define "openstack.serviceConfig" -}}
 name: openstack-synchronizer
 accessor:
diff --git a/xos-services/openstack/templates/_tosca.tpl b/xos-services/openstack/templates/_tosca.tpl
new file mode 100644
index 0000000..a2fdd94
--- /dev/null
+++ b/xos-services/openstack/templates/_tosca.tpl
@@ -0,0 +1,185 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Copyright 2018-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.
+*/}}
+{{- define "openstack.flavorTosca" -}}
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+  - custom_types/flavor.yaml
+
+description: openstack flavor models
+
+topology_template:
+  node_templates:
+
+    m1.tiny:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.tiny
+
+    m1.small:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.small
+
+    m1.medium:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.medium
+
+    m1.large:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.large
+
+    m1.xlarge:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.xlarge
+{{- end -}}
+
+{{- define "openstack.networkTosca" -}}
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+  - custom_types/network.yaml
+  - custom_types/networktemplate.yaml
+  - custom_types/site.yaml
+  - custom_types/slice.yaml
+
+description: openstack flavor models
+
+topology_template:
+  node_templates:
+
+    {{ .cordSiteName }}:
+      type: tosca.nodes.Site
+      properties:
+        name: {{ .cordSiteName }}
+        must-exist: true
+
+# For private networks (e.g., per-slice)
+    private_template:
+      type: tosca.nodes.NetworkTemplate
+      properties:
+        name: Private
+        visibility: private
+        translation: none
+        vtn_kind: PRIVATE
+
+# management (vtn: MANAGEMENT_LOCAL) network
+    management_template:
+      type: tosca.nodes.NetworkTemplate
+      properties:
+        name: management_template
+        visibility: private
+        translation: none
+        vtn_kind: MANAGEMENT_LOCAL
+
+    management:
+      type: tosca.nodes.Network
+      properties:
+        name: management
+        # ip_version: 4
+        subnet: 172.27.0.0/24
+        permit_all_slices: true
+      requirements:
+        - template:
+            node: management_template
+            relationship: tosca.relationships.BelongsToOne
+        - owner:
+            node: slice#{{ .cordSiteName }}_management
+            relationship: tosca.relationships.BelongsToOne
+
+# Slice to own management networks
+    slice#{{ .cordSiteName }}_management:
+      description: This slice exists solely to own the management network(s)
+      type: tosca.nodes.Slice
+      properties:
+        network: noauto
+        name: {{ .cordSiteName }}_management
+      requirements:
+        - site:
+            node: {{ .cordSiteName }}
+            relationship: tosca.relationships.BelongsToOne
+{{- end -}}
+
+{{- define "openstack.controllerTosca" -}}
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+  - custom_types/controller.yaml
+  - custom_types/controllersite.yaml
+  - custom_types/deployment.yaml
+  - custom_types/site.yaml
+  - custom_types/sitedeployment.yaml
+
+description: openstack controller models
+
+topology_template:
+  node_templates:
+
+    {{ .cordSiteName }}:
+      type: tosca.nodes.Site
+      properties:
+          name: {{ .cordSiteName }}
+          must-exist: true
+
+    {{ .cordDeploymentName }}:
+      type: tosca.nodes.Deployment
+      properties:
+        name: {{ .cordDeploymentName }}
+        must-exist: true
+
+    {{ .cordSiteName }}_{{ .cordDeploymentName }}_openstack:
+      type: tosca.nodes.Controller
+      requirements:
+        - deployment:
+            node: {{ .cordDeploymentName }}
+            relationship: tosca.relationships.BelongsToOne
+      properties:
+          name: {{ .cordSiteName }}_{{ .cordDeploymentName }}_openstack
+          backend_type: OpenStack
+          version: Newton
+          auth_url: http://keystone.openstack.svc.cluster.local/v3
+          admin_user: {{ .keystoneAdminUser }}
+          admin_password: {{ .keystoneAdminPassword }}
+          admin_tenant: {{ .keystoneAdminTenant }}
+          domain: {{ .keystoneDomain }}
+
+    {{ .cordSiteName }}_deployment_{{ .cordDeploymentName }}:
+        type: tosca.nodes.SiteDeployment
+        requirements:
+            - site:
+                node: {{ .cordSiteName }}
+                relationship: tosca.relationships.BelongsToOne
+            - deployment:
+                node: {{ .cordDeploymentName }}
+                relationship: tosca.relationships.BelongsToOne
+            - controller:
+                node: {{ .cordSiteName }}_{{ .cordDeploymentName }}_openstack
+                relationship: tosca.relationships.BelongsToOne
+
+    {{ .cordSiteName }}_openstack_controller:
+        type: tosca.nodes.ControllerSite
+        requirements:
+            - site:
+                node: {{ .cordSiteName }}
+                relationship: tosca.relationships.BelongsToOne
+            - controller:
+                node: {{ .cordSiteName }}_{{ .cordDeploymentName }}_openstack
+                relationship: tosca.relationships.BelongsToOne
+{{- end -}}
diff --git a/xos-services/vtn-service/templates/_tosca.tpl b/xos-services/vtn-service/templates/_tosca.tpl
new file mode 100644
index 0000000..9edc27e
--- /dev/null
+++ b/xos-services/vtn-service/templates/_tosca.tpl
@@ -0,0 +1,46 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Copyright 2018-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.
+*/}}
+{{- define "vtn-service.serviceTosca" -}}
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+imports:
+   - custom_types/vtnservice.yaml
+
+description: Configures the VTN ONOS service
+
+topology_template:
+  node_templates:
+
+    service#vtn:
+      type: tosca.nodes.VTNService
+      properties:
+          name: vtn
+          kind: platform
+          view_url: /admin/vtn/vtnservice/$id$/
+          privateGatewayMac: 00:00:00:00:00:01
+          localManagementIp: 172.27.0.1/24
+          ovsdbPort: 6641
+          sshUser: vagrant
+          sshKeyFile: /root/node_key
+          sshPort: 22
+          xosEndpoint: xos-chameleon:9101
+          xosUser: {{ .xosAdminUser }}
+          xosPassword: {{ .xosAdminPassword }}
+          vtnAPIVersion: 2
+          controllerPort: onos-cord-openflow:6653
+          resync: false
+{{- end -}}