Merge "Remove customize src_folder variables"
diff --git a/bootstrap/vagrant-onap/Vagrantfile b/bootstrap/vagrant-onap/Vagrantfile
index 6d35a1a..779f079 100644
--- a/bootstrap/vagrant-onap/Vagrantfile
+++ b/bootstrap/vagrant-onap/Vagrantfile
@@ -1,6 +1,8 @@
 # -*- mode: ruby -*-
 # vi: set ft=ruby :
 
+Vagrant::DEFAULT_SERVER_URL.replace('https://vagrantcloud.com')
+
 configuration = {
   # Generic parameters used across all ONAP components
   'key_name'            => 'ecomp_key',
diff --git a/test/csit/plans/music/music-test-plan/setup.sh b/test/csit/plans/music/music-test-plan/setup.sh
new file mode 100755
index 0000000..517837c
--- /dev/null
+++ b/test/csit/plans/music/music-test-plan/setup.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+#
+
+#
+# add here eventual scripts needed for music
+#
+echo "##########################################################";
+echo "#";
+echo "# music scripts calling";
+echo "#";
+echo "##########################################################";
+source ${WORKSPACE}/test/csit/scripts/music/music-scripts/music_script.sh
+
+#
+# add here below the start of all docker containers needed for music CSIT testing
+#
+echo "##########################################################";
+echo "#";
+echo "# music scripts docker containers spinoff";
+echo "#";
+echo "##########################################################";
+
+#
+# add here all the configuration steps eventually needed to be carried out for music CSIT testing
+#
+echo "##########################################################";
+echo "#";
+echo "# music configuration step";
+echo "#";
+echo "##########################################################";
+
+
+#
+# add here all ROBOT_VARIABLES settings
+#
+echo "##########################################################";
+echo "#";
+echo "# music robot variables settings";
+echo "#";
+echo "##########################################################";
+ROBOT_VARIABLES="-v MUSIC_HOSTNAME:http://localhost -v MUSIC_PORT:8080 -v COND_HOSTNAME:http://localhost -v COND_PORT:8091"
+
+echo ${ROBOT_VARIABLES}
+
+
+
diff --git a/test/csit/plans/music/music-test-plan/teardown.sh b/test/csit/plans/music/music-test-plan/teardown.sh
new file mode 100755
index 0000000..884a64f
--- /dev/null
+++ b/test/csit/plans/music/music-test-plan/teardown.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+#
+
+
+#
+# add here below the killing of all docker containers used for music CSIT testing
+#
+echo "##########################################################";
+echo "#";
+echo "# music scripts docker containers killing";
+echo "#";
+echo "##########################################################";
+# kill-instance.sh <dockercontainername>
+
diff --git a/test/csit/plans/music/music-test-plan/testplan.txt b/test/csit/plans/music/music-test-plan/testplan.txt
new file mode 100644
index 0000000..e53f326
--- /dev/null
+++ b/test/csit/plans/music/music-test-plan/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+music/music-suite
diff --git a/test/csit/plans/optf/has/setup.sh b/test/csit/plans/optf/has/setup.sh
new file mode 100755
index 0000000..b2c8143
--- /dev/null
+++ b/test/csit/plans/optf/has/setup.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+#
+
+#
+# add here eventual scripts needed for optf/has
+#
+echo "##########################################################";
+echo "#";
+echo "# optf/has scripts calling";
+echo "#";
+echo "##########################################################";
+source ${WORKSPACE}/test/csit/scripts/optf/has/has_script.sh
+
+#
+# add here below the start of all docker containers needed for optf/has CSIT testing
+#
+echo "##########################################################";
+echo "#";
+echo "# optf/has scripts docker containers spinoff";
+echo "#";
+echo "##########################################################";
+
+#
+# add here all the configuration steps eventually needed to be carried out for optf/has CSIT testing
+#
+echo "##########################################################";
+echo "#";
+echo "# optf/has configuration step";
+echo "#";
+echo "##########################################################";
+
+
+#
+# add here all ROBOT_VARIABLES settings
+#
+echo "##########################################################";
+echo "#";
+echo "# optf/has robot variables settings";
+echo "#";
+echo "##########################################################";
+ROBOT_VARIABLES="-v MUSIC_HOSTNAME:http://localhost -v MUSIC_PORT:8080 -v COND_HOSTNAME:http://localhost -v COND_PORT:8091"
+
+echo ${ROBOT_VARIABLES}
+
+
+
diff --git a/test/csit/plans/optf/has/teardown.sh b/test/csit/plans/optf/has/teardown.sh
new file mode 100755
index 0000000..b7e6cf0
--- /dev/null
+++ b/test/csit/plans/optf/has/teardown.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+#
+
+
+#
+# add here below the killing of all docker containers used for optf/has CSIT testing
+#
+echo "##########################################################";
+echo "#";
+echo "# optf/has scripts docker containers killing";
+echo "#";
+echo "##########################################################";
+# kill-instance.sh <dockercontainername>
+
diff --git a/test/csit/plans/optf/has/testplan.txt b/test/csit/plans/optf/has/testplan.txt
new file mode 100644
index 0000000..0f9f84d
--- /dev/null
+++ b/test/csit/plans/optf/has/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+optf/has
diff --git a/test/csit/scripts/optf/has/testsample.txt b/test/csit/plans/optf/osdf/sample.txt
similarity index 100%
copy from test/csit/scripts/optf/has/testsample.txt
copy to test/csit/plans/optf/osdf/sample.txt
diff --git a/test/csit/scripts/music/music-scripts/music_script.sh b/test/csit/scripts/music/music-scripts/music_script.sh
new file mode 100755
index 0000000..f16062a
--- /dev/null
+++ b/test/csit/scripts/music/music-scripts/music_script.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+#
+echo "######################################################################"
+echo "### "
+echo "### This is ${WORKSPACE}/test/csit/scripts/music/music-scripts/music_script.sh"
+echo "### "
+echo "######################################################################"
+#
+# add here whatever commands is needed to prepare the music CSIT testing
+#
+
diff --git a/test/csit/scripts/optf/has/has_script.sh b/test/csit/scripts/optf/has/has_script.sh
new file mode 100755
index 0000000..6f1ddd6
--- /dev/null
+++ b/test/csit/scripts/optf/has/has_script.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+#
+echo "######################################################################"
+echo "### "
+echo "### This is ${WORKSPACE}/test/csit/scripts/optf/has/has_script.sh"
+echo "### "
+echo "######################################################################"
+#
+# add here whatever commands is needed to prepare the optf/has CSIT testing
+#
+
diff --git a/test/csit/scripts/optf/has/testsample.txt b/test/csit/scripts/optf/osdf/testsample.txt
similarity index 100%
rename from test/csit/scripts/optf/has/testsample.txt
rename to test/csit/scripts/optf/osdf/testsample.txt
diff --git a/test/csit/tests/clamp/APIs/01__Create_CL_TCA.robot b/test/csit/tests/clamp/APIs/02__Create_CL_TCA.robot
similarity index 100%
rename from test/csit/tests/clamp/APIs/01__Create_CL_TCA.robot
rename to test/csit/tests/clamp/APIs/02__Create_CL_TCA.robot
diff --git a/test/csit/tests/clamp/APIs/03__VariousApis.robot b/test/csit/tests/clamp/APIs/03__VariousApis.robot
index 47441e8..f875e4c 100644
--- a/test/csit/tests/clamp/APIs/03__VariousApis.robot
+++ b/test/csit/tests/clamp/APIs/03__VariousApis.robot
@@ -30,14 +30,6 @@
     Should Contain Match    ${resp}   *Policy_*
     Should Contain Match    ${resp}   *EndEvent_*
 
-Get model by name
-    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
-    Create Session   clamp  http://localhost:8080   auth=${auth}
-    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model/ClHolmes1
-    Dictionary Should Contain Key    ${resp.json()}   templateName
-    Dictionary Should Contain Key    ${resp.json()}   bpmnText
-    Dictionary Should Contain Key    ${resp.json()}   imageText
-
 Get model names
     ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
     Create Session   clamp  http://localhost:8080   auth=${auth}
diff --git a/test/csit/tests/clamp/APIs/04__Verify_API_Models.robot b/test/csit/tests/clamp/APIs/04__Verify_API_Models.robot
new file mode 100644
index 0000000..f4f7626
--- /dev/null
+++ b/test/csit/tests/clamp/APIs/04__Verify_API_Models.robot
@@ -0,0 +1,73 @@
+*** Settings ***
+Library     Collections
+Library     RequestsLibrary
+Library     OperatingSystem
+Library     json
+
+*** Test Cases ***
+Verify HolmesModel1
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model/ClHolmes1
+    Should Contain Match    ${resp}   *templateHolmes1*
+    Should Contain Match    ${resp}   *DC1*
+    Should Contain Match    ${resp}   *DC2*
+    Should Contain Match    ${resp}   *Policy1*
+    Should Contain Match    ${resp}   *vnfRecipe*
+    Should Contain Match    ${resp}   *180*
+    Should Contain Match    ${resp}   *345*
+    Should Contain Match    ${resp}   *Config Policy name1*
+
+Verify HolmesModel2
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model/ClHolmes2
+    Should Contain Match    ${resp}   *templateHolmes2*
+    Should Contain Match    ${resp}   *DC2*
+    Should Contain Match    ${resp}   *DC3*
+    Should Contain Match    ${resp}   *Policy2*
+    Should Contain Match    ${resp}   *enbRecipe*
+    Should Contain Match    ${resp}   *reset*
+    Should Contain Match    ${resp}   *360*
+    Should Contain Match    ${resp}   *345*
+    Should Contain Match    ${resp}   *Config Policy Name2*
+
+Verify TCAModel1
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model/ClTCA1
+    Should Contain Match    ${resp}   *templateTCA1*
+    Should Contain Match    ${resp}   *vnfRecipe*
+    Should Contain Match    ${resp}   *DC1*
+    Should Contain Match    ${resp}   *DC2*
+    Should Contain Match    ${resp}   *Policy3*
+    Should Contain Match    ${resp}   *345*
+    Should Contain Match    ${resp}   *200*
+    Should Contain Match    ${resp}   *ONSET*
+
+Verify TCAModel2
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model/ClTCA2
+    Should Contain Match    ${resp}   *templateTCA2*
+    Should Contain Match    ${resp}   *vnfRecipe*
+    Should Contain Match    ${resp}   *DC1*
+    Should Contain Match    ${resp}   *DC2*
+    Should Contain Match    ${resp}   *DC3*
+    Should Contain Match    ${resp}   *Policy4*
+    Should Contain Match    ${resp}   *vLoadBalancer*
+    Should Contain Match    ${resp}   *345*
+    Should Contain Match    ${resp}   *300*
+    Should Contain Match    ${resp}   *VM*
+
+Get model names
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model-names
+    Should Contain Match    ${resp}   *ClHolmes1*
+    Should Contain Match    ${resp}   *ClHolmes2*
+    Should Contain Match    ${resp}   *ClTCA1*
+    Should Contain Match    ${resp}   *ClTCA2*
+    Should Not Contain Match    ${resp}   *ClTCA99*
+    Should Not Contain Match    ${resp}   *ClHolmes99*
+
diff --git a/test/csit/tests/clamp/UIs/01__Create_Holmes_model.robot b/test/csit/tests/clamp/UIs/01__Create_Holmes_model.robot
index 7a45dbb..a942550 100644
--- a/test/csit/tests/clamp/UIs/01__Create_Holmes_model.robot
+++ b/test/csit/tests/clamp/UIs/01__Create_Holmes_model.robot
@@ -7,8 +7,8 @@
 Library     XvfbRobot
 
 *** Variables ***
-${SELENIUM_SPEED_FAST}       0.2 seconds
-${SELENIUM_SPEED_SLOW}       2 seconds
+${SELENIUM_SPEED_FAST}       .2 seconds
+${SELENIUM_SPEED_SLOW}       .5 seconds
 
 *** Test Cases ***
 Get Requests health check ok
@@ -41,6 +41,35 @@
     Select From List By Label       id=templateName      templateHolmes1
     Click Button    locator=Create
 
+Set Properties for HolmesModel1
+    Wait Until Element Is Visible       xpath=//*[@id="navbar"]/ul/li[1]/a       timeout=60
+    Click Element    xpath=//*[@id="navbar"]/ul/li[1]/a
+    Wait Until Element Is Visible       locator=Properties CL       timeout=60
+    Click Element    locator=Properties CL
+    Select From List By Label       id=service      vFirewall
+    Select From List By Label       id=vf      vFirewall 0
+    Select From List By Label       id=actionSet      VNF
+    Select From List By Label       id=location      Data Center 2      Data Center 3
+    Click Button    locator=Save
+
+Set Policy Box properties for HolmesModel1
+    Wait Until Element Is Visible       xpath=//*[@data-element-id="Policy_136qatf"]      timeout=60
+    Click Element    xpath=//*[@data-element-id="Policy_136qatf"]
+    Click Button    locator=New Policy
+    Input Text      locator=//*[@id="pname"]      text=Policy1
+    Select From List By Label       id=recipe      Migrate
+    Input Text      locator=maxRetries      text=5
+    Input Text      locator=retryTimeLimit      text=240
+    Input Text      locator=timeout      text=390
+    Click Button    locator=Close
+
+Set Holmes Box properties for HolmesModel1
+    Wait Until Element Is Visible       xpath=//*[@data-element-id="Holmes_1gxp0mm"]      timeout=60
+    Click Element    xpath=//*[@data-element-id="Holmes_1gxp0mm"]
+    Input Text      locator=correlationalLogic     text=correlational Logic1
+    Input Text      locator=configPolicyName     text=config Policy Name1
+    Click Button    locator=Save
+
 Save Model from Menu
     Wait Until Element Is Visible       xpath=//*[@id="navbar"]/ul/li[1]/a      timeout=60
     Click Element    xpath=//*[@id="navbar"]/ul/li[1]/a
diff --git a/test/csit/tests/clamp/UIs/02__Create_TCA_model.robot b/test/csit/tests/clamp/UIs/02__Create_TCA_model.robot
index e024072..caacec3 100644
--- a/test/csit/tests/clamp/UIs/02__Create_TCA_model.robot
+++ b/test/csit/tests/clamp/UIs/02__Create_TCA_model.robot
@@ -7,8 +7,8 @@
 Library     XvfbRobot
 
 *** Variables ***
-${SELENIUM_SPEED_FAST}       0.2 seconds
-${SELENIUM_SPEED_SLOW}       2 seconds
+${SELENIUM_SPEED_FAST}       .2 seconds
+${SELENIUM_SPEED_SLOW}       .5 seconds
 
 *** Test Cases ***
 Get Requests health check ok
@@ -41,6 +41,30 @@
     Select From List By Label       id=templateName      templateTCA1
     Click Button    locator=Create
 
+Set Properties for TCAModel1
+    Wait Until Element Is Visible       xpath=//*[@id="navbar"]/ul/li[1]/a       timeout=60
+    Click Element    xpath=//*[@id="navbar"]/ul/li[1]/a
+    Wait Until Element Is Visible       locator=Properties CL       timeout=60
+    Click Element    locator=Properties CL
+    Select From List By Label       id=service       vLoadBalancer
+    Select From List By Label       id=vf       vLoadBalancer 0
+    Select From List By Label       id=actionSet      eNodeB
+    Select From List By Label       id=location      Data Center 1      Data Center 3
+    Click Button    locator=Save
+
+Set Policy Box properties for TCAModel1
+    Wait Until Element Is Visible       xpath=//*[@data-element-id="Policy_12lup3h"]      timeout=60
+    Click Element    xpath=//*[@data-element-id="Policy_12lup3h"]
+    Click Button    locator=New Policy
+    Input Text      locator=//*[@id="pname"]      text=Policy2
+    Select From List By Label       id=recipe      Reset
+    Input Text      locator=maxRetries      text=6
+    Input Text      locator=retryTimeLimit      text=280
+    Input Text      locator=timeout      text=400
+    Click Button    locator=Close
+
+### Cannot set TCA box attributes due to element not interractable with Selenium
+
 Save Model from Menu
     Wait Until Element Is Visible       xpath=//*[@id="navbar"]/ul/li[1]/a      timeout=60
     Click Element    xpath=//*[@id="navbar"]/ul/li[1]/a
diff --git a/test/csit/tests/clamp/UIs/03__Verify_UI_Models.robot b/test/csit/tests/clamp/UIs/03__Verify_UI_Models.robot
new file mode 100644
index 0000000..c866174
--- /dev/null
+++ b/test/csit/tests/clamp/UIs/03__Verify_UI_Models.robot
@@ -0,0 +1,44 @@
+*** Settings ***
+Library     Collections
+Library     RequestsLibrary
+Library     OperatingSystem
+Library     jsons
+
+*** Test Cases ***
+Verify HolmesModel1
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model/HolmesModel1
+    Should Contain Match    ${resp}   *templateHolmes1*
+    Should Contain Match    ${resp}   *DC2*
+    Should Contain Match    ${resp}   *DC3*
+    Should Contain Match    ${resp}   *Policy1*
+    Should Contain Match    ${resp}   *07e266fc-49ab-4cd7-8378-ca4676f1b9ec*
+    Should Contain Match    ${resp}   *migrate*
+    Should Contain Match    ${resp}   *240*
+    Should Contain Match    ${resp}   *390*
+    Should Contain Match    ${resp}   *correlational Logic1*
+    Should Contain Match    ${resp}   *config Policy Name1*
+
+Verify TCAModel1
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model/TCAModel1
+    Should Contain Match    ${resp}   *templateTCA1*
+    Should Contain Match    ${resp}   *c95b0e7c-c1f0-4287-9928-7964c5377a46*
+    Should Contain Match    ${resp}   *enbRecipe*
+    Should Contain Match    ${resp}   *DC1*
+    Should Contain Match    ${resp}   *DC3*
+    Should Contain Match    ${resp}   *Policy2*
+    Should Contain Match    ${resp}   *reset*
+    Should Contain Match    ${resp}   *280*
+    Should Contain Match    ${resp}   *400*
+
+Get model names
+    ${auth}=    Create List     admin    5f4dcc3b5aa765d61d8327deb882cf99
+    Create Session   clamp  http://localhost:8080   auth=${auth}
+    ${resp}=    Get Request    clamp   /restservices/clds/v1/clds/model-names
+    Should Contain Match    ${resp}   *HolmesModel1*
+    Should Contain Match    ${resp}   *TCAModel1*
+    Should Not Contain Match    ${resp}   *TCAModel99*
+    Should Not Contain Match    ${resp}   *HolmesModel99*
diff --git a/test/csit/tests/holmes/testcase/RuleMgt/Rule-Keywords.robot b/test/csit/tests/holmes/testcase/RuleMgt/Rule-Keywords.robot
index 182737f..3ce4be4 100644
--- a/test/csit/tests/holmes/testcase/RuleMgt/Rule-Keywords.robot
+++ b/test/csit/tests/holmes/testcase/RuleMgt/Rule-Keywords.robot
@@ -34,7 +34,7 @@
     [Arguments]    ${responseJsonData}    ${expectAttrDic}
     [Documentation]    ${expectAttrDic} : The data type is dictionary;
     ...    key is the name of the attribute, value is the expected value of the attribute.
-    @{responseRules}    Get From Dictionary    ${responseJsonData}    rules
+    @{responseRules}    Get From Dictionary    ${responseJsonData}    correlationRules
     : FOR    ${rule}    IN    @{responseRules}
     \    log    ${rule}
     \    verifyRuleAttribute    ${rule}    ${expectAttrDic}
diff --git a/test/csit/tests/holmes/testcase/RuleMgt/Rule-Mgt.robot b/test/csit/tests/holmes/testcase/RuleMgt/Rule-Mgt.robot
index ac25cbf..a28bc36 100644
--- a/test/csit/tests/holmes/testcase/RuleMgt/Rule-Mgt.robot
+++ b/test/csit/tests/holmes/testcase/RuleMgt/Rule-Mgt.robot
@@ -8,7 +8,7 @@
 *** Test Cases ***
 add_valid_rule
     [Documentation]    Add a valid rule.
-    ${dict2}    create dictionary    rulename=youbowu0314    description=create a new rule!    content=package rule03140002;\n\nimport java.util.Locale;     enabled=1    loopcontrolname=closedControlLoop
+    ${dict2}    create dictionary    rulename=youbowu0314    description=create a new rule!    content=package ruleqwertasd;\n\nimport java.util.Locale;    enabled=1    loopcontrolname=closedControlLoop
     ${jsonParams}    encode    ${dict2}
     ${response}    createRule    ${jsonParams}
     ${respJson}    to json    ${response.content}
@@ -34,49 +34,49 @@
     should not be empty    ${RULEID}
     ${response}    queryConditionRule    {"ruleid":"${RULEID}"}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}!=1    fail    Can't find the rule with the specified ruleid.
 
 query_rule_with_non_existing_id
     [Documentation]    Query a rule with a non-existing ID.
