Onboard package test case

Issue-ID: VNFSDK-196
Change-Id: I7ba6de4fe6c55b370f9787c23ad16f1afc26f678
Signed-off-by: Moshe <moshehoa@amdocs.com>
diff --git a/dist/vnftest-0.1.dev0-py2.7.egg b/dist/vnftest-0.1.dev0-py2.7.egg
index eaf52c6..7df66f0 100644
--- a/dist/vnftest-0.1.dev0-py2.7.egg
+++ b/dist/vnftest-0.1.dev0-py2.7.egg
Binary files differ
diff --git a/etc/vnftest/vnf_descriptors/vnf_descriptor_sample.yaml b/etc/vnftest/vnf_descriptors/vnf_descriptor_sample.yaml
new file mode 100644
index 0000000..21008df
--- /dev/null
+++ b/etc/vnftest/vnf_descriptors/vnf_descriptor_sample.yaml
@@ -0,0 +1,20 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+
+---
+
+type: CSAR
+vnf_name: sample_firewall
+vnf_id: 123456
+csar_package_location: /etc/nvftest/sample_fw.csar
\ No newline at end of file
diff --git a/tests/onap/test_cases/onap_vnftest_tc001.yaml b/tests/onap/test_cases/onap_vnftest_tc001.yaml
index d309826..185cc1a 100644
--- a/tests/onap/test_cases/onap_vnftest_tc001.yaml
+++ b/tests/onap/test_cases/onap_vnftest_tc001.yaml
@@ -18,9 +18,11 @@
     Vnftest TC001 config file;
     Create VLM in SDC
 
-{% set csar_name = csar_name or none %}
-{% set csar_id = csar_id or none %}
-{% set csar_package_location = csar_package_location or none %}
+{% set vsp_name = vsp_name or ['test_vsp_', range(10000)|random ]|join %}
+{% set vendor_name = vendor_name or ['test_vendor_', range(10000)|random ]|join %}
+{% set service_name = service_name or ['test_service_', range(10000)|random ]|join %}
+{% set resource_instance_name = resource_instance_name or ["test_resource_instance_", range(10000)|random ]|join %}
+
 steps:
 -
   type: OnapApiCall
@@ -29,11 +31,11 @@
     input:
     -
       parameter_name: "vendor_name"
-      value: {{ ["test_vendor_", range(10000)|random ]|join }}
+      value: {{vendor_name}}
     output:
     -
       parameter_name: "vendor_id"
-      path: "value"
+      value: "[value]"
   runner:
     type: Iteration
     run_step: "setup,run"
@@ -44,7 +46,7 @@
     input:
     -
       parameter_name: "vendor_id"
-      source: prev_step
+      value: "{vendor_id}"
   runner:
     type: Iteration
     run_step: "setup,run"
@@ -55,13 +57,329 @@
     input:
     -
       parameter_name: "vendor_id"
-      source: prev_step
+      value: "{vendor_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/create_vsp.yaml"
+    input:
+    -
+      parameter_name: "vendor_id"
+      value: "{vendor_id}"
+    -
+      parameter_name: "vsp_name"
+      value: {{vsp_name}}
+    output:
+    -
+      parameter_name: "vsp_id"
+      value: "[vspId]"
   runner:
     type: Iteration
     run_step: "setup,run"
 
+-
+  type: PackageUpload
+  options:
+    file: "onboard/upload_package.yaml"
+    input:
+    -
+      parameter_name: "vsp_id"
+      value: "{vsp_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/process_package.yaml"
+    input:
+    -
+      parameter_name: "vsp_id"
+      value: "{vsp_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/checkin_vsp.yaml"
+    input:
+    -
+      parameter_name: "vsp_id"
+      value: "{vsp_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/submit_vsp.yaml"
+    input:
+    -
+      parameter_name: "vsp_id"
+      value: "{vsp_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/create_package_vsp.yaml"
+    input:
+    -
+      parameter_name: "vsp_id"
+      value: "{vsp_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/import_vsp.yaml"
+    input:
+    -
+      parameter_name: "vsp_name"
+      value: {{vsp_name}}
+    -
+      parameter_name: "vsp_id"
+      value: "{vsp_id}"
+    output:
+    -
+      parameter_name: "resource_id"
+      value: "[uniqueId]"
+    -
+      parameter_name: "vnf_type"
+      value: "[name]"
+      type: VnfTypeCrawler
+    -
+      parameter_name: "module_model_invariant_id"
+      value: "[invariantUUID]"
+      type: VnfTypeCrawler
+    -
+      parameter_name: "module_model_version_id"
+      value: "[groupUUID]"
+      type: VnfTypeCrawler
+    -
+      parameter_name: "module_model_version"
+      value: "[version]"
+      type: VnfTypeCrawler
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/submit_resource_for_testing.yaml"
+    input:
+    -
+      parameter_name: "resource_id"
+      value: "{resource_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/start_resource_test.yaml"
+    input:
+    -
+      parameter_name: "resource_id"
+      value: "{resource_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/accept_resource_test.yaml"
+    input:
+    -
+      parameter_name: "resource_id"
+      value: "{resource_id}"
+    output:
+    -
+      parameter_name: "resource_version_id"
+      value: "[allVersions][1.0]"
+    -
+      parameter_name: "resource_model_invariant_id"
+      value: "[invariantUUID]"
+    -
+      parameter_name: "resource_model_version_id"
+      value: "[uuid]"
+    -
+      parameter_name: "resource_model_name"
+      value: "[name]"
+    -
+      parameter_name: "resource_model_version"
+      value: "[version]"
+
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/add_service.yaml"
+    input:
+    -
+      parameter_name: "service_name"
+      value: {{service_name}}
+    output:
+    -
+      parameter_name: "service_id"
+      value: "[uniqueId]"
+    -
+      parameter_name: "service_model_name"
+      value: "[name]"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/add_resource_instance.yaml"
+    input:
+    -
+      parameter_name: "resource_instance_unique_id"
+      value: {{ ["U+007B", "resource_version_id", "U+007D", range(10000)|random ]|join }}
+    -
+      parameter_name: "resource_instance_name"
+      value: {{resource_instance_name}}
+    -
+      parameter_name: "service_id"
+      value: "{service_id}"
+    -
+      parameter_name: "resource_version_id"
+      value: "{resource_version_id}"
+    output:
+    -
+      parameter_name: "resource_model_customization_id"
+      value: "[customizationUUID]"
+    -
+      parameter_name: "resource_model_customization_name"
+      value: "[normalizedName]"
+    -
+      parameter_name: "resource_instance_model_name"
+      value: "[name]"
+
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/submit_service_for_testing.yaml"
+    input:
+    -
+      parameter_name: "service_id"
+      value: "{service_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/start_service_test.yaml"
+    input:
+    -
+      parameter_name: "service_id"
+      value: "{service_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/accept_service_test.yaml"
+    input:
+    -
+      parameter_name: "service_id"
+      value: "{service_id}"
+    output:
+    -
+      parameter_name: "service_version_id"
+      value: "[allVersions][1.0]"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/approve_distribution.yaml"
+    input:
+    -
+      parameter_name: "service_version_id"
+      value: "{service_version_id}"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/distribute.yaml"
+    input:
+    -
+      parameter_name: "service_version_id"
+      value: "{service_version_id}"
+    output:
+    -
+      parameter_name: "distributed_service_id"
+      value: "[uuid]"
+    -
+      parameter_name: "service_model_invariant_id"
+      value: "[invariantUUID]"
+    -
+      parameter_name: "service_model_version_id"
+      value: "[uuid]"
+    -
+      parameter_name: "service_model_normalized_name"
+      value: "[normalizedName]"
+    -
+      parameter_name: "service_model_name"
+      value: "[name]"
+    -
+      parameter_name: "service_model_version"
+      value: "[version]"
+    -
+      parameter_name: "service_model_customization_id"
+      value: "[componentInstances]"
+  runner:
+    type: Iteration
+    run_step: "setup,run"
+-
+  type: OnapApiCall
+  options:
+    file: "onboard/monitor_distribution.yaml"
+    input:
+    -
+      parameter_name: "distributed_service_id"
+      value: "{distributed_service_id}"
+    output:
+    -
+      parameter_name: "distribution_status"
+      value: "[distributionStatusOfServiceList][0][deployementStatus]"
+  sla:
+    action: assert
+    value: "{distribution_status}"
+    equals: "Distributed"
+    retries: 5
+    interval: 5
+
 context:
