Sync Integ to Master

Change-Id: I71e3acc26fa612127756ac04073a522b9cc6cd74
Issue-ID: SDC-977
Signed-off-by: Gitelman, Tal (tg851x) <tg851x@intl.att.com>
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/conf/TestAPIConfDependentTest.java b/test-apis-ci/src/test/java/org/openecomp/sdc/conf/TestAPIConfDependentTest.java
new file mode 100644
index 0000000..99b6888
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/conf/TestAPIConfDependentTest.java
@@ -0,0 +1,13 @@
+package org.openecomp.sdc.conf;
+
+import org.junit.BeforeClass;
+import org.openecomp.sdc.common.test.BaseConfDependent;
+
+public class TestAPIConfDependentTest extends BaseConfDependent{
+	@BeforeClass
+	public static void setupBeforeClass() {
+		componentName = "test-apis-ci";
+		confPath = "src/test/resources/config";
+		setUp();
+	}
+}
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/runners/RunTenantIsolationCucumberCI.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/runners/RunTenantIsolationCucumberCI.java
new file mode 100644
index 0000000..d9183fc
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/runners/RunTenantIsolationCucumberCI.java
@@ -0,0 +1,31 @@
+package org.openecomp.sdc.cucumber.runners;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.openecomp.sdc.conf.TestAPIConfDependentTest;
+
+import cucumber.api.CucumberOptions;
+import cucumber.api.junit.Cucumber;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(features = "classpath:cucumber/tenantIsolation.feature", glue = "org.openecomp.sdc.cucumber.steps")
+
+public class RunTenantIsolationCucumberCI extends TestAPIConfDependentTest {
+
+	@BeforeClass
+	public static void beforeClass() {
+	}
+
+	@AfterClass
+	public static void afterClassJUnit() {
+	}
+
+	@org.testng.annotations.BeforeClass
+	public static void beforeClassTestNg() {
+	}
+
+	@org.testng.annotations.AfterClass
+	public static void afterClassTestNG() {
+	}
+}
\ No newline at end of file
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/spring/ImportTableConfig.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/spring/ImportTableConfig.java
new file mode 100644
index 0000000..f0c7610
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/spring/ImportTableConfig.java
@@ -0,0 +1,19 @@
+package org.openecomp.sdc.cucumber.spring;
+
+import org.openecomp.sdc.be.dao.cassandra.CassandraClient;
+import org.openecomp.sdc.be.dao.cassandra.OperationalEnvironmentDao;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ImportTableConfig {
+	@Bean(name = "cassandra-client")
+	public CassandraClient cassandraClient() {
+		return new CassandraClient();
+	}
+	
+	@Bean(name = "operational-environment-dao")
+	public OperationalEnvironmentDao operationalEnvironmentDao() {
+		return new OperationalEnvironmentDao();
+	}
+}
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/PrecannedTestExpectationCallback.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/PrecannedTestExpectationCallback.java
new file mode 100644
index 0000000..56802ec
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/PrecannedTestExpectationCallback.java
@@ -0,0 +1,31 @@
+package org.openecomp.sdc.cucumber.steps;
+
+import static org.mockserver.model.HttpResponse.response;
+
+import org.apache.http.entity.ContentType;
+import org.mockserver.mock.action.ExpectationCallback;
+import org.mockserver.model.Header;
+import org.mockserver.model.HttpRequest;
+import org.mockserver.model.HttpResponse;
+
+import com.google.common.net.HttpHeaders;
+
+public class PrecannedTestExpectationCallback implements ExpectationCallback  {
+	private static volatile int countRequests;
+
+	static HttpResponse httpResponse = response()
+			.withStatusCode(200)
+			.withHeaders(new Header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()));
+
+	@Override
+	public HttpResponse handle(HttpRequest httpRequest) {
+		countRequests++;
+		
+		System.out.println(
+				String.format("MSO Server Simulator Recieved %s Final Distribution Complete Rest Reports From ASDC",
+						countRequests));
+		
+		return httpResponse;
+	}
+	
+}
\ No newline at end of file
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/StepsTenantIsolationCI.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/StepsTenantIsolationCI.java
new file mode 100644
index 0000000..490b3e0
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/StepsTenantIsolationCI.java
@@ -0,0 +1,597 @@
+package org.openecomp.sdc.cucumber.steps;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.mockserver.model.HttpCallback.callback;
+import static org.mockserver.model.HttpRequest.request;
+import static org.mockserver.model.HttpResponse.response;
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnResult;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+//import org.openecomp.sdc.dmaap.DmaapPublisher;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.mockserver.integration.ClientAndServer;
+import org.mockserver.model.Header;
+import org.mockserver.model.HttpRequest;
+import org.openecomp.sdc.api.IDistributionClient;
+import org.openecomp.sdc.api.consumer.IConfiguration;
+import org.openecomp.sdc.api.consumer.IFinalDistrStatusMessage;
+import org.openecomp.sdc.api.consumer.INotificationCallback;
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.INotificationData;
+import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
+import org.openecomp.sdc.api.results.IDistributionClientResult;
+import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
+import org.openecomp.sdc.be.dao.cassandra.OperationalEnvironmentDao;
+import org.openecomp.sdc.be.datatypes.enums.EnvironmentStatusEnum;
+import org.openecomp.sdc.be.resources.data.OperationalEnvironmentEntry;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+import org.openecomp.sdc.common.datastructure.Wrapper;
+import org.openecomp.sdc.cucumber.spring.ImportTableConfig;
+import org.openecomp.sdc.http.HttpAsdcClient;
+import org.openecomp.sdc.http.HttpAsdcResponse;
+import org.openecomp.sdc.http.IHttpAsdcClient;
+import org.openecomp.sdc.impl.DistributionClientFactory;
+import org.openecomp.sdc.utils.ArtifactTypeEnum;
+import org.openecomp.sdc.utils.DistributionActionResultEnum;
+import org.openecomp.sdc.utils.DistributionStatusEnum;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+import com.google.common.base.Strings;
+import com.google.common.net.HttpHeaders;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+
+import cucumber.api.java.After;
+import cucumber.api.java.Before;
+import cucumber.api.java.en.Given;
+import cucumber.api.java.en.Then;
+import cucumber.api.java.en.When;
+import fj.data.Either;
+
+public class StepsTenantIsolationCI {
+
+	private Map<String, OperationalEnvironmentEntry> recordMap = new HashMap<>();
+	private OperationalEnvironmentDao operationalEnvironmentDao;
+	private ClientAndServer aaiMockServer;
+	private ClientAndServer msoMockServer;
+	private List<IDistributionClient> distributionClients = new ArrayList<>();
+
+	private List<String> wdFinalStatusSent = new ArrayList<>();
+
+	private HttpRequest msoHttpRequest;
+	private List<String> uuidServicesList;
+	private boolean cleanFlag = true;
+	private int maxStepWaitTimeMs;
+
+	private List<String> envIds = new ArrayList<>();
+	private List<OperationalEnvironmentEntry> envList = new ArrayList<>();
+	private String asdcAddress;
+	private volatile int numberOfFinalDistributionsSentByASDC;
+	private int numOfArtifactsToDownload;
+	private volatile int totalNumOfArtifactsToDownload;
+	private List<String> envNames = new ArrayList<>(Arrays.asList("Apple", "Orange", "Grape", "Pear", "Watermelon", "Bannana", "Cherry", "Coconut", "Fig", "Mango", "Peach", "Pineapple", "Plum", "Strawberries", "Apricot"));
+
+	private static final String AAI_RESPONSE_BODY_FMT = "{\"operational-environment-id\":\"UUID of Operational Environment\","
+			+ "\"operational-environment-name\":\"Op Env Name\"," + "\"operational-environment-type\":\"ECOMP\","
+			+ "\"operational-environment-status\":\"Activate\"," + "\"tenant-context\":\"%s\","
+			+ "\"workload-context\":\"%s\"," + "\"resource-version\":\"1505228226913\"," + "\"relationship-list\":{}}";
+
+	private static final String AAI_PATH_REGEX = "/aai/v12/cloud-infrastructure/operational-environments/.*";
+
+	private static final String MSO_PATH_REGEX = "/onap/mso/infra/modelDistributions/v1/distributions/.*";
+
+	@Before
+	public void beforeScenario() {
+		Collections.shuffle(envNames);
+		aaiMockServer = ClientAndServer.startClientAndServer(1111);
+		msoMockServer = ClientAndServer.startClientAndServer(1112);
+
+		this.operationalEnvironmentDao = createDaoObj();
+	}
+
+	@After
+	public void afterScenario() {
+		System.out.println("Cleaning Up After Scenario...");
+		aaiMockServer.stop();
+		msoMockServer.stop();
+		if (cleanFlag) {
+			envIds.stream().forEach(operationalEnvironmentDao::delete);
+		}
+		distributionClients.stream().forEach(IDistributionClient::stop);
+		System.out.println("Cleaning Up After Scenario Done");
+	}
+
+	// ############################# Given - Start #############################
+
+	@Given("^clean db after test is (.*)$")
+	public void clean_db_after_test_is(boolean cleanFlag) {
+		this.cleanFlag = cleanFlag;
+	}
+
+	@Given("^AAI returns (.*) and aai_body contains (.*) and (.*)$")
+	public void aai_returns(int retCode, String tenant, String workload) throws Throwable {
+		String aaiResponseBody = String.format(AAI_RESPONSE_BODY_FMT, tenant, workload);
+
+		setAaiMockServer(aaiResponseBody);
+
+		System.out.println(aaiMockServer.getClass());
+	}
+
+	@Given("^MSO-WD Simulators Started with topic name (.*)$")
+	public void notification_listner_simulators_started(String topicName) throws Throwable {
+		envList.forEach(env -> {
+			final IDistributionClient distClientSim = simulateDistributionClientWD(topicName, env);
+			distributionClients.add(distClientSim);
+		});
+
+	}
+
+	@Given("^MSO Final Distribution Simulator is UP$")
+	public void mso_Final_Distribution_Simulator_is_UP() throws Throwable {
+		msoHttpRequest = request().withPath(MSO_PATH_REGEX);
+		msoMockServer.when(msoHttpRequest).callback(
+				callback().withCallbackClass("org.openecomp.sdc.cucumber.steps.PrecannedTestExpectationCallback"));
+	}
+
+	@Given("^ASDC Address is (.*)$")
+	public void asdc_Address_is(String asdcAddress) throws Throwable {
+		this.asdcAddress = asdcAddress;
+
+	}
+
+	@Given("^ASDC Contains the following services (.*)$")
+	public void asdc_Contains_the_following_services(String listOfServicesUUID) throws Throwable {
+		uuidServicesList = Arrays.asList(listOfServicesUUID.split(",")).stream().map(String::trim)
+				.collect(Collectors.toList());
+
+		int maxMinWait = uuidServicesList.size() * envIds.size();
+		this.maxStepWaitTimeMs = 60000 * maxMinWait;
+		System.out.println(String.format("Set Max Step Wait Time To: %s Minutes", maxMinWait));
+	}
+
+	@Given("^The number of complete environments is (.*)$")
+	public void the_number_of_complete_environments_is(int envNum) throws Throwable {
+
+		int counter = 1;
+		while( envNum > envNames.size()){
+			envNames.add(String.valueOf(counter));
+			counter++;
+		}
+		
+		
+		for (int i = 0; i < envNum; i++) {
+			OperationalEnvironmentEntry preSaveEntry = new OperationalEnvironmentEntry();
+
+			preSaveEntry.setStatus(EnvironmentStatusEnum.COMPLETED);
+			preSaveEntry.setLastModified(new Date(System.currentTimeMillis()));
+
+			Set<String> uebAdresses = new HashSet<>();
+			uebAdresses.add("uebsb92sfdc.it.att.com");
+			preSaveEntry.setDmaapUebAddress(uebAdresses);
+			preSaveEntry.setIsProduction(false);
+			preSaveEntry.setUebApikey("sSJc5qiBnKy2qrlc");
+			preSaveEntry.setUebSecretKey("4ZRPzNJfEUK0sSNBvccd2m7X");
+			preSaveEntry.setTenant("TEST");
+			preSaveEntry.setEcompWorkloadContext("ECOMP_E2E-IST");
+
+			// String envId = UUID.randomUUID().toString();
+			String envId = envNames.get(i);
+			preSaveEntry.setEnvironmentId(envId);
+			envIds.add(envId);
+			envList.add(preSaveEntry);
+			operationalEnvironmentDao.save(preSaveEntry);
+		}
+	}
+
+	@Given("^The number of artifacts each Simulator downloads from a service is (.*)$")
+	public void number_of_artifacts_each_simulator_downloads(int numOfArtifactsToDownload) throws Throwable {
+		this.numOfArtifactsToDownload = numOfArtifactsToDownload;
+	}
+
+	// ############################# Given - End #############################
+
+	// ############################# When - Start #############################
+	@When("^Distribution Requests are Sent By MSO$")
+	public void distribution_Requests_are_Sent_By_MSO() throws Throwable {
+		envList.stream().forEach(this::distributeServiceInEnv);
+
+	}
+
+	@When("^The Number Of Operational Envrinoments that created is (.*) and Records are added with data (.*)$")
+	public void operational_envrinoments_records_are_added_with_data(int numOfRecords, String recordData)
+			throws Throwable {
+		for (int i = 0; i < numOfRecords; i++) {
+			OperationalEnvironmentEntry preSaveEntry = new OperationalEnvironmentEntry();
+			JsonElement root = new JsonParser().parse(recordData);
+
+			String originalStatus = root.getAsJsonObject().get("status").getAsString();
+			int delta = root.getAsJsonObject().get("last_modified_delta").getAsInt();
+			preSaveEntry.setStatus(EnvironmentStatusEnum.getByName(originalStatus));
+			long last_modified = System.currentTimeMillis() + delta * 1000;
+			preSaveEntry.setLastModified(new Date(last_modified));
+			String envId = UUID.randomUUID().toString();
+			preSaveEntry.setEnvironmentId(envId);
+			envIds.add(envId);
+			// envrionmentIds.add(envId);
+			operationalEnvironmentDao.save(preSaveEntry);
+
+		}
+
+	}
+
+	// ############################# When - End #############################
+
+	// ############################# Then - Start #############################
+	@Then("^Operational Environment record contains tenant field (.*$)")
+	public void operational_environment_record_contains_tenant(boolean tenantExist) throws Throwable {
+		envIds.forEach(envId -> {
+			validateStringFieldPresent(tenantExist, OperationalEnvironmentEntry::getTenant, envId,
+					"Tenant is not as expected");
+		});
+	}
+
+	@Then("^Operational Environment record contains workload field (.*$)")
+	public void operational_environment_record_contains_workload(boolean workloadExist) throws Throwable {
+		envIds.forEach(envId -> {
+			validateStringFieldPresent(workloadExist, OperationalEnvironmentEntry::getEcompWorkloadContext, envId,
+					"Workload is not as expected");
+		});
+	}
+
+	@Then("^Operational Environment record contains UEB Address field (.*$)")
+	public void operational_environment_record_contains_ueb_address(boolean uebAddresExist) throws Throwable {
+		envIds.forEach(envId -> {
+			validateStringFieldPresent(uebAddresExist, this::convertUebAddressToList, envId,
+					"UEB Address is not as expected");
+		});
+	}
+
+	@Then("^The Number Of Environment is (.*) with status (.*)$")
+	public void the_Number_Of_Environment_Created_is(int numberOfEnvsCreated, String status) throws Throwable {
+		// Write code here that turns the phrase above into concrete actions
+
+		retryMethodOnResult(() -> getCurrentEnvironmets(status), envList -> envList.size() == numberOfEnvsCreated,
+				40000, 500);
+
+		List<OperationalEnvironmentEntry> environmentsFound = getCurrentEnvironmets(status);
+
+		assertThat(environmentsFound.size(), is(numberOfEnvsCreated));
+
+		environmentsFound.forEach(env -> recordMap.put(env.getEnvironmentId(), env));
+		envList.addAll(environmentsFound);
+	}
+
+	@Then("^MSO Final Distribution Recieved Correct Number Of Request$")
+	public void mso_final_distribution_recieved_request() throws Throwable {
+		int expectedNumberOfRequestsSentByASDC = calculateExcpectedNumberOfDistributionRequets();
+		Function<Integer, Boolean> resultVerifier = actualStatusList -> actualStatusList >= expectedNumberOfRequestsSentByASDC;
+		retryMethodOnResult(() -> numberOfFinalDistributionsSentByASDC(expectedNumberOfRequestsSentByASDC),
+				resultVerifier, maxStepWaitTimeMs, 500);
+		int actualNumberOfRequestsSentByASDC = numberOfFinalDistributionsSentByASDC(expectedNumberOfRequestsSentByASDC);
+		assertThat(actualNumberOfRequestsSentByASDC, is(expectedNumberOfRequestsSentByASDC));
+	}
+
+	@Then("^All MSO-WD Simulators Sent The Distribution Complete Notifications$")
+	public void all_mso_wd_simulators_sent_the_distribution_complete_notifications() {
+		// Wait Watch Dogs To Send Final Distribution
+		int excpectedNumberOfDistributionCompleteNotifications = calculateExcpectedNumberOfDistributionRequets();
+		final Function<List<String>, Boolean> resultVerifier = actualStatusList -> actualStatusList
+				.size() == excpectedNumberOfDistributionCompleteNotifications;
+		retryMethodOnResult(() -> wdFinalStatusSent, resultVerifier, maxStepWaitTimeMs, 500);
+		assertThat(wdFinalStatusSent.size(), is(excpectedNumberOfDistributionCompleteNotifications));
+	}
+	@Then("^All Artifacts were downloaded by Simulators$")
+	public void all_artifacts_downloaded() {
+		// Wait Watch Dogs To Send Final Distribution
+		int excpectedNumberOfArtifactsToDownload = numOfArtifactsToDownload * envIds.size() * uuidServicesList.size();
+		assertThat(totalNumOfArtifactsToDownload, is(excpectedNumberOfArtifactsToDownload));
+	}
+	// ############################# Then - End #############################
+
+	private List<OperationalEnvironmentEntry> getCurrentEnvironmets(String status) {
+		Either<List<OperationalEnvironmentEntry>, CassandraOperationStatus> eitherStatus = operationalEnvironmentDao
+				.getByEnvironmentsStatus(EnvironmentStatusEnum.getByName(status));
+		assertThat(eitherStatus.isLeft(), is(true));
+
+		List<OperationalEnvironmentEntry> environmentsRetrieved = eitherStatus.left().value();
+
+		List<OperationalEnvironmentEntry> environmentsFound = environmentsRetrieved.stream()
+				.filter(env -> envIds.contains(env.getEnvironmentId())).collect(Collectors.toList());
+		return environmentsFound;
+	}
+
+	private int numberOfFinalDistributionsSentByASDC(int expectedNumberOfRequestsSentByASDC) {
+		final int newVal = msoMockServer.retrieveRecordedRequests(msoHttpRequest).length;
+		if (newVal != numberOfFinalDistributionsSentByASDC) {
+			System.out.println(String.format(
+					"MSO Server Simulator Recieved %s/%s Final Distribution Complete Rest Reports From ASDC", newVal,
+					expectedNumberOfRequestsSentByASDC));
+			numberOfFinalDistributionsSentByASDC = newVal;
+		}
+
+		return newVal;
+	}
+
+	private int calculateExcpectedNumberOfDistributionRequets() {
+		int numberOfDistributionRequests = envList.size() * uuidServicesList.size();
+		return numberOfDistributionRequests;
+	}
+
+	private static OperationalEnvironmentDao createDaoObj() {
+		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportTableConfig.class);
+		final OperationalEnvironmentDao openvDao = (OperationalEnvironmentDao) context
+				.getBean("operational-environment-dao");
+		return openvDao;
+	}
+
+	private OperationalEnvironmentEntry getRecord(String environmentId) {
+		Either<OperationalEnvironmentEntry, CassandraOperationStatus> result = operationalEnvironmentDao
+				.get(environmentId);
+		return result.isLeft() ? result.left().value() : null;
+	}
+
+	private void validateStringFieldPresent(boolean fieldExist,
+			Function<OperationalEnvironmentEntry, String> getFieldFunc, String envId, String msg) {
+		OperationalEnvironmentEntry record = recordMap.computeIfAbsent(envId, this::getRecord);
+
+		assertNotNull(record, "Expected DB record was not found");
+
+		String actualValue = getFieldFunc.apply(record);
+
+		assertEquals(fieldExist, !Strings.isNullOrEmpty(actualValue), msg);
+	}
+
+	private void setAaiMockServer(String aaiResponseBody) {
+		HttpRequest httpRequest = request().withMethod("GET").withPath(AAI_PATH_REGEX)
+				.withHeaders(new Header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()));
+
+		aaiMockServer.when(httpRequest)
+				.respond(response()
+						.withHeaders(new Header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()))
+						.withBody(aaiResponseBody));
+	}
+
+	private IDistributionClient simulateDistributionClientWD(String topicName, OperationalEnvironmentEntry opEnv) {
+
+		IDistributionClient client = DistributionClientFactory.createDistributionClient();
+		final IConfiguration buildDistributionClientConfiguration = buildDistributionClientConfiguration(topicName,
+				opEnv);
+		IDistributionClientResult initResult = client.init(buildDistributionClientConfiguration,
+				new INotificationCallback() {
+
+					@Override
+					public void activateCallback(INotificationData data) {
+						buildWdSimulatorCallback(opEnv, client, buildDistributionClientConfiguration, data);
+
+					}
+
+				});
+		assertThat(initResult.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+		IDistributionClientResult startResult = client.start();
+		assertThat(startResult.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+		System.out.println(String.format("WD Simulator On Environment:\"%s\" Started Successfully",
+				buildDistributionClientConfiguration.getConsumerID()));
+		return client;
+	}
+
+	private IFinalDistrStatusMessage buildFinalDistribution() {
+		return new IFinalDistrStatusMessage() {
+
+			@Override
+			public long getTimestamp() {
+				return System.currentTimeMillis();
+			}
+
+			@Override
+			public DistributionStatusEnum getStatus() {
+				return DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK;
+			}
+
+			@Override
+			public String getDistributionID() {
+				return "FakeDistributionId";
+			}
+		};
+	}
+
+	private IConfiguration buildDistributionClientConfiguration(String topicName, OperationalEnvironmentEntry opEnv) {
+		return new IConfiguration() {
+
+			public String getUser() {
+				return "ci";
+			}
+
+			public int getPollingTimeout() {
+				return 20;
+			}
+
+			public int getPollingInterval() {
+				return 20;
+			}
+
+			public String getPassword() {
+				return "123456";
+			}
+
+			public String getEnvironmentName() {
+				return topicName;
+			}
+
+			public String getConsumerID() {
+				return opEnv.getEnvironmentId();
+			}
+
+			public String getConsumerGroup() {
+				return String.format("BenchMarkDistributionClientConsumerGroup%s", opEnv.getEnvironmentId());
+			}
+
+			public String getAsdcAddress() {
+				return String.format("%s:8443", asdcAddress);
+			}
+
+			@Override
+			public String getKeyStorePath() {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			@Override
+			public String getKeyStorePassword() {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			@Override
+			public boolean activateServerTLSAuth() {
+				// TODO Auto-generated method stub
+				return false;
+			}
+
+			@Override
+			public List<String> getRelevantArtifactTypes() {
+				return Arrays.asList(ArtifactTypeEnum.values()).stream()
+						.map(artifactTypeEnum -> artifactTypeEnum.name()).collect(Collectors.toList());
+			}
+
+			@Override
+			public boolean isFilterInEmptyResources() {
+				// TODO Auto-generated method stub
+				return false;
+			}
+
+			@Override
+			public Boolean isUseHttpsWithDmaap() {
+				return null;
+			}
+
+			@Override
+			public List<String> getMsgBusAddress() {
+				return opEnv.getDmaapUebAddress().stream().map(this::extractHost).collect(Collectors.toList());
+			}
+
+			private String extractHost(String url) {
+				return url.split(":")[0];
+			}
+		};
+	}
+
+	private void distributeServiceInEnv(OperationalEnvironmentEntry env) {
+		uuidServicesList.stream().forEach(serviceUUID -> distributeSingleService(env, serviceUUID));
+	}
+
+	private void distributeSingleService(OperationalEnvironmentEntry env, String serviceUUID) {
+		IHttpAsdcClient client = new HttpAsdcClient(buildDistributionClientConfiguration(StringUtils.EMPTY, env));
+		String pattern = "/sdc/v1/catalog/services/%s/distribution/%s/activate";
+		String requestUrl = String.format(pattern, serviceUUID, env.getEnvironmentId());
+		String requestBody = String.format("{\"workloadContext\":\"%s\"}", env.getEnvironmentId());
+		StringEntity body = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put("USER_ID", "cs0008");
+		headersMap.put("X-ECOMP-InstanceID", "test");
+		headersMap.put("Content-Type", "application/json");
+
+		HttpAsdcResponse postRequest = FunctionalInterfaces.retryMethodOnResult(
+				() -> distributeMethod(client, requestUrl, serviceUUID, body, headersMap, env.getEnvironmentId()),
+				resp -> resp.getStatus() == HttpStatus.SC_ACCEPTED);
+		assertThat(postRequest.getStatus(), is(HttpStatus.SC_ACCEPTED));
+
+	}
+
+	private HttpAsdcResponse distributeMethod(IHttpAsdcClient client, String requestUrl, String serviceUUID,
+			StringEntity body, Map<String, String> headersMap, String envId) {
+
+		final HttpAsdcResponse postRequest = client.postRequest(requestUrl, body, headersMap);
+		final String message = String.format(
+				"MSO Client Simulator Distributes Service:%s On Environment:\"%s\" - Recieved Response: %s", serviceUUID, envId,
+				postRequest.getStatus());
+		if (postRequest.getStatus() != HttpStatus.SC_ACCEPTED) {
+			System.err.println(message);
+		} else {
+			System.out.println(message);
+		}
+
+		return postRequest;
+	}
+
+	private String convertUebAddressToList(OperationalEnvironmentEntry op) {
+		Set<String> dmaapUebAddress = op.getDmaapUebAddress();
+		Wrapper<String> resultWrapper = new Wrapper<>(StringUtils.EMPTY);
+		if (!CollectionUtils.isEmpty(dmaapUebAddress)) {
+			dmaapUebAddress.stream()
+					.forEach(uebAddress -> resultWrapper.setInnerElement(resultWrapper.getInnerElement() + uebAddress));
+		}
+
+		return resultWrapper.getInnerElement();
+	}
+
+	private void buildWdSimulatorCallback(OperationalEnvironmentEntry opEnv, IDistributionClient client,
+			final IConfiguration buildDistributionClientConfiguration, INotificationData data) {
+		if (StringUtils.equals(data.getWorkloadContext(), opEnv.getEnvironmentId())) {
+			
+			final String expectedArtifactType = org.openecomp.sdc.common.api.ArtifactTypeEnum.MODEL_INVENTORY_PROFILE.name();
+			Optional<IArtifactInfo> optional = data.getServiceArtifacts().stream().filter( artifact -> {
+				return StringUtils.equals(artifact.getArtifactType(), expectedArtifactType);
+			}).findAny();
+			
+			for (int i = 0; i < numOfArtifactsToDownload; i++) {
+				optional.ifPresent( artifactInfo -> simulateDownload(client , artifactInfo, data) );
+				optional.orElseThrow( () -> handleArtifactNotFound(expectedArtifactType, data));
+				
+			}
+			if(  numOfArtifactsToDownload > 0 ){
+				System.out.println(String.format(
+						"ASDC Consumer Simulator On Environment:\"%s\" Downloaded %s Artifacts From ASDC Service with UUID:%s  Total Artifacts Downloaded from ASDC is: %s",
+						data.getWorkloadContext(), numOfArtifactsToDownload,
+						data.getServiceUUID(), totalNumOfArtifactsToDownload));
+			}
+			
+			IDistributionClientResult finalDistrStatus = client.sendFinalDistrStatus(buildFinalDistribution());
+			assertThat(finalDistrStatus.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+			wdFinalStatusSent.add(data.getWorkloadContext());
+
+			System.out.println(String.format(
+					"WD Simulator On Environment:\"%s\" Recieved Notification From ASDC On WorkLoad: %s And Service UUID:%s And Sends Distribution Complete Notification",
+					buildDistributionClientConfiguration.getConsumerID(), data.getWorkloadContext(),
+					data.getServiceUUID()));
+		}
+	}
+	
+	private IllegalStateException handleArtifactNotFound(String expectedArtifactType, INotificationData data ){
+		final String stringMessage = String.format("Did Not Find Artifact of type: %s to download from service with UUID:%s", expectedArtifactType, data.getServiceUUID());
+		System.err.println(stringMessage); 
+		return new IllegalStateException(stringMessage);
+	 
+	}
+	
+	private void simulateDownload(IDistributionClient client, IArtifactInfo info, INotificationData data){
+		IDistributionClientDownloadResult downloadResult = client.download(info);
+		if( downloadResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS ){
+			System.err.println(String.format("Client Simulator %s Failed to download artifact from service : %s", client.getConfiguration().getConsumerID(), data.getServiceUUID()));
+			assertThat(downloadResult.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+		}
+		else{
+			totalNumOfArtifactsToDownload++;
+		
+		}
+	}
+}
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/utils/RunnerSession.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/utils/RunnerSession.java
new file mode 100644
index 0000000..c93b3d2
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/utils/RunnerSession.java
@@ -0,0 +1,61 @@
+package org.openecomp.sdc.cucumber.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Store Data here that is relevant for the whole runner and not just a single scenario.
+ * @author ms172g
+ *
+ */
+public class RunnerSession {
+	private static final RunnerSession instance = new RunnerSession();
+	private Map<String, String> stringElements;
+	private Map<String, Integer> intElements;
+	private Map<String, Object> elements;
+	private RunnerSession(){
+		stringElements = new HashMap<>();
+		intElements = new HashMap<>();
+		elements = new HashMap<>();
+	}
+	public static RunnerSession getSession(){
+		return instance;
+	}
+
+	public void putInSession(String key, String value){
+		stringElements.put(key, value);
+	}
+	
+	public String getString(String key){
+		return stringElements.get(key);
+		
+	}
+	
+	public void putInSession(String key, Integer value){
+		intElements.put(key, value);
+	}
+	
+	
+	public Integer getInt(String key){
+		return intElements.get(key);
+	}
+	
+	public void putInSession(String key, Object value) {
+		elements.put(key, value);
+		
+	}
+	
+	public Object get(String key){
+		return elements.get(key);
+	}
+	
+	public void clean(){
+		intElements.clear();
+		stringElements.clear();
+	}
+	
+	
+	
+	
+	
+}
diff --git a/test-apis-ci/src/test/resources/CI/tests/tenantIsolationCI/aai_error.properties b/test-apis-ci/src/test/resources/CI/tests/tenantIsolationCI/aai_error.properties
new file mode 100644
index 0000000..b4ae9e3
--- /dev/null
+++ b/test-apis-ci/src/test/resources/CI/tests/tenantIsolationCI/aai_error.properties
@@ -0,0 +1,10 @@
+400=Bad Request
+401=Unauthorized
+403=Forbidden
+404=Not Found
+405=Method Not Allowed
+409=The request could not be completed due to a conflict with the current state of the target resource
+410=You are using a version of the API that has been retired
+412=Precondition failed
+415=Unsupported Media Type
+500=Internal Server Error
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/catalogMgmtTest.properties b/test-apis-ci/src/test/resources/catalogMgmtTest.properties
new file mode 100644
index 0000000..7a26a0c
--- /dev/null
+++ b/test-apis-ci/src/test/resources/catalogMgmtTest.properties
@@ -0,0 +1,34 @@
+TransportType=DME2
+Latitude =32.109333
+Longitude =34.855499
+Version =1.0
+ServiceName =dmaap-v1.dev.dmaap.dt.saat.acsi.att.com/events
+Environment =TEST
+Partner=BOT_R
+routeOffer=MR1
+SubContextPath =/
+Protocol =http
+MethodType =POST
+username = m09875@sdc.att.com
+password =Aa123456
+contenttype = application/json
+Authorization = Basic bTEzMzMxQGNjZC5hdHQuY29tOkFhMTIzNDU2
+authKey=
+authDate=
+#Dmaap Server Url port 3904-HTTP 3905-https
+host=olsd004.wnsnet.attws.com:3904
+###topic=com.att.ccd.CCD-CatalogManagement-go539p or  com.att.sdc.SDCforTestDev | com.att.sdc.23911-SDCforTestDev-v001
+topic=com.att.sdc.23911-SDCforTestDev-v001
+partition=1
+maxBatchSize=100
+maxAgeMs=250
+AFT_DME2_EXCHANGE_REQUEST_HANDLERS=com.att.nsa.test.PreferredRouteRequestHandler
+AFT_DME2_EXCHANGE_REPLY_HANDLERS=com.att.nsa.test.PreferredRouteReplyHandler
+AFT_DME2_REQ_TRACE_ON=true
+AFT_ENVIRONMENT=AFTUAT
+AFT_DME2_EP_CONN_TIMEOUT=15000
+AFT_DME2_ROUNDTRIP_TIMEOUT_MS=240000
+AFT_DME2_EP_READ_TIMEOUT_MS=50000
+sessionstickinessrequired=NO
+DME2preferredRouterFilePath=src/test/resources/preferredRouter.txt
+MessageSentThreadOccurance=50
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/catalogMgmtTest.yaml b/test-apis-ci/src/test/resources/catalogMgmtTest.yaml
new file mode 100644
index 0000000..ee419f4
--- /dev/null
+++ b/test-apis-ci/src/test/resources/catalogMgmtTest.yaml
@@ -0,0 +1,6 @@
+publisherPropertiesFilePath: "catalogMgmtTest.properties"
+topicMessages:
+  - "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"product\"],\"republish\":\"No\",\"Authorization\": \"Basic bTEzMzMxQGNjZC5hdHQuY29tOkFhMTIzNDU2\"}"
+  #- "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"logo\"],\"republish\":\"No\"}"
+  #- "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"availabilitymatrix\"],\"republish\":\"No\"}"
+  #- "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"product\",\"availabilitymatrix\"],\"republish\":\"No\"}"
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/configuration1.yaml b/test-apis-ci/src/test/resources/config/configuration1.yaml
new file mode 100644
index 0000000..12ab2c7
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/configuration1.yaml
@@ -0,0 +1,17 @@
+version: 1.0
+released: 2012-11-30
+
+# Connection parameters
+connection:
+    url: jdbc:mysql://localhost:3306/db
+    poolSize: 5
+
+# Protocols
+protocols:
+   - http
+   - https
+
+# Users
+users:
+    tom: passwd
+    bob: passwd
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/elasticsearch.yml b/test-apis-ci/src/test/resources/config/elasticsearch.yml
new file mode 100644
index 0000000..a6a2c1b
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/elasticsearch.yml
@@ -0,0 +1,387 @@
+
+cluster.name: elasticsearch_1_5_2
+  
+discovery.zen.ping.multicast.enabled: false
+discovery.zen.ping.unicast.enabled: true
+discovery.zen.ping.unicast.hosts: elasticsearch_host
+
+
+
+##################### Elasticsearch Configuration Example #####################
+
+# This file contains an overview of various configuration settings,
+# targeted at operations staff. Application developers should
+# consult the guide at <http://elasticsearch.org/guide>.
+#
+# The installation procedure is covered at
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html>.
+#
+# Elasticsearch comes with reasonable defaults for most settings,
+# so you can try it out without bothering with configuration.
+#
+# Most of the time, these defaults are just fine for running a production
+# cluster. If you're fine-tuning your cluster, or wondering about the
+# effect of certain configuration option, please _do ask_ on the
+# mailing list or IRC channel [http://elasticsearch.org/community].
+
+# Any element in the configuration can be replaced with environment variables
+# by placing them in ${...} notation. For example:
+#
+# node.rack: ${RACK_ENV_VAR}
+
+# For information on supported formats and syntax for the config file, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html>
+
+
+################################### Cluster ###################################
+
+# Cluster name identifies your cluster for auto-discovery. If you're running
+# multiple clusters on the same network, make sure you're using unique names.
+#
+# cluster.name: elasticsearch
+
+
+#################################### Node #####################################
+
+# Node names are generated dynamically on startup, so you're relieved
+# from configuring them manually. You can tie this node to a specific name:
+#
+# node.name: "Franz Kafka"
+
+# Every node can be configured to allow or deny being eligible as the master,
+# and to allow or deny to store the data.
+#
+# Allow this node to be eligible as a master node (enabled by default):
+#
+# node.master: true
+#
+# Allow this node to store data (enabled by default):
+#
+# node.data: true
+
+# You can exploit these settings to design advanced cluster topologies.
+#
+# 1. You want this node to never become a master node, only to hold data.
+#    This will be the "workhorse" of your cluster.
+#
+# node.master: false
+# node.data: true
+#
+# 2. You want this node to only serve as a master: to not store any data and
+#    to have free resources. This will be the "coordinator" of your cluster.
+#
+# node.master: true
+# node.data: false
+#
+# 3. You want this node to be neither master nor data node, but
+#    to act as a "search load balancer" (fetching data from nodes,
+#    aggregating results, etc.)
+#
+# node.master: false
+# node.data: false
+
+# Use the Cluster Health API [http://localhost:9200/_cluster/health], the
+# Node Info API [http://localhost:9200/_nodes] or GUI tools
+# such as <http://www.elasticsearch.org/overview/marvel/>,
+# <http://github.com/karmi/elasticsearch-paramedic>,
+# <http://github.com/lukas-vlcek/bigdesk> and
+# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.
+
+# A node can have generic attributes associated with it, which can later be used
+# for customized shard allocation filtering, or allocation awareness. An attribute
+# is a simple key value pair, similar to node.key: value, here is an example:
+#
+# node.rack: rack314
+
+# By default, multiple nodes are allowed to start from the same installation location
+# to disable it, set the following:
+# node.max_local_storage_nodes: 1
+
+
+#################################### Index ####################################
+
+# You can set a number of options (such as shard/replica options, mapping
+# or analyzer definitions, translog settings, ...) for indices globally,
+# in this file.
+#
+# Note, that it makes more sense to configure index settings specifically for
+# a certain index, either when creating it or by using the index templates API.
+#
+# See <http://elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html> and
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html>
+# for more information.
+
+# Set the number of shards (splits) of an index (5 by default):
+#
+# index.number_of_shards: 5
+
+# Set the number of replicas (additional copies) of an index (1 by default):
+#
+# index.number_of_replicas: 1
+
+# Note, that for development on a local machine, with small indices, it usually
+# makes sense to "disable" the distributed features:
+#
+index.number_of_shards: 1
+index.number_of_replicas: 0
+
+# These settings directly affect the performance of index and search operations
+# in your cluster. Assuming you have enough machines to hold shards and
+# replicas, the rule of thumb is:
+#
+# 1. Having more *shards* enhances the _indexing_ performance and allows to
+#    _distribute_ a big index across machines.
+# 2. Having more *replicas* enhances the _search_ performance and improves the
+#    cluster _availability_.
+#
+# The "number_of_shards" is a one-time setting for an index.
+#
+# The "number_of_replicas" can be increased or decreased anytime,
+# by using the Index Update Settings API.
+#
+# Elasticsearch takes care about load balancing, relocating, gathering the
+# results from nodes, etc. Experiment with different settings to fine-tune
+# your setup.
+
+# Use the Index Status API (<http://localhost:9200/A/_status>) to inspect
+# the index status.
+
+
+#################################### Paths ####################################
+
+# Path to directory containing configuration (this file and logging.yml):
+#
+path.conf: /src/test/resources
+
+# Path to directory where to store index data allocated for this node.
+#
+path.data: target/esdata
+#
+# Can optionally include more than one location, causing data to be striped across
+# the locations (a la RAID 0) on a file level, favouring locations with most free
+# space on creation. For example:
+#
+# path.data: /path/to/data1,/path/to/data2
+
+# Path to temporary files:
+#
+path.work: /target/eswork
+
+# Path to log files:
+#
+path.logs: /target/eslogs
+
+# Path to where plugins are installed:
+#
+# path.plugins: /path/to/plugins
+
+
+#################################### Plugin ###################################
+
+# If a plugin listed here is not installed for current node, the node will not start.
+#
+# plugin.mandatory: mapper-attachments,lang-groovy
+
+
+################################### Memory ####################################
+
+# Elasticsearch performs poorly when JVM starts swapping: you should ensure that
+# it _never_ swaps.
+#
+# Set this property to true to lock the memory:
+#
+# bootstrap.mlockall: true
+
+# Make sure that the ES_MIN_MEM and ES_MAX_MEM environment variables are set
+# to the same value, and that the machine has enough memory to allocate
+# for Elasticsearch, leaving enough memory for the operating system itself.
+#
+# You should also make sure that the Elasticsearch process is allowed to lock
+# the memory, eg. by using `ulimit -l unlimited`.
+
+
+############################## Network And HTTP ###############################
+
+# Elasticsearch, by default, binds itself to the 0.0.0.0 address, and listens
+# on port [9200-9300] for HTTP traffic and on port [9300-9400] for node-to-node
+# communication. (the range means that if the port is busy, it will automatically
+# try the next port).
+
+# Set the bind address specifically (IPv4 or IPv6):
+#
+# network.bind_host: 192.168.0.1
+
+# Set the address other nodes will use to communicate with this node. If not
+# set, it is automatically derived. It must point to an actual IP address.
+#
+# network.publish_host: 192.168.0.1
+
+# Set both 'bind_host' and 'publish_host':
+#
+# network.host: 192.168.0.1
+
+# Set a custom port for the node to node communication (9300 by default):
+#
+# transport.tcp.port: 9300
+
+# Enable compression for all communication between nodes (disabled by default):
+#
+# transport.tcp.compress: true
+
+# Set a custom port to listen for HTTP traffic:
+#
+# http.port: 9200
+
+# Set a custom allowed content length:
+#
+# http.max_content_length: 100mb
+
+# Disable HTTP completely:
+#
+# http.enabled: false
+
+
+################################### Gateway ###################################
+
+# The gateway allows for persisting the cluster state between full cluster
+# restarts. Every change to the state (such as adding an index) will be stored
+# in the gateway, and when the cluster starts up for the first time,
+# it will read its state from the gateway.
+
+# There are several types of gateway implementations. For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-gateway.html>.
+
+# The default gateway type is the "local" gateway (recommended):
+#
+# gateway.type: local
+
+# Settings below control how and when to start the initial recovery process on
+# a full cluster restart (to reuse as much local data as possible when using shared
+# gateway).
+
+# Allow recovery process after N nodes in a cluster are up:
+#
+gateway.recover_after_nodes: 1
+
+# Set the timeout to initiate the recovery process, once the N nodes
+# from previous setting are up (accepts time value):
+#
+# gateway.recover_after_time: 5m
+
+# Set how many nodes are expected in this cluster. Once these N nodes
+# are up (and recover_after_nodes is met), begin recovery process immediately
+# (without waiting for recover_after_time to expire):
+#
+gateway.expected_nodes: 1
+
+
+############################# Recovery Throttling #############################
+
+# These settings allow to control the process of shards allocation between
+# nodes during initial recovery, replica allocation, rebalancing,
+# or when adding and removing nodes.
+
+# Set the number of concurrent recoveries happening on a node:
+#
+# 1. During the initial recovery
+#
+# cluster.routing.allocation.node_initial_primaries_recoveries: 4
+#
+# 2. During adding/removing nodes, rebalancing, etc
+#
+# cluster.routing.allocation.node_concurrent_recoveries: 2
+
+# Set to throttle throughput when recovering (eg. 100mb, by default 20mb):
+#
+# indices.recovery.max_bytes_per_sec: 20mb
+
+# Set to limit the number of open concurrent streams when
+# recovering a shard from a peer:
+#
+# indices.recovery.concurrent_streams: 5
+
+
+################################## Discovery ##################################
+
+# Discovery infrastructure ensures nodes can be found within a cluster
+# and master node is elected. Multicast discovery is the default.
+
+# Set to ensure a node sees N other master eligible nodes to be considered
+# operational within the cluster. Its recommended to set it to a higher value
+# than 1 when running more than 2 nodes in the cluster.
+#
+# discovery.zen.minimum_master_nodes: 1
+
+# Set the time to wait for ping responses from other nodes when discovering.
+# Set this option to a higher value on a slow or congested network
+# to minimize discovery failures:
+#
+# discovery.zen.ping.timeout: 3s
+
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html>
+
+# Unicast discovery allows to explicitly control which nodes will be used
+# to discover the cluster. It can be used when multicast is not present,
+# or to restrict the cluster communication-wise.
+#
+# 1. Disable multicast discovery (enabled by default):
+#
+# discovery.zen.ping.multicast.enabled: false
+#
+# 2. Configure an initial list of master nodes in the cluster
+#    to perform discovery when new nodes (master or data) are started:
+#
+# discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
+
+# EC2 discovery allows to use AWS EC2 API in order to perform discovery.
+#
+# You have to install the cloud-aws plugin for enabling the EC2 discovery.
+#
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-ec2.html>
+#
+# See <http://elasticsearch.org/tutorials/elasticsearch-on-ec2/>
+# for a step-by-step tutorial.
+
+# GCE discovery allows to use Google Compute Engine API in order to perform discovery.
+#
+# You have to install the cloud-gce plugin for enabling the GCE discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-gce>.
+
+# Azure discovery allows to use Azure API in order to perform discovery.
+#
+# You have to install the cloud-azure plugin for enabling the Azure discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-azure>.
+
+################################## Slow Log ##################################
+
+# Shard level query and fetch threshold logging.
+
+#index.search.slowlog.threshold.query.warn: 10s
+#index.search.slowlog.threshold.query.info: 5s
+#index.search.slowlog.threshold.query.debug: 2s
+#index.search.slowlog.threshold.query.trace: 500ms
+
+#index.search.slowlog.threshold.fetch.warn: 1s
+#index.search.slowlog.threshold.fetch.info: 800ms
+#index.search.slowlog.threshold.fetch.debug: 500ms
+#index.search.slowlog.threshold.fetch.trace: 200ms
+
+#index.indexing.slowlog.threshold.index.warn: 10s
+#index.indexing.slowlog.threshold.index.info: 5s
+#index.indexing.slowlog.threshold.index.debug: 2s
+#index.indexing.slowlog.threshold.index.trace: 500ms
+
+################################## GC Logging ################################
+
+#monitor.jvm.gc.young.warn: 1000ms
+#monitor.jvm.gc.young.info: 700ms
+#monitor.jvm.gc.young.debug: 400ms
+
+#monitor.jvm.gc.old.warn: 10s
+#monitor.jvm.gc.old.info: 5s
+#monitor.jvm.gc.old.debug: 2s
+
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/DME2preferredRouter.txt b/test-apis-ci/src/test/resources/config/test-apis-ci/DME2preferredRouter.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/DME2preferredRouter.txt
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/configuration.yaml
new file mode 100644
index 0000000..f138ba1
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/configuration.yaml
@@ -0,0 +1,677 @@
+identificationHeaderFields:
+   - HTTP_IV_USER
+   - HTTP_CSP_FIRSTNAME
+   - HTTP_CSP_LASTNAME
+   - HTTP_IV_REMOTE_ADDRESS
+   - HTTP_CSP_WSTYPE
+
+# catalog backend hostname
+beFqdn: localhost
+# sdccatalog.att.com
+
+# catalog backend http port
+beHttpPort: 8080
+
+# catalog backend http context
+beContext: /sdc/rest/config/get
+
+# catalog backend protocol
+beProtocol: http
+
+# catalog backend ssl port
+beSslPort: 8443
+
+version: 1.1.0
+released: 2012-11-30
+toscaConformanceLevel: 5.0
+minToscaConformanceLevel: 3.0
+
+titanCfgFile: /home/vagrant/catalog-be/config/catalog-be/titan.properties
+titanInMemoryGraph: false
+titanLockTimeout: 1800
+
+# The interval to try and reconnect to titan DB when it is down during ASDC startup:
+titanReconnectIntervalInSeconds: 3
+
+# The read timeout towards Titan DB when health check is invoked:
+titanHealthCheckReadTimeout: 1
+
+# The interval to try and reconnect to Elasticsearch when it is down during ASDC startup:
+esReconnectIntervalInSeconds: 3
+uebHealthCheckReconnectIntervalInSeconds: 15
+uebHealthCheckReadTimeout: 4
+
+# Protocols
+protocols:
+   - http
+   - https
+
+# Default imports
+defaultImports:
+   - nodes:
+        file: nodes.yml
+   - datatypes:
+        file: data.yml
+   - capabilities:
+        file: capabilities.yml
+   - relationships:
+        file: relationships.yml
+   - groups:
+        file: groups.yml
+   - policies:
+        file: policies.yml
+
+# Users
+users:
+    tom: passwd
+    bob: passwd
+
+neo4j:
+    host: neo4jhost
+    port: 7474
+    user: neo4j
+    password: "12345"
+
+cassandraConfig:
+    cassandraHosts: ['localhost']
+    localDataCenter: datacenter1
+    reconnectTimeout : 30000
+    authenticate: false
+    username: koko
+    password: bobo
+    ssl: false
+    truststorePath : /path/path
+    truststorePassword : 123123
+    keySpaces:
+        - { name: sdcaudit, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+        - { name: sdcartifact, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+        - { name: sdccomponent, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+        - { name: sdcrepository, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+
+#Application-specific settings of ES
+elasticSearch:
+    # Mapping of index prefix to time-based frame. For example, if below is configured:
+    #
+    # - indexPrefix: auditingevents
+    #    creationPeriod: minute
+    #
+    # then ES object of type which is mapped to "auditingevents-*" template, and created on 2015-12-23 13:24:54, will enter "auditingevents-2015-12-23-13-24" index.
+    # Another object created on 2015-12-23 13:25:54, will enter "auditingevents-2015-12-23-13-25" index.
+    # If creationPeriod: month, both of the above will enter "auditingevents-2015-12" index.
+    #
+    # PLEASE NOTE: the timestamps are created in UTC/GMT timezone! This is needed so that timestamps will be correctly presented in Kibana.
+    #
+    # Legal values for creationPeriod - year, month, day, hour, minute, none (meaning no time-based behaviour).
+    #
+    # If no creationPeriod is configured for indexPrefix, default behavour is creationPeriod: month.
+    
+    indicesTimeFrequency:
+      - indexPrefix: auditingevents
+        creationPeriod: month
+      - indexPrefix: monitoring_events
+        creationPeriod: month
+
+artifactTypes:
+   - CHEF
+   - PUPPET
+   - SHELL
+   - YANG
+   - YANG_XML
+   - HEAT
+   - BPEL
+   - DG_XML
+   - MURANO_PKG
+   - WORKFLOW
+   - NETWORK_CALL_FLOW
+   - TOSCA_TEMPLATE
+   - TOSCA_CSAR
+   - AAI_SERVICE_MODEL
+   - AAI_VF_MODEL
+   - AAI_VF_MODULE_MODEL
+   - AAI_VF_INSTANCE_MODEL
+   - OTHER
+   - SNMP_POLL
+   - SNMP_TRAP
+   - GUIDE
+
+licenseTypes:
+   - User
+   - Installation
+   - CPU
+
+#Deployment artifacts placeHolder
+resourceTypes: &allResourceTypes
+  - VFC
+  - CP
+  - VL
+  - VF
+  - VFCMT
+  - Abstract
+  - CVFC
+
+# validForResourceTypes usage
+#     validForResourceTypes:
+#        - VF
+#        - VL
+deploymentResourceArtifacts:
+#  heat:
+#      displayName: "Base HEAT Template"
+#      type: HEAT
+#      validForResourceTypes: *allResourceTypes
+#  heatVol:
+#      displayName: "Volume HEAT Template"
+#      type: HEAT_VOL
+#      validForResourceTypes: *allResourceTypes
+#  heatNet:
+#      displayName: "Network HEAT Template"
+#      type: HEAT_NET
+#      validForResourceTypes: *allResourceTypes
+
+deploymentResourceInstanceArtifacts:
+  heatEnv:
+      displayName: "HEAT ENV"
+      type: HEAT_ENV
+      description: "Auto-generated HEAT Environment deployment artifact"
+      fileExtension: "env"
+  VfHeatEnv:
+      displayName: "VF HEAT ENV"
+      type: HEAT_ENV
+      description: "VF Auto-generated HEAT Environment deployment artifact"
+      fileExtension: "env"
+
+#tosca artifacts placeholders
+toscaArtifacts:
+  assetToscaTemplate:
+      artifactName: -template.yml
+      displayName: Tosca Template
+      type: TOSCA_TEMPLATE
+      description: TOSCA representation of the asset
+  assetToscaCsar:
+      artifactName: -csar.csar
+      displayName: Tosca Model
+      type: TOSCA_CSAR
+      description: TOSCA definition package of the asset
+
+
+#Informational artifacts placeHolder
+excludeResourceCategory:
+  - Generic
+excludeResourceType:
+  - PNF  
+informationalResourceArtifacts:
+  features:
+      displayName: Features
+      type: OTHER
+  capacity:
+      displayName: Capacity
+      type: OTHER
+  vendorTestResult:
+      displayName: Vendor Test Result
+      type: OTHER
+  testScripts:
+      displayName: Test Scripts
+      type: OTHER
+  CloudQuestionnaire:
+      displayName: Cloud Questionnaire (completed)
+      type: OTHER
+  HEATTemplateFromVendor:
+      displayName: HEAT Template from Vendor
+      type: HEAT
+  resourceSecurityTemplate:
+      displayName: Resource Security Template
+      type: OTHER
+
+excludeServiceCategory:
+
+informationalServiceArtifacts:
+  serviceArtifactPlan:
+      displayName: Service Artifact Plan
+      type: OTHER
+  summaryOfImpactsToECOMPElements:
+      displayName: Summary of impacts to ECOMP elements,OSSs, BSSs
+      type: OTHER
+  controlLoopFunctions:
+      displayName: Control Loop Functions
+      type: OTHER
+  dimensioningInfo:
+      displayName: Dimensioning Info
+      type: OTHER
+  affinityRules:
+      displayName: Affinity Rules
+      type: OTHER
+  operationalPolicies:
+      displayName: Operational Policies
+      type: OTHER
+  serviceSpecificPolicies:
+      displayName: Service-specific Policies
+      type: OTHER
+  engineeringRules:
+      displayName: Engineering Rules (ERD)
+      type: OTHER
+  distributionInstructions:
+      displayName: Distribution Instructions
+      type: OTHER
+  certificationTestResults:
+      displayName: TD Certification Test Results
+      type: OTHER
+  deploymentVotingRecord:
+      displayName: Deployment Voting Record
+      type: OTHER
+  serviceQuestionnaire:
+      displayName: Service Questionnaire
+      type: OTHER
+  serviceSecurityTemplate:
+      displayName: Service Security Template
+      type: OTHER
+
+serviceApiArtifacts:
+  configuration:
+      displayName: Configuration
+      type: OTHER
+  instantiation:
+      displayName: Instantiation
+      type: OTHER
+  monitoring:
+      displayName: Monitoring
+      type: OTHER
+  reporting:
+      displayName: Reporting
+      type: OTHER
+  logging:
+      displayName: Logging
+      type: OTHER
+  testing:
+      displayName: Testing
+      type: OTHER
+
+additionalInformationMaxNumberOfKeys: 50
+
+systemMonitoring:
+    enabled: false
+    isProxy: false
+    probeIntervalInSeconds: 15
+
+defaultHeatArtifactTimeoutMinutes: 60
+
+serviceDeploymentArtifacts:
+    YANG_XML:
+        acceptedTypes:
+            - xml
+    VNF_CATALOG:
+        acceptedTypes:
+            - xml
+    MODEL_INVENTORY_PROFILE:
+        acceptedTypes:
+            - xml
+    MODEL_QUERY_SPEC:
+        acceptedTypes:
+            - xml
+    UCPE_LAYER_2_CONFIGURATION:
+        acceptedTypes:
+            - xml
+
+#AAI Artifacts
+    AAI_SERVICE_MODEL:
+        acceptedTypes:
+            - xml
+    AAI_VF_MODULE_MODEL:
+        acceptedTypes:
+            - xml
+    AAI_VF_INSTANCE_MODEL:
+        acceptedTypes:
+            - xml 
+    OTHER:
+        acceptedTypes:
+
+resourceDeploymentArtifacts:
+    HEAT:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_VOL:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_NET:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_NESTED:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_ARTIFACT:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    YANG_XML:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    VNF_CATALOG:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    VF_LICENSE:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    VENDOR_LICENSE:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    MODEL_INVENTORY_PROFILE:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    MODEL_QUERY_SPEC:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    LIFECYCLE_OPERATIONS:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes:
+            - VF
+            - VFC
+    VES_EVENTS:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    PERFORMANCE_COUNTER:
+        acceptedTypes:
+            - csv
+        validForResourceTypes: *allResourceTypes
+    APPC_CONFIG:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF
+    DCAE_TOSCA:
+        acceptedTypes:
+            - yml
+            - yaml
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    DCAE_JSON:
+        acceptedTypes:
+            - json
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    DCAE_POLICY:
+        acceptedTypes:
+            - emf
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    DCAE_DOC:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF 
+            - VFCMT       
+    DCAE_EVENT:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    AAI_VF_MODEL:
+        acceptedTypes:
+            - xml
+        validForResourceTypes:
+            - VF
+    AAI_VF_MODULE_MODEL:
+        acceptedTypes:
+            - xml
+        validForResourceTypes:
+            - VF
+    OTHER:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_POLL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_TRAP:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+
+resourceInstanceDeploymentArtifacts:
+    HEAT_ENV:
+        acceptedTypes:
+            - env
+    VF_MODULES_METADATA:
+        acceptedTypes:
+            - json
+    VES_EVENTS:
+        acceptedTypes:
+            - yaml
+            - yml
+    PERFORMANCE_COUNTER:
+        acceptedTypes:
+            - csv
+    DCAE_INVENTORY_TOSCA:
+        acceptedTypes:
+            - yml
+            - yaml
+    DCAE_INVENTORY_JSON:
+        acceptedTypes:
+            - json
+    DCAE_INVENTORY_POLICY:
+      acceptedTypes:
+            - emf
+    DCAE_INVENTORY_DOC:
+      acceptedTypes:
+    DCAE_INVENTORY_BLUEPRINT:
+      acceptedTypes:
+    DCAE_INVENTORY_EVENT:
+      acceptedTypes:
+    SNMP_POLL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_TRAP:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+
+resourceInformationalArtifacts:
+    CHEF:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    PUPPET:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SHELL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    YANG:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    YANG_XML:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    HEAT:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    BPEL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    DG_XML:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    MURANO_PKG:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    OTHER:
+        acceptedTypes:
+        validForResourceTypes: 
+            - VFC
+            - CVFC
+            - CP
+            - VL
+            - VF
+            - VFCMT
+            - Abstract
+            - PNF
+    SNMP_POLL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_TRAP:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    GUIDE:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF
+            - VFC
+            - CVFC
+
+resourceInformationalDeployedArtifacts:
+
+requirementsToFulfillBeforeCert:
+
+capabilitiesToConsumeBeforeCert:
+
+unLoggedUrls:
+   - /sdc2/rest/healthCheck
+
+cleanComponentsConfiguration:
+    cleanIntervalInMinutes: 1440
+    componentsToClean:
+       - Resource
+       - Service
+
+artifactsIndex: resources
+
+heatEnvArtifactHeader: ""
+heatEnvArtifactFooter: ""
+
+onboarding:
+    protocol: http
+    host: localhost
+    port: 8080
+    downloadCsarUri: "/onboarding-api/v1.0/vendor-software-products/packages"
+    healthCheckUri: "/onboarding-api/v1.0/healthcheck"
+
+dcae:
+    protocol: http
+    host: 127.0.0.1
+    port: 8080
+    healthCheckUri: "/dcae/healthCheck"
+
+switchoverDetector:
+    gBeFqdn: AIO-BE.ecomp.idns.cip.com
+    gFeFqdn: AIO-FE.ecomp.idns.cip.com
+    beVip: 0.0.0.0
+    feVip: 0.0.0.0
+    beResolveAttempts: 3
+    feResolveAttempts: 3
+    enabled: false
+    interval: 60
+    changePriorityUser: ecompasdc
+    changePriorityPassword: ecompasdc123
+    publishNetworkUrl: "http://xxx.com/crt/CipDomain.ECOMP-ASDC-DEVST/config/update_network?user=root"
+    publishNetworkBody: '{"note":"publish network"}'
+    groups:
+      beSet: { changePriorityUrl: "http://xxx.com/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-BE.ecomp.idns.com?user=root",
+               changePriorityBody: '{"name":"AIO-BE.ecomp.idns.com","uri":"/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-BE.ecomp.idns.com","no_ad_redirection":false,"v4groups":{"failover_groups":["/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_mg_be","/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_bs_be"],"failover_policy":["FAILALL"]},"comment":"AIO BE G-fqdn","intended_app_proto":"DNS"}'}
+      feSet: { changePriorityUrl: "http://xxx.com/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-FE.ecomp.idns.com?user=root",
+               changePriorityBody: '{"comment":"AIO G-fqdn","name":"AIO-FE.ecomp.idns.com","v4groups":{"failover_groups":["/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_mg_fe","/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_bs_fe"],"failover_policy":["FAILALL"]},"no_ad_redirection":false,"intended_app_proto":"DNS","uri":"/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-FE.ecomp.idns.com"}'}
+
+applicationL1Cache:
+    datatypes:
+        enabled: true
+        firstRunDelay: 10
+        pollIntervalInSec: 60
+
+applicationL2Cache:
+    enabled: true
+    catalogL1Cache:
+        enabled: true
+        resourcesSizeInCache: 300
+        servicesSizeInCache: 200
+        productsSizeInCache: 100
+    queue:
+        syncIntervalInSecondes: 43200
+        waitOnShutDownInMinutes: 10
+        numberOfCacheWorkers: 4
+
+toscaValidators:
+    stringMaxLength: 2500
+
+disableAudit: false
+
+vfModuleProperties:
+    min_vf_module_instances:
+        forBaseModule: 1
+        forNonBaseModule: 0
+    max_vf_module_instances:
+        forBaseModule: 1
+        forNonBaseModule:
+    initial_count:
+        forBaseModule: 1
+        forNonBaseModule: 0
+    vf_module_type:
+        forBaseModule: Base
+        forNonBaseModule: Expansion
+
+genericAssetNodeTypes:
+  VFC: org.openecomp.resource.abstract.nodes.VFC
+  CVFC: org.openecomp.resource.abstract.nodes.VFC
+  VF : org.openecomp.resource.abstract.nodes.VF
+  PNF: org.openecomp.resource.abstract.nodes.PNF
+  Service: org.openecomp.resource.abstract.nodes.service
+
+workloadContext: Production
+environmentContext:
+    defaultValue: General_Revenue-Bearing
+    validValues:
+       - Critical_Revenue-Bearing
+       - Vital_Revenue-Bearing
+       - Essential_Revenue-Bearing
+       - Important_Revenue-Bearing
+       - Needed_Revenue-Bearing
+       - Useful_Revenue-Bearing
+       - General_Revenue-Bearing
+       - Critical_Non-Revenue
+       - Vital_Non-Revenue
+       - Essential_Non-Revenue
+       - Important_Non-Revenue
+       - Needed_Non-Revenue
+       - Useful_Non-Revenue
+       - General_Non-Revenue
+
+dmaapConsumerConfiguration:
+    hosts: olsd004.wnsnet.attws.com:3905
+    consumerGroup: asdc
+    consumerId: mama
+    timeoutMs: 15000
+    limit: 1
+    pollingInterval: 2
+    topic: com.att.sdc.23911-SDCforTestDev-v001
+    latitude: 32.109333
+    longitude: 34.855499
+    version: 1.0
+    serviceName: dmaap-v1.dev.dmaap.dt.saat.acsi.att.com/events
+    environment: TEST
+    partner: BOT_R
+    routeOffer: MR1
+    protocol: https
+    contenttype: application/json
+    dme2TraceOn: true
+    aftEnvironment: AFTUAT
+    aftDme2ConnectionTimeoutMs: 15000
+    aftDme2RoundtripTimeoutMs: 240000
+    aftDme2ReadTimeoutMs: 50000
+    dme2preferredRouterFilePath: DME2preferredRouter.txt 
+    timeLimitForNotificationHandleMs: 0
+    credential:
+        username: m09875@sdc.att.com
+        password: hmXYcznAljMSisdy8zgcag==
+        
+dmeConfiguration:
+    dme2Search: DME2SEARCH
+    dme2Resolve: DME2RESOLVE
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/distribution-engine-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/distribution-engine-configuration.yaml
new file mode 100644
index 0000000..00ae8f5
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/distribution-engine-configuration.yaml
@@ -0,0 +1,77 @@
+uebServers:
+   - uebsb91kcdc.it.att.com
+   - uebsb92kcdc.it.att.com
+#   - uebsb93kcdc.it.att.com
+
+uebPublicKey: 8F3MDAtMSBwwpSMy
+
+uebSecretKey: gzFmsTxSCtO5RQfAccM6PqqX
+
+distributionNotifTopicName: ASDC-DISTR-NOTIF-TOPIC
+distributionStatusTopicName: ASDC-DISTR-STATUS-TOPIC
+
+initRetryIntervalSec: 5
+initMaxIntervalSec: 60
+
+distribNotifServiceArtifactTypes:
+  info:
+      - MURANO-PKG
+
+distribNotifResourceArtifactTypes:
+  lifecycle:
+      - HEAT
+      - DG-XML
+
+environments:
+   - PROD
+
+distributionStatusTopic:
+   pollingIntervalSec: 60
+   fetchTimeSec: 15
+   consumerGroup: asdc
+   consumerId: asdc-id
+
+distributionNotificationTopic:
+   minThreadPoolSize: 0
+   maxThreadPoolSize: 10
+   maxWaitingAfterSendingSeconds: 5
+
+createTopic:
+   partitionCount: 1
+   replicationCount: 1
+
+startDistributionEngine: true
+
+
+aaiConfig:
+   serverRootUrl: https://127.0.0.1/aai/v1
+   resourceNamespaces:
+      operationalEnvironments: /aai/cloud-infrastructure/operational-environments
+
+   httpRequestConfig:
+      readTimeoutMs: 5000
+      connectTimeoutMs: 1000
+      maxReadConnectionRetry: 3
+      userName: abcd
+      password: hmXYcznAljMSisdy8zgcag==
+      clientSslAuthentication: false
+      keyStore: opt/app/catalog-be/cert/.keystore
+      keyStorePassword: hmXYcznAljMSisdy8zgcag==
+  
+   httpRequestHeaders:
+      XFromAppId: asdc
+  
+opEnvRecoveryIntervalSec: 180
+allowedTimeBeforeStaleSec: 300
+
+msoConfig:
+    serverRootUrl: https://127.0.0.1/onap/so/infra/modelDistributions/v1
+    resourceNamespaces:
+        distributions: /distributions
+
+    httpClientConfig:
+        readTimeout: 2000
+        connectTimeout: 500
+        numOfRetries: 3
+        userName: asdc
+        password: OTLEp5lfVhYdyw5EAtTUBQ==
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/ecomp-error-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/ecomp-error-configuration.yaml
new file mode 100644
index 0000000..9d7cd74
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/ecomp-error-configuration.yaml
@@ -0,0 +1,383 @@
+###########################################
+# Note the conventions of the field values:
+# type can be one of: CONFIG_ERROR, SYSTEM_ERROR, DATA_ERROR, CONNECTION_PROBLEM, AUTHENTICATION_PROBLEM
+# severity can be one of: WARN, ERROR, FATAL
+# alarmSeverity can be one of: CRITICAL,MAJOR,MINOR,INFORMATIONAL,NONE
+# code is a unique integer in range of 3003-9999 (3000-3002 are occupied for internal usage)
+# The above enumeration values are out-of-the-box and can be changed in code. 
+# In case of config and code mismatch, the appropriate error will be printed to log
+#
+## Range of BE codes - 3010-7999
+
+errors:
+
+    BeRestApiGeneralError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4000,
+        severity: ERROR,
+        description: "Unexpected error during BE REST API execution",
+        alarmSeverity: CRITICAL
+    }
+
+    BeHealthCheckError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3010,
+        severity: ERROR,
+        description: "Error during BE Health Check",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInitializationError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4019,
+        severity: ERROR,
+        description: "Catalog-BE was not initialized properly",
+        alarmSeverity: CRITICAL
+    }
+
+    BeResourceMissingError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3011,
+        severity: ERROR,
+        description: "Mandatory resource %s cannot be found in repository",
+        alarmSeverity: MAJOR
+    }
+    
+    BeServiceMissingError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3012,
+        severity: ERROR,
+        description: "Mandatory service %s cannot be found in repository",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedAddingResourceInstanceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3013,
+        severity: ERROR,
+        description: "Failed to add resource instance of resource %s to service %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeIncorrectServiceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3014,
+        severity: ERROR,
+        description: "Service %s is not valid",
+        alarmSeverity: MAJOR
+    }
+     
+    BeRepositoryDeleteError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3015,
+        severity: ERROR,
+        description: "Failed to delete object %s from repository",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeRepositoryQueryError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3016,
+        severity: ERROR,
+        description: "Failed to fetch from repository %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeInvalidConfigurationError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3017,
+        severity: FATAL,
+        description: "Configuration parameter %s is invalid. Value configured is %s",
+        alarmSeverity: MAJOR
+    }
+   
+    BeUebConnectionError: {
+        type: CONNECTION_PROBLEM,
+        code: ASDC_4001,
+        severity: ERROR,
+        description: "Connection problem towards U-EB server. Reason: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3019,
+        severity: ERROR,
+        description: "Error occured during access to U-EB Server. Operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebObjectNotFoundError: {
+        type: DATA_ERROR,
+        code: ASDC_4005,
+        severity: ERROR,
+        description: "Error occured during access to U-EB Server. Data not found: %s",
+        alarmSeverity: MAJOR
+    }
+
+    BeDistributionEngineSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3021,
+        severity: ERROR,
+        description: "Error occured in Distribution Engine. Failed operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebAuthenticationError: {
+        type: AUTHENTICATION_PROBLEM,
+        code: ASDC_4003,
+        severity: ERROR,
+        description: "Authentication problem towards U-EB server. Reason: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebUnkownHostError: {
+        type: CONNECTION_PROBLEM,
+        code: ASDC_4002,
+        severity: ERROR,
+        description: "Connection problem towards U-EB server. Cannot reach host %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDistributionEngineInvalidArtifactType: {
+        type: DATA_ERROR,
+        code: ASDC_4006,
+        severity: WARN,
+        description: "The artifact type %s does not appear in the list of valid artifacts %s",
+        alarmSeverity: MAJOR
+    }
+    BeInvalidTypeError: {
+        type: DATA_ERROR,
+        code: ASDC_4008,
+        severity: WARN,
+        description: "The type %s of %s is invalid",
+        alarmSeverity: MAJOR
+    }
+    BeInvalidValueError: {
+        type: DATA_ERROR,
+        code: ASDC_3028,
+        severity: WARN,
+        description: "The value %s of %s from type %s is invalid",
+        alarmSeverity: MAJOR
+    } 
+    
+    BeFailedDeletingResourceInstanceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3029,
+        severity: ERROR,
+        description: "Failed to delete resource instance %s from service %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeMissingConfigurationError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3030,
+        severity: FATAL,
+        description: "Configuration parameter %s is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeConfigurationInvalidListSizeError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3031,
+        severity: FATAL,
+        description: "Configuration parameter %s is invalid. At least %s values shall be configured",
+        alarmSeverity: MAJOR
+    }
+    
+    ErrorConfigFileFormat: {
+        type: CONFIG_ERROR,
+        code: ASDC_3032,
+        severity: ERROR,
+        description: "Error element not found in YAML name: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeMissingArtifactInformationError: {
+        type: DATA_ERROR,
+        code: ASDC_4010,
+        severity: ERROR,
+        description: "Artifact uploaded has missing information. Missing %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4011,
+        severity: ERROR,
+        description: "Artifact %s requested is not found",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactPayloadInvalid: {
+        type: DATA_ERROR,
+        code: ASDC_4012,
+        severity: ERROR,
+        description: "Payload of artifact uploaded is invalid (invalid MD5 or encryption)",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUserMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4009,
+        severity: ERROR,
+        description: "User %s requested is not found",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactInformationInvalidError: {
+        type: DATA_ERROR,
+        code: ASDC_4013,
+        severity: ERROR,
+        description: "Input for artifact metadata is invalid",
+        alarmSeverity: MAJOR
+    }
+    BeFailedAddingCapabilityTypeError: {
+        type: DATA_ERROR,
+        code: ASDC_4015,
+        severity: ERROR,
+        description: "Failed adding capability type",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeCapabilityTypeMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4016,
+        severity: ERROR,
+        description: "Capability Type %s not found",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInterfaceMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4020,
+        severity: ERROR,
+        description: "Interface %s required is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDaoSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4014,
+        severity: ERROR,
+        description: "Operation towards database failed",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4017,
+        severity: ERROR,
+        description: "Unexpected error during operation",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeFailedLockObjectError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4007,
+        severity: WARN,
+        description: "Failed to lock object for update",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInvalidJsonInput: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4018,
+        severity: ERROR,
+        description: "Failed to convert json input to object",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDistributionMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4021,
+        severity: ERROR,
+        description: "Distribution %s required is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeHealthCheckRecovery: {
+        type: RECOVERY,
+        code: ASDC_4022,
+        severity: INFO,
+        description: "BE Health Check Recovery",
+        alarmSeverity: INFORMATIONAL
+    }
+    BeFailedCreateNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6000,
+        severity: ERROR,
+        description: "Failed to create node %s on graph. status is %s",
+        alarmSeverity: MAJOR
+    }
+    BeFailedUpdateNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6001,
+        severity: ERROR,
+        description: "Failed to update node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedDeleteNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6002,
+        severity: ERROR,
+        description: "Failed to delete node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedRetrieveNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6003,
+        severity: ERROR,
+        description: "Failed to retrieve node %s from graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeExecuteRollbackError: {
+        type: DATA_ERROR,
+        code: ASDC_6004,
+        severity: ERROR,
+        description: "Going to execute rollback on graph.",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindParentError: {
+        type: DATA_ERROR,
+        code: ASDC_6005,
+        severity: ERROR,
+        description: "Failed to find parent node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAllNodesError: {
+        type: DATA_ERROR,
+        code: ASDC_6006,
+        severity: ERROR,
+        description: "Failed to fetch all nodes with type %s of parent node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAssociationError: {
+        type: DATA_ERROR,
+        code: ASDC_6007,
+        severity: ERROR,
+        description: "Cannot find node with type %s associated with node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAssociationError: {
+        type: DATA_ERROR,
+        code: ASDC_6008,
+        severity: ERROR,
+        description: "Cannot find node with type %s associated with node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    BeComponentCleanerSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_6009,
+        severity: ERROR,
+        description: "Error occured in Component Cleaner Task. Failed operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/error-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/error-configuration.yaml
new file mode 100644
index 0000000..5494c2f
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/error-configuration.yaml
@@ -0,0 +1,1883 @@
+# Errors
+errors:
+    OK: {
+        code: 200,
+        message: "OK"
+    }
+    CREATED: {
+        code: 201,
+        message: "OK"
+    }
+    ACCEPTED: {
+        code: 202,
+        message: "Accepted"
+    }
+    NO_CONTENT: {
+        code: 204,
+        message: "No Content"
+    }
+#--------POL4050-----------------------------
+    NOT_ALLOWED: {
+        code: 405,
+        message: "Error: Method not allowed.",
+        messageId: "POL4050"
+    }
+#--------POL5000-----------------------------
+    GENERAL_ERROR: {
+        code: 500,
+        message: "Error: Internal Server Error. Please try again later.",
+        messageId: "POL5000"
+    }
+#---------POL5001------------------------------
+    MISSING_X_ECOMP_INSTANCE_ID: {
+        code: 400  ,
+        message: "Error: Missing 'X-ECOMP-InstanceID' HTTP header.",
+        messageId: "POL5001"
+    }
+#---------POL5002------------------------------
+    AUTH_REQUIRED: {
+        code: 401  ,
+        message: "Error: Authentication is required to use the API.",
+        messageId: "POL5002"
+    }
+#---------POL5003------------------------------
+    AUTH_FAILED: {
+        code: 403  ,
+        message: "Error: Not authorized to use the API.",
+        messageId: "POL5003"
+    }
+#---------POL5004------------------------------
+    MISSING_USER_ID: {
+        code: 400  ,
+        message: "Error: Missing 'USER_ID' HTTP header.",
+        messageId: "POL5004"
+    }
+#---------SVC4000-----------------------------
+    INVALID_CONTENT: {
+        code: 400,
+        message: "Error: Invalid content.",
+        messageId: "SVC4000"
+    }
+#---------SVC4002-----------------------------
+    MISSING_INFORMATION: {
+        code: 403,
+        message: "Error: Missing information.",
+        messageId: "SVC4002"
+    }
+#---------SVC4003------------------------------
+# %1 - Users's ID
+    USER_NOT_FOUND: {
+        code: 404,
+        message: "Error: User '%1' was not found.",
+        messageId: "SVC4003"
+    }
+#---------SVC4004-----------------------------
+# %1 - Users's email address
+    INVALID_EMAIL_ADDRESS: {
+        code: 400,
+        message: "Error: Invalid email address '%1'.",
+        messageId: "SVC4004"
+    }
+#---------SVC4005------------------------------
+# %1 - role
+    INVALID_ROLE: {
+        code: 400,
+        message: "Error: Invalid role '%1'.",
+        messageId: "SVC4005"
+    }
+#---------SVC4006------------------------------
+# %1 - Users's USER_ID
+    USER_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: User with '%1' ID already exists.",
+        messageId: "SVC4006"
+    }
+#---------SVC4007------------------------------
+    DELETE_USER_ADMIN_CONFLICT: {
+        code: 409,
+        message: "Error: An administrator can only be deleted by another administrator.",
+        messageId: "SVC4007"
+    }
+#---------SVC4008-----------------------------
+# %1 - Users's userId
+    INVALID_USER_ID: {
+        code: 400,
+        message: "Error: Invalid userId '%1'.",
+        messageId: "SVC4008"
+    }
+
+#---------SVC4049------------------------------
+# %1 - service/resource
+    COMPONENT_MISSING_CONTACT: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 contact.",
+        messageId: "SVC4051"
+    }
+#---------SVC4050-----------------------------
+# %1 - Service/Resource/Additional parameter
+# %2 - service/resource/label name
+    COMPONENT_NAME_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: %1 with name '%2' already exists.",
+        messageId: "SVC4050"
+    }
+#---------SVC4051------------------------------
+# %1 - resource/service
+    COMPONENT_MISSING_CATEGORY: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 category.",
+        messageId: "SVC4051"
+    }
+
+#---------SVC4052------------------------------
+    COMPONENT_MISSING_TAGS: {
+        code: 400,
+        message: "Error: Invalid Content. At least one tag has to be specified.",
+        messageId: "SVC4052"
+    }
+
+#---------SVC4053------------------------------
+# %1 - service/resource
+    COMPONENT_MISSING_DESCRIPTION: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 description.",
+        messageId: "SVC4053"
+    }
+#---------SVC4054------------------------------
+# %1 - resource/service
+    COMPONENT_INVALID_CATEGORY: {
+        code: 400,
+        message: "Error: Invalid Content. Invalid %1 category.",
+        messageId: "SVC4054"
+    }
+#---------SVC4055------------------------------
+    MISSING_VENDOR_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. Missing vendor name.",
+        messageId: "SVC4055"
+    }
+#---------SVC4056------------------------------
+    MISSING_VENDOR_RELEASE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing vendor release.",
+        messageId: "SVC4056"
+    }
+
+#---------SVC4057------------------------------
+    MISSING_DERIVED_FROM_TEMPLATE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing derived from template specification.",
+        messageId: "SVC4057"
+    }
+
+#---------SVC4058------------------------------
+# %1 - service/resource
+    COMPONENT_MISSING_ICON: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 icon.",
+        messageId: "SVC4058"
+    }
+#---------SVC4059------------------------------
+# %1 - service/resource
+    COMPONENT_INVALID_ICON: {
+        code: 400,
+        message: "Error: Invalid Content. Invalid %1 icon.",
+        messageId: "SVC4059"
+    }
+#---------SVC4060------------------------------
+    PARENT_RESOURCE_NOT_FOUND: {
+        code: 400,
+        message: "Error: Invalid Content. Derived from resource template was not found.",
+        messageId: "SVC4060"
+    }
+#---------SVC4061------------------------------
+    MULTIPLE_PARENT_RESOURCE_FOUND: {
+        code: 400,
+        message: "Error: Invalid Content. Multiple derived from resource template is not allowed.",
+        messageId: "SVC4061"
+    }
+
+#---------SVC4062------------------------------
+# %1 - service/resource
+    MISSING_COMPONENT_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 name.",
+        messageId: "SVC4062"
+    }
+#---------SVC4063------------------------------
+    #%1  -  resource/service name
+    RESOURCE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' resource was not found.",
+        messageId: "SVC4063"
+    }
+
+#---------SVC4064------------------------------
+# %1 - Service/Resource/Property
+    COMPONENT_INVALID_DESCRIPTION: {
+        code: 400,
+        message: "Error: Invalid Content. %1 description contains non-english characters.",
+        messageId: "SVC4064"
+    }
+#---------SVC4065------------------------------
+# %1 - Service/Resource/Property
+# %2 - max resource/service name length
+    COMPONENT_DESCRIPTION_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 description exceeds limit of %2 characters.",
+        messageId: "SVC4065"
+    }
+#---------SVC4066------------------------------
+# %1 - max length
+    COMPONENT_TAGS_EXCEED_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Tags overall length exceeds limit of %1 characters.",
+        messageId: "SVC4066"
+    }
+#---------SVC4067------------------------------
+# %1 - max length
+    VENDOR_NAME_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Vendor name exceeds limit of %1 characters.",
+        messageId: "SVC4067"
+    }
+#---------SVC4068------------------------------
+# %1 - max length
+    VENDOR_RELEASE_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Vendor release exceeds limit of %1 characters.",
+        messageId: "SVC4068"
+    }
+
+#---------SVC4069------------------------------
+# %1 - Service/Resource/Product
+    COMPONENT_INVALID_CONTACT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 Contact Id should be in format 'mnnnnnn' or 'aannna' or 'aannnn', where m=m ,a=a-zA-Z and n=0-9",
+        messageId: "SVC4069"
+    }
+#---------SVC4070------------------------------
+# %1 - Service/Resource
+    INVALID_COMPONENT_NAME: {
+        code: 400,
+        message: 'Error: Invalid Content. %1 name is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4070"
+    }
+
+#---------SVC4071------------------------------
+    INVALID_VENDOR_NAME: {
+        code: 400,
+        message: 'Error: Invalid Content. Vendor name is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4071"
+    }
+#---------SVC4072------------------------------
+    INVALID_VENDOR_RELEASE: {
+        code: 400,
+        message: 'Error: Invalid Content. Vendor release is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4072"
+    }
+#---------SVC4073------------------------------
+# %1 - Service/Resource
+# %2 - max  resource/service name
+    COMPONENT_NAME_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 name exceeds limit of %2 characters.",
+        messageId: "SVC4073"
+    }
+#---------SVC4080------------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_IN_CHECKOUT_STATE: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is locked for modification by %3 %4(%5).",
+        messageId: "SVC4080"
+    }
+#---------SVC4081-----------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_IN_CERT_IN_PROGRESS_STATE: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is locked for certification by %3 %4(%5).",
+        messageId: "SVC4081"
+    }
+
+#-----------SVC4082---------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_SENT_FOR_CERTIFICATION: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is sent for certification by %3 %4(%5).",
+        messageId: "SVC4082"
+    }
+#-----------SVC4083---------------------------
+    COMPONENT_VERSION_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Version of this %1 was already promoted.",
+        messageId: "SVC4083"
+    }
+#-----------SVC4084---------------------------
+# %1 - resource/service/product name
+# %2 - resource/service/product
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_ALREADY_CHECKED_IN: {
+        code: 409,
+        message: "Error: The current version of '%1' %2 was already checked-in by %3 %4(%5).",
+        messageId: "SVC4084"
+    }
+#-----------SVC4085---------------------------
+# %1 - resource/service/product name
+# %2 - resource/service/product
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_CHECKOUT_BY_ANOTHER_USER: {
+        code: 403,
+        message: "Error: %1 %2 has already been checked out by %3 %4(%5).",
+        messageId: "SVC4085"
+    }
+#-----------SVC4086---------------------------
+# %1  - resource/service name
+# %2  - resource/service
+    COMPONENT_IN_USE: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is in use by another user.",
+        messageId: "SVC4086"
+    }
+#-----------SVC4087---------------------------
+# %1 - component name
+# %2 - resource/service/product
+    COMPONENT_HAS_NEWER_VERSION: {
+        code: 409,
+        message: "Error: Checking out of the requested version of the '%1' %2 is not allowed as a newer version exists.",
+        messageId: "SVC4087"
+    }
+#-----------SVC4088---------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_ALREADY_CERTIFIED: {
+        code: 403,
+        message: "Error: Requested %1 %2 has already been certified by %3 %4(%5).",
+        messageId: "SVC4088"
+    }
+#-----------SVC4089---------------------------
+# %1 - resource/service name
+# %2 - resource/service
+    COMPONENT_NOT_READY_FOR_CERTIFICATION: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is not ready for certification.",
+        messageId: "SVC4089"
+    }
+#-----------SVC4100---------------------------
+#%1 - property name
+    PROPERTY_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' property was not found.",
+        messageId: "SVC4100"
+    }
+#-----------SVC4101---------------------------
+#%1 - property name
+    PROPERTY_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Property with '%1' name already exists.",
+        messageId: "SVC4101"
+    }
+
+#-----------SVC4102---------------------------
+# %1 - capability type name
+    CAPABILITY_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Capability Type with name '%1' already exists.",
+        messageId: "SVC4102"
+    }
+#-----------SVC4114---------------------------
+    AUTH_FAILED_INVALIDE_HEADER: {
+        code: 400,
+        message: "Error: Invalid Authorization header.",
+        messageId: "SVC4114"
+    }
+#-----------SVC4115---------------------------
+# %1 - capability type name
+    MISSING_CAPABILITY_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing Capability Type '%1'.",
+        messageId: "SVC4115"
+    }
+    RESOURCE_INSTANCE_BAD_REQUEST: {
+        code: 400,
+        message: "Error: Invalid Content.",
+        messageId: "SVC4116"
+    }
+#-----------SVC4117---------------------------
+# %1 - resource instance name
+# %2 - resource instance name
+# %3 - requirement name
+    RESOURCE_INSTANCE_MATCH_NOT_FOUND: {
+        code: 404,
+        message: "Error: Match not found between resource instance '%1' and resource instance '%2' for requirement '%3'.",
+        messageId: "SVC4117"
+    }
+#-----------SVC4118---------------------------
+# %1 - resource instance name
+# %2 - resource instance name
+# %3 - requirement name
+    RESOURCE_INSTANCE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Resource instances '%1' and '%2' are already associated with requirement '%3'.",
+        messageId: "SVC4118"
+    }
+#-----------SVC4119---------------------------
+# %1 - resource instance name
+# %2 - resource instance name
+# %3 - requirement name
+    RESOURCE_INSTANCE_RELATION_NOT_FOUND: {
+        code: 404,
+        message: "Error: No relation found between resource instances '%1' and '%2' for requirement '%3'.",
+        messageId: "SVC4119"
+    }
+#-----------SVC4120---------------------------
+# %1 - User's USER_ID
+    USER_INACTIVE: {
+        code: 404,
+        message: "Error: User %1 was not found.",
+        messageId: "SVC4120"
+    }
+#-----------SVC4121---------------------------
+# %1 - User's USER_ID
+    USER_HAS_ACTIVE_ELEMENTS: {
+        code: 403,
+        message: "Error: User with %1 ID can not be deleted since it has active elements(resources/services/artifacts).",
+        messageId: "SVC4121"
+    }
+#-----------SVC4122---------------------------
+# %1 - artifact type
+    ARTIFACT_TYPE_NOT_SUPPORTED: {
+        code: 400,
+        message: "Error: Invalid artifact type '%1'.",
+        messageId: "SVC4122"
+    }
+#-----------SVC4123---------------------------
+    ARTIFACT_LOGICAL_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Artifact logical name cannot be changed.",
+        messageId: "SVC4123"
+    }
+#-----------SVC4124---------------------------
+    MISSING_ARTIFACT_TYPE: {
+        code: 400,
+        message: "Error: Missing artifact type.",
+        messageId: "SVC4124"
+    }
+#-----------SVC4125---------------------------
+# %1-artifact name
+    ARTIFACT_EXIST: {
+        code: 400,
+        message: "Error: Artifact '%1' already exists.",
+        messageId: "SVC4125"
+    }
+#---------SVC4126------------------------------
+# %1 - resource/service/product/...
+# %2 - field (tag, vendor name...)
+    INVALID_FIELD_FORMAT: {
+        code: 400,
+        message: "Error:  Invalid %1 %2 format.",
+        messageId: "SVC4126"
+    }
+#-----------SVC4127---------------------------
+    ARTIFACT_INVALID_MD5: {
+        code: 400,
+        message: "Error: Invalid artifact checksum.",
+        messageId: "SVC4127"
+    }
+#-----------SVC4128---------------------------
+    MISSING_ARTIFACT_NAME: {
+        code: 400,
+        message: "Error: Invalid content. Missing artifact name.",
+        messageId: "SVC4128"
+    }
+#-----------SVC4129---------------------------
+    MISSING_PROJECT_CODE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing PROJECT_CODE number.",
+        messageId: "SVC4129"
+    }
+#-----------SVC4130---------------------------
+    INVALID_PROJECT_CODE: {
+        code: 400,
+        message: "Error: Invalid Content. PROJECT_CODE must be from 3 up to 50 characters.",
+        messageId: "SVC4130"
+    }
+#-----------SVC4131---------------------------
+# %1-resource/service
+# %2-srtifact/artifacts
+# %3-semicolomn separated list of artifact
+    COMPONENT_MISSING_MANDATORY_ARTIFACTS: {
+        code: 403,
+        message: "Error: Missing mandatory informational %1 %2: [%3].",
+        messageId: "SVC4131"
+    }
+#-----------SVC4132---------------------------
+# %1 - lifecycle  type name
+    LIFECYCLE_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Lifecycle Type with name '%1' already exists.",
+        messageId: "SVC4132"
+    }
+#-----------SVC4133---------------------------
+# %1 - service version
+# %2 - service name
+    SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION: {
+        code: 403,
+        message: "Error: Version %1 of '%2' service is not available for distribution.",
+        messageId: "SVC4133"
+    }
+#-----------SVC4134---------------------------
+    MISSING_LIFECYCLE_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing interface life-cycle type.",
+        messageId: "SVC4134"
+    }
+#---------SVC4135------------------------------
+    SERVICE_CATEGORY_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Service category cannot be changed once the service is certified.",
+        messageId: "SVC4135"
+    }
+#---------SVC4136------------------------------
+# %1 - distribution environment name
+    DISTRIBUTION_ENVIRONMENT_NOT_AVAILABLE: {
+        code: 500,
+        message: "Error: Requested distribution environment '%1' is not available.",
+        messageId: "SVC4136"
+    }
+#---------SVC4137------------------------------
+# %1 - distribution environment name
+    DISTRIBUTION_ENVIRONMENT_NOT_FOUND: {
+        code: 400,
+        message: "Error: Requested distribution environment '%1' was not found.",
+        messageId: "SVC4137"
+    }
+#---------SVC4138------------------------------
+    DISTRIBUTION_ENVIRONMENT_INVALID: {
+        code: 400,
+        message: "Error: Invalid distribution environment.",
+        messageId: "SVC4138"
+    }
+#---------SVC4139------------------------------
+# %1 - service name
+    DISTRIBUTION_ARTIFACT_NOT_FOUND: {
+        code: 409,
+        message: "Error: Service '%1' cannot be distributed due to missing deployment artifacts.",
+        messageId: "SVC4139"
+    }
+#---------SVC4200------------------------------
+# %1 - Service/Resource
+# %2 - max icon name length
+    COMPONENT_ICON_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 icon name exceeds limit of %2 characters.",
+        messageId: "SVC4200"
+    }
+#---------SVC4300------------------------------
+    RESTRICTED_ACCESS: {
+        code: 403,
+        message: "Error: Restricted access.",
+        messageId: "SVC4300"
+    }
+#---------SVC4301------------------------------
+    RESTRICTED_OPERATION: {
+        code: 409,
+        message: "Error: Restricted operation.",
+        messageId: "SVC4301"
+    }
+#---------SVC4500------------------------------
+    MISSING_BODY: {
+        code: 400  ,
+        message: "Error: Missing request body.",
+        messageId: "SVC4500"
+    }
+#---------SVC4501------------------------------
+    MISSING_PUBLIC_KEY: {
+        code: 400  ,
+        message: "Error: Invalid Content. Missing mandatory parameter 'apiPublicKey'." ,
+        messageId: "SVC4501"
+    }
+#---------SVC4502------------------------------
+    DISTRIBUTION_ENV_DOES_NOT_EXIST: {
+        code: 400  ,
+        message: "Error: Invalid  Body  : Missing mandatory parameter 'distrEnvName'." ,
+        messageId: "SVC4502"
+    }
+#-----------SVC4503---------------------------
+# %1 - service name
+    SERVICE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' service was not found.",
+        messageId: "SVC4503"
+    }
+
+#---------SVC4504------------------------------
+# %1 - Service/Resource
+# %2 - service/resource version
+    COMPONENT_VERSION_NOT_FOUND: {
+        code: 404,
+        message: "Error: %1 version %2 was not found.",
+        messageId: "SVC4504"
+    }
+#-----------SVC4505---------------------------
+    #%1-artifact name
+
+    ARTIFACT_NOT_FOUND: {
+        code: 404,
+        message: "Error: Artifact '%1' was not found.",
+        messageId: "SVC4505"
+    }
+#---------SVC4506------------------------------
+    MISSING_ENV_NAME: {
+        code: 400  ,
+        message: "Error: Invalid Content. Missing mandatory parameter 'distrEnvName'.",
+        messageId: "SVC4506"
+    }
+#---------SVC4507------------------------------
+    COMPONENT_INVALID_TAGS_NO_COMP_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. One of the tags should be the component name.",
+        messageId: "SVC4507"
+    }
+
+#---------SVC4508------------------------------
+    SERVICE_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Service name cannot be changed once the service is certified.",
+        messageId: "SVC4508"
+    }
+
+#---------SVC4509------------------------------
+    SERVICE_ICON_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Icon cannot be changed once the service is certified.",
+        messageId: "SVC4509"
+    }
+#---------SVC4510------------------------------
+# %1 - icon name max length
+    SERVICE_ICON_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Icon name exceeds limit of %1 characters.",
+        messageId: "SVC4510"
+    }
+#---------SVC4511------------------------------
+    DISTRIBUTION_REQUESTED_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested distribution was not found.",
+        messageId: "SVC4511"
+    }
+#---------SVC4512------------------------------
+# %1 - Distribution ID
+    DISTRIBUTION_REQUESTED_FAILED: {
+        code: 403,
+        message: "Error: Requested distribution '%1' failed.",
+        messageId: "SVC4512"
+    }
+#---------SVC4513------------------------------
+    RESOURCE_CATEGORY_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Resource category cannot be changed once the resource is certified.",
+        messageId: "SVC4513"
+    }
+#---------SVC4514------------------------------
+    RESOURCE_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Resource name cannot be changed once the resource is certified.",
+        messageId: "SVC4514"
+    }
+#---------SVC4515------------------------------
+    RESOURCE_ICON_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Icon cannot be changed once the resource is certified.",
+        messageId: "SVC4515"
+    }
+#---------SVC4516------------------------------
+    RESOURCE_VENDOR_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Vendor name cannot be changed once the resource is certified.",
+        messageId: "SVC4516"
+    }
+#---------SVC4517------------------------------
+    RESOURCE_DERIVED_FROM_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Derived from resource template cannot be changed once the resource is certified.",
+        messageId: "SVC4517"
+    }
+#---------SVC4518------------------------------
+# %1 - max length
+    COMPONENT_SINGLE_TAG_EXCEED_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Single tag exceeds limit of %1 characters.",
+        messageId: "SVC4518"
+    }
+#---------SVC4519------------------------------
+    INVALID_DEFAULT_VALUE: {
+        code: 400,
+        message: "Error: mismatch in data-type occurred for property %1. data type is %2 and default value found is %3.",
+        messageId: "SVC4519"
+    }
+#---------SVC4520------------------------------
+# %1 - service or resource
+    ADDITIONAL_INFORMATION_MAX_NUMBER_REACHED: {
+        code: 409,
+        message: "Error: Maximal number of additional %1 parameters was reached.",
+        messageId: "SVC4520"
+    }
+#---------SVC4521------------------------------
+    ADDITIONAL_INFORMATION_EMPTY_STRING_NOT_ALLOWED: {
+        code: 400,
+        message: "Error: Invalid Content. The Additional information label and value cannot be empty.",
+        messageId: "SVC4521"
+    }
+#---------SVC4522------------------------------
+# %1 - label/value
+# %2 - Maximal length of %1
+    ADDITIONAL_INFORMATION_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Additional information %1 exceeds limit of %2 characters.",
+        messageId: "SVC4522"
+    }
+#---------SVC4523------------------------------
+    ADDITIONAL_INFORMATION_KEY_NOT_ALLOWED_CHARACTERS: {
+        code: 400,
+        message: 'Error: Invalid Content. Additional information label is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4523"
+    }
+#---------SVC4524------------------------------
+    ADDITIONAL_INFORMATION_NOT_FOUND: {
+        code: 409,
+        message: "Error: Requested additional information was not found.",
+        messageId: "SVC4524"
+    }
+#---------SVC4525------------------------------
+    ADDITIONAL_INFORMATION_VALUE_NOT_ALLOWED_CHARACTERS: {
+        code: 400,
+        message: 'Error: Invalid Content. Additional information contains non-english characters.',
+        messageId: "SVC4525"
+    }
+#---------SVC4526------------------------------
+    RESOURCE_INSTANCE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' resource instance was not found.",
+        messageId: "SVC4526"
+    }
+#---------SVC4527------------------------------
+    ASDC_VERSION_NOT_FOUND: {
+        code: 500,
+        message: 'Error: ASDC version cannot be displayed.',
+        messageId: "SVC4527"
+    }
+#---------SVC4528------------------------------
+# %1-artifact url/artifact label/artifact description/VNF Service Indicator
+    MISSING_DATA: {
+        code: 400,
+        message: "Error: Invalid content. Missing %1.",
+        messageId: "SVC4528"
+    }
+#---------SVC4529------------------------------
+# %1-artifact url/artifact label/artifact description/artifact name
+# %2 - Maximal length of %1
+    EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 exceeds limit of %2 characters.",
+        messageId: "SVC4529"
+    }
+#---------SVC4530------------------------------
+    ARTIFACT_INVALID_TIMEOUT: {
+        code: 400,
+        message: "Error: Invalid Content. Artifact Timeout should be set to valid positive non-zero number of minutes.",
+        messageId: "SVC4530"
+    }
+#---------SVC4531------------------------------
+    SERVICE_IS_VNF_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: VNF Indicator cannot be updated for certified service.",
+        messageId: "SVC4531"
+    }
+ #---------SVC4532------------------------------
+    RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE: {
+        code: 404,
+        message: "Error: Requested '%1' resource instance was not found on the service '%2.",
+        messageId: "SVC4532"
+    }
+ #---------SVC4533------------------------------
+ # %1 -  "HEAT"/"HEAT_ENV"/"MURANO_PKG"/"YANG_XML"
+    WRONG_ARTIFACT_FILE_EXTENSION: {
+        code: 400,
+        message: "Error: Invalid file extension for %1 artifact type.",
+        messageId: "SVC4533"
+    }
+
+#---------SVC4534------------------------------
+# %1 -  "HEAT"/"HEAT_ENV"
+    INVALID_YAML: {
+        code: 400,
+        message: "Error: Uploaded YAML file for %1 artifact is invalid.",
+        messageId: "SVC4534"
+    }
+
+#---------SVC4535------------------------------
+# %1 -  "HEAT"
+    INVALID_DEPLOYMENT_ARTIFACT_HEAT: {
+        code: 400,
+        message: "Error: Invalid %1 artifact.",
+        messageId: "SVC4535"
+    }
+#---------SVC4536------------------------------
+# %1 - "Resource"/"Service"
+# %2 -  resource/service name
+# %3 -  "HEAT"/"HEAT_ENV"/"MURANO_PKG"
+# %4 -  "HEAT"/"HEAT_ENV"/"MURANO_PKG
+    DEPLOYMENT_ARTIFACT_OF_TYPE_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: %1 '%2' already has a deployment artifact of %3 type .Please delete or update an existing %4 artifact.",
+        messageId: "SVC4536"
+    }
+
+#---------SVC4537------------------------------
+    MISSING_HEAT: {
+        code: 400,
+        message: "Error: Missing HEAT artifact. HEAT_ENV artifact cannot be uploaded without corresponding HEAT template.",
+        messageId: "SVC4537"
+    }
+#---------SVC4538------------------------------
+    MISMATCH_HEAT_VS_HEAT_ENV: {
+        code: 400,
+        message: "Error: Invalid artifact content. Parameter's set in HEAT_ENV '%1' artifact doesn't match the parameters in HEAT '%2' artifact.",
+        messageId: "SVC4538"
+    }
+#---------SVC4539------------------------------
+    INVALID_RESOURCE_PAYLOAD: {
+        code: 400,
+        message: "Error: Invalid resource payload.",
+        messageId: "SVC4539"
+    }
+#---------SVC4540------------------------------
+    INVALID_TOSCA_FILE_EXTENSION: {
+        code: 400,
+        message: "Error: Invalid file extension for TOSCA template.",
+        messageId: "SVC4540"
+    }
+#---------SVC4541------------------------------
+    INVALID_YAML_FILE: {
+        code: 400,
+        message: "Error: Invalid YAML file.",
+        messageId: "SVC4541"
+    }
+#---------SVC4542------------------------------
+    INVALID_TOSCA_TEMPLATE: {
+        code: 400,
+        message: "Error: Invalid TOSCA template.",
+        messageId: "SVC4542"
+    }
+#---------SVC4543------------------------------
+    NOT_RESOURCE_TOSCA_TEMPLATE: {
+        code: 400,
+        message: "Error: Imported Service TOSCA template.",
+        messageId: "SVC4543"
+    }
+#---------SVC4544------------------------------
+    NOT_SINGLE_RESOURCE: {
+        code: 400,
+        message: "Error: Imported TOSCA template should contain one resource definition.",
+        messageId: "SVC4544"
+    }
+#---------SVC4545------------------------------
+    INVALID_RESOURCE_NAMESPACE: {
+        code: 400,
+        message: "Error: Invalid resource namespace.",
+        messageId: "SVC4545"
+    }
+#---------SVC4546------------------------------
+    RESOURCE_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: Imported resource already exists in ASDC Catalog.",
+        messageId: "SVC4546"
+    }
+#---------SVC4549------------------------------
+    INVALID_RESOURCE_CHECKSUM: {
+        code: 400,
+        message: "Error: Invalid resource checksum.",
+        messageId: "SVC4549"
+    }
+#---------SVC4550------------------------------
+    #%1  -  Consumer salt
+    INVALID_LENGTH: {
+        code: 400,
+        message: "Error: Invalid %1 length.",
+        messageId: "SVC4550"
+    }
+    #---------SVC4551------------------------------
+    #%1  -  ECOMP User name
+    ECOMP_USER_NOT_FOUND: {
+        code: 404,
+        message: "Error: ECOMP User '%1' was not found.",
+        messageId: "SVC4551"
+    }
+#---------SVC4552------------------------------
+    CONSUMER_ALREADY_EXISTS: {
+        code: 409,
+        message: "Error: ECOMP User already exists.",
+        messageId: "SVC4552"
+    }
+#---------SVC4553-----------------------------
+    #%1  -  Consumer name / Consumer password/ Consumer salt
+    INVALID_CONTENT_PARAM: {
+        code: 400,
+        message: "Error: %1 is invalid.",
+        messageId: "SVC4553"
+    }
+    #---------SVC4554------------------------------
+# %1 - "Resource"/"Service"
+    COMPONENT_ARTIFACT_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested artifact doesn't belong to specified %1.",
+        messageId: "SVC4554"
+    }
+#---------SVC4554------------------------------
+# %1 - "Service name"
+    SERVICE_DEPLOYMENT_ARTIFACT_NOT_FOUND: {
+        code: 403,
+        message: "Error: Requested '%1' service is not ready for certification. Service has to have at least one deployment artifact.",
+        messageId: "SVC4554"
+    }
+#---------SVC4555------------------------------
+#%1 - "Resource"/"Service"/"Product"
+#%2 - "category"
+    COMPONENT_ELEMENT_INVALID_NAME_LENGTH: {
+        code: 400,
+        message: "Error: Invalid %1 %2 name length.",
+        messageId: "SVC4555"
+    }
+#---------SVC4556------------------------------
+#%1 - "Resource"/"Service"/"Product"
+#%2 - "category"
+    COMPONENT_ELEMENT_INVALID_NAME_FORMAT: {
+        code: 400,
+        message: "Error: Invalid %1 %2 name format.",
+        messageId: "SVC4556"
+    }
+#---------SVC4557------------------------------
+#%1 - "Resource"/"Service"/"Product"
+#%2 - "category name"
+    COMPONENT_CATEGORY_ALREADY_EXISTS: {
+        code: 409,
+        message: "Error: %1 category name '%2' already exists.",
+        messageId: "SVC4557"
+    }
+#---------SVC4558------------------------------
+# %1 - "service"/"VF"
+# %2 - "Resource name"
+    VALIDATED_RESOURCE_NOT_FOUND: {
+        code: 403,
+        message: "Error: Submit for Testing is not permitted as your '%1' includes non-validated '%2' resource.",
+        messageId: "SVC4558"
+    }
+#---------SVC4559------------------------------
+# %1 - "service"/"VF"
+# %2 - "Resource name"
+    FOUND_ALREADY_VALIDATED_RESOURCE: {
+        code: 403,
+        message: "Error: Submit for Testing is not permitted as your '%1' includes non-validated '%2' resource. Please use already available validated resource version.",
+        messageId: "SVC4559"
+    }
+#---------SVC4560------------------------------
+# %1 - "service"/"VF"
+# %2 - "Resource name"
+    FOUND_LIST_VALIDATED_RESOURCES: {
+        code: 403,
+        message: "Error: Submit for Testing is not permitted as your '%1' includes non-validated '%2' resource. Please use one of available validated resource versions.",
+        messageId: "SVC4560"
+    }
+#---------SVC4561------------------------------
+# %1 - "resource"/"product"
+# %2 - "category"
+# %3 - "category name"
+    COMPONENT_CATEGORY_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested %1 %2 '%3' was not found.",
+        messageId: "SVC4561"
+    }
+#---------SVC4562------------------------------
+# %1 - "Resource"/"Product"
+# %2 - "sub-category name"
+# %3 - "category name"
+    COMPONENT_SUB_CATEGORY_EXISTS_FOR_CATEGORY: {
+        code: 409,
+        message: "Error: %1 sub-category '%2' already exists under '%3' category.",
+        messageId: "SVC4562"
+    }
+#---------SVC4563------------------------------
+# %1 - "Product"
+# %2 - "grouping name"
+# %3 - "sub-category name"
+    COMPONENT_GROUPING_EXISTS_FOR_SUB_CATEGORY: {
+        code: 409,
+        message: "Error: %1 grouping '%2' already exists under '%3' sub-category.",
+        messageId: "SVC4563"
+    }
+#---------SVC4564------------------------------
+# %1 - product name
+    PRODUCT_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' product was not found.",
+        messageId: "SVC4564"
+    }
+#---------SVC4565------------------------------
+# %1 - "HEAT"
+# %2  - parameter type ("string" , "boolean" , "number")
+# %3 -  parameter name
+    INVALID_HEAT_PARAMETER_VALUE: {
+        code: 400,
+        message: "Error: Invalid %1 artifact. Invalid %2 value set for '%3' parameter.",
+        messageId: "SVC4565"
+    }
+#---------SVC4566------------------------------
+# %1 - "HEAT"
+# %2  - parameter type ("string" , "boolean" , "number")
+    INVALID_HEAT_PARAMETER_TYPE: {
+        code: 400,
+        message: "Error: Invalid %1 artifact. Unsupported '%2' parameter type.",
+        messageId: "SVC4566"
+    }
+#---------SVC4567------------------------------
+# %1 -  "YANG_XML"
+    INVALID_XML: {
+        code: 400,
+        message: "Error: Uploaded XML file for %1 artifact is invalid.",
+        messageId: "SVC4567"
+    }
+#---------SVC4567------------------------------
+# %1 - "User Name and UserId"
+# %2  -"checked-out"/"in-certification"
+    CANNOT_DELETE_USER_WITH_ACTIVE_ELEMENTS: {
+        code: 409,
+        message: "Error: User cannot be deleted. User '%1' has %2 projects.",
+        messageId: "SVC4567"
+    }
+#---------SVC4568------------------------------
+# %1 - "User Name and UserId"
+# %2  -"checked-out"/"in-certification"
+    CANNOT_UPDATE_USER_WITH_ACTIVE_ELEMENTS: {
+        code: 409,
+        message: "Error: Role cannot be changed. User '%1' has %2 projects.",
+        messageId: "SVC4568"
+    }
+#---------SVC4570------------------------------
+    UPDATE_USER_ADMIN_CONFLICT: {
+        code: 409,
+        message: "Error: An administrator is not allowed to change his/her role.",
+        messageId: "SVC4570"
+    }
+#---------SVC4571------------------------------
+    SERVICE_CANNOT_CONTAIN_SUBCATEGORY: {
+        code: 400,
+        message: "Error: Sub category cannot be defined for service",
+        messageId: "SVC4571"
+    }
+#---------SVC4572------------------------------
+# %1 - "Resource"/"Service"
+    COMPONENT_TOO_MUCH_CATEGORIES: {
+        code: 400,
+        message: "Error: %1 must have only 1 category",
+        messageId: "SVC4572"
+    }
+#---------SVC4574------------------------------
+    RESOURCE_TOO_MUCH_SUBCATEGORIES: {
+        code: 400,
+        message: "Error: Resource must have only 1 sub category",
+        messageId: "SVC4574"
+    }
+#---------SVC4575------------------------------
+    COMPONENT_MISSING_SUBCATEGORY: {
+        code: 400,
+        message: "Error: Missing sub category",
+        messageId: "SVC4575"
+    }
+ #---------SVC4576------------------------------
+# %1 - "component type"
+    UNSUPPORTED_ERROR: {
+        code: 400,
+        message: "Error : Requested component type %1 is unsupported.",
+        messageId: "SVC4576"
+    }
+    #---------SVC4577------------------------------
+# %1 - "resource type"
+    RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES: {
+        code: 409,
+        message: "Error : Resource of type %1 cannot contain resource instances.",
+        messageId: "SVC4577"
+    }
+#---------SVC4578------------------------------
+# %1 - "Resource"/"Service"
+# %2 -  resource/service name
+# %3 -  "artifact name"
+    DEPLOYMENT_ARTIFACT_NAME_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: %1 '%2' already has a deployment artifact named '%3'.",
+        messageId: "SVC4578"
+    }
+#---------SVC4579------------------------------
+# %1 - "Category"/"Sub-Category"/"Group"
+# %2 -  category/sub-category/grouping name.
+    INVALID_GROUP_ASSOCIATION: {
+        code: 400,
+        message: "Error: Invalid group association. %1 '%2' was not found.",
+        messageId: "SVC4579"
+    }
+#---------SVC4580------------------------------
+    EMPTY_PRODUCT_CONTACTS_LIST: {
+        code: 400,
+        message: "Error: Invalid content. At least one Product Contact has to be specified.",
+        messageId: "SVC4580"
+    }
+#---------SVC4581------------------------------
+# %1 - UserId
+    INVALID_PRODUCT_CONTACT: {
+        code: 400,
+        message: "Error: Invalid content. User '%1' cannot be set as Product Contact.",
+        messageId: "SVC4581"
+    }
+#---------SVC4582------------------------------
+# %1 - Product
+# %2 - "abbreviated"/"full"
+    MISSING_ONE_OF_COMPONENT_NAMES: {
+        code: 400,
+        message: "Error: Invalid content. Missing %1 %2 name.",
+        messageId: "SVC4582"
+    }
+#---------SVC4583------------------------------
+# %1 - "Icon"
+# %2 - "resource"/"service"/"product"
+    COMPONENT_PARAMETER_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: %1 cannot be changed once the %2 is certified.",
+        messageId: "SVC4583"
+    }
+#---------SVC4584------------------------------
+# %1  - service/VF name
+# %2 - "service" /"VF"
+# %3 -  resource instance origin type
+# %4 -  resource instance name
+# %5 -  requirement/capability
+# %6 -  requirement/capability name
+# %7 -  "fulfilled" (for req)/"consumed (for cap)"
+    REQ_CAP_NOT_SATISFIED_BEFORE_CERTIFICATION: {
+        code: 403,
+        message: "Error:  Requested '%1' %2 is not ready for certification.  %3 '%4' has to have %5 '%6' %7.",
+        messageId: "SVC4584"
+    }
+#---------SVC4585------------------------------
+    INVALID_OCCURRENCES: {
+        code: 400,
+        message: "Error: Invalid occurrences format.",
+        messageId: "SVC4585"
+    }
+#---------SVC4586------------------------------
+#---------SVC4586------------------------------
+    INVALID_SERVICE_API_URL: {
+        code: 400,
+        message: 'Error: Invalid Service API URL. Please check whether your URL has a valid domain extension and does not contain the following characters - #?&@%+;,=$<>~^`\[]{}|"*!',
+        messageId: "SVC4586"
+    }
+#---------SVC4587------------------------------
+# %1  - Data type name
+    DATA_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: 'Error: Data type %1 already exists.',
+        messageId: "SVC4587"
+    }
+#---------SVC4588------------------------------
+# %1  - Data type name
+    DATA_TYPE_NOR_PROPERTIES_NEITHER_DERIVED_FROM: {
+        code: 400,
+        message: 'Error: Invalid Data type %1. Data type must have either a valid derived from declaration or at least one valid property',
+        messageId: "SVC4588"
+    }
+#---------SVC4589------------------------------
+# %1  - Data type name
+    DATA_TYPE_PROPERTIES_CANNOT_BE_EMPTY: {
+        code: 400,
+        message: "Error: Invalid Data type %1. 'properties' parameter cannot be empty if provided.",
+        messageId: "SVC4589"
+    }
+#---------SVC4590------------------------------
+# %1  - Property type name
+# %2  - Property name
+    INVALID_PROPERTY_TYPE: {
+        code: 400,
+        message: "Error: Invalid Property type %1 in property %2.",
+        messageId: "SVC4590"
+    }
+#---------SVC4591------------------------------
+# %1  - Property inner type
+# %2  - Property name
+    INVALID_PROPERTY_INNER_TYPE: {
+        code: 400,
+        message: "Error: Invalid property inner type %1, in property %2",
+        messageId: "SVC4591"
+    }
+#---------SVC4592------------------------------
+# %1  - component instance name
+# %2  - "resource instance"/"service instance"
+    COMPONENT_INSTANCE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' %2 was not found.",
+        messageId: "SVC4592"
+    }
+#---------SVC4593------------------------------
+# %1 - component instance name
+# %2 - "resource instance"/"service instance"
+# %3 - "resource/"service"/"product"
+# %4 - container name
+    COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER: {
+        code: 404,
+        message: "Error: Requested '%1' %2 was not found on the %3 '%4'.",
+        messageId: "SVC4593"
+    }
+#---------SVC4594------------------------------
+#%1 - requirement / capability
+#%2 - requirement name
+    IMPORT_DUPLICATE_REQ_CAP_NAME: {
+        code: 400,
+        message: "Error: Imported TOSCA template contains more than one %1 named '%2'.",
+        messageId: "SVC4594"
+    }
+#---------SVC4595------------------------------
+#%1 - requirement / capability
+#%2 - requirement name
+#%3 - parent containing the requirement
+    IMPORT_REQ_CAP_NAME_EXISTS_IN_DERIVED: {
+        code: 400,
+        message: "Error: Imported TOSCA template contains %1 '%2' that is already defined by derived template %3.",
+        messageId: "SVC4595"
+    }
+#---------SVC4596------------------------------
+# %1  - Data type name
+    DATA_TYPE_DERIVED_IS_MISSING: {
+        code: 400,
+        message: "Error: Invalid Content. The ancestor data type %1 cannot be found in the system.",
+        messageId: "SVC4596"
+    }
+#---------SVC4597------------------------------
+# %1  - Data type name
+# %2  - Property names
+    DATA_TYPE_PROPERTY_ALREADY_DEFINED_IN_ANCESTOR: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 contains properties named %2 which are already defined in one of its ancestors.",
+        messageId: "SVC4597"
+    }
+#---------SVC4598------------------------------
+# %1  - Data type name
+    DATA_TYPE_DUPLICATE_PROPERTY: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 contains duplicate property.",
+        messageId: "SVC4598"
+    }
+#---------SVC4599------------------------------
+# %1  - Data type name
+# %2  - Property names
+    DATA_TYPE_PROEPRTY_CANNOT_HAVE_SAME_TYPE_OF_DATA_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 contains properties %2 which their type is this data type.",
+        messageId: "SVC4599"
+    }
+#---------SVC4600------------------------------
+# %1  - Data type name
+    DATA_TYPE_CANNOT_HAVE_PROPERTIES: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 cannot have properties since it is of type scalar",
+        messageId: "SVC4600"
+    }
+#---------SVC4601------------------------------
+    NOT_TOPOLOGY_TOSCA_TEMPLATE: {
+        code: 400,
+        message: "Error: TOSCA yaml file %1 cannot be modeled to VF as it does not contain 'topology_template.",
+        messageId: "SVC4601"
+    }
+#---------SVC4602--------------------------------
+# %1 - yaml file name
+# %2 - node_template label
+# %3 - node_template type
+    INVALID_NODE_TEMPLATE: {
+        code: 400,
+        message: "Error: TOSCA yaml file '%1' contains node_template '%2' of type '%3' that does not represent existing VFC/CP/VL",
+        messageId: "SVC4602"
+    }
+#---------SVC4603------------------------------
+# %1 - component type
+# %2 - component name
+# %3 - state
+    ILLEGAL_COMPONENT_STATE: {
+        code: 403,
+        message: "Error: Component instance of %1 can not be created because the component '%2' is in an illegal state %3.",
+        messageId: "SVC4603"
+    }
+#---------SVC4604------------------------------
+# %1 - csar file name
+    CSAR_INVALID: {
+        code: 400,
+        message: "Error: TOSCA CSAR '%1' is invalid. 'TOSCA-Metadata/Tosca.meta' file must be provided.",
+        messageId: "SVC4604"
+    }
+#---------SVC4605------------------------------
+# %1 - csar file name
+    CSAR_INVALID_FORMAT: {
+        code: 400,
+        message: "Error: TOSCA CSAR '%1' is invalid. Invalid 'TOSCA-Metadata/Tosca.meta' file format.",
+        messageId: "SVC4605"
+    }
+#---------SVC4606------------------------------
+# %1 - property name
+# %2 - property type
+# %3 - property innerType
+# %4 - default value is
+    INVALID_COMPLEX_DEFAULT_VALUE: {
+        code: 400,
+        message: "Error: Invalid default value of property %1. Data type is %2 with inner type %3 and default value found is %4.",
+        messageId: "SVC4606"
+    }
+#---------SVC4607------------------------------
+# %1 - csar file name
+    CSAR_NOT_FOUND: {
+        code: 400,
+        message: "Error: TOSCA CSAR '%1' is not found.",
+        messageId: "SVC4607"
+    }
+#---------SVC4608------------------------------
+# %1 - artifact name
+# %2 - component type
+# %3 - actual component type
+    MISMATCH_BETWEEN_ARTIFACT_TYPE_AND_COMPONENT_TYPE: {
+        code: 400,
+        message: "Error: Artifact %1 is only compatible with component of type %2, but component type is %3.",
+        messageId: "SVC4608"
+    }
+
+#---------SVC4609------------------------------
+# %1 -  "INVALID_JSON"
+    INVALID_JSON: {
+        code: 400,
+        message: "Error: Uploaded JSON file for %1 artifact is invalid.",
+        messageId: "SVC4609"
+    }
+#---------SVC4610------------------------------
+# %1 - csar file name
+# %2 - missing file name
+    YAML_NOT_FOUND_IN_CSAR: {
+        code: 400,
+        message: "Error - TOSCA CSAR %1 is invalid. TOSCA-Metadata/Tosca.meta refers to file %2 that is not provided.",
+        messageId: "SVC4610"
+    }
+#---------SVC4611------------------------------
+# %1 - group name
+    GROUP_MEMBER_EMPTY: {
+        code: 400,
+        message: "Error: Invalid Content. Group %1 member list was provided but does not have values",
+        messageId: "SVC4611"
+    }
+#---------SVC4612------------------------------
+# %1  - group name
+    GROUP_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: 'Error: Group type %1 already exists.',
+        messageId: "SVC4612"
+    }
+#---------SVC4613------------------------------
+# %1 - group name
+# %2 - VF name(component name)
+# %3 - actual component type [VF]
+    GROUP_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Group with name '%1' already exists in %2 %3.",
+        messageId: "SVC4613"
+    }
+#---------SVC4614------------------------------
+# %1 - group type
+    GROUP_TYPE_IS_INVALID: {
+        code: 400,
+        message: "Error: Invalid content. Group type %1 does not exist",
+        messageId: "SVC4614"
+    }
+#---------SVC4615------------------------------
+# %1 - group name
+    GROUP_MISSING_GROUP_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing Group Type for group '%1'",
+        messageId: "SVC4615"
+    }
+#---------SVC4616------------------------------
+# %1 - member name
+# %2 - group name
+# %3 - VF name
+# %4 - component type [VF ]
+    GROUP_INVALID_COMPONENT_INSTANCE: {
+        code: 400,
+        message: "Error: Member '%1' listed in group '%2' is not part of '%3' %4.",
+        messageId: "SVC4616"
+    }
+#---------SVC4617------------------------------
+# %1 - member name
+# %2 - group name
+# %3 - group type
+    GROUP_INVALID_TOSCA_NAME_OF_COMPONENT_INSTANCE: {
+        code: 400,
+        message: "Error: member %1 listed in group %2 is not part of allowed members of group type %3.",
+        messageId: "SVC4617"
+    }
+#---------SVC4618------------------------------
+# %1 - missing file name
+# %2 - csar file name
+    ARTIFACT_NOT_FOUND_IN_CSAR: {
+        code: 400,
+        message: "Error: artifact %1 is defined in CSAR %2 manifest but is not provided",
+        messageId: "SVC4618"
+    }
+#---------SVC4619------------------------------
+# %1 - artifact name
+# %2 - artifact type
+# %3 - existing artifact type
+    ARTIFACT_ALRADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR: {
+        code: 400,
+        message: "Error: artifact %1 in type %2 already exists in type %3.",
+        messageId: "SVC4619"
+    }
+#---------SVC4620------------------------------
+    FAILED_RETRIVE_ARTIFACTS_TYPES: {
+        code: 400,
+        message: "Error: Failed to retrieve list of suported artifact types.",
+        messageId: "SVC4620"
+    }
+#---------SVC4621------------------------------
+# %1 - artifact name
+# %2 - master
+    ARTIFACT_ALRADY_EXIST_IN_MASTER_IN_CSAR: {
+        code: 400,
+        message: "Error: artifact %1 already exists in master %2 .",
+        messageId: "SVC4621"
+    }
+#---------SVC4622------------------------------
+# %1 - artifact name
+# %2 - artifact type
+# %3 - master name
+# %4 - master type
+    ARTIFACT_NOT_VALID_IN_MASTER: {
+        code: 400,
+        message: "Error: artifact %1 in type %2 can not be exists under master %3 in type %4.",
+        messageId: "SVC4622"
+    }
+#---------SVC4623------------------------------
+# %1 - artifact name
+# %2 - artifact type
+# %3 - env name
+# %4 - existing env
+    ARTIFACT_NOT_VALID_ENV: {
+        code: 400,
+        message: "Error: Artifact %1 in type %2 with env %3 already exists with another env %4",
+        messageId: "SVC4623"
+    }
+#---------SVC4624------------------------------
+# %1 - groups names
+# %2 - VF name
+# %3 - component type [VF ]
+    GROUP_IS_MISSING: {
+        code: 400,
+        message: "Error: Invalid Content. The groups '%1' cannot be found under %2 %3.",
+        messageId: "SVC4624"
+    }
+#---------SVC4625------------------------------
+# %1 - groups name
+    GROUP_ARTIFACT_ALREADY_ASSOCIATED: {
+        code: 400,
+        message: "Error: Invalid Content. Artifact already associated to group '%1'.",
+        messageId: "SVC4625"
+    }
+#---------SVC4626------------------------------
+# %1 - groups name
+    GROUP_ARTIFACT_ALREADY_DISSOCIATED: {
+        code: 400,
+        message: "Error: Invalid Content. Artifact already dissociated from group '%1'.",
+        messageId: "SVC4626"
+    }
+#---------SVC4627------------------------------
+# %1 - property name
+# %2 - group name
+# %3 - group type name
+    GROUP_PROPERTY_NOT_FOUND: {
+        code: 400,
+        message: "Error: property %1 listed in group %2 is not exist in group type %3.",
+        messageId: "SVC4627"
+    }
+#---------SVC4628------------------------------
+# %1 - csarUUID
+# %2 - VF name
+    VSP_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: The VSP with UUID %1 was already imported for VF %2. Please select another or update the existing VF.",
+        messageId: "SVC4628"
+    }
+#---------SVC4629------------------------------
+# %1 - VF name
+    MISSING_CSAR_UUID: {
+        code: 400,
+        message: "Error: The Csar UUID or payload name is missing for VF %1.",
+        messageId: "SVC4629"
+    }
+#---------SVC4630------------------------------
+# %1 - VF name
+# %2 - new csarUUID
+# %3 - old csarUUID
+    RESOURCE_LINKED_TO_DIFFERENT_VSP: {
+        code: 400,
+        message: "Error: Resource %1 cannot be updated using CsarUUID %2 since the resource is linked to a different VSP with csarUUID %3.",
+        messageId: "SVC4630"
+    }
+#---------SVC4631------------------------------
+# %1  - policy name
+    POLICY_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Policy type %1 already exists.",
+        messageId: "SVC4631"
+    }
+#---------SVC4632------------------------------
+# %1 - target name
+# %2 - policy type name
+    TARGETS_NON_VALID: {
+        code: 400,
+        message: "Error: target %1 listed in policy type %2 is not a group or resource.",
+        messageId: "SVC4632"
+    }
+#---------SVC4633------------------------------
+# %1 - policy name
+    TARGETS_EMPTY: {
+        code: 400,
+        message: "Error: Invalid Content. Policy %1 target list was provided but does not have values",
+        messageId: "SVC4633"
+    }
+#---------SVC4634------------------------------
+    DATA_TYPE_CANNOT_BE_EMPTY: {
+        code: 500,
+        message: "Error: Data types are empty. Please import the data types.",
+        messageId: "SVC4634"
+    }
+#---------SVC4635------------------------------
+# %1 - csar uuid
+    RESOURCE_FROM_CSAR_NOT_FOUND: {
+        code: 400,
+        message: "Error: resource from csar uuid %1 not found",
+        messageId: "SVC4635"
+    }
+#---------SVC4636------------------------------
+# %1 - Data type name
+    DATA_TYPE_CANNOT_BE_UPDATED_BAD_REQUEST: {
+        code: 400,
+        message: 'Error: Data type %1 cannot be upgraded. The new data type does not contain old properties or the type of one of the properties has been changed.',
+        messageId: "SVC4636"
+    }
+#-----------SVC4637---------------------------
+#%1 - attribute name
+    ATTRIBUTE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' attribute was not found.",
+        messageId: "SVC4637"
+    }
+#-----------SVC4638---------------------------
+#%1 - attribute name
+    ATTRIBUTE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Attribute with '%1' name already exists.",
+        messageId: "SVC4638"
+    }
+#-----------SVC4639---------------------------
+#%1 - property name
+    PROPERTY_NAME_ALREADY_EXISTS: {
+        code: 409,
+        message: "Error: Property with '%1' name and different type already exists.",
+        messageId: "SVC4639"
+    }
+#-----------SVC4640---------------------------
+#%1 - property name
+    INVALID_PROPERTY: {
+        code: 409,
+        message: "Error: Invalid property received.",
+        messageId: "SVC4640"
+    }
+#---------SVC4641-----------------------------
+#%1 - invalid filter
+#%2 - valid filters
+    INVALID_FILTER_KEY: {
+        code: 400,
+        message: "Error: The filter %1 is not applicable. Please use one of the following filters: %2",
+        messageId: "SVC4641"
+    }
+#---------SVC4642-----------------------------
+#%1 - asset type
+#%2 - filter
+    NO_ASSETS_FOUND: {
+        code: 404,
+        message: "No %1 were found to match criteria %2",
+        messageId: "SVC4642"
+    }
+#---------SVC4643------------------------------
+# %1 - "Resource"/"Product"
+# %2 - "sub-category name"
+# %3 - "category name"
+    COMPONENT_SUB_CATEGORY_NOT_FOUND_FOR_CATEGORY: {
+        code: 404,
+        message: "Error: %1 sub-category '%2' not found under category '%3'.",
+        messageId: "SVC4643"
+    }
+#---------SVC4644------------------------------
+# %1 - Format
+    CORRUPTED_FORMAT: {
+        code: 400,
+        message: "Error: %1 format is corrupted.",
+        messageId: "SVC4644"
+    }
+#---------SVC4645------------------------------
+# %1 - "groupType"
+    INVALID_VF_MODULE_TYPE: {
+        code: 400,
+        message: "Error: Invalid group type '%1' (should be VfModule).",
+        messageId: "SVC4645"
+    }
+#---------SVC4646------------------------------
+# %1 - "groupName"
+    INVALID_VF_MODULE_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. VF Module name '%1' contains invalid characters",
+        messageId: "SVC4646"
+    }
+
+#---------SVC4647------------------------------
+# %1 - "modifiedName"
+    INVALID_VF_MODULE_NAME_MODIFICATION: {
+        code: 400,
+        message: "Error: Invalid VF Module name modification, can not modify '%1'",
+        messageId: "SVC4647"
+    }
+#---------SVC4648------------------------------
+# %1 - "inputId"
+# %2 - "componentId"
+    INPUT_IS_NOT_CHILD_OF_COMPONENT: {
+        code: 400,
+        message: "Error: Input id: '%1' is not child of component id: '%2'",
+        messageId: "SVC4648"
+    }
+#---------SVC4649------------------------------
+# %1 - "groupName"
+    GROUP_HAS_CYCLIC_DEPENDENCY: {
+        code: 400,
+        message: "Error: The group '%1' has cyclic dependency",
+        messageId: "SVC4649"
+    }
+#---------SVC4650------------------------------
+# %1 - "Component Type"
+# %2 - <ServiceName>
+# %3 - error description
+    AAI_ARTIFACT_GENERATION_FAILED: {
+        code: 500,
+        message: "Error: %1 %2 automatic generation of artifacts failed. Description: %3",
+        messageId: "SVC4650"
+    }
+#---------SVC4651------------------------------
+    PARENT_RESOURCE_DOES_NOT_EXTEND: {
+        code: 400,
+        message: "Error: Once resource is certified, derived_from can be changed only to a sibling",
+        messageId: "SVC4651"
+    }
+#---------SVC4652------------------------------
+# %1 - resource/service
+    COMPONENT_INVALID_SUBCATEGORY: {
+        code: 400,
+        message: "Error: Invalid Content. Invalid %1 sub category.",
+        messageId: "SVC4652"
+    }
+#---------SVC4653------------------------------
+# %1 - group instance uniqueId
+# %2 - service uniqueId
+    GROUP_INSTANCE_NOT_FOUND_ON_COMPONENT_INSTANCE: {
+        code: 404,
+        message: "Error: Requested group instance %1 was not found on component %2.",
+        messageId: "SVC4653"
+    }
+#---------SVC4654------------------------------
+# %1 - group property name
+# %2 - valid min limit value
+# %3 - valid max limit value
+    INVALID_GROUP_MIN_MAX_INSTANCES_PROPERTY_VALUE: {
+        code: 400,
+        message: "Error: Value of %1 must be not higher than %2, and not lower than %3.",
+        messageId: "SVC4654"
+    }
+#---------SVC4655------------------------------
+# %1 - group property name
+# %2 - valid min limit value
+# %3 - valid max limit value
+    INVALID_GROUP_INITIAL_COUNT_PROPERTY_VALUE: {
+        code: 400,
+        message: "Error: Value of %1 must be between %2 and %3.",
+        messageId: "SVC4655"
+    }
+#---------SVC4656------------------------------
+# %1 - group property name
+# %2 - lower/higher
+# %3 - valid max/min value
+    INVALID_GROUP_PROPERTY_VALUE_LOWER_HIGHER: {
+        code: 400,
+        message: "Error: Value of %1 must be %2 or equals to %3.",
+        messageId: "SVC4656"
+    }
+#---------SVC4657------------------------------
+# %1 - certificationRequest / startTesting
+    RESOURCE_VFCMT_LIFECYCLE_STATE_NOT_VALID: {
+        code: 400,
+        message: "Error - Lifecycle state %1 is not valid for resource of type VFCMT",
+        messageId: "SVC4657"
+    }
+#---------SVC4658------------------------------
+# %1 – asset type [service / resource ]
+# %2 – main asset uuid
+# %3 – not found asset type [service / resource]
+# %4 – not found asset name
+    ASSET_NOT_FOUND_DURING_CSAR_CREATION: {
+        code: 400,
+        message: "Error: CSAR packaging failed for %1 %2. %3 %4 was not found",
+        messageId: "SVC4658"
+    }
+#---------SVC4659------------------------------
+# %1 – asset type [service / resource ]
+# %2 – main asset uuid
+# %3 – Artifact name
+# %4 – Artifact uuid
+    ARTIFACT_PAYLOAD_NOT_FOUND_DURING_CSAR_CREATION: {
+        code: 400,
+        message: "Error: CSAR packaging failed for %1 %2. Artifact %3 [%4] was not found",
+        messageId: "SVC4659"
+    }
+#---------SVC4660------------------------------
+# %1 - assetType
+# %2 - matching generic node type name
+    GENERIC_TYPE_NOT_FOUND: {
+        code: 404,
+        message: "Creation of %1 failed. Generic type %2 was not found",
+        messageId: "SVC4660"
+    }
+#---------SVC4661------------------------------
+# %1 - assetType
+# %2 - matching generic node type name
+    TOSCA_SCHEMA_FILES_NOT_FOUND: {
+        code: 400,
+        message: "Error: CSAR packaging failed. TOSCA schema files for SDC-Version: %1 and Conformance-Level %2 were not found",
+        messageId: "SVC4661"
+    }
+#---------SVC4662------------------------------
+# %1 - file name
+# %2 - parser error
+    TOSCA_PARSE_ERROR: {
+        code: 400,
+        message: "Error: Invalid TOSCA template in file %1. %2",
+        messageId: "SVC4662"
+    }
+#---------SVC4663------------------------------
+# %1 - max length
+    RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Resource vendor model number exceeds limit of %1 characters.",
+        messageId: "SVC4663"
+    }
+#---------SVC4664------------------------------
+    INVALID_RESOURCE_VENDOR_MODEL_NUMBER: {
+        code: 400,
+        message: 'Error: Invalid Content. Resource vendor model number is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4664"
+    }
+#---------SVC4665------------------------------
+# %1 - max length
+    SERVICE_TYPE_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Service type exceeds limit of %1 characters.",
+        messageId: "SVC4665"
+    }
+#---------SVC4666------------------------------
+    INVALID_SERVICE_TYPE: {
+        code: 400,
+        message: 'Error: Invalid Content. Serivce type is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4666"
+    }
+#---------SVC4667------------------------------
+# %1 - max length
+    SERVICE_ROLE_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Service role exceeds limit of %1 characters.",
+        messageId: "SVC4667"
+    }
+#---------SVC4668------------------------------
+    INVALID_SERVICE_ROLE: {
+        code: 400,
+        message: 'Error: Invalid Content. Service role is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4668"
+    }
+
+#---------SVC4669-----------------------------
+    INVALID_RESOURCE_TYPE: {
+        code: 400,
+        message: "Error: Invalid resource type.",
+        messageId: "SVC4669"
+    }
+#---------SVC4670------------------------------
+    ARTIFACT_NAME_INVALID: {
+        code: 400,
+        message: "Error: Artifact name is invalid.",
+        messageId: "SVC4670"
+    }
+#---------SVC4671------------------------------
+# %1 - VSP name
+# %2 - VFC name
+    CFVC_LOOP_DETECTED: {
+        code: 400,
+        message: 'Error: VSP %1 cannot be imported. The VSP contains internal loop in VFC %2',
+        messageId: "SVC4671"
+    }
+#---------SVC4672------------------------------
+# %1 - capability uniqueId
+# %2 - instance uniqueId
+# %3 - container uniqueId
+    COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER: {
+        code: 404,
+        message: "Error: Requested capability %1 of instance %2 was not found on the container %3.",
+        messageId: "SVC4672"
+    }
+
+
+#---------SVC4673------------------------------
+    INVALID_SERVICE_STATE: {
+        code: 409,
+        message: "Error: Invalid service state. Expected state: %1, actual state: %2",
+        messageId: "SVC4673"
+    }
+
+#---------SVC4674------------------------------
+    INVALID_RESPONSE_FROM_PROXY: {
+        code: 502,
+        message: "Error: The server was acting as a gateway or proxy and received an invalid response from the upstream server",
+        messageId: "SVC4674"
+    }
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/neo4j-errors-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/neo4j-errors-configuration.yaml
new file mode 100644
index 0000000..7a0d6db
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/neo4j-errors-configuration.yaml
@@ -0,0 +1,60 @@
+# Errors
+errors:
+    Neo_ClientError_General_ReadOnly: "This is a read only database, writing or modifying the database is not allowed."
+    Neo_ClientError_LegacyIndex_NoSuchIndex: "The request (directly or indirectly) referred to a index that does not exist."
+    Neo_ClientError_Request_Invalid: "The client provided an invalid Request."
+    Neo_ClientError_Request_InvalidFormat: "The client provided a request that was missing required fields, or had values that are not allowed."
+    Neo_ClientError_Schema_ConstraintAlreadyExists: "Unable to perform operation because it would clash with a pre-existing constraint."
+    Neo_ClientError_Schema_ConstraintVerificationFailure: "Unable to create constraint because data that exists in the database violates it."
+    Neo_ClientError_Schema_ConstraintViolation: "A constraint imposed by the database was violated."
+    Neo_ClientError_Schema_IllegalTokenName: "A token name, such as a label, relationship type or property key, used is not valid. Tokens cannot be empty strings and cannot be null."
+    Neo_ClientError_Schema_IndexAlreadyExists: "Unable to perform operation because it would clash with a pre-existing index."
+    Neo_ClientError_Schema_IndexBelongsToConstraint: "A requested operation can not be performed on the specified index because the index is part of a constraint. If you want to drop the index, for instance, you must drop the constraint."
+    Neo_ClientError_Schema_IndexLimitReached: "The maximum number of index entries supported has been reached, no more entities can be indexed."
+    Neo_ClientError_Schema_LabelLimitReached: "The maximum number of labels supported has been reached, no more labels can be created."
+    Neo_ClientError_Schema_NoSuchConstraint: "The request (directly or indirectly) referred to a constraint that does not exist."
+    Neo_ClientError_Schema_NoSuchIndex: "The request (directly or indirectly) referred to an index that does not exist."
+    Neo_ClientError_Security_AuthenticationFailed: "The client provided an incorrect username and/or password."
+    Neo_ClientError_Security_AuthenticationRateLimit: "The client has provided incorrect authentication details too many times in a row."
+    Neo_ClientError_Security_AuthorizationFailed: "The client does not have privileges to perform the operation requested."
+    Neo_ClientError_Statement_ArithmeticError: "Invalid use of arithmetic, such as dividing by zero."
+    Neo_ClientError_Statement_ConstraintViolation: "A constraint imposed by the statement is violated by the data in the database."
+    Neo_ClientError_Statement_EntityNotFound: "The statement is directly referring to an entity that does not exist."
+    Neo_ClientError_Statement_InvalidArguments: "The statement is attempting to perform operations using invalid arguments"
+    Neo_ClientError_Statement_InvalidSemantics: "The statement is syntactically valid, but expresses something that the database cannot do."
+    Neo_ClientError_Statement_InvalidSyntax: "The statement contains invalid or unsupported syntax."
+    Neo_ClientError_Statement_InvalidType: "The statement is attempting to perform operations on values with types that are not supported by the operation."
+    Neo_ClientError_Statement_NoSuchLabel: "The statement is referring to a label that does not exist."
+    Neo_ClientError_Statement_NoSuchProperty: "The statement is referring to a property that does not exist."
+    Neo_ClientError_Statement_ParameterMissing: "The statement is referring to a parameter that was not provided in the Request."
+    Neo_ClientError_Transaction_ConcurrentRequest: "There were concurrent requests accessing the same transaction, which is not allowed."
+    Neo_ClientError_Transaction_EventHandlerThrewException: "A transaction event handler threw an exception. The transaction will be rolled back."
+    Neo_ClientError_Transaction_HookFailed: "Transaction hook failure."
+    Neo_ClientError_Transaction_InvalidType: "The transaction is of the wrong type to service the Request_ For instance, a transaction that has had schema modifications performed in it cannot be used to subsequently perform data operations, and vice versa."
+    Neo_ClientError_Transaction_MarkedAsFailed: "Transaction was marked as both successful and failed. Failure takes precedence and so this transaction was rolled back although it may have looked like it was going to be committed"
+    Neo_ClientError_Transaction_UnknownId: "The request referred to a transaction that does not exist."
+    Neo_ClientError_Transaction_ValidationFailed: "Transaction changes did not pass validation checks"
+    Neo_DatabaseError_General_CorruptSchemaRule: "A malformed schema rule was encountered. Please contact your support representative."
+    Neo_DatabaseError_General_FailedIndex: "The request (directly or indirectly) referred to an index that is in a failed state. The index needs to be dropped and recreated manually."
+    Neo_DatabaseError_General_UnknownFailure: "An unknown failure occurred."
+    Neo_DatabaseError_Schema_ConstraintCreationFailure: "Creating a requested constraint failed."
+    Neo_DatabaseError_Schema_ConstraintDropFailure: "The database failed to drop a requested constraint."
+    Neo_DatabaseError_Schema_IndexCreationFailure: "Failed to create an index."
+    Neo_DatabaseError_Schema_IndexDropFailure: "The database failed to drop a requested index."
+    Neo_DatabaseError_Schema_NoSuchLabel: "The request accessed a label that did not exist."
+    Neo_DatabaseError_Schema_NoSuchPropertyKey: "The request accessed a property that does not exist."
+    Neo_DatabaseError_Schema_NoSuchRelationshipType: "The request accessed a relationship type that does not exist."
+    Neo_DatabaseError_Schema_NoSuchSchemaRule: "The request referred to a schema rule that does not exist."
+    Neo_DatabaseError_Statement_ExecutionFailure: "The database was unable to execute the Statement."
+    Neo_DatabaseError_Transaction_CouldNotBegin: "The database was unable to start the Transaction."
+    Neo_DatabaseError_Transaction_CouldNotCommit: "The database was unable to commit the Transaction."
+    Neo_DatabaseError_Transaction_CouldNotRollback: "The database was unable to roll back the Transaction."
+    Neo_DatabaseError_Transaction_CouldNotWriteToLog: "The database was unable to write transaction to log."
+    Neo_DatabaseError_Transaction_ReleaseLocksFailed: "The transaction was unable to release one or more of its locks."
+    Neo_TransientError_General_DatabaseUnavailable: "The database is not currently available to serve your request, refer to the database logs for more details. Retrying your request at a later time may succeed."
+    Neo_TransientError_Network_UnknownFailure: "An unknown network failure occurred, a retry may resolve the issue."
+    Neo_TransientError_Schema_ModifiedConcurrently: "The database schema was modified while this transaction was running, the transaction should be retried."
+    Neo_TransientError_Security_ModifiedConcurrently: "The user was modified concurrently to this Request."
+    Neo_TransientError_Statement_ExternalResourceFailure: "The external resource is not available"
+    Neo_TransientError_Transaction_AcquireLockTimeout: "The transaction was unable to acquire a lock, for instance due to a timeout or the transaction thread being interrupted."
+    Neo_TransientError_Transaction_DeadlockDetected: "This transaction, and at least one more transaction, has acquired locks in a way that it will wait indefinitely, and the database has aborted it. Retrying this transaction will most likely be successful."
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/users-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/users-configuration.yaml
new file mode 100644
index 0000000..a6c2365
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/users-configuration.yaml
@@ -0,0 +1,2 @@
+userCredentials:
+    ci: 2a1f887d607d4515d4066fe0f5452a50:0a0dc557c3bf594b1a48030e3e99227580168b21f44e285c69740b8d5b13e33b
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/cucumber/tenantIsolation.feature b/test-apis-ci/src/test/resources/cucumber/tenantIsolation.feature
new file mode 100644
index 0000000..f1a0f6f
--- /dev/null
+++ b/test-apis-ci/src/test/resources/cucumber/tenantIsolation.feature
@@ -0,0 +1,38 @@
+Feature: Tenant Isolation Feature
+
+  #Get individual external AT&T Certificate API
+  Scenario Outline: Create operational Envrionment
+    Given AAI returns <retcode> and aai_body contains <tenant> and <workload>
+    When The Number Of Operational Envrinoments that created is <numberOfEnvs> and Records are added with data <recordData>
+    Then The Number Of Environment is <numberOfEnvs> with status <recordStatus>
+    #Verify Succesfull A&AI Call
+    And Operational Environment record contains tenant field <isTenantExist>
+    And Operational Environment record contains workload field <isWorkloadtExist>
+    #Verify Succesfull DME Call
+    And Operational Environment record contains UEB Address field <isUebAddressExist>
+
+    Examples: 
+      | retcode | tenant | workload        | recordData                                     | numberOfEnvs | recordStatus | isTenantExist | isWorkloadtExist | isUebAddressExist |
+      |     200 | Test   | VNF_Development | {"status": "failed", "last_modified_delta": 0} |            1 | completed    | true          | true             | true              |
+
+  Scenario Outline: Distribute To Operational Environment
+    Given ASDC Address is 127.0.0.1
+    And The number of complete environments is <numberOfEnvs>
+    #Start SImulator for each envrionment
+    And The number of artifacts each Simulator downloads from a service is <numberOfArtifactsDownloaded>
+    #5 (3 days) - run jar
+    And MSO-WD Simulators Started with topic name MSHITRIT-D2D
+    And ASDC Contains the following services <ListOfServicesUUID>
+    # (1.5 days)
+    And MSO Final Distribution Simulator is UP
+    #4 (Sends 75 request )(2 days)
+    When Distribution Requests are Sent By MSO
+    Then All MSO-WD Simulators Sent The Distribution Complete Notifications
+    And All Artifacts were downloaded by Simulators
+    #6
+    And MSO Final Distribution Recieved Correct Number Of Request
+
+    Examples: 
+      | numberOfEnvs | numberOfArtifactsDownloaded | ListOfServicesUUID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+      #|            5 |                           8 | 74e05aac-48d5-4642-8dc1-dc1ddeb5c0f5,fa86100a-409b-4310-835c-e401896181a5,8dbc41cc-2076-49c0-b95b-cb37b1539367,0c7eb2ac-06c0-41e1-b635-825037942e28,840123d1-b9d6-4036-8e94-471b268026bf,74331473-1eb0-4628-84b8-ab47948f7023, 3277af19-d152-4d94-a4d0-44ad6f226b52, e553c12b-b67b-4d66-a6a9-8676d5e0becf, f648052e-3207-4eb2-9336-29f2fe9df618, 535c6ad3-ad2b-429f-ab9b-b654cf647c86,611c764d-8862-4f09-a8e0-1622f8d97ce9, b5df0774-2445-4daf-b893-61c014652145, 01481626-b58a-49b5-ba1e-74eb8508ed15, 9e17345a-d11d-4219-b4e3-e86cfdb51d07, 5ff40fbc-f4e9-45f1-85de-0a04b8a5d60c |
+      |            2 |                           2 | 74e05aac-48d5-4642-8dc1-dc1ddeb5c0f5,fa86100a-409b-4310-835c-e401896181a5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
diff --git a/test-apis-ci/src/test/resources/preferredRouter.txt b/test-apis-ci/src/test/resources/preferredRouter.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-apis-ci/src/test/resources/preferredRouter.txt