-    ${response}    queryConditionRule    {"ruleid":"invalidid"}
+    ${response}    queryConditionRule    {"rid":"invalidid"}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}!=0    fail
 
 query_rule_with_partial_existing_name
     [Documentation]    Query rules with (a part of) an existing name.
     ${response}    queryConditionRule    {"rulename":"youbowu"}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}<1    fail    Can't find the rule with (a part of) an existing name
 
 query_rule_with_partial_non_existing_name
     [Documentation]    Query rules with (a part of) a non-existing name.
-    ${response}    queryConditionRule    {"rulename":"zte2017"}
+    ${response}    queryConditionRule    {"name":"zte2017"}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}!=0    fail
 
 query_rule_with_vaild_status
     [Documentation]    Query rules with a valid status.
     ${response}    queryConditionRule    {"enabled":1}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}<0    fail    Can't find the rule with the status valued 1.
 
 query_rule_with_invalid_status
     [Documentation]    Query rules with an invalid status.
     ${response}    queryConditionRule    {"enabled":99}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}!=0    fail
 
 query_rule_with_empty_status
     [Documentation]    Query rules with the status left empty.
-    ${response}    queryConditionRule    {"enabled":""}
+    ${response}    queryConditionRule    {"enabled":null}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}!=0    fail
 
 query_rule_with_combinational_fields