-  type: CSAR
-  csar_name: {{csar_name}}
-  csar_id: {{csar_id}}
-  csar_package_location: {{csar_package_location}}
\ No newline at end of file
+  type: CSAR
\ No newline at end of file
diff --git a/tests/onap/test_suites/onap_basic_lifecycle.yaml b/tests/onap/test_suites/onap_basic_lifecycle.yaml
index 6be8a1b..ee4a15f 100644
--- a/tests/onap/test_suites/onap_basic_lifecycle.yaml
+++ b/tests/onap/test_suites/onap_basic_lifecycle.yaml
@@ -21,5 +21,3 @@
 test_cases:
 -
     file_name: onap_vnftest_tc001.yaml
-    task_args:
-        default: '{"csar_name": "dummy_package_name", "csar_id":"dummy123", "csar_package_location": "/etc/vnftest/dummy_package.csar"}'
diff --git a/vnftest.egg-info/SOURCES.txt b/vnftest.egg-info/SOURCES.txt
index 4bb5c16..611c563 100644
--- a/vnftest.egg-info/SOURCES.txt
+++ b/vnftest.egg-info/SOURCES.txt
@@ -37,33 +37,39 @@
 vnftest/common/template_format.py
 vnftest/common/utils.py
 vnftest/common/yaml_loader.py
+vnftest/contexts/__init__.py
+vnftest/contexts/base.py
+vnftest/contexts/csar.py
+vnftest/contexts/dummy.py
+vnftest/core/__init__.py
+vnftest/core/plugin.py
+vnftest/core/report.py
+vnftest/core/runner.py
+vnftest/core/step.py
+vnftest/core/task.py
+vnftest/core/testcase.py
+vnftest/core/testsuite.py
+vnftest/crawlers/__init__.py
+vnftest/crawlers/base.py
+vnftest/crawlers/default.py
 vnftest/dispatcher/__init__.py
 vnftest/dispatcher/base.py
 vnftest/dispatcher/file.py
 vnftest/dispatcher/http.py
 vnftest/onap/__init__.py
-vnftest/onap/contexts/__init__.py
-vnftest/onap/contexts/base.py
-vnftest/onap/contexts/csar.py
-vnftest/onap/contexts/dummy.py
-vnftest/onap/core/__init__.py
-vnftest/onap/core/plugin.py
-vnftest/onap/core/report.py
-vnftest/onap/core/runner.py
-vnftest/onap/core/step.py
-vnftest/onap/core/task.py
-vnftest/onap/core/testcase.py
-vnftest/onap/core/testsuite.py
-vnftest/onap/runners/__init__.py
-vnftest/onap/runners/base.py
-vnftest/onap/runners/duration.py
-vnftest/onap/runners/dynamictp.py
-vnftest/onap/runners/iteration.py
-vnftest/onap/runners/search.py
-vnftest/onap/runners/sequence.py
-vnftest/onap/steps/__init__.py
-vnftest/onap/steps/base.py
-vnftest/onap/steps/onap_api_call.py
-vnftest/onap/steps/dummy/__init__.py
-vnftest/onap/steps/dummy/dummy.py
-vnftest/onap/steps/onboard/__init__.py
\ No newline at end of file
+vnftest/onap/onap_api_call.py
+vnftest/onap/package_upload.py
+vnftest/onap/common/__init__.py
+vnftest/onap/common/vnf_type_crawler.py
+vnftest/onap/onboard/__init__.py
+vnftest/runners/__init__.py
+vnftest/runners/base.py
+vnftest/runners/duration.py
+vnftest/runners/dynamictp.py
+vnftest/runners/iteration.py
+vnftest/runners/search.py
+vnftest/runners/sequence.py
+vnftest/steps/__init__.py
+vnftest/steps/base.py
+vnftest/steps/dummy/__init__.py
+vnftest/steps/dummy/dummy.py
\ No newline at end of file
diff --git a/vnftest/cmd/commands/__init__.py b/vnftest/cmd/commands/__init__.py
index 8c46b47..f0ecc97 100644
--- a/vnftest/cmd/commands/__init__.py
+++ b/vnftest/cmd/commands/__init__.py
@@ -1,5 +1,5 @@
 from __future__ import absolute_import
-from vnftest.onap.core import Param
+from vnftest.core import Param
 
 
 def change_osloobj_to_paras(args):
diff --git a/vnftest/cmd/commands/plugin.py b/vnftest/cmd/commands/plugin.py
index e05130a..ff5f45d 100644
--- a/vnftest/cmd/commands/plugin.py
+++ b/vnftest/cmd/commands/plugin.py
@@ -18,7 +18,7 @@
 from __future__ import print_function
 
 from __future__ import absolute_import
-from vnftest.onap.core.plugin import Plugin
+from vnftest.core.plugin import Plugin
 from vnftest.common.utils import cliargs
 from vnftest.cmd.commands import change_osloobj_to_paras
 
diff --git a/vnftest/cmd/commands/report.py b/vnftest/cmd/commands/report.py
index 05b9249..582d76e 100644
--- a/vnftest/cmd/commands/report.py
+++ b/vnftest/cmd/commands/report.py
@@ -15,7 +15,7 @@
 
 from __future__ import absolute_import
 
-from vnftest.onap.core.report import Report
+from vnftest.core.report import Report
 from vnftest.cmd.commands import change_osloobj_to_paras
 from vnftest.common.utils import cliargs
 
diff --git a/vnftest/cmd/commands/runner.py b/vnftest/cmd/commands/runner.py
index 557f58f..5d130c3 100644
--- a/vnftest/cmd/commands/runner.py
+++ b/vnftest/cmd/commands/runner.py
@@ -18,7 +18,7 @@
 from __future__ import print_function
 
 from __future__ import absolute_import
-from vnftest.onap.core.runner import Runners
+from vnftest.core.runner import Runners
 from vnftest.common.utils import cliargs
 from vnftest.cmd.commands import change_osloobj_to_paras
 
diff --git a/vnftest/cmd/commands/step.py b/vnftest/cmd/commands/step.py
index 10ae913..90b3d68 100644
--- a/vnftest/cmd/commands/step.py
+++ b/vnftest/cmd/commands/step.py
@@ -17,7 +17,7 @@
 
 from __future__ import print_function
 from __future__ import absolute_import
-from vnftest.onap.core.step import Steps
+from vnftest.core.step import Steps
 from vnftest.common.utils import cliargs
 from vnftest.cmd.commands import change_osloobj_to_paras
 
diff --git a/vnftest/cmd/commands/task.py b/vnftest/cmd/commands/task.py
index c0aa63d..3e2a071 100644
--- a/vnftest/cmd/commands/task.py
+++ b/vnftest/cmd/commands/task.py
@@ -14,14 +14,13 @@
 
 import logging
 
-from vnftest.onap.core.task import Task
+from vnftest.core.task import Task
 from vnftest.common.utils import cliargs
 from vnftest.common.utils import write_json_to_file
 from vnftest.cmd.commands import change_osloobj_to_paras
 
 output_file_default = "/tmp/vnftest.out"
 
-
 LOG = logging.getLogger(__name__)
 
 