@@ -85,7 +85,7 @@
     ${paramJson}    encode    ${dic}
     ${response}    queryConditionRule    ${paramJson}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}<1    fail    Can't find the rules with the combination of different fields.    ELSE    traversalRuleAttribute    ${respJson}
     ...    ${dic}
 
@@ -96,7 +96,7 @@
     ${modifyResp}    modifyRule    ${modifyParam}
     ${response}    queryConditionRule    {"ruleid":"${RULEID}"}
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}!=1    fail    query rule fails! (can't find the rule modified!)    ELSE    traversalRuleAttribute    ${respJson}
     ...    ${dic}
 
@@ -113,7 +113,7 @@
     ${modifyResp}    modifyRule    ${modifyParam}
     ${response}    queryConditionRule    {"ruleid":"${RULEID}"}    1
     ${respJson}    to json    ${response.content}
-    ${count}    get from dictionary    ${respJson}    totalcount
+    ${count}    get from dictionary    ${respJson}    totalCount
     run keyword if    ${count}!=1    fail    query rule fails!    ELSE    traversalRuleAttribute    ${respJson}
     ...    ${dic}
 
diff --git a/test/csit/tests/music/music-suite/__init__.robot b/test/csit/tests/music/music-suite/__init__.robot
new file mode 100644
index 0000000..fb654d7
--- /dev/null
+++ b/test/csit/tests/music/music-suite/__init__.robot
@@ -0,0 +1,4 @@
+*** Settings ***
+Documentation    Integration - Suite 1
+
+
diff --git a/test/csit/tests/music/music-suite/data/createkeyspace-network.json b/test/csit/tests/music/music-suite/data/createkeyspace-network.json
new file mode 100644
index 0000000..9514bae
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/createkeyspace-network.json
@@ -0,0 +1,6 @@
+{ 	
+  "consistencyInfo":{"type":"eventual"},
+  "durabilityOfWrites":"true",
+  "keyspaceName":"txt",
+  "replicationInfo":{"class" :"NetworkTopologyStrategy","DC1":"1", "DC2":"1", "DC3":"1"}
+}
diff --git a/test/csit/tests/music/music-suite/data/createkeyspace-simple.json b/test/csit/tests/music/music-suite/data/createkeyspace-simple.json
new file mode 100644
index 0000000..31f4b6a
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/createkeyspace-simple.json
@@ -0,0 +1,6 @@
+{ 	
+  "consistencyInfo":{"type":"eventual"},
+  "durabilityOfWrites":"true",
+  "keyspaceName":"txt",
+  "replicationInfo":{"class" :"SimpleStrategy","replication_factor": 1}
+}
diff --git a/test/csit/tests/music/music-suite/data/createkeyspace.json b/test/csit/tests/music/music-suite/data/createkeyspace.json
new file mode 100644
index 0000000..31f4b6a
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/createkeyspace.json
@@ -0,0 +1,6 @@
+{ 	
+  "consistencyInfo":{"type":"eventual"},
+  "durabilityOfWrites":"true",
+  "keyspaceName":"txt",
+  "replicationInfo":{"class" :"SimpleStrategy","replication_factor": 1}
+}
diff --git a/test/csit/tests/music/music-suite/data/createtable.json b/test/csit/tests/music/music-suite/data/createtable.json
new file mode 100644
index 0000000..71b4716
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/createtable.json
@@ -0,0 +1,12 @@
+{
+	"clusteringOrder":null,
+	"consistencyInfo":{"type":"eventual"},
+	"fields":{"PRIMARY KEY":"(name)",
+	"name":"text","job":"text","threadIndex":"int"},
+	"keyspaceName":null,
+	"primaryKey":null,
+	"properties":null,
+	"sortingKey":null,
+	"tableName":null
+}
+
diff --git a/test/csit/tests/music/music-suite/data/deleterow_eventual.json b/test/csit/tests/music/music-suite/data/deleterow_eventual.json
new file mode 100644
index 0000000..ed9a289
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/deleterow_eventual.json
@@ -0,0 +1,5 @@
+{
+	"consistencyInfo":   {"type":"eventual"},   
+	"timestamp":null,   
+	"ttl":null   
+}
diff --git a/test/csit/tests/music/music-suite/data/dropkeyspace.json b/test/csit/tests/music/music-suite/data/dropkeyspace.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/dropkeyspace.json
@@ -0,0 +1 @@
+{}
diff --git a/test/csit/tests/music/music-suite/data/droptable.json b/test/csit/tests/music/music-suite/data/droptable.json
new file mode 100644
index 0000000..71b4716
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/droptable.json
@@ -0,0 +1,12 @@
+{
+	"clusteringOrder":null,
+	"consistencyInfo":{"type":"eventual"},
+	"fields":{"PRIMARY KEY":"(name)",
+	"name":"text","job":"text","threadIndex":"int"},
+	"keyspaceName":null,
+	"primaryKey":null,
+	"properties":null,
+	"sortingKey":null,
+	"tableName":null
+}
+
diff --git a/test/csit/tests/music/music-suite/data/getrow_atomic.json b/test/csit/tests/music/music-suite/data/getrow_atomic.json
new file mode 100644
index 0000000..65f9d76
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/getrow_atomic.json
@@ -0,0 +1,3 @@
+{
+	"consistencyInfo": {"type":"atomic"}
+}
diff --git a/test/csit/tests/music/music-suite/data/insertrow_eventual.json b/test/csit/tests/music/music-suite/data/insertrow_eventual.json
new file mode 100644
index 0000000..56e1762
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/insertrow_eventual.json
@@ -0,0 +1,8 @@
+{
+   "consistencyInfo":   {"type":"eventual"},
+   "row_specification": null,
+   "timestamp": null,
+   "ttl": null,
+   "values":{"name":"emp1","job":"researcher1518791824160","threadIndex":"0"}
+}
+
diff --git a/test/csit/tests/music/music-suite/data/onboard.json b/test/csit/tests/music/music-suite/data/onboard.json
new file mode 100644
index 0000000..5c74f82
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/onboard.json
@@ -0,0 +1,6 @@
+{ 
+"appname": "lb7254",
+"userId": "music",
+"password": "music",
+"isAAF": "false" 
+}
diff --git a/test/csit/tests/music/music-suite/data/updaterow_atomic.json b/test/csit/tests/music/music-suite/data/updaterow_atomic.json
new file mode 100644
index 0000000..782da14
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/updaterow_atomic.json
@@ -0,0 +1,7 @@
+{
+     "consistencyInfo": {"type":"atomic"},
+     "row_specification":null,
+     "timestamp":null,
+     "ttl":null,
+     "values":{"job":"star-wars-actor"}
+}
diff --git a/test/csit/tests/music/music-suite/data/updaterow_eventual.json b/test/csit/tests/music/music-suite/data/updaterow_eventual.json
new file mode 100644
index 0000000..f8b3e9d
--- /dev/null
+++ b/test/csit/tests/music/music-suite/data/updaterow_eventual.json
@@ -0,0 +1,7 @@
+{
+	"consistencyInfo": {"type":"eventual"},
+     "row_specification":null,
+     "timestamp":null,
+     "ttl":null,
+     "values":{"job":"star-wars-actor"}
+}
diff --git a/test/csit/tests/music/music-suite/music-test.robot b/test/csit/tests/music/music-suite/music-test.robot
new file mode 100644
index 0000000..bb94d29
--- /dev/null
+++ b/test/csit/tests/music/music-suite/music-test.robot
@@ -0,0 +1,148 @@
+*** Settings ***
+Library       OperatingSystem
+Library       RequestsLibrary
+Library       json
+
+*** Variables ***
+${MESSAGE}    {"ping": "ok"}
+
+#global variables
+${generatedAID}
+
+*** Test Cases ***
+Get Music Version
+    [Documentation]    It sends a REST GET request to retrieve the Music.war version
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    &{headers}=      Create Dictionary    Content-Type=application/json  Accept=application/json 
+    ${resp}=         Get Request        musicaas   /MUSIC/rest/v2/version     headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music AddOnBoarding
+    [Documentation]    It sends a REST POST request to Music to Onboard a new application
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}onboard.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   Content-Type=application/json  Accept=application/json 
+    ${resp}=         Post Request        musicaas   /MUSIC/rest/v2/admin/onboardAppWithMusic    data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    ${response_json}    json.loads    ${resp.content}
+    ${generatedAID}=    Convert To String      ${response_json['Generated AID']}
+    Set Global Variable     ${generatedAID}
+    Log To Console              generatedAID = ${generatedAID}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music CreateKeyspace
+    [Documentation]    It sends a REST POST request to Music to create a new keyspace in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}createkeyspace.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json  Accept=application/json
+    ${resp}=         Post Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace    data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music CreateTable
+    [Documentation]    It sends a REST POST request to Music to create a new Table in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}createtable.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json  Accept=application/json
+    ${resp}=         Post Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable    data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music InsertRow
+    [Documentation]    It sends a REST POST request to Music to create a new row in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}insertrow_eventual.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json  Accept=application/json
+    ${resp}=         Post Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows/?row=emp1   data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music ReadRowJustInserted
+    [Documentation]    It sends a REST GET request to Music to Read the row just inserted in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json  Accept=application/json
+    ${resp}=         Get Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1   headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music UpdateRowInAtomicWay
+    [Documentation]    It sends a REST PUT request to Music to create a new row in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}updaterow_atomic.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json  Accept=application/json
+    ${resp}=         Put Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1   data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music ReadRowAfterUpdate
+    [Documentation]    It sends a REST GET request to Music to Read the row just inserted in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json  Accept=application/json
+    ${resp}=         Get Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1   headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music DeleteRow
+    [Documentation]    It sends a REST DELETE request to Music to delete a row in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}deleterow_eventual.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json  Accept=application/json
+    ${resp}=         Delete Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable/rows?name=emp1   data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music DropTable
+    [Documentation]    It sends a REST Delete request to Music to drop one existing Table in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}droptable.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json   Accept=application/json
+    ${resp}=         Delete Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace/tables/MusicOnapTable    data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+Music DropKeyspace
+    [Documentation]    It sends a REST DELETE request to Music to drop one existing keyspace in Cassandra
+    Create Session   musicaas            ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}dropkeyspace.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json   Accept=application/json
+    ${resp}=         Delete Request        musicaas   /MUSIC/rest/v2/keyspaces/MusicOnapKeyspace    data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+
+Music DeleteOnBoarding
+    [Documentation]    It sends a REST DELETE request to Music to remove a previosly onboarded application
+    Create Session   musicaas             ${MUSIC_HOSTNAME}:${MUSIC_PORT}
+    ${data}=         Get Binary File     ${CURDIR}${/}data${/}onboard.json
+    &{headers}=      Create Dictionary    ns=lb7254    userId=music    password=music   aid=${generatedAID}   Content-Type=application/json   Accept=application/json
+    ${resp}=         Delete Request        musicaas   /MUSIC/rest/v2/admin/onboardAppWithMusic    data=${data}    headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+*** Keywords ***
+
diff --git a/test/csit/tests/optf/has/__init__.robot b/test/csit/tests/optf/has/__init__.robot
new file mode 100644
index 0000000..fb654d7
--- /dev/null
+++ b/test/csit/tests/optf/has/__init__.robot
@@ -0,0 +1,4 @@
+*** Settings ***
+Documentation    Integration - Suite 1
+
+
diff --git a/test/csit/tests/optf/has/data/plan_with_wrong_version.json b/test/csit/tests/optf/has/data/plan_with_wrong_version.json
new file mode 100644
index 0000000..9471fbf
--- /dev/null
+++ b/test/csit/tests/optf/has/data/plan_with_wrong_version.json
@@ -0,0 +1,175 @@
+{
+  "name": "onap optf has plan with wrong version",
+  "template": {
+  "conductor_template_version": "yyyy-mm-dd",
+  "parameters": {
+    "UCPEHOST": "chcil129snd",
+    "CUSTOMER":"21014aa2-526b-11e6-beb8-9e71128cae77"
+  },
+  "locations": {
+    "customer_loc": {
+      "host_name": {
+        "get_param": "UCPEHOST"
+      }
+    }
+  },
+  "demands": {
+    "vHNPortalaaS_PRIMARY_1": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "HNPORTAL",
+        "customer_id": {"get_param": "CUSTOMER"}
+      },
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "cloud"
+      }
+    ],
+    "vHNPortalaaS_SECONDARY_1": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "HNPORTAL",
+        "customer_id": {"get_param": "CUSTOMER"}
+      },
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "cloud"
+      }
+    ],
+    "vHNGWaaS_PRIMARY_1": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "HNGATEWAY",
+        "customer_id": {"get_param": "CUSTOMER"}
+      },
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "cloud"
+      }
+    ],
+    "vHNGWaaS_SECONDARY_1": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "HNGATEWAY",
+        "customer_id": {"get_param": "CUSTOMER"}
+      },
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "cloud"
+      }
+    ],
+    "vVIGaaS_PRIMARY_1": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "VVIG",
+        "customer_id": {"get_param": "CUSTOMER"}
+      }
+    ],
+    "vVIGaaS_SECONDARY_1": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "VVIG",
+        "customer_id": {"get_param": "CUSTOMER"}
+      }
+    ],
+    "vVIGaaS_PRIMARY_2": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "VVIG",
+        "customer_id": {"get_param": "CUSTOMER"}
+      }
+    ],
+    "vVIGaaS_SECONDARY_2": [
+      {
+        "inventory_provider": "aai",
+        "inventory_type": "service",
+        "service_type": "VVIG",
+        "customer_id": {"get_param": "CUSTOMER"}
+      }
+    ]
+  },
+  "constraints": {
+    "distance-vvig": {
+      "type": "distance_to_location",
+      "demands": [
+        "vVIGaaS_SECONDARY_1",
+        "vVIGaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "distance": "< 5000 km",
+        "location": "customer_loc"
+      }
+    },
+    "distance-vgw": {
+      "type": "distance_to_location",
+      "demands": [
+        "vHNGWaaS_SECONDARY_1",
+        "vHNGWaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "distance": "< 5000 km",
+        "location": "customer_loc"
+      }
+    },
+    "zone-vhngw": {
+      "type": "zone",
+      "demands": [
+        "vHNGWaaS_SECONDARY_1",
+        "vHNGWaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "qualifier": "different",
+        "category": "complex"
+      }
+    },
+    "zone-vhnportal": {
+      "type": "zone",
+      "demands": [
+        "vHNPortalaaS_SECONDARY_1",
+        "vHNPortalaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "qualifier": "different",
+        "category": "complex"
+      }
+    }
+  },
+  "optimization": {
+    "minimize": {
+      "sum": [
+        {
+          "product": [
+            1,
+            {
+              "distance_between": [
+                "customer_loc",
+                "vVIGaaS_PRIMARY_1"
+              ]
+            }
+          ]
+        },
+        {
+          "product": [
+            1,
+            {
+              "distance_between": [
+                "customer_loc",
+                "vHNGWaaS_PRIMARY_1"
+              ]
+            }
+          ]
+        }
+      ]
+    }
+  }
+},
+  "timeout": 5,
+  "limit": 3
+}
diff --git a/test/csit/tests/optf/has/data/plan_without_demand_section.json b/test/csit/tests/optf/has/data/plan_without_demand_section.json
new file mode 100644
index 0000000..87a459d
--- /dev/null
+++ b/test/csit/tests/optf/has/data/plan_without_demand_section.json
@@ -0,0 +1,93 @@
+{
+  "name": "onap optf has plan with wrong version",
+  "template": {
+  "conductor_template_version": "2016-11-01",
+  "parameters": {
+    "UCPEHOST": "chcil129snd",
+    "CUSTOMER":"21014aa2-526b-11e6-beb8-9e71128cae77"
+  },
+  "locations": {
+    "customer_loc": {
+      "host_name": {
+        "get_param": "UCPEHOST"
+      }
+    }
+  },
+  "constraints": {
+    "distance-vvig": {
+      "type": "distance_to_location",
+      "demands": [
+        "vVIGaaS_SECONDARY_1",
+        "vVIGaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "distance": "< 5000 km",
+        "location": "customer_loc"
+      }
+    },
+    "distance-vgw": {
+      "type": "distance_to_location",
+      "demands": [
+        "vHNGWaaS_SECONDARY_1",
+        "vHNGWaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "distance": "< 5000 km",
+        "location": "customer_loc"
+      }
+    },
+    "zone-vhngw": {
+      "type": "zone",
+      "demands": [
+        "vHNGWaaS_SECONDARY_1",
+        "vHNGWaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "qualifier": "different",
+        "category": "complex"
+      }
+    },
+    "zone-vhnportal": {
+      "type": "zone",
+      "demands": [
+        "vHNPortalaaS_SECONDARY_1",
+        "vHNPortalaaS_PRIMARY_1"
+      ],
+      "properties": {
+        "qualifier": "different",
+        "category": "complex"
+      }
+    }
+  },
+  "optimization": {
+    "minimize": {
+      "sum": [
+        {
+          "product": [
+            1,
+            {
+              "distance_between": [
+                "customer_loc",
+                "vVIGaaS_PRIMARY_1"
+              ]
+            }
+          ]
+        },
+        {
+          "product": [
+            1,
+            {
+              "distance_between": [
+                "customer_loc",
+                "vHNGWaaS_PRIMARY_1"
+              ]
+            }
+          ]
+        }
+      ]
+    }
+  }
+},
+  "timeout": 5,
+  "limit": 3
+}
diff --git a/test/csit/tests/optf/has/optf_has_test.robot b/test/csit/tests/optf/has/optf_has_test.robot
new file mode 100644
index 0000000..183cb68
--- /dev/null
+++ b/test/csit/tests/optf/has/optf_has_test.robot
@@ -0,0 +1,29 @@
+*** Settings ***
+Library       OperatingSystem
+Library       RequestsLibrary
+Library       json
+
+*** Variables ***
+${MESSAGE}    {"ping": "ok"}
+${RESP_STATUS}     "error"
+${RESP_MESSAGE_WRONG_VERSION}    "conductor_template_version must be one of: 2016-11-01"
+${RESP_MESSAGE_WITHOUT_DEMANDS}    Undefined Demand
+
+#global variables
+${generatedPlanId}
+
+*** Test Cases ***
+Get Root Url
+    [Documentation]    It sends a REST GET request to root url
+    Create Session   optf-cond            ${COND_HOSTNAME}:${COND_PORT}
+    &{headers}=      Create Dictionary    Content-Type=application/json  Accept=application/json
+    ${resp}=         Get Request        optf-cond   /v1/plans/     headers=${headers}
+    Log To Console              *********************
+    Log To Console              response = ${resp}
+    Log To Console              body = ${resp.text}
+    Should Be Equal As Integers    ${resp.status_code}    200
+
+
+*** Keywords ***
+
+
diff --git a/test/csit/scripts/optf/has/testsample.txt b/test/csit/tests/optf/osdf/data/sampletest.txt
similarity index 100%
copy from test/csit/scripts/optf/has/testsample.txt
copy to test/csit/tests/optf/osdf/data/sampletest.txt