@@ -30,8 +29,8 @@
 
        Set of commands to manage benchmark tasks.
        """
-
-    @cliargs("inputfile", type=str, help="path to task or suite file", nargs=1)
+    @cliargs("vnfdescriptor", type=str, help="path to vnf descriptor file", metavar="vnf-descriptor")
+    @cliargs("inputfile", type=str, help="path to task or suite file", metavar="input-file")
     @cliargs("--task-args", dest="task_args",
              help="Input task args (dict in json). These args are used"
              "to render input task that is jinja2 template.")
diff --git a/vnftest/cmd/commands/testcase.py b/vnftest/cmd/commands/testcase.py
index 518df2d..445a8fe 100644
--- a/vnftest/cmd/commands/testcase.py
+++ b/vnftest/cmd/commands/testcase.py
@@ -18,7 +18,7 @@
 
 import prettytable
 
-from vnftest.onap.core.testcase import Testcase
+from vnftest.core.testcase import Testcase
 from vnftest.common.utils import cliargs
 from vnftest.cmd.commands import change_osloobj_to_paras
 from vnftest.cmd.commands import Commands
diff --git a/vnftest/common/constants.py b/vnftest/common/constants.py
index 9da64ba..8bbe070 100644
--- a/vnftest/common/constants.py
+++ b/vnftest/common/constants.py
@@ -38,11 +38,12 @@
 
 
 def get_param(key, default=''):
-    # we have to defer this to runtime so that we can mock os.environ.get in unittests
-    default_path = os.path.join(VNFTEST_ROOT_PATH, "etc/vnftest/vnftest.yaml")
-    conf_file = os.environ.get('CONF_FILE', default_path)
     # don't re-parse yaml for each lookup
     if not CONF:
+        # we have to defer this to runtime so that we can mock os.environ.get in unittests
+        default_path = os.path.join(VNFTEST_ROOT_PATH, "etc/vnftest/vnftest.yaml")
+        conf_file = os.environ.get('CONF_FILE', default_path)
+
         # do not use vnftest.common.utils.parse_yaml
         # since vnftest.common.utils creates a logger
         # and so it cannot be imported before this code
diff --git a/vnftest/onap/contexts/__init__.py b/vnftest/contexts/__init__.py
similarity index 100%
rename from vnftest/onap/contexts/__init__.py
rename to vnftest/contexts/__init__.py
diff --git a/vnftest/onap/contexts/base.py b/vnftest/contexts/base.py
similarity index 90%
rename from vnftest/onap/contexts/base.py
rename to vnftest/contexts/base.py
index a6ddb56..ac1591c 100644
--- a/vnftest/onap/contexts/base.py
+++ b/vnftest/contexts/base.py
@@ -14,13 +14,19 @@
 import abc
 import six
 import vnftest.common.utils as utils
+import yaml
 
 
 @six.add_metaclass(abc.ABCMeta)
 class Context(object):
     """Class that represents a context in the logical model"""
     list = []
-    params = {}
+    vnf_descriptor = {}
+
+    @classmethod
+    def load_vnf_descriptor(cls, vnf_descriptor_path):
+        with open(vnf_descriptor_path) as f:
+            cls.vnf_descriptor = yaml.safe_load(f)
 
     @staticmethod
     def split_name(name, sep='.'):
diff --git a/vnftest/onap/contexts/csar.py b/vnftest/contexts/csar.py
similarity index 96%
rename from vnftest/onap/contexts/csar.py
rename to vnftest/contexts/csar.py
index 8d89467..2dd4fa4 100644
--- a/vnftest/onap/contexts/csar.py
+++ b/vnftest/contexts/csar.py
@@ -13,7 +13,8 @@
 ##############################################################################
 
 import logging
-from vnftest.onap.contexts.base import Context
+
+from vnftest.contexts.base import Context
 
 LOG = logging.getLogger(__name__)
 
diff --git a/vnftest/onap/contexts/dummy.py b/vnftest/contexts/dummy.py
similarity index 96%
rename from vnftest/onap/contexts/dummy.py
rename to vnftest/contexts/dummy.py
index b61d55e..04d63ed 100644
--- a/vnftest/onap/contexts/dummy.py
+++ b/vnftest/contexts/dummy.py
@@ -15,7 +15,7 @@
 from __future__ import absolute_import
 import logging
 
-from vnftest.onap.contexts.base import Context
+from vnftest.contexts.base import Context
 
 
 LOG = logging.getLogger(__name__)
diff --git a/vnftest/onap/core/__init__.py b/vnftest/core/__init__.py
similarity index 96%
rename from vnftest/onap/core/__init__.py
rename to vnftest/core/__init__.py
index c204f9d..6ef8d70 100644
--- a/vnftest/onap/core/__init__.py
+++ b/vnftest/core/__init__.py
@@ -25,6 +25,7 @@
 
     def __init__(self, kwargs):
         # list
+        self.vnfdescriptor = kwargs.get('vnfdescriptor')
         self.inputfile = kwargs.get('inputfile')
         self.task_args = kwargs.get('task-args')
         self.task_args_file = kwargs.get('task-args-file')
diff --git a/vnftest/onap/core/plugin.py b/vnftest/core/plugin.py
similarity index 100%
rename from vnftest/onap/core/plugin.py
rename to vnftest/core/plugin.py
diff --git a/vnftest/onap/core/report.py b/vnftest/core/report.py
similarity index 100%
rename from vnftest/onap/core/report.py
rename to vnftest/core/report.py
diff --git a/vnftest/onap/core/runner.py b/vnftest/core/runner.py
similarity index 97%
rename from vnftest/onap/core/runner.py
rename to vnftest/core/runner.py
index 32ec6e9..d4830eb 100644
--- a/vnftest/onap/core/runner.py
+++ b/vnftest/core/runner.py
@@ -19,7 +19,7 @@
 
 import prettytable
 
-from vnftest.onap.runners.base import Runner
+from vnftest.runners.base import Runner
 
 
 class Runners(object):  # pragma: no cover
diff --git a/vnftest/onap/core/step.py b/vnftest/core/step.py
similarity index 97%
rename from vnftest/onap/core/step.py
rename to vnftest/core/step.py
index 4411780..dcd1fb4 100644
--- a/vnftest/onap/core/step.py
+++ b/vnftest/core/step.py
@@ -19,7 +19,7 @@
 from __future__ import absolute_import
 import prettytable
 
-from vnftest.onap.steps.base import Step
+from vnftest.steps.base import Step
 
 
 class Steps(object):    # pragma: no cover
diff --git a/vnftest/onap/core/task.py b/vnftest/core/task.py
similarity index 97%
rename from vnftest/onap/core/task.py
rename to vnftest/core/task.py
index 32d61f5..11c8bc6 100644
--- a/vnftest/onap/core/task.py
+++ b/vnftest/core/task.py
@@ -18,29 +18,33 @@
 
 from __future__ import absolute_import
 from __future__ import print_function
+
+import atexit
+import collections
+import copy
+import logging
 import sys
-import os
+import time
+import uuid
 from collections import OrderedDict
 
-import copy
-import yaml
-import atexit
 import ipaddress
-import time
-import logging
-import uuid
-import collections
-
-from six.moves import filter
+import os
+import yaml
 from jinja2 import Environment
+from six.moves import filter
+from vnftest.runners import base as base_runner
 
-from vnftest.onap.contexts.base import Context
-from vnftest.onap.contexts.csar import CSARContext
-from vnftest.onap.runners import base as base_runner
-from vnftest.onap.runners.duration import DurationRunner
-from vnftest.onap.runners.iteration import IterationRunner
+from vnftest.contexts.base import Context
+from vnftest.contexts.csar import CSARContext
+from vnftest.runners import base as base_runner
+from vnftest.runners.duration import DurationRunner
+from vnftest.runners.iteration import IterationRunner
 from vnftest.common.constants import CONF_FILE
+from vnftest.common.html_template import report_template
+from vnftest.common.task_template import TaskTemplate
 from vnftest.common.yaml_loader import yaml_load
+from vnftest.contexts.base import Context
 from vnftest.dispatcher.base import Base as DispatcherBase
 from vnftest.common.task_template import TaskTemplate
 from vnftest.common import utils
@@ -69,8 +73,7 @@
         output_config['DEFAULT']['dispatcher'] = out_types
 
     def start(self, args, **kwargs):
-        """Start a vnf step."""
-
+        Context.load_vnf_descriptor(args.vnfdescriptor)
         atexit.register(self.atexit_handler)
 
         task_id = getattr(args, 'task_id')
@@ -96,7 +99,7 @@
             utils.write_json_to_file(args.output_file, result)
 
         total_start_time = time.time()
-        parser = TaskParser(args.inputfile[0])
+        parser = TaskParser(args.inputfile)
 
         if args.suite:
             # 1.parse suite, return suite_params info
diff --git a/vnftest/onap/core/testcase.py b/vnftest/core/testcase.py
similarity index 100%
rename from vnftest/onap/core/testcase.py
rename to vnftest/core/testcase.py
diff --git a/vnftest/onap/core/testsuite.py b/vnftest/core/testsuite.py
similarity index 100%
rename from vnftest/onap/core/testsuite.py
rename to vnftest/core/testsuite.py
diff --git a/vnftest/onap/runners/__init__.py b/vnftest/crawlers/__init__.py
similarity index 100%
copy from vnftest/onap/runners/__init__.py
copy to vnftest/crawlers/__init__.py
diff --git a/vnftest/onap/contexts/dummy.py b/vnftest/crawlers/base.py
old mode 100644
new mode 100755
similarity index 64%
copy from vnftest/onap/contexts/dummy.py
copy to vnftest/crawlers/base.py
index b61d55e..8b5a526
--- a/vnftest/onap/contexts/dummy.py
+++ b/vnftest/crawlers/base.py
@@ -15,27 +15,23 @@
 from __future__ import absolute_import
 import logging
 
-from vnftest.onap.contexts.base import Context
+from vnftest.common import utils
+
+log = logging.getLogger(__name__)
 
 
-LOG = logging.getLogger(__name__)
+class Crawler(object):
 
-
-class DummyContext(Context):
-    """Class that handle dummy info"""
-
-    __context_type__ = "Dummy"
+    @staticmethod
+    def get_cls(crawler_type):
+        """return class of specified type"""
+        for crawler in utils.itersubclasses(Crawler):
+            if crawler_type == crawler.__crawler_type__:
+                return crawler
+        raise RuntimeError("No such crawler_type %s" % crawler_type)
 
     def __init__(self):
-        super(DummyContext, self).__init__()
-
-    def init(self, attrs):
         pass
 
-    def deploy(self):
-        """don't need to deploy"""
-        pass
-
-    def undeploy(self):
-        """don't need to undeploy"""
-        super(DummyContext, self).undeploy()
+    def crawl(self, dictionary, path):
+        raise NotImplementedError
diff --git a/vnftest/onap/contexts/dummy.py b/vnftest/crawlers/default.py
similarity index 61%
copy from vnftest/onap/contexts/dummy.py
copy to vnftest/crawlers/default.py
index b61d55e..da4df0a 100644
--- a/vnftest/onap/contexts/dummy.py
+++ b/vnftest/crawlers/default.py
@@ -13,29 +13,23 @@
 ##############################################################################
 
 from __future__ import absolute_import
+from vnftest.crawlers import base
 import logging
 
-from vnftest.onap.contexts.base import Context
-
-
 LOG = logging.getLogger(__name__)
 
 
-class DummyContext(Context):
-    """Class that handle dummy info"""
+class DefaultCrawler(base.Crawler):
+    __crawler_type__ = 'default'
 
-    __context_type__ = "Dummy"
-
-    def __init__(self):
-        super(DummyContext, self).__init__()
-
-    def init(self, attrs):
-        pass
-
-    def deploy(self):
-        """don't need to deploy"""
-        pass
-
-    def undeploy(self):
-        """don't need to undeploy"""
-        super(DummyContext, self).undeploy()
+    def crawl(self, dictionary, path):
+        path_list = path.split("[")
+        value = dictionary
+        for path_element in path_list:
+            if path_element == "":
+                continue
+            path_element = path_element.replace("]", "")
+            if isinstance(value, list):
+                path_element = int(path_element)
+            value = value[path_element]
+        return value
diff --git a/vnftest/onap/contexts/__init__.py b/vnftest/onap/common/__init__.py
similarity index 100%
copy from vnftest/onap/contexts/__init__.py
copy to vnftest/onap/common/__init__.py
diff --git a/vnftest/onap/contexts/dummy.py b/vnftest/onap/common/vnf_type_crawler.py
similarity index 65%
copy from vnftest/onap/contexts/dummy.py
copy to vnftest/onap/common/vnf_type_crawler.py
index b61d55e..9e03dc0 100644
--- a/vnftest/onap/contexts/dummy.py
+++ b/vnftest/onap/common/vnf_type_crawler.py
@@ -13,29 +13,19 @@
 ##############################################################################
 
 from __future__ import absolute_import
+from vnftest.crawlers.default import DefaultCrawler
 import logging
 
-from vnftest.onap.contexts.base import Context
-
-
 LOG = logging.getLogger(__name__)
 
 
-class DummyContext(Context):
-    """Class that handle dummy info"""
+class VnfTypeCrawler(DefaultCrawler):
+    __crawler_type__ = 'VnfTypeCrawler'
 
-    __context_type__ = "Dummy"
-
-    def __init__(self):
-        super(DummyContext, self).__init__()
-
-    def init(self, attrs):
-        pass
-
-    def deploy(self):
-        """don't need to deploy"""
-        pass
-
-    def undeploy(self):
-        """don't need to undeploy"""
-        super(DummyContext, self).undeploy()
+    def crawl(self, dictionary, path):
+        index = 0
+        vnf_type = dictionary['groups'][0]['name']
+        if ".." not in vnf_type:
+            index = 1
+        dictionary = dictionary['groups'][index]
+        return super(VnfTypeCrawler, self).crawl(dictionary, path)
diff --git a/vnftest/onap/steps/onap_api_call.py b/vnftest/onap/onap_api_call.py
similarity index 77%
rename from vnftest/onap/steps/onap_api_call.py
rename to vnftest/onap/onap_api_call.py
index e03e00a..7cc68c3 100644
--- a/vnftest/onap/steps/onap_api_call.py
+++ b/vnftest/onap/onap_api_call.py
@@ -13,17 +13,19 @@
 ##############################################################################
 from __future__ import absolute_import
 
+import copy
 import logging
 import time
+
 import os
 import yaml
-import copy
 
-from vnftest.common.exceptions import MandatoryKeyException, InputParameterMissing
-from vnftest.onap.steps import base
-from vnftest.common import rest_client
 from vnftest.common import constants as consts
-from vnftest.onap.contexts.csar import CSARContext
+from vnftest.common import rest_client
+from vnftest.common.exceptions import MandatoryKeyException, InputParameterMissing
+from vnftest.crawlers.base import Crawler
+from vnftest.onap.common.vnf_type_crawler import VnfTypeCrawler
+from vnftest.steps import base
 
 LOG = logging.getLogger(__name__)
 
@@ -47,6 +49,7 @@
         self.rest_def_file = options.get("file")
         self.input_cfg = options.get("input", {})
         self.output_cfg = options.get("output", {})
+        self.sla_cfg = self.step_cfg.get('sla', {'retries': 0})
         self.setup_done = True
 
     def eval_input(self, params):
@@ -54,19 +57,28 @@
             param_name = input_parameter['parameter_name']
             value = None
             if 'value' in input_parameter:
-                value = input_parameter['value']
-            elif 'source' in input_parameter:
-                source = input_parameter['source']
-                if source == 'prev_step':
-                    if param_name in self.input_params:
-                        value = self.input_params[param_name]
-                    else:
-                        raise InputParameterMissing(param_name=param_name, source='input parameters')
-            if value is None:
+                value_def = input_parameter['value']
+                value = self.format_string(value_def, self.input_params)
+            if value is None or value == "":
                 raise InputParameterMissing(param_name=param_name, source="task configuration")
             params[param_name] = value
 
-    def run(self, result):
+    def run(self, result, attempt=0):
+        output = self.run_impl(result)
+        try:
+            self.handle_sla(output)
+        except AssertionError as e:
+            LOG.info(str(e))
+            if attempt < self.sla_cfg['retries']:
+                time.sleep(self.sla_cfg['interval'])
+                LOG.info("retry operation")
+                attempt = attempt + 1
+                return self.run(result, attempt)
+            else:
+                raise e
+        return output
+
+    def run_impl(self, result):
         if not self.setup_done:
             self.setup()
         output = {}
@@ -76,15 +88,17 @@
         result_body = execution_result['body']
         for output_parameter in self.output_cfg:
             param_name = output_parameter['parameter_name']
-            param_path = output_parameter['path']
-            path_list = param_path.split("|")
-            param_value = result_body
-            for path_element in path_list:
-                param_value = param_value[path_element]
+            param_value = output_parameter['value']
+            if param_value.find("[") > -1:
+                crawler_type = output_parameter.get('type', 'default')
+                crawler_class = Crawler.get_cls(crawler_type)
+                crawler = crawler_class()
+                param_value = crawler.crawl(result_body, param_value)
             if param_value is None:
                 raise MandatoryKeyException(key_name='param_path', class_name=str(result_body))
             result[param_name] = param_value
             output[param_name] = param_value
+        self.handle_sla(output)
         return output
 
     def execute_operation(self, params, attempt=0):
@@ -154,7 +168,8 @@
             ret = self.format_string(d, params)
         return ret
 
-    def format_string(self, st, params):
+    @staticmethod
+    def format_string(st, params):
         try:
             return st.format(**params)
         except Exception as e:
@@ -165,4 +180,9 @@
             LOG.info("param" + params[s])
             return st.format(**params)
 
-
+    def handle_sla(self, output):
+        if 'assert' in self.sla_cfg and 'equals' in self.sla_cfg:
+            value_def = self.sla_cfg['value']
+            value = self.format_string(value_def, output)
+            expected_value = self.sla_cfg['equals']
+            assert value == expected_value
diff --git a/vnftest/onap/steps/onboard/__init__.py b/vnftest/onap/onboard/__init__.py
similarity index 100%
rename from vnftest/onap/steps/onboard/__init__.py
rename to vnftest/onap/onboard/__init__.py
diff --git a/vnftest/onap/onboard/accept_resource_test.yaml b/vnftest/onap/onboard/accept_resource_test.yaml
new file mode 100644
index 0000000..60a079e
--- /dev/null
+++ b/vnftest/onap/onboard/accept_resource_test.yaml
@@ -0,0 +1,24 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/resources/{resource_id}/lifecycleState/certify"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_tester_user}",
+        "Accept": "application/json"
+        }
+body: {"userRemarks":"certified"}
diff --git a/vnftest/onap/onboard/accept_service_test.yaml b/vnftest/onap/onboard/accept_service_test.yaml
new file mode 100644
index 0000000..8b5e6db
--- /dev/null
+++ b/vnftest/onap/onboard/accept_service_test.yaml
@@ -0,0 +1,24 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services/{service_id}/lifecycleState/certify"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_tester_user}",
+        "Accept": "application/json"
+        }
+body: {"userRemarks":"certified"}
diff --git a/vnftest/onap/onboard/add_resource_instance.yaml b/vnftest/onap/onboard/add_resource_instance.yaml
new file mode 100644
index 0000000..b92cc9b
--- /dev/null
+++ b/vnftest/onap/onboard/add_resource_instance.yaml
@@ -0,0 +1,33 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services/{service_id}/resourceInstance"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {
+          "uniqueId": "{resource_instance_unique_id}",
+          "posX": "500",
+          "posY": "100",
+          "name": "{resource_instance_name}",
+          "componentVersion": "1.0",
+          "originType": "VF",
+          "icon": "defaulticon",
+          "componentUid": "{resource_version_id}"
+      }
\ No newline at end of file
diff --git a/vnftest/onap/onboard/add_service.yaml b/vnftest/onap/onboard/add_service.yaml
new file mode 100644
index 0000000..9602a6b
--- /dev/null
+++ b/vnftest/onap/onboard/add_service.yaml
@@ -0,0 +1,82 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {
+          "artifacts": {
+
+          },
+          "toscaArtifacts": {
+
+          },
+          "contactId": "{sdc_designer_user}",
+          "categories": [
+              {
+                  "name": "Network L4+",
+                  "normalizedName": "network l4+",
+                  "uniqueId": "serviceNewCategory.network l4+",
+                  "icons": [
+                      "network_l_4"
+                  ],
+                  "subcategories": null,
+                  "ownerId": null
+              }
+          ],
+          "description": "service test",
+          "icon": "defaulticon",
+          "componentInstancesProperties": {
+
+          },
+          "componentInstancesAttributes": {
+
+          },
+          "name": "{service_name}",
+          "tags": [
+              "{service_name}"
+          ],
+          "capabilities": {
+
+          },
+          "requirements": {
+
+          },
+          "deploymentArtifacts": {
+
+          },
+          "componentType": "SERVICE",
+          "projectCode": "100100",
+          "componentInstances": [
+
+          ],
+          "properties": [
+
+          ],
+          "attributes": [
+
+          ],
+          "groups": [
+
+          ],
+          "ecompGeneratedNaming": "true",
+          "serviceApiArtifacts": {
+
+          }
+      }
diff --git a/vnftest/onap/onboard/approve_distribution.yaml b/vnftest/onap/onboard/approve_distribution.yaml
new file mode 100644
index 0000000..b1efc48
--- /dev/null
+++ b/vnftest/onap/onboard/approve_distribution.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services/{service_version_id}/distribution-state/approve"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_governance_user}",
+        "Accept": "application/json"
+        }
+body: {"userRemarks":"approved"}
diff --git a/vnftest/onap/steps/onboard/checkin_vlm.yaml b/vnftest/onap/onboard/checkin_vlm.yaml
similarity index 100%
rename from vnftest/onap/steps/onboard/checkin_vlm.yaml
rename to vnftest/onap/onboard/checkin_vlm.yaml
diff --git a/vnftest/onap/onboard/checkin_vsp.yaml b/vnftest/onap/onboard/checkin_vsp.yaml
new file mode 100644
index 0000000..399aa47
--- /dev/null
+++ b/vnftest/onap/onboard/checkin_vsp.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "PUT"
+url: "http://{sdc_ip}:{sdc_port}/onboarding-api/v1.0/vendor-software-products/{vsp_id}/versions/0.1/actions"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {"action":"Checkin"}
diff --git a/vnftest/onap/onboard/create_package_vsp.yaml b/vnftest/onap/onboard/create_package_vsp.yaml
new file mode 100644
index 0000000..a961b86
--- /dev/null
+++ b/vnftest/onap/onboard/create_package_vsp.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "PUT"
+url: "http://{sdc_ip}:{sdc_port}/onboarding-api/v1.0/vendor-software-products/{vsp_id}/versions/0.1/actions"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {"action":"Create_Package"}
diff --git a/vnftest/onap/steps/onboard/create_vlm.yaml b/vnftest/onap/onboard/create_vlm.yaml
similarity index 100%
rename from vnftest/onap/steps/onboard/create_vlm.yaml
rename to vnftest/onap/onboard/create_vlm.yaml
diff --git a/vnftest/onap/onboard/create_vsp.yaml b/vnftest/onap/onboard/create_vsp.yaml
new file mode 100644
index 0000000..d9721a2
--- /dev/null
+++ b/vnftest/onap/onboard/create_vsp.yaml
@@ -0,0 +1,34 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_port}/onboarding-api/v1.0/vendor-software-products"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {
+        "vendorId": "{vendor_id}",
+        "name": "{vsp_name}",
+        "category": "resourceNewCategory.application l4+",
+        "subCategory": "resourceNewCategory.application l4+.firewall",
+        "description": "vlm via dovetail",
+        "onboardingMethod": "NetworkPackage",
+        "vendorName": "dovetailVendor",
+        "icon": "icon",
+        "licensingData": {
+        }
+      }
\ No newline at end of file
diff --git a/vnftest/onap/onboard/distribute.yaml b/vnftest/onap/onboard/distribute.yaml
new file mode 100644
index 0000000..7deb9a1
--- /dev/null
+++ b/vnftest/onap/onboard/distribute.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services/{service_version_id}/distribution/PROD/activate"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_operations_user}",
+        "Accept": "application/json"
+        }
+body: {}
diff --git a/vnftest/onap/onboard/import_vsp.yaml b/vnftest/onap/onboard/import_vsp.yaml
new file mode 100644
index 0000000..d3a3100
--- /dev/null
+++ b/vnftest/onap/onboard/import_vsp.yaml
@@ -0,0 +1,91 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/resources"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {
+        "artifacts": {
+
+        },
+        "toscaArtifacts": {
+
+        },
+        "contactId": "{sdc_designer_user}",
+        "categories": [
+          {
+            "name": "Application L4+",
+            "normalizedName": "application l4+",
+            "uniqueId": "resourceNewCategory.application l4+",
+            "icons": null,
+            "subcategories": [
+              {
+                "name": "Firewall",
+                "normalizedName": "firewall",
+                "uniqueId": "resourceNewCategory.application l4+.firewall",
+                "icons": [
+                  "firewall"
+                ],
+                "groupings": null,
+                "ownerId": null
+              }
+            ],
+            "ownerId": null
+          }
+        ],
+        "description": "dovetail initiated",
+        "icon": "defaulticon",
+        "componentInstancesProperties": {
+
+        },
+        "componentInstancesAttributes": {
+
+        },
+        "name": "{vsp_name}",
+        "tags": [
+          "{vsp_name}"
+        ],
+        "capabilities": {
+
+        },
+        "requirements": {
+
+        },
+        "deploymentArtifacts": {
+
+        },
+        "componentType": "RESOURCE",
+        "vendorName": "dovetailVendor",
+        "vendorRelease": "1.0",
+        "componentInstances": [
+
+        ],
+        "properties": [
+
+        ],
+        "attributes": [
+
+        ],
+        "groups": [
+
+        ],
+        "resourceType": "VF",
+        "csarUUID": "{vsp_id}",
+        "csarVersion": "1.0"
+      }
diff --git a/vnftest/onap/onboard/monitor_distribution.yaml b/vnftest/onap/onboard/monitor_distribution.yaml
new file mode 100644
index 0000000..07216d0
--- /dev/null
+++ b/vnftest/onap/onboard/monitor_distribution.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "GET"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services/{distributed_service_id}/distribution"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_operations_user}",
+        "Accept": "application/json"
+        }
+body: {}
diff --git a/vnftest/onap/onboard/process_package.yaml b/vnftest/onap/onboard/process_package.yaml
new file mode 100644
index 0000000..ee8f791
--- /dev/null
+++ b/vnftest/onap/onboard/process_package.yaml
@@ -0,0 +1,22 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "PUT"
+url: "http://{sdc_ip}:{sdc_port}/onboarding-api/v1.0/vendor-software-products/{vsp_id}/versions/0.1/orchestration-template-candidate/process"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
\ No newline at end of file
diff --git a/vnftest/onap/onboard/start_resource_test.yaml b/vnftest/onap/onboard/start_resource_test.yaml
new file mode 100644
index 0000000..d6ba7b3
--- /dev/null
+++ b/vnftest/onap/onboard/start_resource_test.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/resources/{resource_id}/lifecycleState/startCertification"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_tester_user}",
+        "Accept": "application/json"
+        }
+body: {}
diff --git a/vnftest/onap/onboard/start_service_test.yaml b/vnftest/onap/onboard/start_service_test.yaml
new file mode 100644
index 0000000..6a89b94
--- /dev/null
+++ b/vnftest/onap/onboard/start_service_test.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services/{service_id}/lifecycleState/startCertification"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_tester_user}",
+        "Accept": "application/json"
+        }
+body: {}
diff --git a/vnftest/onap/onboard/submit_resource_for_testing.yaml b/vnftest/onap/onboard/submit_resource_for_testing.yaml
new file mode 100644
index 0000000..4bdc2be
--- /dev/null
+++ b/vnftest/onap/onboard/submit_resource_for_testing.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/resources/{resource_id}/lifecycleState/certificationRequest"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {"userRemarks":"resource submited for testing"}
diff --git a/vnftest/onap/onboard/submit_service_for_testing.yaml b/vnftest/onap/onboard/submit_service_for_testing.yaml
new file mode 100644
index 0000000..e75e6af
--- /dev/null
+++ b/vnftest/onap/onboard/submit_service_for_testing.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_catalog_port}/sdc1/feProxy/rest/v1/catalog/services/{service_id}/lifecycleState/certificationRequest"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic YmVlcDpib29w",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {"userRemarks":"resource submited for testing"}
diff --git a/vnftest/onap/steps/onboard/submit_vlm.yaml b/vnftest/onap/onboard/submit_vlm.yaml
similarity index 100%
rename from vnftest/onap/steps/onboard/submit_vlm.yaml
rename to vnftest/onap/onboard/submit_vlm.yaml
diff --git a/vnftest/onap/onboard/submit_vsp.yaml b/vnftest/onap/onboard/submit_vsp.yaml
new file mode 100644
index 0000000..c255cd7
--- /dev/null
+++ b/vnftest/onap/onboard/submit_vsp.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "PUT"
+url: "http://{sdc_ip}:{sdc_port}/onboarding-api/v1.0/vendor-software-products/{vsp_id}/versions/0.1/actions"
+headers: {
+        "Content-Type": "application/json",
+        "Authorization": "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+body: {"action":"Submit"}
diff --git a/vnftest/onap/onboard/upload_package.yaml b/vnftest/onap/onboard/upload_package.yaml
new file mode 100644
index 0000000..958782f
--- /dev/null
+++ b/vnftest/onap/onboard/upload_package.yaml
@@ -0,0 +1,23 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+---
+method: "POST"
+url: "http://{sdc_ip}:{sdc_port}/onboarding-api/v1.0/vendor-software-products/{vsp_id}/versions/0.1/orchestration-template-candidate"
+headers: {
+        "Content-Type": "multipart/form-data",
+        "Authorization": "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
+        "USER_ID": "{sdc_designer_user}",
+        "Accept": "application/json"
+        }
+file: "{package_file_path}"
\ No newline at end of file
diff --git a/vnftest/onap/package_upload.py b/vnftest/onap/package_upload.py
new file mode 100644
index 0000000..084de78
--- /dev/null
+++ b/vnftest/onap/package_upload.py
@@ -0,0 +1,43 @@
+##############################################################################
+# Copyright 2018 EuropeanSoftwareMarketingLtd.
+# ===================================================================
+#  Licensed under the ApacheLicense, Version2.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
+#
+# 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
+##############################################################################
+from __future__ import absolute_import
+
+import copy
+import logging
+import time
+
+import os
+import yaml
+
+from vnftest.common import constants as consts
+from vnftest.common import rest_client
+from vnftest.common.exceptions import MandatoryKeyException, InputParameterMissing
+from vnftest.contexts.base import Context
+from vnftest.crawlers.base import Crawler
+from vnftest.onap.common.vnf_type_crawler import VnfTypeCrawler
+from vnftest.onap.onap_api_call import OnapApiCall
+
+LOG = logging.getLogger(__name__)
+
+
+class PackageUpload(OnapApiCall):
+
+    __step_type__ = "PackageUpload"
+
+    def __init__(self, step_cfg, context_cfg, input_params):
+        super(PackageUpload, self).__init__(step_cfg, context_cfg, input_params)
+
+    def setup(self):
+        super(PackageUpload, self).setup()
+        self.input_cfg.append({'parameter_name': "package_file_path", 'value': Context.vnf_descriptor["csar_package_location"]})
diff --git a/vnftest/onap/runners/__init__.py b/vnftest/runners/__init__.py
similarity index 100%
rename from vnftest/onap/runners/__init__.py
rename to vnftest/runners/__init__.py
diff --git a/vnftest/onap/runners/base.py b/vnftest/runners/base.py
similarity index 98%
rename from vnftest/onap/runners/base.py
rename to vnftest/runners/base.py
index 15d8a8d..c00a4cd 100755
--- a/vnftest/onap/runners/base.py
+++ b/vnftest/runners/base.py
@@ -15,17 +15,19 @@
 # rally/rally/benchmark/runners/base.py
 
 from __future__ import absolute_import
+
+import importlib
 import logging
 import multiprocessing
 import subprocess
 import time
 import traceback
-import importlib
 from Queue import Empty
 
 import vnftest.common.utils as utils
-from vnftest.onap.steps import base as base_step
-from vnftest.onap.steps.onap_api_call import OnapApiCall
+from vnftest.steps import base as base_step
+from vnftest.onap.onap_api_call import OnapApiCall
+from vnftest.onap.package_upload import PackageUpload
 
 log = logging.getLogger(__name__)
 
diff --git a/vnftest/onap/runners/duration.py b/vnftest/runners/duration.py
similarity index 98%
rename from vnftest/onap/runners/duration.py
rename to vnftest/runners/duration.py
index 7e539e5..a3bf33f 100644
--- a/vnftest/onap/runners/duration.py
+++ b/vnftest/runners/duration.py
@@ -18,13 +18,15 @@
 """
 
 from __future__ import absolute_import
-import os
-import multiprocessing
-import logging
-import traceback
-import time
 
-from vnftest.onap.runners import base
+import logging
+import multiprocessing
+import time
+import traceback
+
+import os
+
+from vnftest.runners import base
 
 LOG = logging.getLogger(__name__)
 
diff --git a/vnftest/onap/runners/dynamictp.py b/vnftest/runners/dynamictp.py
similarity index 99%
rename from vnftest/onap/runners/dynamictp.py
rename to vnftest/runners/dynamictp.py
index 5ea0910..e394567 100755
--- a/vnftest/onap/runners/dynamictp.py
+++ b/vnftest/runners/dynamictp.py
@@ -24,7 +24,7 @@
 
 import os
 
-from vnftest.onap.runners import base
+from vnftest.runners import base
 
 LOG = logging.getLogger(__name__)
 
diff --git a/vnftest/onap/runners/iteration.py b/vnftest/runners/iteration.py
similarity index 96%
rename from vnftest/onap/runners/iteration.py
rename to vnftest/runners/iteration.py
index 9c9ab2c..1fec101 100644
--- a/vnftest/onap/runners/iteration.py
+++ b/vnftest/runners/iteration.py
@@ -12,7 +12,7 @@
 # the License
 ##############################################################################
 # vnftest comment: this is a modified copy of
-# rally/rally/benchmark/runners/iteration.py
+# rally/rally/benchmark/runners/vnf_type_crawler.py
 
 """A runner that runs a configurable number of times before it returns
 """
@@ -25,9 +25,9 @@
 import traceback
 
 import os
-from vnftest.common.exceptions import VnftestException
 
-from vnftest.onap.runners import base
+from vnftest.common.exceptions import VnftestException
+from vnftest.runners import base
 
 LOG = logging.getLogger(__name__)
 
@@ -94,16 +94,12 @@
                     step_cfg['options']['rate'] -= delta
                     sequence = 1
                     continue
-            except VnftestException:
+            except Exception:
                 errors.append(traceback.format_exc())
                 LOG.exception("")
                 LOG.info("Abort the task")
                 fatal_error = True
 
-            except Exception:
-                errors.append(traceback.format_exc())
-                LOG.exception("")
-
             time.sleep(interval)
 
             step_results = {
diff --git a/vnftest/onap/runners/search.py b/vnftest/runners/search.py
similarity index 99%
rename from vnftest/onap/runners/search.py
rename to vnftest/runners/search.py
index d5bd417..79ade19 100644
--- a/vnftest/onap/runners/search.py
+++ b/vnftest/runners/search.py
@@ -23,14 +23,14 @@
 import multiprocessing
 import time
 import traceback
+from collections import Mapping
 from contextlib import contextmanager
 from itertools import takewhile
 
 import os
-from collections import Mapping
 from six.moves import zip
 
-from vnftest.onap.runners import base
+from vnftest.runners import base
 
 LOG = logging.getLogger(__name__)
 
diff --git a/vnftest/onap/runners/sequence.py b/vnftest/runners/sequence.py
similarity index 98%
rename from vnftest/onap/runners/sequence.py
rename to vnftest/runners/sequence.py
index b341495..80afa16 100644
--- a/vnftest/onap/runners/sequence.py
+++ b/vnftest/runners/sequence.py
@@ -27,7 +27,7 @@
 
 import os
 
-from vnftest.onap.runners import base
+from vnftest.runners import base
 
 LOG = logging.getLogger(__name__)
 
diff --git a/vnftest/onap/steps/__init__.py b/vnftest/steps/__init__.py
similarity index 100%
rename from vnftest/onap/steps/__init__.py
rename to vnftest/steps/__init__.py
diff --git a/vnftest/onap/steps/base.py b/vnftest/steps/base.py
similarity index 100%
rename from vnftest/onap/steps/base.py
rename to vnftest/steps/base.py
diff --git a/vnftest/onap/steps/dummy/__init__.py b/vnftest/steps/dummy/__init__.py
similarity index 100%
rename from vnftest/onap/steps/dummy/__init__.py
rename to vnftest/steps/dummy/__init__.py
diff --git a/vnftest/onap/steps/dummy/dummy.py b/vnftest/steps/dummy/dummy.py
similarity index 97%
rename from vnftest/onap/steps/dummy/dummy.py
rename to vnftest/steps/dummy/dummy.py
index 27e9a32..650fdb4 100644
--- a/vnftest/onap/steps/dummy/dummy.py
+++ b/vnftest/steps/dummy/dummy.py
@@ -12,9 +12,10 @@
 # the License
 ##############################################################################
 from __future__ import absolute_import
+
 import logging
 
-from vnftest.onap.steps import base
+from vnftest.steps import base
 
 LOG = logging.getLogger(__name__)