diff options
81 files changed, 7069 insertions, 0 deletions
diff --git a/sdnr/wt/common/pom.xml b/sdnr/wt/common/pom.xml new file mode 100644 index 000000000..144cb6648 --- /dev/null +++ b/sdnr/wt/common/pom.xml @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============LICENSE_START======================================================= + ONAP : CCSDK / SDNR / WT / common + ================================================================================ + Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All + rights reserved. + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); you may not + use this file except in compliance with the License. You may obtain a copy + of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required + by applicable law or agreed to in writing, software distributed under the + License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS + OF ANY KIND, either express or implied. See the License for the specific + language governing permissions and limitations under the License. + ============LICENSE_END========================================================= +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-common</artifactId> + <version>0.7.0-SNAPSHOT</version> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + <packaging>jar</packaging> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>binding-parent</artifactId> + <version>1.5.1-SNAPSHOT</version> + <relativePath/> + </parent> + + <properties> + <checkstyle.skip>true</checkstyle.skip> <!-- POM configuration --> + <maven.javadoc.skip>true</maven.javadoc.skip> + <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format> + <buildtime>${maven.build.timestamp} UTC</buildtime> + <elasticsearch.version>6.4.3</elasticsearch.version> + <databaseport>49400</databaseport> + </properties> + + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + + <dependencies> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + </dependency> + <dependency> + <groupId>org.elasticsearch.client</groupId> + <artifactId>elasticsearch-rest-client</artifactId> + <version>${elasticsearch.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-core</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + </dependency> + + + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <configuration> + <excludes> + <exclude>**/gen/**</exclude> + <exclude>**/generated-sources/**</exclude> + <exclude>**/yang-gen-sal/**</exclude> + <exclude>**/pax/**</exclude> + </excludes> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <executions> + <execution> + <id>generateDTOs</id> + <phase>generate-sources</phase> + <goals> + <goal>exec</goal> + </goals> + <configuration> + <executable>${basedir}/../data-provider/database/src/main/resources/es-init.sh</executable> + <arguments> + <argument>initfile</argument> + <argument>-f</argument> + <argument>${project.build.directory}/EsInit.script</argument> + </arguments> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>com.github.alexcojocaru</groupId> + <artifactId>elasticsearch-maven-plugin</artifactId> + <version>6.14</version> + <configuration> + <clusterName>testCluster</clusterName> + <transportPort>9500</transportPort> + <httpPort>${databaseport}</httpPort> + <version>6.4.3</version> + <pathInitScript>${project.build.directory}/EsInit.script</pathInitScript> + </configuration> + <executions> + <execution> + <id>start-elasticsearch</id> + <phase>process-test-classes</phase> + <goals> + <goal>runforked</goal> + </goals> + </execution> + <execution> + <id>stop-elasticsearch</id> + <phase>prepare-package</phase> + <goals> + <goal>stop</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <systemProperties> + <property> + <name>databaseport</name> + <value>${databaseport}</value> + </property> + </systemProperties> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java new file mode 100644 index 000000000..3fa9b6982 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common; + +public interface PropertyService { + + public String getProperty(String property); +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java new file mode 100644 index 000000000..3597f2e57 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java @@ -0,0 +1,352 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileFilter; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONObject; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Resources { + + private static final Logger LOG = LoggerFactory.getLogger(Resources.class); + + private static final String RESSOURCEROOT = "src/main/resources"; + + private static URL getFileURL(Class<?> cls,String resFile) { + Bundle b = FrameworkUtil.getBundle(cls); + URL u = null; + LOG.debug("try to get file {}", resFile); + if (b == null) { + LOG.info("Load resource as file: {}", resFile); + u = getUrlForRessource(cls,resFile); + } else { + LOG.info("Load resource from bundle: {}", resFile); + u = b.getEntry(resFile); + } + return u; + } + + private static File getFile(Bundle b,String resFile) { + File f = null; + LOG.debug("try to get file {}", resFile); + if (b == null) { + LOG.warn("cannot load bundle resources"); + f = new File(RESSOURCEROOT + resFile); + } else { + try { + f = new File(b.getEntry(resFile).toURI()); + } catch (URISyntaxException e) { + LOG.warn("Con not load file: {}",e.getMessage()); + } + } + return f; + } + + private static String readFile(final URL u) throws IOException { + return readFile(u.openStream()); + } + + private static String readFile(final InputStream s) throws IOException { + // read file + final String LR = "\n"; + BufferedReader in = new BufferedReader(new InputStreamReader(s)); + StringBuilder sb = new StringBuilder(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + sb.append(inputLine+LR); + } + in.close(); + s.close(); + return sb.toString(); + } + + private static List<URL> getFileURLs(Bundle b,String folder, final String filter, final boolean recursive) + throws IOException { + + List<URL> list = new ArrayList<>(); + if (b == null) { + FileFilter ff = pathname -> { + if (pathname.isFile()) { + return pathname.getName().contains(filter); + } else { + return true; + } + }; + File ffolder = getFile(b,folder); + if (ffolder != null && ffolder.isDirectory()) { + File[] files = ffolder.listFiles(ff); + if (files != null && files.length > 0) { + for (File f : files) { + if (f.isFile()) { + list.add(f.toURI().toURL()); + } else if (f.isDirectory() && recursive) { + getFileURLsRecursive(f, ff, list); + } + } + } + } + } else { + getResourceURLsTreeRecurse(b, filter, b.getEntryPaths(folder), recursive, list); + } + return list; + } + + private static void getFileURLsRecursive(File root, FileFilter ff, List<URL> list) throws MalformedURLException { + if (root != null && root.isDirectory()) { + File[] files = root.listFiles(ff); + if (files != null && files.length > 0) { + for (File f : files) { + if (f.isFile()) { + list.add(f.toURI().toURL()); + } else if (f.isDirectory()) { + getFileURLsRecursive(f, ff, list); + } + } + } + } + + } + + private static void getResourceURLsTreeRecurse(Bundle b, String filter, Enumeration<String> resource, + boolean recursive, List<URL> outp) throws IOException { + while (resource.hasMoreElements()) { + String name = resource.nextElement(); + Enumeration<String> list = b.getEntryPaths(name); + if (list != null) { + if (recursive) { + getResourceURLsTreeRecurse(b, filter, list, recursive, outp); + } + } else { + // Read + if (name.contains(filter)) { + LOG.debug("add {} to list", name); + outp.add(b.getEntry(name)); + } else { + LOG.debug("filtered out {}", name); + } + } + } + } + +// public static List<JSONObject> getJSONFiles(Bundle b,String folder, boolean recursive) { +// List<JSONObject> list = new ArrayList<>(); +// List<URL> urls; +// try { +// urls = getFileURLs(b,folder, ".json", recursive); +// LOG.debug("found {} files", urls.size()); +// } catch (IOException e1) { +// urls = new ArrayList<>(); +// LOG.warn("failed to get urls from resfolder {} : {}", folder, e1.getMessage()); +// } +// for (URL u : urls) { +// LOG.debug("try to parse " + u.toString()); +// try { +// JSONObject o = new JSONObject(readFile(u)); +// list.add(o); +// } catch (JSONException | IOException e) { +// LOG.warn("problem reading/parsing file {} : {}", u, e.getMessage()); +// } +// } +// return list; +// } + public static String getFileContent( Class<?> cls, String resFile) { + LOG.debug("loading file {} from res", resFile); + URL u = getFileURL(cls,resFile); + String s=null; + if (u == null) { + LOG.warn("cannot find resfile: {}", resFile); + return null; + } + try { + s=readFile(u); + } catch (Exception e) { + LOG.warn("problem reading file: {}", e.getMessage()); + } + return s; + + } +// public static JSONObject getJSONFile(Class<?> cls,String resFile) { +// LOG.debug("loading json file {} from res", resFile); +// JSONObject o = null; +// try { +// // parse to jsonobject +// o = new JSONObject(getFileContent(cls,resFile)); +// } catch (Exception e) { +// LOG.warn("problem reading/parsing file: {}", e.getMessage()); +// } +// return o; +// } + + /** + * Used for reading plugins from resource files /elasticsearch/plugins/head + * /etc/elasticsearch-plugins /elasticsearch/plugins + * + * @param resFolder resource folder pointing to the related files + * @param dstFolder destination + * @param rootDirToRemove part from full path to remove + * @return true if files could be extracted + */ +// public static boolean copyFolderInto(Bundle b,Class<?> cls,String resFolder, String dstFolder, String rootDirToRemove) { +// +// Enumeration<URL> urls = null; +// if (b == null) { +// LOG.info("Running in file text."); +// urls = getResourceFolderFiles(cls,resFolder); +// } else { +// urls = b.findEntries(resFolder, "*", true); +// } +// +// boolean success = true; +// URL srcUrl; +// String srcFilename; +// String dstFilename; +// while (urls.hasMoreElements()) { +// srcUrl = urls.nextElement(); +// srcFilename = srcUrl.getFile(); +// +// if (srcFilename.endsWith("/")) { +// LOG.debug("Skip directory: {}", srcFilename); +// continue; +// } +// +// LOG.debug("try to copy res {} to {}", srcFilename, dstFolder); +// if (rootDirToRemove != null) { +// srcFilename = +// srcFilename.substring(srcFilename.indexOf(rootDirToRemove) + rootDirToRemove.length() + 1); +// LOG.debug("dstfilename trimmed to {}", srcFilename); +// } +// dstFilename = dstFolder + "/" + srcFilename; +// try { +// if (!extractFileTo(srcUrl, new File(dstFilename))) { +// success = false; +// } +// } catch (Exception e) { +// LOG.warn("problem copying res {} to {}: {}", srcFilename, dstFilename, e.getMessage()); +// } +// } +// +// return success; +// +// } + +// private static Enumeration<URL> getResourceFolderFiles(Class<?> cls,String folder) { +// LOG.debug("Get resource: {}", folder); +// Collection<URL> urlCollection = new ArrayList<>(); +// URL url = getUrlForRessource(cls,folder); +// if(url==null) { +// return Collections.enumeration(urlCollection); +// } +// String path = url.getPath(); +// File[] files = new File(path).listFiles(); +// +// if (files != null) { +// for (File f : files) { +// try { +// if (f.isDirectory()) { +// urlCollection.addAll(Collections.list(getResourceFolderFiles(cls,folder + "/" + f.getName()))); +// } else { +// urlCollection.add(f.toURI().toURL()); +// } +// } catch (MalformedURLException e) { +// LOG.error("Can not read ressources", e); +// break; +// } +// } +// } +// +// return Collections.enumeration(urlCollection); +// +// } + + public static URL getUrlForRessource(Class<?> cls,String fileOrDirectory) { + //ClassLoader loader = Thread.currentThread().getContextClassLoader(); + ClassLoader loader = cls.getClassLoader(); + URL url = loader.getResource(fileOrDirectory); + if(url==null && fileOrDirectory.startsWith("/")) { + url = loader.getResource(fileOrDirectory.substring(1)); + } + return url; + } + +// public static boolean extractFileTo(Class<?> cls,String resFile, File oFile) { +// if (oFile == null) { +// return false; +// } +// LOG.debug("try to copy {} from res to {}", resFile, oFile.getAbsolutePath()); +// URL u = getFileURL(cls,resFile); +// if (u == null) { +// LOG.warn("cannot find resfile: {}", resFile); +// return false; +// } +// return extractFileTo(u, oFile); +// } +// +// public static boolean extractFileTo(URL u, File oFile) { +// +// if (oFile.isDirectory()) { +// oFile.mkdirs(); +// return true; +// } else { +// oFile.getParentFile().mkdirs(); +// } +// +// if (!oFile.exists()) { +// try { +// oFile.createNewFile(); +// } catch (IOException e) { +// LOG.warn("problem creating file {}: {}", oFile.getAbsoluteFile(), e.getMessage()); +// } +// } +// try (InputStream in = u.openStream(); OutputStream outStream = new FileOutputStream(oFile);) { +// +// int theInt; +// while ((theInt = in.read()) >= 0) { +// outStream.write(theInt); +// } +// in.close(); +// outStream.flush(); +// outStream.close(); +// LOG.debug("file written successfully"); +// } catch (IOException e) { +// LOG.error("problem writing file: {}", e.getMessage()); +// return false; +// } +// return true; +// } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java new file mode 100644 index 000000000..619191766 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration; + +/** + * Marker interface for configurations + */ +public interface Configuration { + + String getSectionName(); + + void defaults(); +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java new file mode 100644 index 000000000..36673d318 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java @@ -0,0 +1,235 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Optional; + +import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.ConfigFileObserver; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Representation of configuration file with section.<br> + * A root section is used for parameters, not assigned to a specific section.<br> + * The definitions of the configuration are attributes of a java class<br> + */ +public class ConfigurationFileRepresentation implements IConfigChangedListener { + + private static final Logger LOG = LoggerFactory.getLogger(ConfigurationFileRepresentation.class); + + private static final long FILE_POLL_INTERVAL_MS = 1000; + private static final String SECTIONNAME_ROOT = ""; + private static final String LR = "\n"; + private static final String EMPTY = ""; + + /** Related configuration file **/ + private final File mFile; + /** Monitor changes of file **/ + private final ConfigFileObserver fileObserver; + /** List of sections **/ + private final HashMap<String, Section> sections; + + public ConfigurationFileRepresentation(File f) { + + this.mFile = f; + this.sections = new HashMap<String, Section>(); + try { + if (!this.mFile.exists()) { + if (!this.mFile.createNewFile()) { + LOG.error("Can not create file {}", f.getAbsolutePath()); + } + } + reLoad(); + + } catch (IOException e) { + LOG.error("Problem loading config file {} : {}", f.getAbsolutePath(), e.getMessage()); + } + this.fileObserver = new ConfigFileObserver(f.getAbsolutePath(), FILE_POLL_INTERVAL_MS); + this.fileObserver.start(); + this.fileObserver.registerConfigChangedListener(this); + } + + public ConfigurationFileRepresentation(String configurationfile) { + this(new File(configurationfile)); + } + + public Optional<Section> getSection(String name) { + return Optional.ofNullable(sections.get(name)); + } + + public Section addSection(String name) { + if (this.sections.containsKey(name)) { + return this.sections.get(name); + } + Section s = new Section(name); + this.sections.put(name, s); + return s; + } + + public void reLoad() { + sections.clear(); + addSection(SECTIONNAME_ROOT); + load(); + } + + public void save() { + LOG.debug("Write configuration to {}", getMFileName()); + try (BufferedWriter bw = new BufferedWriter(new FileWriter(this.mFile, false))) { + for (Section section : this.sections.values()) { + if (section.hasValues()) { + bw.write(String.join(LR, section.toLines()) + LR + LR); + } + } + bw.close(); + } catch (Exception e) { + LOG.warn("problem saving value: " + e.getMessage()); + } + } + + public void registerConfigChangedListener(IConfigChangedListener l) { + this.fileObserver.registerConfigChangedListener(l); + } + + public void unregisterConfigChangedListener(IConfigChangedListener l) { + this.fileObserver.unregisterConfigChangedListener(l); + } + + @Override + public void onConfigChanged() { + LOG.debug("Reload on change {}", getMFileName()); + reLoad(); + } + + @Override + public String toString() { + return "ConfigurationFileRepresentation [mFile=" + mFile + ", sections=" + sections + "]"; + } + + @Override + protected void finalize() throws Throwable { + if (this.fileObserver != null) { + this.fileObserver.interrupt(); + } + super.finalize(); + } + + /* + * Property access set/get + */ + public void setProperty(String section, String key, Object value) { + Optional<Section> os = this.getSection(section); + if (os.isPresent()) { + os.get().setProperty(key, value == null ? "null" : value.toString()); + save(); + } else { + LOG.info("Unknown configuration section {}", section); + } + } + + public String getProperty(String section, String propertyKey) { + Optional<Section> os = this.getSection(section); + if (os.isPresent()) { + return os.get().getProperty(propertyKey); + } else { + LOG.debug("Unknown configuration section {}", section); + return EMPTY; + } + } + + public Optional<Long> getPropertyLong(String section, String propertyKey) { + Optional<Section> os = this.getSection(section); + if (os.isPresent()) { + return os.get().getLong(propertyKey); + } else { + LOG.debug("Unknown configuration section {}", section); + return Optional.empty(); + } + } + + public boolean isPropertyAvailable(String section, String propertyKey) { + Optional<Section> s = this.getSection(section); + return s.isPresent() && s.get().hasKey(propertyKey); + } + + public void setPropertyIfNotAvailable(String section, String propertyKey, + Object propertyValue) { + if (! isPropertyAvailable(section, propertyKey)) { + setProperty(section, propertyKey, propertyValue.toString()); + } + } + + public boolean getPropertyBoolean(String section, String propertyKey) { + return getProperty(section, propertyKey).equalsIgnoreCase("true"); + } + + /* + * Private + */ + private void load() { + LOG.debug("loading file {}", getMFileName()); + String curSectionName = SECTIONNAME_ROOT; + Optional<Section> sectionOptional = this.getSection(curSectionName); + Section curSection=sectionOptional.isPresent()?sectionOptional.get():this.addSection(curSectionName); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(this.mFile)); + for (String line; (line = br.readLine()) != null;) { + line = line.trim(); + if (line.isEmpty()) { + continue; + } + if (line.startsWith("[") && line.endsWith("]")) { + curSectionName = line.substring(1, line.length() - 1); + curSection = this.addSection(curSectionName); + } else { + curSection.addLine(line); + } + } + + } catch (Exception e) { + LOG.info("Problem loading configuration file. {} {}", getMFileName(), e); + } finally { + try { + if (br != null) { + br.close(); + } + } catch (IOException e) { + } + } + LOG.debug("finished loading file"); + LOG.debug("start parsing sections"); + for (Section section : this.sections.values()) { + section.parseLines(); + } + LOG.debug("finished parsing " + this.sections.size() + " sections"); + } + + private String getMFileName() { + return mFile.getAbsolutePath(); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java new file mode 100644 index 000000000..f6d3601e9 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration; + +public interface ISubConfigHandler { + void save(); +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java new file mode 100644 index 000000000..18ed409a7 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration.exception; + +public class ConfigurationException extends Exception { + + private static final long serialVersionUID = 733061908616404383L; + + public ConfigurationException(String m) { + super(m); + } +}
\ No newline at end of file diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java new file mode 100644 index 000000000..d261c73f0 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration.exception; + +public class ConversionException extends Exception { + private static final long serialVersionUID = 5179891576029923079L; + + public ConversionException(String m) { + super(m); + } +} + diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java new file mode 100644 index 000000000..78f116641 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import org.onap.ccsdk.features.sdnr.wt.common.file.FileWatchdog; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ConfigFileObserver extends FileWatchdog { + + private static final Logger LOG = LoggerFactory.getLogger(ConfigFileObserver.class); + + private final List<IConfigChangedListener> mConfigChangedHandlers = new ArrayList<>(); + + public ConfigFileObserver(String filename, long pollIntervallMs) { + super(filename); + this.setDelay(pollIntervallMs); + } + + @Override + protected void doOnChange() { + LOG.debug("property file has changed"); + for (IConfigChangedListener listener : this.mConfigChangedHandlers) { + listener.onConfigChanged(); + } + } + + public void registerConfigChangedListener(@Nonnull IConfigChangedListener l) { + if (!this.mConfigChangedHandlers.contains(l)) { + this.mConfigChangedHandlers.add(l); + } + } + + public void unregisterConfigChangedListener(IConfigChangedListener l) { + this.mConfigChangedHandlers.remove(l); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java new file mode 100644 index 000000000..32f11cd57 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange; + +public interface IConfigChangedListener { + void onConfigChanged(); +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java new file mode 100644 index 000000000..a0e21be01 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java @@ -0,0 +1,196 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.Optional; + +import org.onap.ccsdk.features.sdnr.wt.common.configuration.exception.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Section { + + private static final Logger LOG = LoggerFactory.getLogger(Section.class); + private static final String DELIMITER = "="; + private static final String COMMENTCHARS[] = {"#", ";"}; + + private final String name; + private final List<String> rawLines; + private final LinkedHashMap<String, SectionValue> values; + + public Section(String name) { + LOG.debug("new section created: '{}'", name); + this.name = name; + this.rawLines = new ArrayList<>(); + this.values = new LinkedHashMap<>(); + } + + public void addLine(String line) { + LOG.trace("adding raw line:" + line); + this.rawLines.add(line); + } + + public String getProperty(String key) { + return this.getProperty(key, null); + } + + public String getProperty(String key, String defValue) { + if (values.containsKey(key)) { + return values.get(key).getValue(); + } + return defValue; + } + + public String getName() { + return name; + } + + public void setProperty(String key, String value) { + boolean isuncommented = this.isCommentLine(key); + if (isuncommented) { + key = key.substring(1); + } + if (this.values.containsKey(key)) { + this.values.get(key).setValue(value).setIsUncommented(isuncommented); + } else { + this.values.put(key, new SectionValue(value,isuncommented)); + } + } + + public void parseLines() { + this.values.clear(); + List<String> commentsForValue = new ArrayList<>(); + boolean uncommented = false; + for (String line : rawLines) { + + if (this.isCommentLine(line)) { + if (!line.contains(DELIMITER)) { + commentsForValue.add(line); + continue; + } else { + uncommented = true; + line = line.substring(1); + } + } + if (!line.contains(DELIMITER)) { + continue; + } + String hlp[] = line.split(DELIMITER); + if (hlp.length > 1) { + String key = hlp[0]; + String value = + line.length() > (key + DELIMITER).length() ? line.substring((key + DELIMITER).length()) + : ""; + if (this.values.containsKey(key)) { + this.values.get(key).setValue(value); + } else { + this.values.put(key, new SectionValue(value, commentsForValue, uncommented)); + commentsForValue = new ArrayList<>(); + } + } else { + LOG.warn("ignoring unknown formatted line:" + line); + } + uncommented = false; + } + } + + private boolean isCommentLine(String line) { + for (String c : COMMENTCHARS) { + if (line.startsWith(c)) { + return true; + } + } + return false; + } + + public String[] toLines() { + List<String> lines = new ArrayList<>(); + if (!this.name.isEmpty()) { + lines.add("[" + this.name + "]"); + } + for (Entry<String, SectionValue> entry : this.values.entrySet()) { + SectionValue sectionValue = entry.getValue(); + if (sectionValue.getComments().size() > 0) { + for (String comment : sectionValue.getComments()) { + lines.add(comment); + } + } + lines.add((sectionValue.isUncommented() ? COMMENTCHARS[0] : "") + entry.getKey() + DELIMITER + + sectionValue.getValue()); + } + String[] alines = new String[lines.size()]; + return lines.toArray(alines); + } + + public String getString(String key, String def) { + return this.getProperty(key, def); + } + + public boolean getBoolean(String key, boolean def) throws ConversionException { + String v = this.getProperty(key); + if (v == null || v.isEmpty()) { + return def; + } + if (v.equals("true")) { + return true; + } + if (v.equals("false")) { + return false; + } + throw new ConversionException("invalid value for key " + key); + } + + public int getInt(String key, int def) throws ConversionException { + String v = this.getProperty(key); + if (v == null || v.isEmpty()) { + return def; + } + try { + return Integer.parseInt(v); + } catch (NumberFormatException e) { + throw new ConversionException(e.getMessage()); + } + } + + public Optional<Long> getLong(String key) { + String v = this.getProperty(key); + try { + return Optional.of(Long.parseLong(v)); + } catch (NumberFormatException e) { + } + return Optional.empty(); + } + + public boolean hasValues() { + return this.values.size() > 0; + } + + public boolean hasKey(String key) { + return this.values.containsKey(key); + } + + @Override + public String toString() { + return "Section [name=" + name + ", rawLines=" + rawLines + ", values=" + values + "]"; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java new file mode 100644 index 000000000..8af072493 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes; + +import java.util.ArrayList; +import java.util.List; + +class SectionValue { + + private String value; + private final List<String> comments; + private boolean isUncommented; + + public SectionValue(String value, List<String> commentsForValue, boolean isuncommented) { + this.comments = commentsForValue; + this.value = value; + this.isUncommented = isuncommented; + } + + public SectionValue(String value) { + this(value, new ArrayList<String>(), false); + } + + public SectionValue(String value, boolean isUncommented) { + this(value, new ArrayList<String>(), isUncommented); + } + + /* Getter / Setter */ + + public String getValue() { + return value; + } + + public SectionValue setValue(String value) { + this.value = value; + return this; + } + + public boolean isUncommented() { + return isUncommented; + } + + public SectionValue setIsUncommented(boolean isUncommented) { + this.isUncommented = isUncommented; + return this; + } + + public List<String> getComments() { + return comments; + } + + @Override + public String toString() { + return "SectionValue [value=" + value + ", comments=" + comments + ", isUncommented=" + isUncommented + "]"; + } + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java new file mode 100644 index 000000000..78501a8db --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java @@ -0,0 +1,162 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; + +/** + * Access elasticsearch database + */ + +public interface DatabaseClient { + + /** + * Read JSON Object from database + * @param dataTypeName to read + * @param esId to provide id to read + * @return String with json structure + */ + public @Nullable String doReadJsonData(String dataTypeName, @Nonnull IsEsObject esId ); + + /** + * Read JSON Object from database + * @param dataTypeName to read + * @param esId of object to read + * @return String with json structure + */ + public @Nullable String doReadJsonData(String dataTypeName, @Nonnull String esId); + + /** + * Provide all Objects of the specified dataTypeName. + * @param dataTypeName to be used + * @return SearchResult with list of elements + */ + public @Nonnull SearchResult<SearchHit> doReadAllJsonData(String dataTypeName); + + /** + * Provide all Objects that are covered by query. + * @param dataTypeName to be used + * @param queryBuilder with the query to be used. + * @return SearchResult with list of elements + */ + public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName, QueryBuilder queryBuilder); + /** + * Write one object into Database + * + * @param esId Database index + * @param dataTypeName Name of datatype + * @param json String in JSON format. + * @return esId String of the database object or null in case of write problems. + */ + public @Nullable String doWriteJsonString( String dataTypeName, @Nonnull IsEsObject esId, String json); + + /** + * Write one object into Database + * @param dataTypeName Name of datatype + * @param esId of object to be replaced or null for new entry. + * @param json String in JSON format. + * @return esId String of the database object or null in case of write problems. + */ + public @Nullable String doWriteRaw( String dataTypeName, @Nullable String esId, String json); + + /** + * Remove Object from database + * @param dataTypeName of object + * @param esId of object to be deleted + * @return success + */ + public boolean doRemove( String dataTypeName, IsEsObject esId ); + + /** + * Remove Object from database + * @param dataTypeName of object + * @param esId as String of object to be deleted + * @return success + */ + boolean doRemove(String dataTypeName, String esId); + + /** + * Verify if index already created + * @param dataTypeName to be verified. + * @return boolean accordingly + */ + public boolean isExistsIndex(String dataTypeName); + + /** + * Update one object in Database with id=esId or create if not exists. + * @param dataTypeName Name of datatype + * @param esId of object to be replaced or null for new entry. + * @param json String in JSON format. + * @return esId String of the database object or null in case of write problems. + */ + public String doUpdateOrCreate(String dataTypeName, String esId, String json); + + /** + * Update one object in Database with id=esId or create if not exists. + * @param dataTypeName Name of datatype + * @param esId to use for DB object + * @param json object to write + * @param doNotUpdateField Fields that are not updated, but inserted if DB Object not existing in DB + * @return esId as String or null of not successfully + */ + public String doUpdateOrCreate(String dataTypeName, String esId, String json, List<String> doNotUpdateField); + + /** + * remove items from database by query + * @param dataTypeName Name of datatype + * @param query query to select items to remove + * @return count of removed items + */ + public int doRemove(String dataTypeName, QueryBuilder query); + + /** + * update object in database + * @param dataTypeName Name of datatype + * @param json dataobject + * @param query query to select item to update + * @return esId which was updated or null if failed + */ + public String doUpdate(String dataTypeName, String json, QueryBuilder query); + + /** + * + * @param dataTypeName Name of datatype + * @param queryBuilder query to select items to read + * @param ignoreException flag if serverside exception will be thrown if query is not valid (needed for user entered filters) + * @return results + */ + SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName, QueryBuilder queryBuilder, + boolean ignoreException); + + + /** + * read all data + * @param dataTypeName Name of datatype + * @param ignoreException flag if serverside exception will be thrown if query is not valid (needed for user entered filters) + * @return results + */ + SearchResult<SearchHit> doReadAllJsonData(String dataTypeName, boolean ignoreException); + + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java new file mode 100644 index 000000000..828ae8bb0 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; + +public interface DatabaseConfig { + + HostInfo[] getHosts(); + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java new file mode 100644 index 000000000..0e544acec --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java @@ -0,0 +1,216 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +import java.io.IOException; +import org.apache.http.HttpHost; +import org.elasticsearch.client.Response; +import org.elasticsearch.client.ResponseException; +import org.elasticsearch.client.RestClient; +import org.json.JSONException; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo.Protocol; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterHealthRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndicesAliasesRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.NodeStatsRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.RefreshIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateByQueryRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AcknowledgedResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterHealthResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.CreateIndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteByQueryResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteIndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.IndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.NodeStatsResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.RefreshIndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateByQueryResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ExtRestClient { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExtRestClient.class); + + private RestClient client; + + public ExtRestClient(RestClient client) { + this.client = client; + } + + public ClusterHealthResponse health(ClusterHealthRequest request) + throws UnsupportedOperationException, IOException, JSONException { + return new ClusterHealthResponse(this.client.performRequest(request.getInner())); + } + + public void close() throws IOException { + this.client.close(); + + } + // + public boolean indicesExists(GetIndexRequest request) throws IOException { + Response response = this.client.performRequest(request.getInner()); + return response.getStatusLine().getStatusCode()==200; + } + + public AcknowledgedResponse updateAliases(IndicesAliasesRequest request) throws IOException{ + return new AcknowledgedResponse(this.client.performRequest(request.getInner())); + } + + public CreateIndexResponse createIndex(CreateIndexRequest request) throws IOException { + CreateIndexResponse response = new CreateIndexResponse(this.client.performRequest(request.getInner())); + return response; + } + public DeleteIndexResponse deleteIndex(DeleteIndexRequest request) throws IOException { + return new DeleteIndexResponse(this.client.performRequest(request.getInner())); + } + public IndexResponse index(IndexRequest request) throws IOException{ + return new IndexResponse(this.client.performRequest(request.getInner())); + } + + public DeleteResponse delete(DeleteRequest request) throws IOException{ + Response response=null; + try { + response = this.client.performRequest(request.getInner()); + } + catch(ResponseException e) { + new DeleteResponse(e.getResponse()); + } + return new DeleteResponse(response); + } + public DeleteByQueryResponse deleteByQuery(DeleteByQueryRequest request) throws IOException { + Response response=null; + try { + response = this.client.performRequest(request.getInner()); + } + catch(ResponseException e) { + new DeleteResponse(e.getResponse()); + } + return new DeleteByQueryResponse(response); + } + public SearchResponse search(SearchRequest request) throws IOException{ + return this.search(request,false); + } + + /** + * + * @param request + * @param ignoreParseException especially for usercreated filters which may cause ES server response exceptions + * @return + * @throws IOException + */ + public SearchResponse search(SearchRequest request, boolean ignoreParseException) throws IOException { + if (ignoreParseException) { + try { + return new SearchResponse(this.client.performRequest(request.getInner())); + } catch (ResponseException e) { + LOGGER.debug("ignoring Exception for request {}: {}",request,e.getMessage()); + return new SearchResponse(e.getResponse()); + } + } else { + return new SearchResponse(this.client.performRequest(request.getInner())); + } + } + + public GetResponse get(GetRequest request) throws IOException{ + try { + return new GetResponse(this.client.performRequest(request.getInner())); + } + catch (ResponseException e) { + return new GetResponse(e.getResponse()); + } + } + public UpdateByQueryResponse update(UpdateByQueryRequest request) throws IOException { + return new UpdateByQueryResponse(this.client.performRequest(request.getInner())); + + } + public UpdateResponse update(UpdateRequest request) throws IOException { + return new UpdateResponse(this.client.performRequest(request.getInner())); + + } + public RefreshIndexResponse refreshIndex(RefreshIndexRequest request) throws IOException{ + return new RefreshIndexResponse(this.client.performRequest(request.getInner())); + } + + public NodeStatsResponse stats(NodeStatsRequest request) throws IOException{ + return new NodeStatsResponse(this.client.performRequest(request.getInner())); + } + + public boolean waitForYellowStatus(long timeoutms) { + + ClusterHealthRequest request = new ClusterHealthRequest(); + request.timeout(timeoutms/1000); + ClusterHealthResponse response = null; + String status=""; + try { + response = this.health(request); + + } catch (UnsupportedOperationException | IOException | JSONException e) { + LOGGER.error(e.getMessage()); + } + if(response!=null) { + status=response.getStatus(); + LOGGER.debug("Elasticsearch service started with status {}", response.getStatus()); + + } + else { + LOGGER.warn("Elasticsearch service not started yet with status {}. current status is {}",status,"none"); + return false; + } + return response.isStatusMinimal(ClusterHealthResponse.HEALTHSTATUS_YELLOW); + + } + + protected ExtRestClient(HostInfo[] hosts) { + this(RestClient.builder(get(hosts)).build()); + } + private static HttpHost[] get(HostInfo[] hosts) { + HttpHost[] httphosts = new HttpHost[hosts.length]; + for(int i=0;i<hosts.length;i++) { + httphosts[i]=new HttpHost(hosts[i].hostname, hosts[i].port, hosts[i].protocol.toString()); + } + return httphosts; + } + public static ExtRestClient createInstance(HostInfo[] hosts) { + HttpHost[] httphosts = new HttpHost[hosts.length]; + for(int i=0;i<hosts.length;i++) { + httphosts[i]=new HttpHost(hosts[i].hostname, hosts[i].port, hosts[i].protocol.toString()); + } + return new ExtRestClient(RestClient.builder(httphosts).build()); + } + public static ExtRestClient createInstance(String hostname, int port, Protocol protocol) throws InvalidProtocolException { + return createInstance(new HostInfo[] {new HostInfo(hostname,port,protocol)}); + + } + + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java new file mode 100644 index 000000000..c3bd7c5eb --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java @@ -0,0 +1,286 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +import java.io.IOException; +import java.util.List; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.RefreshIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateByQueryRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteByQueryResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.IndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.RefreshIndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateByQueryResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Herbert, Micha + * + * Hint: Elasticsearch index/alias and doctype will be the same value + * server side restricted since ES 5.0 + * + */ +public class HtDatabaseClient extends ExtRestClient implements DatabaseClient, AutoCloseable { + + private final Logger LOG = LoggerFactory.getLogger(HtDatabaseClient.class); + + private boolean doRefreshAfterWrite; + public HtDatabaseClient(HostInfo[] hosts) { + this(hosts,true); + } + public HtDatabaseClient(HostInfo[] hosts, boolean refreshAfterWrite) { + super(hosts); + this.doRefreshAfterWrite = refreshAfterWrite; + } + + + + /*---------------------------------- + * Functions + */ + + /** + * Close function + */ + @Override + public void close() { + try { + super.close(); + } catch (IOException e) { + LOG.warn("Problem closing db client: {}",e); + } + } + + @Override + public boolean isExistsIndex(String esIndexAlias) { + + LOG.debug("Check status of ES index: {}", esIndexAlias); + + GetIndexRequest request = new GetIndexRequest(esIndexAlias); + + boolean indexStatus = false; + try { + indexStatus = this.indicesExists(request); + } catch (IOException e) { + LOG.warn("Problem checking index for {}: {}",esIndexAlias,e); + } + + return indexStatus; + + } + + @Override + public @Nullable String doWriteJsonString(String dataTypeName, @Nonnull IsEsObject esId, String json) { + return doWriteRaw(dataTypeName, esId.getEsId(), json); + } + + @Override + public @Nullable String doWriteRaw(String dataTypeName, @Nullable String esId, String json) { + + IndexResponse response = null; + IndexRequest indexRequest = new IndexRequest(dataTypeName,dataTypeName,esId); + indexRequest.source(json); + try { + response = this.index(indexRequest ); + } catch (IOException e) { + LOG.warn("ES Exception {} Json: {}", e.getMessage(), json); + } + + if (response == null) { + LOG.warn("Response null during write: {} {}", esId, json); + return null; + } + if(this.doRefreshAfterWrite) { + this.doRefresh(dataTypeName); + } + return response.getId(); + } + + private void doRefresh(String dataTypeName) { + try { + RefreshIndexResponse response = this.refreshIndex(new RefreshIndexRequest(dataTypeName)); + if(!response.succeeded()) { + LOG.warn("seems that index {} was not refreshed",dataTypeName); + } + } catch (IOException e) { + LOG.warn("problem with refreshing index: {}",e); + } + + } + @Override + public boolean doRemove(String dataTypeName, IsEsObject esId) { + return doRemove(dataTypeName, esId.getEsId()); + } + + + @Override + public boolean doRemove(String dataTypeName, String esId) { + DeleteRequest deleteRequest = new DeleteRequest(dataTypeName,dataTypeName,esId); + DeleteResponse response = null; + try { + response = this.delete(deleteRequest); + } catch (IOException e) { + LOG.warn("Problem deleting from db: {}",e.getMessage()); + } + if(this.doRefreshAfterWrite) { + this.doRefresh(dataTypeName); + } + return response!=null?response.isDeleted():false; + } + + @Override + public @Nullable String doReadJsonData(String dataTypeName, @Nonnull IsEsObject esId) { + + if (esId.getEsId() == null) { + throw new IllegalArgumentException("Read access to object without database Id"); + } + + return doReadJsonData(dataTypeName, esId.getEsId()); + } + + @Override + public @Nullable String doReadJsonData(String dataTypeName, @Nonnull String esId) { + + LOG.debug("NetworkIndex read: {}", dataTypeName); + GetRequest getRequest = new GetRequest(dataTypeName,dataTypeName,esId); + GetResponse response = null; + try { + response = this.get(getRequest); + } catch (IOException e) { + LOG.warn("problem reading data {} with id {}: {}",dataTypeName,esId,e); + } + return response!=null && response.isExists() ? response.getSourceAsBytesRef() : null; + } + + @Override + public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName, QueryBuilder queryBuilder) { + + return this.doReadByQueryJsonData(dataTypeName, queryBuilder, false); + } + + @Override + public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName,QueryBuilder queryBuilder, boolean ignoreException) { + + long total = 0; + LOG.debug("NetworkIndex query and read: {}", dataTypeName); + + SearchRequest searchRequest = new SearchRequest(dataTypeName, dataTypeName); + searchRequest.setQuery(queryBuilder); + SearchResponse response = null; + try { + response = this.search(searchRequest,ignoreException); + total = response.getTotal(); + + } catch (IOException e) { + LOG.warn("error do search {}: {}", queryBuilder, e); + } + return new SearchResult<SearchHit>(response != null ? response.getHits() : new SearchHit[] {}, total); + } + @Override + public @Nonnull SearchResult<SearchHit> doReadAllJsonData(String dataTypeName) { + return this.doReadAllJsonData( dataTypeName,false); + } + @Override + public @Nonnull SearchResult<SearchHit> doReadAllJsonData( String dataTypeName, boolean ignoreException) { + // Use query + return doReadByQueryJsonData( dataTypeName, QueryBuilders.matchAllQuery(),ignoreException); + } + + + @Override + public String doUpdateOrCreate(String dataTypeName, String esId, String json) { + return this.doUpdateOrCreate(dataTypeName, esId, json,null); + } + + + + @Override + public String doUpdateOrCreate(String dataTypeName, String esId, String json, List<String> onlyForInsert) { + if(esId==null) { + LOG.warn("try to update or insert {} with id null is not allowed.",dataTypeName); + return null; + } + boolean success = false; + UpdateRequest request = new UpdateRequest(dataTypeName, dataTypeName, esId); + request.source(new JSONObject(json),onlyForInsert); + try { + UpdateResponse response = this.update(request); + success = response.succeeded(); + } catch (IOException e) { + LOG.warn("Problem updating {} with id {} and data {}: {}", dataTypeName, esId, json, e); + } + if(this.doRefreshAfterWrite) { + this.doRefresh(dataTypeName); + } + return success ? esId : null; + } + @Override + public String doUpdate(String dataTypeName, String json, QueryBuilder query) { + boolean success = false; + UpdateByQueryRequest request = new UpdateByQueryRequest(dataTypeName, dataTypeName ); + request.source(new JSONObject(json),query); + try { + UpdateByQueryResponse response = this.update(request); + success = !response.hasFailures(); + } catch (IOException e) { + LOG.warn("Problem updating items in {} with query {} and data {}: {}", dataTypeName, query, json, e); + } + if(this.doRefreshAfterWrite) { + this.doRefresh(dataTypeName); + } + return success?"":null; + } + + + + @Override + public int doRemove(String dataTypeName, QueryBuilder query) { + int del=0; + DeleteByQueryRequest request = new DeleteByQueryRequest(dataTypeName); + request.source(query); + try { + DeleteByQueryResponse response = this.deleteByQuery(request); + del = response.getDeleted(); + } catch (IOException e) { + LOG.warn("Problem delete in {} with query {}:{} ", dataTypeName, query.toJSON(), e); + } + if(this.doRefreshAfterWrite) { + this.doRefresh(dataTypeName); + } + return del; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java new file mode 100644 index 000000000..c7d27204a --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +public class InvalidProtocolException extends Exception { + + + /** + * + */ + private static final long serialVersionUID = 1L; + + public InvalidProtocolException(String e) { + super(e); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java new file mode 100644 index 000000000..a5c7df6bb --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +/** + * Element is a document in the ES database. + */ +public interface IsEsObject { + + /** + * Set the ES Id + * @param id Set the ID, created by ES for this Object + */ + void setEsId( String id ); + + /** + * Get Id content as string that is used in ES + * @return Related ID, that was specified by set command. + */ + String getEsId(); + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java new file mode 100644 index 000000000..e86c5c36b --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +import org.json.JSONObject; + +public class SearchHit { + + private String index; + private String type; + private String id; + private JSONObject source; + + public SearchHit(JSONObject o) { + this.index=o.getString("_index"); + this.type = o.getString("_type"); + this.id = o.getString("_id"); + this.source = o.getJSONObject("_source"); + } + + public String getIndex() { + return this.index; + } + public String getType() { + return this.type; + } + public String getId() { + return this.id; + } + + public String getSourceAsString() { + return this.source.toString(); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java new file mode 100644 index 000000000..eedc45c77 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SearchResult<T> { + + /** + * objects in results + */ + private final List<T> hits; + /** + * size of all potential hits + * not necessarily the number of hits + */ + private long total; + + public SearchResult(T[] hits) { + this(hits,hits==null?0:hits.length); + } + public SearchResult(T[] hits,long total) { + this.hits = Arrays.asList(hits); + this.total = total; + } +// public SearchResult(List<T> hits,long total) { +// this.hits = hits; +// this.total = total; +// } + public SearchResult() { + this.hits=new ArrayList<>(); + this.total = 0; + } + public List<T> getHits() { + return this.hits; + } + public long getTotal() { + return this.total; + } + public void setTotal(long total) { + this.total = total; + } + public void add(T object) { + this.hits.add(object); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java new file mode 100644 index 000000000..11554b5b6 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.config; + +public class HostInfo { + + public enum Protocol{ + HTTP("http"), + HTTPS("https");//, +// FILETRANSFERPROTOCOL("ftp"); + + private final String value; + + private Protocol(String s) { + this.value = s; + } + @Override + public String toString() { + return this.value; + } + public String getValue() { + return value; + } + public static Protocol getValueOf(String s) { + s = s.toLowerCase(); + for(Protocol p:Protocol.values()) { + if(p.value.equals(s)) { + return p; + } + } + return HTTP; + } + } + private static final Protocol DEFAULT_PROTOCOL = Protocol.HTTP; + public final String hostname; + public final int port; + public final Protocol protocol; + + public HostInfo(String hostname,int port, Protocol protocol) { + this.hostname = hostname; + this.port = port; + this.protocol=protocol; + + } + + public HostInfo(String hostname, int port) { + this(hostname,port,DEFAULT_PROTOCOL); + + } + + @Override + public String toString() { + return "HostInfo [hostname=" + hostname + ", port=" + port + ", protocol=" + protocol + "]"; + } + + public String toUrl() { + return String.format("%s://%s:%d",this.protocol,this.hostname,this.port); + } + + public static HostInfo getDefault() { + return new HostInfo("localhost",9200,Protocol.HTTP); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java new file mode 100644 index 000000000..19cb82669 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.data; + +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder; + +public class DbFilter { + + public static String createDatabaseRegex(String restFilterValue) { + return restFilterValue == null ? null : restFilterValue.replace("?", ".{1,1}").replace("*", ".*"); + } + + public static boolean hasSearchParams(String restFilterValue) { + return restFilterValue == null ? false : restFilterValue.contains("*") || restFilterValue.contains("?"); + } + + public static boolean isComparisonValid(String restFilterValue) { + return restFilterValue == null ? false : restFilterValue.contains(">") || restFilterValue.contains("<"); + } + + public static RangeQueryBuilder getRangeQuery(String key, String restFilterValue) { + RangeQueryBuilder query = new RangeQueryBuilder(key); + restFilterValue = restFilterValue.trim(); + if (restFilterValue.startsWith(">=")) { + query.gte(getObjectFromString(restFilterValue.substring(2).trim())); + } else if (restFilterValue.startsWith(">")) { + query.gt(getObjectFromString(restFilterValue.substring(1).trim())); + } else if (restFilterValue.startsWith("<=")) { + query.lte(getObjectFromString(restFilterValue.substring(2).trim())); + } else if (restFilterValue.startsWith("<")) { + query.lt(getObjectFromString(restFilterValue.substring(1).trim())); + } else { + return null; + } + + return query; + } + + private static Object getObjectFromString(String str) { + try { + return Double.parseDouble(str); + } catch (NumberFormatException | NullPointerException nfe) { + return str; + } + + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java new file mode 100644 index 000000000..a753122ac --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.data; + +import org.onap.ccsdk.features.sdnr.wt.common.database.IsEsObject; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * @author Herbert + * + */ +public class EsObject implements IsEsObject { + + @JsonIgnore + private String esId; + + @Override + public String getEsId() { + return esId; + } + + @Override + public void setEsId(String esId) { + this.esId = esId; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java new file mode 100644 index 000000000..5edc2613d --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.queries; + +import org.json.JSONArray; +import org.json.JSONObject; + +public class BoolQueryBuilder extends QueryBuilder { + + private JSONObject inner; + + public BoolQueryBuilder() { + super(); + this.inner = new JSONObject(); + this.setQuery("bool", this.inner); + } + + @Override + public String toString() { + return "BoolQueryBuilder [inner=" + inner + "]"; + } + + public BoolQueryBuilder must(QueryBuilder matchQuery) { + + if(this.inner.has("must") || this.inner.has("match") || this.inner.has("regexp")) { + Object x = this.inner.has("must") ?this.inner.get("must"):this.inner; + if(x instanceof JSONArray) { + ((JSONArray)x).put(matchQuery.getInner()); + } + else { + this.inner = new JSONObject(); + this.inner.put("must", new JSONObject()); + JSONArray a=new JSONArray(); + a.put(x); + a.put(matchQuery.getInner()); + this.inner.put("must", a); + } + } + + else { + this.inner = matchQuery.getInner(); + } + this.setQuery("bool", this.inner); + return this; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java new file mode 100644 index 000000000..c1f372cc9 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.queries; + +import org.json.JSONArray; +import org.json.JSONObject; + +public class QueryBuilder { + + private JSONObject innerQuery; + private final JSONObject outerQuery; + private final JSONObject queryObj; + + public QueryBuilder() { + this.outerQuery = new JSONObject(); + this.queryObj = new JSONObject(); + this.outerQuery.put("query", this.queryObj); + + } + + public QueryBuilder from(long from) { + this.outerQuery.put("from", from); + return this; + } + + public QueryBuilder size(long size) { + this.outerQuery.put("size", size); + return this; + } + + public QueryBuilder sort(String prop, SortOrder order) { + JSONArray a; + if (this.outerQuery.has("sort")) { + a = this.outerQuery.getJSONArray("sort"); + } else { + a = new JSONArray(); + } + JSONObject sortObj = new JSONObject(); + JSONObject orderObj = new JSONObject(); + orderObj.put("order", order.getValue()); + sortObj.put(prop, orderObj); + a.put(sortObj); + this.outerQuery.put("sort", a); + return this; + } + + public QueryBuilder aggregations(String key, SortOrder sortOrder) { + JSONObject keyquery = new JSONObject(); + JSONObject terms = new JSONObject(); + JSONObject field = new JSONObject(); + field.put("field", key); + terms.put("terms", field); + if(sortOrder!=null) { + JSONObject so = new JSONObject(); + so.put("_key",sortOrder.getValue()); + terms.put("order", so); + } + keyquery.put(key, terms); + this.outerQuery.put("aggs", keyquery); + return this; + } + + protected QueryBuilder setQuery(String key, JSONObject query) { + this.innerQuery = query; + this.queryObj.put(key, this.innerQuery); + return this; + } + + public JSONObject getInner() { + return this.queryObj; + } + public boolean contains(String match) { + return this.toJSON().contains(match); + } + public String toJSON() { + return this.outerQuery.toString(); + } + + public QueryBuilder aggregations(String key) { + return this.aggregations(key, null); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java new file mode 100644 index 000000000..b9271c22b --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.queries; + +import org.json.JSONObject; + +public class QueryBuilders { + + public static QueryBuilder matchAllQuery() { + return new QueryBuilder().setQuery("match_all",new JSONObject()); + } + public static QueryBuilder termQuery(String key, String value) { + JSONObject o=new JSONObject(); + o.put(key, value); + return new QueryBuilder().setQuery("term", o); + } + public static QueryBuilder matchQuery(String key, Object value) { + JSONObject o=new JSONObject(); + o.put(key, value); + return new QueryBuilder().setQuery("match", o); + } + public static BoolQueryBuilder boolQuery() { + return new BoolQueryBuilder(); + } + public static RangeQueryBuilder rangeQuery(String key) { + return new RangeQueryBuilder(key); + } + public static RegexQueryBuilder regex(String propertyName, String re) { + return new RegexQueryBuilder().add(propertyName, re); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java new file mode 100644 index 000000000..e9df263ea --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java @@ -0,0 +1,85 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.queries; + +import org.json.JSONObject; + +public class RangeQueryBuilder extends QueryBuilder{ + + private Object gtValue=null; + private Object gteValue=null; + private Float boost=2.0f; + private Object ltValue=null; + private Object lteValue=null; + private String key; + + public RangeQueryBuilder(String key) { + super(); + this.key=key; + + } + + private void setQuery() { + JSONObject r=new JSONObject(); + JSONObject k=new JSONObject(); + if(this.gteValue!=null) { + k.put("gte", this.gteValue); + }else if(this.gtValue!=null) { + k.put("gt", this.gtValue); + } + if(this.lteValue!=null) { + k.put("lte", this.lteValue); + } else if(this.ltValue!=null) { + k.put("lt", this.ltValue); + } + if(this.boost!=null) { + k.put("boost", this.boost); + } + r.put(this.key,k); + + this.setQuery("range",r); + } + + + public RangeQueryBuilder lte(Object compare) { + this.lteValue=compare; + this.ltValue=null; + this.setQuery(); + return this; + } + public RangeQueryBuilder lt(Object compare) { + this.lteValue=null; + this.ltValue=compare; + this.setQuery(); + return this; + } + + public RangeQueryBuilder gte(Object compare) { + this.gteValue=compare; + this.gtValue=null; + this.setQuery(); + return this; + } + public RangeQueryBuilder gt(Object compare) { + this.gteValue=null; + this.gtValue=compare; + this.setQuery(); + return this; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java new file mode 100644 index 000000000..d9f9c1069 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.queries; + +import org.json.JSONObject; + +public class RegexQueryBuilder extends QueryBuilder { + + private JSONObject inner; + + public RegexQueryBuilder() { + super(); + this.inner = new JSONObject(); + this.setQuery("regexp", this.inner); + } + public RegexQueryBuilder add(String propertyName, String filter) { + JSONObject regexFilter = new JSONObject(); + regexFilter.put("value", filter); + regexFilter.put("flags", "ALL"); + regexFilter.put("max_determinized_states", 10000); + this.inner.put(propertyName, regexFilter); + return this; + } + @Override + public String toString() { + return "RegexQueryBuilder [inner=" + inner + "]"; + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java new file mode 100644 index 000000000..aae7f6433 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.queries; + +public enum SortOrder { + + ASCENDING("asc"), + DESCENDING("desc"); + + private final String value; + + SortOrder(String so){ + this.value=so; + } + public String getValue() { + return this.value; + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java new file mode 100644 index 000000000..e00cd1a03 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +import org.elasticsearch.client.Request; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class BaseRequest { + + private static final Logger LOG = LoggerFactory.getLogger(BaseRequest.class); + + protected final Request request; + private String query; + public BaseRequest(String method, String endpoint) { + LOG.debug("create request {} {}", method, endpoint); + this.request = new Request(method, endpoint); + query=null; + } + + public Request getInner() { + + return this.request; + } + + public static String urlEncodeValue(String value) { + if (value == null) + return null; + try { + return URLEncoder.encode(value, StandardCharsets.UTF_8.toString()).replace("+", "%20"); + } catch (UnsupportedEncodingException ex) { + LOG.warn("encoding problem: {}", ex.getMessage()); + } + return value; + } + @Override + public String toString() { + return this.request.getMethod() + " "+this.request.getEndpoint()+ " : "+(this.query!=null?this.query:"no query"); + } + + protected void setQuery(QueryBuilder query) { + this.setQuery(query.toJSON()); + } + + public void setQuery(JSONObject o) { + this.setQuery(o.toString()); + } + + public void setQuery(String content) { + this.query=content; + LOG.trace("query={}",content); + this.request.setJsonEntity(this.query); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java new file mode 100644 index 000000000..4c1d85870 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +public class ClusterHealthRequest extends BaseRequest{ + + + public ClusterHealthRequest() { + super("GET","/_cluster/health"); + } + + public void timeout(long seconds) { + this.request.addParameter("timeout", String.valueOf(seconds)+"s"); + + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java new file mode 100644 index 000000000..0e00d5d49 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +public class CountRequest extends BaseRequest{ + + + public CountRequest(String alias,String dataType) { + super("GET",String.format("/%s/%s/_count",alias,dataType)); + } + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java new file mode 100644 index 000000000..c7e27ee4a --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import org.json.JSONObject; + +//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.create.json +//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_mapping.json +public class CreateIndexRequest extends BaseRequest{ + + private JSONObject settings; + private JSONObject mappings; + + public CreateIndexRequest(String index) { + super("PUT","/"+index); + this.mappings=new JSONObject(); + } + + private void setRequest() { + + JSONObject o=new JSONObject(); + if(this.mappings!=null) { + o.put("mappings", this.mappings); + } + if(this.settings!=null) { + o.put("settings", this.settings); + } + super.setQuery(o); + } + public void mappings(JSONObject mappings) { + this.mappings=mappings; + this.setRequest(); + } + + public void settings(JSONObject settings) { + this.settings = settings; + this.setRequest(); + } + + public boolean hasMappings() { + return this.mappings!=null; + } + + public boolean hasSettings() { + return this.settings!=null; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java new file mode 100644 index 000000000..b02f027b2 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; + +public class DeleteByQueryRequest extends BaseRequest { + + public DeleteByQueryRequest(String alias) { + super("POST",String.format("/%s/_delete_by_query",alias)); + } + + public void source(QueryBuilder query) { + this.setQuery(query); + } + + + + +}
\ No newline at end of file diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java new file mode 100644 index 000000000..f673c53a4 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.delete.json +public class DeleteIndexRequest extends BaseRequest{ + + public DeleteIndexRequest(String index) { + super("DELETE","/"+index); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java new file mode 100644 index 000000000..fb84ce4a9 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +public class DeleteRequest extends BaseRequest { + + public DeleteRequest(String alias,String dataType,String esId) { + super("DELETE",String.format("/%s/%s/%s",alias,dataType,BaseRequest.urlEncodeValue(esId))); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java new file mode 100644 index 000000000..2a56b2160 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.exists.json +public class GetIndexRequest extends BaseRequest { + + public GetIndexRequest(String index) { + super("HEAD","/"+index); + } + + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java new file mode 100644 index 000000000..855a7c4a6 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import javax.annotation.Nonnull; + +public class GetRequest extends BaseRequest{ + + public GetRequest(String alias,String dataType,@Nonnull String esId) { + super("GET",String.format("/%s/%s/%s",alias,dataType,BaseRequest.urlEncodeValue(esId))); + } + + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java new file mode 100644 index 000000000..521760c21 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import javax.annotation.Nullable; + +public class IndexRequest extends BaseRequest{ + + public IndexRequest(String alias, String dataType) { + this(alias,dataType,null); + } + + public IndexRequest(String alias,String dataType, @Nullable String esId) { + super("POST",esId!=null?String.format("/%s/%s/%s",alias,dataType,BaseRequest.urlEncodeValue(esId)):String.format("/%s/%s",alias,dataType)); + } + + public void source(String content) { + super.setQuery(content); + } + + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java new file mode 100644 index 000000000..e9436e946 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_alias.json +public class IndicesAliasesRequest extends BaseRequest{ + + public IndicesAliasesRequest(String index, String alias) { + super("PUT", String.format("/%s/_alias/%s",index,alias)); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java new file mode 100644 index 000000000..e77a39a0a --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +public class NodeStatsRequest extends BaseRequest{ + + + public NodeStatsRequest() { + super("GET","/_nodes/stats"); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java new file mode 100644 index 000000000..e7cdd0c1a --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +public class RefreshIndexRequest extends BaseRequest{ + + public RefreshIndexRequest(String alias) { + super("GET",String.format("/%s/_refresh",alias)); + } + + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java new file mode 100644 index 000000000..86fa8a91f --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; + +public class SearchRequest extends BaseRequest{ + + public SearchRequest(String alias,String dataType) { + super("POST",String.format("/%s/%s/_search", alias,dataType)); + } + + @Override + public void setQuery(QueryBuilder query){ + super.setQuery(query); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java new file mode 100644 index 000000000..b1469a57e --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; + +public class UpdateByQueryRequest extends BaseRequest { + + private JSONObject params; + + public UpdateByQueryRequest(String alias, String dataType) { + super("POST", String.format("/%s/%s/_update_by_query", alias, dataType)); + this.params = null; + } + + public void source(String esId, JSONObject map) { + this.source(map, QueryBuilders.matchQuery("_id", esId)); + } + + public void source(JSONObject map, QueryBuilder query) { + JSONObject outer = new JSONObject(); + outer.put("query", query.getInner()); + JSONObject script = new JSONObject(); + script.put("lang", "painless"); + script.put("inline", this.createInline(map)); + if(this.params!=null) { + script.put("params",this.params); + } + outer.put("script", script); + super.setQuery(outer.toString()); + } + + private String createInline(JSONObject map) { + String s = "", k, pkey; + int i = 1; + Object value; + for (Object key : map.keySet()) { + k = String.valueOf(key); + value = map.get(k); + if (value instanceof JSONObject || value instanceof JSONArray) { + pkey = String.format("p%d", i++); + if (value instanceof JSONObject) { + this.withParam(pkey, (JSONObject) value); + } else { + this.withParam(pkey, (JSONArray) value); + } + + s += String.format("ctx._source['%s']=%s;", key, "params." + pkey); + } else { + s += String.format("ctx._source['%s']=%s;", key, escpaped(value)); + } + } + return s; + } + + private UpdateByQueryRequest withParam(String key, JSONArray p) { + if (this.params == null) { + this.params = new JSONObject(); + } + this.params.put(key, p); + return this; + } + + private UpdateByQueryRequest withParam(String key, JSONObject p) { + if (this.params == null) { + this.params = new JSONObject(); + } + this.params.put(key, p); + return this; + } + + private String escpaped(Object value) { + String s = ""; + if (value instanceof Boolean || value instanceof Integer || value instanceof Long || value instanceof Float + || value instanceof Double) { + s = String.valueOf(value); + } else { + s = "\"" + String.valueOf(value) + "\""; + } + return s; + + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java new file mode 100644 index 000000000..adab44df9 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.requests; + +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UpdateRequest extends BaseRequest { + + private static final Logger LOG = LoggerFactory.getLogger(UpdateRequest.class); + private JSONObject params; + + public UpdateRequest(String alias, String dataType, String esId) { + super("POST", String.format("/%s/%s/%s/_update", alias, dataType, BaseRequest.urlEncodeValue(esId))); + this.params = null; + } + + private UpdateRequest withParam(String key, JSONObject p) { + if (this.params == null) { + this.params = new JSONObject(); + } + this.params.put(key, p); + return this; + } + + private UpdateRequest withParam(String key, JSONArray p) { + if (this.params == null) { + this.params = new JSONObject(); + } + this.params.put(key, p); + return this; + } + public void source(JSONObject map) { + this.source(map,null); + } + public void source(JSONObject map, List<String> onlyForInsert) { + JSONObject outer = new JSONObject(); + JSONObject script = new JSONObject(); + script.put("lang", "painless"); + script.put("source", this.createInline(map,onlyForInsert)); + if(this.params!=null) { + script.put("params",this.params); + } + outer.put("script", script); + outer.put("upsert", map); + LOG.debug("update payload: " + outer.toString()); + super.setQuery(outer.toString()); + } + + private String createInline(JSONObject map, List<String> onlyForInsert) { + if(onlyForInsert==null) { + onlyForInsert = new ArrayList<String>(); + } + String s = "",k=""; + Object value; + String pkey; + int i = 0; + for (Object key : map.keySet()) { + k=String.valueOf(key); + if(onlyForInsert.contains(k)) { + continue; + } + value = map.get(k); + if (value instanceof JSONObject || value instanceof JSONArray) { + pkey = String.format("p%d", i++); + if (value instanceof JSONObject) { + this.withParam(pkey, (JSONObject) value); + } else { + this.withParam(pkey, (JSONArray) value); + } + + s += String.format("ctx._source['%s']=%s;", key, "params."+pkey); + } else { + s += String.format("ctx._source['%s']=%s;", key, escpaped(value)); + } + } + return s; + } + + private String escpaped(Object value) { + String s = ""; + if (value instanceof Boolean || value instanceof Integer || value instanceof Long || value instanceof Float + || value instanceof Double) { + s = String.valueOf(value); + } else { + s = "\"" + String.valueOf(value) + "\""; + } + return s; + + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java new file mode 100644 index 000000000..291ed5190 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; + +public class AcknowledgedResponse extends BaseResponse{ + + private boolean isAcknowledged; + + public AcknowledgedResponse(Response response) { + super(response); + JSONObject o = this.getJson(response); + if(o!=null) { + this.isAcknowledged=o.getBoolean("acknowledged"); + } + } + + public boolean isAcknowledged() { + return this.isAcknowledged; + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java new file mode 100644 index 000000000..debd5e4ef --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +public class AggregationEntries extends LinkedHashMap<String,Long>{ + + private static final long serialVersionUID = 1L; + + /** + * Return page with keys + * @param size elements + * @param offset start position in list. + * @return List<String> with selected values + */ + public String[] getKeysAsPagedStringList(long size, long offset) { + List<String> ltps = new ArrayList<String>(); + String[] keys = keySet().toArray(new String[0]); + for (long i = offset; i < keys.length && i < offset + size; i++) { + ltps.add(keys[(int) i]); + } + return ltps.toArray(new String[0]); + } + + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java new file mode 100644 index 000000000..49447f660 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Scanner; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BaseResponse { + private static final Logger LOG = LoggerFactory.getLogger(BaseResponse.class); + private int responseCode; + + public int getResponseCode() { + return this.responseCode; + } + public boolean isResponseSucceeded() { + return this.responseCode<300; + } + public BaseResponse() { + } + public BaseResponse(Response response) { + this.responseCode = response!=null?response.getStatusLine().getStatusCode():0; + } + protected JSONObject getJson(Response response) { + Scanner s; + JSONObject o=null; + try { + //input stream used because Scanner ignored whitespaces + InputStream is = response.getEntity().getContent(); + long len; + int BUFSIZE=1024; + byte[] buffer = new byte[BUFSIZE]; + StringBuffer sresponse = new StringBuffer(); + while (true) { + len = is.read(buffer, 0, BUFSIZE); + if (len <= 0) { + break; + } + + sresponse.append(new String(buffer)); + } + + LOG.debug("parsing response={}",sresponse); + o = new JSONObject(sresponse.toString()); + } catch (UnsupportedOperationException | IOException e) { + LOG.warn("error parsing es response: {}",e.getMessage()); + } + + return o; + } + protected JSONObject getJson(String json) { + return new JSONObject(json); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java new file mode 100644 index 000000000..3f47ac286 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import java.io.IOException; +import org.elasticsearch.client.Response; +import org.json.JSONException; +import org.json.JSONObject; + +public class ClusterHealthResponse extends BaseResponse { + + public static final String HEALTHSTATUS_GREEN = "green"; + public static final String HEALTHSTATUS_YELLOW = "yellow"; + public static final String HEALTSTATUS_RED = "red"; + + private String status; + private boolean timedOut; + + /* + * "cluster_name": "docker-cluster", "status": "yellow", "timed_out": false, + * "number_of_nodes": 1, "number_of_data_nodes": 1, "active_primary_shards": 5, + * "active_shards": 5, "relocating_shards": 0, "initializing_shards": 0, + * "unassigned_shards": 5, "delayed_unassigned_shards": 0, + * "number_of_pending_tasks": 0, "number_of_in_flight_fetch": 0, + * "task_max_waiting_in_queue_millis": 0, "active_shards_percent_as_number": 50 + */ + public ClusterHealthResponse(Response response) throws UnsupportedOperationException, IOException, JSONException { + super(response); + + JSONObject o = this.getJson(response); + if (o != null) { + this.status = o.getString("status"); + this.timedOut = o.getBoolean("timed_out"); + } + } + + public boolean isTimedOut() { + return this.timedOut; + } + public boolean isStatusMinimal(String status) { + if (status == null) { + return true; + } + if (this.status.equals(HEALTHSTATUS_GREEN)) { + return true; + } + if (this.status.equals(HEALTHSTATUS_YELLOW) && !status.equals(HEALTHSTATUS_GREEN)) { + return true; + } + if (this.status.equals(status)) { + return true; + } + return false; + + } + + public String getStatus() { + return this.status; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java new file mode 100644 index 000000000..429c3394d --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; + +public class CountResponse extends BaseResponse { + + private long count; + + public CountResponse(Response response) { + super(response); + + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java new file mode 100644 index 000000000..29f7e886e --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; + +public class CreateIndexResponse extends AcknowledgedResponse { + + public CreateIndexResponse(Response response) { + super(response); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java new file mode 100644 index 000000000..467f7e95a --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; + +/** + * {"took":1,"batches":0,"retries":{"search":0,"bulk":0},"throttled_millis":0,"total":0,"deleted":0,"noops":0,"requests_per_second":-1,"failures":[],"version_conflicts":0,"throttled_until_millis":0,"timed_out":false} + * @author jack + * + */ +public class DeleteByQueryResponse extends BaseResponse { + + private int deleted; + + public DeleteByQueryResponse(Response response) { + super(response); + try { + JSONObject o = this.getJson(response); + if (o != null) { + this.deleted = o.getInt("deleted"); + } + } + catch(Exception e) { + this.deleted=0; + } + + } + + public int getDeleted() { + return this.deleted; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java new file mode 100644 index 000000000..7eb0a97ba --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; + +public class DeleteIndexResponse extends AcknowledgedResponse { + + public DeleteIndexResponse(Response response) { + super(response); + } + +}
\ No newline at end of file diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java new file mode 100644 index 000000000..db9124df7 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; + +public class DeleteResponse extends BaseResponse { + + private boolean isDeleted; + + public DeleteResponse(Response response) { + super(response); + int code = response.getStatusLine().getStatusCode(); + if (code < 210) { + + JSONObject o = this.getJson(response); + if (o != null) { + this.isDeleted = "deleted".equals(o.getString("result")); + } + } + else { + this.isDeleted=false; + } + + } + + public boolean isDeleted() { + return this.isDeleted; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java new file mode 100644 index 000000000..49e3ad9a7 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; + +public class GetResponse extends BaseResponse { + + private boolean found; + private SearchHit result; + + public GetResponse(Response response) { + super(response); + if (this.isResponseSucceeded()) { + JSONObject o = this.getJson(response); + this.found = o.getBoolean("found"); + this.result = new SearchHit(o); + } else { + this.found = false; + this.result = null; + } + + } + + public boolean isExists() { + return this.found; + } + + public String getSourceAsBytesRef() { + return this.result.getSourceAsString(); + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java new file mode 100644 index 000000000..499cd3719 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; + +public class IndexResponse extends BaseResponse{ + + private boolean isCreated; + private String id; + private boolean isUpdated; + + public IndexResponse(Response response) { + super(response); + JSONObject o = this.getJson(response); + this.id=o.getString("_id"); + this.isCreated="created".equals(o.getString("result")); + this.isUpdated="updated".equals(o.getString("result")); + //{"_index":"historicalperformance24h","_type":"historicalperformance24h","_id":"CbZxvWwB4xjGPydc9ida","_version":1,"result":"created","_shards":{"total":4,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1} + } + + public String getId() { + return this.id; + } + + public boolean isCreated() { + return this.isCreated; + } + public boolean isUpdated() { + return this.isUpdated; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java new file mode 100644 index 000000000..3718fd342 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.elasticsearch.client.Response; +import org.json.JSONException; +import org.json.JSONObject; + +public class NodeStatsResponse extends BaseResponse { + + private NodesInfo nodesInfo; + private Map<String,NodeStats> nodeStats; + + public NodesInfo getNodesInfo() { + return this.nodesInfo; + } + public Map<String,NodeStats> getNodeStatistics(){ + return this.nodeStats; + } + public NodeStatsResponse(Response response) throws UnsupportedOperationException, IOException, JSONException { + super(response); + + JSONObject o = this.getJson(response); + String k; + if (o != null) { + this.nodesInfo = new NodesInfo(o.getJSONObject("_nodes")); + this.nodeStats = new HashMap<>(); + if(this.nodesInfo.successful>0) { + JSONObject stats = o.getJSONObject("nodes"); + for (Object key : stats.keySet()) { + k=String.valueOf(key); + this.nodeStats.put(k, new NodeStats(k,stats.getJSONObject(k))); + } + } + } + } + + + + public static class NodesInfo{ + @Override + public String toString() { + return "NodesInfo [total=" + total + ", successful=" + successful + ", failed=" + failed + "]"; + } + + public final int total; + public final int successful; + public final int failed; + + public NodesInfo(JSONObject o) { + this.total =o.getInt("total"); + this.successful = o.getInt("successful"); + this.failed = o.getInt("failed"); + } + } + public static class NodeStats{ + public final String name; + public final NodeTotalDiskStats total; + + @Override + public String toString() { + return "NodeStats [name=" + name + ", total=" + total + "]"; + } + + public NodeStats(String name,JSONObject o) { + this.name = name; + this.total = new NodeTotalDiskStats(o.getJSONObject("fs").getJSONObject("total")); + } + } + public static class NodeTotalDiskStats{ + public final long total; + public final long available; + public final long free; + + @Override + public String toString() { + return "NodeTotalDiskStats [total=" + total + ", available=" + available + ", free=" + free + + ", getUseDiskPercentage()=" + getUseDiskPercentage() + "]"; + } + + public float getUseDiskPercentage() { + return (total-available)*100.0f/(float)total; + } + public NodeTotalDiskStats(JSONObject o) { + this.total = o.getLong("total_in_bytes"); + this.available = o.getLong("available_in_bytes"); + this.free = o.getLong("free_in_bytes"); + } + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java new file mode 100644 index 000000000..569bef4a8 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; + +/** + * { "_shards": { "total": 10, "successful": 5, "failed": 0 } } + * + * @author jack + * + */ +public class RefreshIndexResponse extends BaseResponse { + + private boolean succeeded; + + public RefreshIndexResponse(Response response) { + super(response); + JSONObject o = this.getJson(response); + this.succeeded = o.getJSONObject("_shards").getInt("failed") == 0; + // {"_index":"historicalperformance24h","_type":"historicalperformance24h","_id":"CbZxvWwB4xjGPydc9ida","_version":1,"result":"created","_shards":{"total":4,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1} + } + + public boolean succeeded() { + return this.succeeded; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java new file mode 100644 index 000000000..f13ad7d34 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; + +public class SearchResponse extends BaseResponse { + + private long total; + private SearchHit[] searchHits; + private JSONObject aggregations; + + public SearchResponse(Response response) { + super(response); + this.handleResult(this.getJson(response)); + } + + public SearchResponse(String json) { + super(null); + this.handleResult(this.getJson(json)); + } + + private void handleResult(JSONObject result) { + if(result!=null && this.isResponseSucceeded()) { + JSONObject hitsouter=result.getJSONObject("hits"); + this.total = hitsouter.getLong("total"); + JSONArray a=hitsouter.getJSONArray("hits"); + SearchHit[] hits=new SearchHit[a.length()]; + for(int i=0;i<a.length();i++) { + hits[i]=new SearchHit(a.getJSONObject(i)); + } + this.searchHits=hits; + if(result.has("aggregations")) { + this.aggregations = result.getJSONObject("aggregations"); + } + else { + this.aggregations=null; + } + } + else { + this.searchHits=new SearchHit[0]; + } + } + public SearchHit[] getHits() { + return this.searchHits; + } + public long getTotal() { + return this.total; + } + public boolean hasAggregations() { + return this.aggregations!=null; + } + public AggregationEntries getAggregations(String property) { + AggregationEntries entries=new AggregationEntries(); + if(this.aggregations!=null && this.aggregations.has(property)) { + JSONArray a=this.aggregations.getJSONObject(property).getJSONArray("buckets"); + for(int i=0;i<a.length();i++) { + entries.put(a.getJSONObject(i).getString("key"),a.getJSONObject(i).getLong("doc_count") ); + } + } + return entries; + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java new file mode 100644 index 000000000..6205df7cb --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; + +/** + * { + * "took":47, + * "timed_out":false, + * "total":1, + * "updated":1, + * "deleted":0, + * "batches":1, + * "version_conflicts":0, + * "noops":0, + * "retries":{ + * "bulk":0, + * "search":0 + * }, + * "throttled_millis":0, + * "requests_per_second":-1.0, + * "throttled_until_millis":0, + * "failures":[]} + * @author jack + * + */ +public class UpdateByQueryResponse extends BaseResponse{ + + + private int isUpdated; + private int failures; + + public UpdateByQueryResponse(Response response) { + super(response); + JSONObject o = this.getJson(response); + + this.isUpdated=o.getInt("updated"); + this.failures = o.getJSONArray("failures").length(); + //{"_index":"historicalperformance24h","_type":"historicalperformance24h","_id":"CbZxvWwB4xjGPydc9ida","_version":1,"result":"created","_shards":{"total":4,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1} + } + + + public boolean isUpdated() { + return this.isUpdated>0; + } + public boolean hasFailures() { + return this.failures>0; + } + @Override + public String toString() { + return "UpdateByQueryResponse [isUpdated=" + isUpdated + ", failures=" + failures + "]"; + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java new file mode 100644 index 000000000..539969438 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.database.responses; + +import org.elasticsearch.client.Response; +import org.json.JSONObject; + +/** + { +"_index": "networkelement-connection-v1", +"_type": "networkelement-connection", +"_id": "sim2", +"_version": 2, +"result": "updated", +"_shards": { +"total": 2, +"successful": 1, +"failed": 0 +}, +"_seq_no": 5, +"_primary_term": 1 +} + * @author jack + * + */ +public class UpdateResponse extends BaseResponse{ + + private String result; + + public UpdateResponse(Response response) { + super(response); + JSONObject o = this.getJson(response); + + this.result=o.getString("result"); + } + + public boolean succeeded() { + if(this.result==null) { + return false; + } + String s=this.result.toLowerCase(); + return s.equals("updated") || s.equals("created"); + } + + @Override + public String toString() { + return "UpdateResponse [result=" + result + "]"; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java new file mode 100644 index 000000000..89efc45e7 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.onap.ccsdk.features.sdnr.wt.common.file; + +import java.io.File; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Check every now and then that a certain file has not changed. If it has, then call the + * {@link #doOnChange} method. + * + * @author JunHo Yoon + * @since 3.1.1 + */ +public abstract class FileWatchdog extends Thread { + private static final Logger LOGGER = LoggerFactory.getLogger(FileWatchdog.class); + /** + * The default delay between every file modification check, set to 60 seconds. + */ + public static final long DEFAULT_DELAY = 60000; + /** + * The name of the file to observe for changes. + */ + private final String filename; + + /** + * The delay to observe between every check. By default set {@link #DEFAULT_DELAY}. + */ + private long delay = DEFAULT_DELAY; + + private final File file; + private long lastModified = 0; + private boolean warnedAlready = false; + + protected FileWatchdog(String filename) { + this.filename = filename; + file = new File(filename); + setDaemon(true); + checkAndConfigure(); + } + + /** + * Set the delay to observe between each check of the file changes. + * + * @param delay the frequency of file watch. + */ + public void setDelay(long delay) { + this.delay = delay; + } + + /** + * abstract method to be run when the file is changed. + */ + protected abstract void doOnChange(); + + protected void checkAndConfigure() { + boolean fileExists; + try { + fileExists = file.exists(); + } catch (SecurityException e) { + LOGGER.warn("Was not allowed to read check file existence, file:[{}].",filename); + this.interrupt(); // there is no point in continuing + return; + } + + if (fileExists) { + long l = file.lastModified(); // this can also throw a + if (lastModified == 0) { + lastModified = l; // is very unlikely. + } + if (l > lastModified) { // however, if we reached this point this + lastModified = l; // is very unlikely. + doOnChange(); + warnedAlready = false; + } + } else { + if (!warnedAlready) { + LOGGER.debug("[{}] does not exist.", filename); + warnedAlready = true; + } + } + } + + @Override + public void run() { + while (!isInterrupted()) { + checkAndConfigure(); + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + LOGGER.debug("Interrupted sleep. {}", e.getMessage()); + Thread.currentThread().interrupt(); + } + } + LOGGER.debug("Stoppen file watchdog for file {}", filename); + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java new file mode 100644 index 000000000..d415d601f --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.file; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +public class PomFile { + + private Document xmlDoc; + + public PomFile(InputStream is) throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory + .newInstance(); +// documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); +// documentBuilderFactory.setFeature(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); +// documentBuilderFactory.setFeature(XMLInputFactory.SUPPORT_DTD, false); + + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + this.xmlDoc = documentBuilder.parse(is); + } + + public String getProperty(String key) { + Node props = findChild("properties",this.xmlDoc.getDocumentElement()); + if(props!=null) { + Node prop = findChild(key, props); + if(prop!=null) { + return getTextValue(prop); + } + } + return null; + } + + public static String getTextValue(Node node) { + StringBuffer textValue = new StringBuffer(); + for (int i = 0,length = node.getChildNodes().getLength(); i < length; i ++) { + Node c = node.getChildNodes().item(i); + if (c.getNodeType() == Node.TEXT_NODE) { + textValue.append(c.getNodeValue()); + } + } + return textValue.toString().trim(); + } + + private Node findChild(String name,Node root) { + List<Element> childs = getChildElementNodes(root); + for(Element n : childs) { + if(name.equals(n.getNodeName())) { + return n; + } + } + return null; + } + /** + * get all child nodes with type ELEMENT_NODE back in a list + * @param node parent node + * @return List with child nodes + */ + private static List<Element> getChildElementNodes(Node node) { + List<Element> res = new ArrayList<>(); + NodeList childs = node.getChildNodes(); + Node item; + //System.out.println("Query node "+node.getNodeName()); + for (int n=0; n < childs.getLength(); n++) { + item = childs.item(n); + //System.out.println(node.getNodeName()+"-"+item.getNodeName()+" "+item.getNodeType()); + if (item.getNodeType() == Node.ELEMENT_NODE) { + res.add((Element)childs.item(n)); + } + } + return res; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java new file mode 100644 index 000000000..c1cb984d0 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.file; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Example Content: + * #Generated by org.apache.felix.bundleplugin + * #Tue Nov 19 10:17:57 CET 2019 + * version=0.7.0-SNAPSHOT + * groupId=org.onap.ccsdk.features.sdnr.wt +* artifactId=sdnr-wt-data-provider-provider + * @author jack + * + */ +public class PomPropertiesFile { + + private Date buildDate; + private String version; + private String groupId; + private String artifactId; + + public Date getBuildDate() { + return this.buildDate; + } + public String getVersion() { + return this.version; + } + public String getGroupId() { + return this.groupId; + } + public String getArtifactId() { + return this.artifactId; + } + private final DateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); + public PomPropertiesFile(InputStream is) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + int intRead; + while ((intRead = is.read()) != -1) { + bos.write(intRead); + } + this.parse(new String(bos.toByteArray())); + } + + private void parse(String s) { + String[] lines = s.split("\n"); + for(String line:lines) { + + if(line.startsWith("#Generated")) { + + } else if( line.startsWith("groupId")) { + this.groupId = line.substring("groupId=".length()); + } + else if(line.startsWith("artifactId")) { + this.artifactId = line.substring("artifactId=".length()); + } + else if(line.startsWith("#")){ + try { + this.buildDate = sdf.parse(line.substring(1)); + } catch (ParseException e) { + + } + } + if(version!=null && this.buildDate!=null && this.groupId!=null && this.artifactId!=null) { + break; + } + } + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java new file mode 100644 index 000000000..0604de3bf --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java @@ -0,0 +1,328 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.http; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.security.KeyFactory; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; +import java.util.Map; +import javax.annotation.Nonnull; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.xml.bind.DatatypeConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BaseHTTPClient { + + private static Logger LOG = LoggerFactory.getLogger(BaseHTTPClient.class); + private static final int SSLCERT_NONE = -1; + private static final int SSLCERT_PCKS = 0; + private static final int SSLCERT_PEM = 1; + private static final int BUFSIZE = 1024; + private static final Charset CHARSET = StandardCharsets.UTF_8; + private static final String SSLCONTEXT = "TLSv1.2"; + private static final int DEFAULT_HTTP_TIMEOUT_MS = 30000; // in ms + + private final boolean trustAll; + private final String baseUrl; + + private int timeout = DEFAULT_HTTP_TIMEOUT_MS; + private SSLContext sc = null; + + public BaseHTTPClient(String base) { + this(base, false); + } + + public BaseHTTPClient(String base, boolean trustAllCerts) { + this(base, trustAllCerts, null, null, SSLCERT_NONE); + } + + public BaseHTTPClient(String base, boolean trustAllCerts, String certFilename, String passphrase, int sslCertType) { + if(!base.endsWith("/")) { + base+="/"; + } + this.baseUrl = base; + this.trustAll = trustAllCerts; + try { + sc = setupSsl(trustAll, certFilename, passphrase, sslCertType); + } catch (KeyManagementException | NoSuchAlgorithmException | UnrecoverableKeyException | CertificateException + | KeyStoreException | IOException | InvalidKeySpecException e) { + LOG.warn("problem ssl setup: " + e.getMessage()); + } + } + + protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, String body, Map<String, String> headers) + throws IOException { + return this.sendRequest(uri, method, body != null ? body.getBytes(CHARSET) : null, headers); + } + + protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, byte[] body, Map<String, String> headers) + throws IOException { + if (uri == null) { + uri = ""; + } + String surl = this.baseUrl; + if (!surl.endsWith("/") && uri.length() > 0) { + surl += "/"; + } + if (uri.startsWith("/")) { + uri = uri.substring(1); + } + surl += uri; + LOG.debug("try to send request with url=" + this.baseUrl + uri + " as method=" + method); + LOG.trace("body:" + (body == null ? "null" : new String(body, CHARSET))); + URL url = new URL(surl); + URLConnection http = url.openConnection(); + http.setConnectTimeout(this.timeout); + if (surl.toString().startsWith("https")) { + if (sc != null) { + ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory()); + if (trustAll) { + LOG.debug("trusting all certs"); + HostnameVerifier allHostsValid = (hostname, session) -> true; + ((HttpsURLConnection) http).setHostnameVerifier(allHostsValid); + } + } else // Should never happen + { + LOG.warn("No SSL context available"); + return new BaseHTTPResponse(-1, ""); + } + } + ((HttpURLConnection) http).setRequestMethod(method); + http.setDoOutput(true); + if (headers != null && headers.size() > 0) { + for (String key : headers.keySet()) { + http.setRequestProperty(key, headers.get(key)); + LOG.trace("set http header " + key + ": " + headers.get(key)); + } + } + byte[] buffer = new byte[BUFSIZE]; + int len = 0, lensum = 0; + // send request + // Send the message to destination + if (!method.equals("GET") && body != null && body.length > 0) { + try (OutputStream output = http.getOutputStream()) { + output.write(body); + } + } + // Receive answer + int responseCode = ((HttpURLConnection) http).getResponseCode(); + String sresponse = ""; + InputStream response = null; + try { + if (responseCode >= 200 && responseCode < 300) { + response = http.getInputStream(); + } else { + response = ((HttpURLConnection) http).getErrorStream(); + if (response == null) { + response = http.getInputStream(); + } + } + if (response != null) { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) { + break; + } + lensum += len; + sresponse += new String(buffer, 0, len, CHARSET); + } + } else { + LOG.debug("response is null"); + } + } catch (Exception e) { + LOG.debug("No response. ", e); + } finally { + if (response != null) { + response.close(); + } + } + LOG.debug("ResponseCode: " + responseCode); + LOG.trace("Response (len:{}): {}", String.valueOf(lensum), sresponse); + return new BaseHTTPResponse(responseCode, sresponse); + } + + public static SSLContext setupSsl(boolean trustall) + throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException, + IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException { + + return setupSsl(trustall, null, null, SSLCERT_NONE); + } + + /** + * @param keyFilename filename for key file + * @param certFilename filename for cert file + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + * @throws IOException + * @throws FileNotFoundException + * @throws CertificateException + * @throws KeyStoreException + * @throws UnrecoverableKeyException + * @throws InvalidKeySpecException + */ + /** + * Setup of SSLContext + * + * @param trustall true to switch of certificate verification + * @param certFilename filename for certificate file + * @param passPhrase for certificate + * @param certType of certificate + * @return SSL Context according to parameters + * @throws NoSuchAlgorithmException according name + * @throws KeyManagementException according name + * @throws CertificateException according name + * @throws FileNotFoundException according name + * @throws IOException according name + * @throws UnrecoverableKeyException according name + * @throws KeyStoreException according name + * @throws InvalidKeySpecException according name + */ + public static SSLContext setupSsl(boolean trustall, String certFilename, String passPhrase, int certType) + throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException, + IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException { + + SSLContext sc = SSLContext.getInstance(SSLCONTEXT); + TrustManager[] trustCerts = null; + if (trustall) { + trustCerts = new TrustManager[] {new javax.net.ssl.X509TrustManager() { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {} + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {} + }}; + + } + KeyManager[] kms = null; + if (certFilename != null && passPhrase != null && !certFilename.isEmpty() && !passPhrase.isEmpty()) { + if (certType == SSLCERT_PCKS) { + LOG.debug("try to load pcks file " + certFilename + " with passphrase=" + passPhrase); + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + FileInputStream fileInputStream = new FileInputStream(certFilename); + keyStore.load(fileInputStream, passPhrase.toCharArray()); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(keyStore, passPhrase.toCharArray()); + kms = kmf.getKeyManagers(); + fileInputStream.close(); + LOG.debug("successful"); + + } else if (certType == SSLCERT_PEM) { + LOG.debug("try to load pem files cert=" + certFilename + " key=" + passPhrase); + File fCert = new File(certFilename); + File fKey = new File(passPhrase); + KeyStore keyStore = KeyStore.getInstance("JKS"); + keyStore.load(null); + byte[] certBytes = parseDERFromPEM(Files.readAllBytes(fCert.toPath()), "-----BEGIN CERTIFICATE-----", + "-----END CERTIFICATE-----"); + byte[] keyBytes = parseDERFromPEM(Files.readAllBytes(fKey.toPath()), "-----BEGIN PRIVATE KEY-----", + "-----END PRIVATE KEY-----"); + + X509Certificate cert = generateCertificateFromDER(certBytes); + RSAPrivateKey key = generatePrivateKeyFromDER(keyBytes); + keyStore.setCertificateEntry("cert-alias", cert); + keyStore.setKeyEntry("key-alias", key, "changeit".toCharArray(), new Certificate[] {cert}); + + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + kmf.init(keyStore, "changeit".toCharArray()); + kms = kmf.getKeyManagers(); + LOG.debug("successful"); + } + } + // Init the SSLContext with a TrustManager[] and SecureRandom() + sc.init(kms, trustCerts, new java.security.SecureRandom()); + return sc; + } + + protected static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) { + String data = new String(pem); + String[] tokens = data.split(beginDelimiter); + tokens = tokens[1].split(endDelimiter); + return DatatypeConverter.parseBase64Binary(tokens[0]); + } + + protected static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes) + throws InvalidKeySpecException, NoSuchAlgorithmException { + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); + + KeyFactory factory = KeyFactory.getInstance("RSA"); + + return (RSAPrivateKey) factory.generatePrivate(spec); + } + + protected static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException { + CertificateFactory factory = CertificateFactory.getInstance("X.509"); + + return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certBytes)); + } + + public static String getAuthorizationHeaderValue(String username, String password) { + return "Basic " + new String(Base64.getEncoder().encode((username + ":" + password).getBytes())); + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public static int getSslCertPcks() { + return SSLCERT_PCKS; + } + + public static int getSslCertNone() { + return SSLCERT_NONE; + } + + public static int getSslCertPEM() { + return SSLCERT_PEM; + } + +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java new file mode 100644 index 000000000..2ef32fce1 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.http; + +public class BaseHTTPResponse { + + public static final int CODE404 = 404; + public static final int CODE200 = 200; + public static final BaseHTTPResponse UNKNOWN = new BaseHTTPResponse(-1, ""); + public final int code; + public final String body; + + public BaseHTTPResponse(int code,String body) + { + this.code=code; + this.body=body; + } + + @Override + public String toString() { + return "BaseHTTPResponse [code=" + code + ", body=" + body + "]"; + } + + public boolean isSuccess() { + return this.code==CODE200; + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java new file mode 100644 index 000000000..17cc231a2 --- /dev/null +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java @@ -0,0 +1,196 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import java.util.Comparator; +import java.util.Iterator; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class JSONAssert { + + /** + * nonstrict comparison means that json array items can be in different orders + */ + private static Comparator<JSONObject> nonStrictComarator = new Comparator<JSONObject>() { + + @Override + public int compare(JSONObject o1, JSONObject o2) { + if (o1.equals(o2)) { + return 0; + } + Iterator<?> keys = o1.keys(); + while (keys.hasNext()) { + String key = String.valueOf(keys.next()); + int x = this.test(o1.get(key), o2.get(key)); + if (x != 0) { + return x; + } + } + return 0; + } + + private int test(Object o1, Object o2) { + int x; + if ((o1 instanceof Double) && (o2 instanceof Double)) { + + return (((Double) o1).doubleValue() - ((Double) o2).doubleValue()) < 0 ? -1 : 1; + } else if ((o1 instanceof Boolean) && (o2 instanceof Boolean)) { + return ((Boolean) o1).booleanValue() == ((Boolean) o2).booleanValue() ? 0 : -1; + + } else if ((o1 instanceof String) && (o2 instanceof String)) { + + return ((String) o1).equals(((String) o2)) ? 0 : -1; + } else if ((o1 instanceof JSONObject) && (o2 instanceof JSONObject)) { + if (((JSONObject) o1).length() != ((JSONObject) o2).length()) { + return ((JSONObject) o1).length() - ((JSONObject) o2).length() < 0 ? -1 : 1; + } + Iterator<?> keys = ((JSONObject) o1).keys(); + while (keys.hasNext()) { + String key = String.valueOf(keys.next()); + if (!((JSONObject) o2).has(key)) { + return -1; + } + x = this.test(((JSONObject) o1).get(key), ((JSONObject) o2).get(key)); + if (x != 0) { + return x; + } + } + } else if ((o1 instanceof JSONArray) && (o2 instanceof JSONArray)) { + if (((JSONArray) o1).length() != ((JSONArray) o2).length()) { + return ((JSONArray) o1).length() - ((JSONArray) o2).length() < 0 ? -1 : 1; + } + for (int i = 0; i < ((JSONArray) o1).length(); i++) { + x = this.findInArray(((JSONArray) o1).get(i), (JSONArray) o2); + if (x != 0) { + return x; + } + } + for (int i = 0; i < ((JSONArray) o2).length(); i++) { + x = this.findInArray(((JSONArray) o2).get(i), (JSONArray) o1); + if (x != 0) { + return x; + } + } + } + return 0; + + } + + private int findInArray(Object node, JSONArray o) { + for (int i = 0; i < o.length(); i++) { + if (this.test(o.get(i), node) == 0) { + return 0; + } + } + return -1; + } + }; + /** + * strict comparison means that json array items have to be in the same order + */ + private static Comparator<JSONObject> strictComarator = new Comparator<JSONObject>() { + + @Override + public int compare(JSONObject o1, JSONObject o2) { + if (o1.equals(o2)) { + return 0; + } + Iterator<?> keys = o1.keys(); + while (keys.hasNext()) { + String key = String.valueOf(keys.next()); + int x = this.test(o1.get(key), o2.get(key)); + if (x != 0) { + return x; + } + } + return 0; + } + + private int test(Object o1, Object o2) { + int x; + if ((o1 instanceof Double) && (o2 instanceof Double)) { + + return (((Double) o1).doubleValue() - ((Double) o2).doubleValue()) < 0 ? -1 : 1; + } else if ((o1 instanceof Boolean) && (o2 instanceof Boolean)) { + return ((Boolean) o1).booleanValue() == ((Boolean) o2).booleanValue() ? 0 : -1; + + } else if ((o1 instanceof String) && (o2 instanceof String)) { + + return ((String) o1).equals(((String) o2)) ? 0 : -1; + } else if ((o1 instanceof JSONObject) && (o2 instanceof JSONObject)) { + if (((JSONObject) o1).length() == 0 && ((JSONObject) o2).length() == 0) { + return 0; + } + Iterator<?> keys = ((JSONObject) o1).keys(); + while (keys.hasNext()) { + String key = String.valueOf(keys.next()); + if (!((JSONObject) o2).has(key)) { + return -1; + } + x = this.test(((JSONObject) o1).get(key), ((JSONObject) o2).get(key)); + if (x != 0) { + return x; + } + } + } else if ((o1 instanceof JSONArray) && (o2 instanceof JSONArray)) { + if (((JSONArray) o1).length() != ((JSONArray) o2).length()) { + return ((JSONArray) o1).length() - ((JSONArray) o2).length() < 0 ? -1 : 1; + } + for (int i = 0; i < ((JSONArray) o1).length(); i++) { + x = this.test(((JSONArray) o1).get(i), ((JSONArray) o2).get(i)); + if (x != 0) { + return x; + } + } + } + return 0; + + } + }; + public static void assertEquals(String def, String toTest, boolean strict) throws JSONException { + assertEquals(null, def, toTest, strict); + } + + public static void assertEquals(String message, String def, String toTest, boolean strict) throws JSONException { + if (strict) { + assertEqualsStrict(message, def, toTest); + } else { + assertEqualsNonStrict(message, def, toTest); + } + } + + private static void assertEqualsNonStrict(String message, String def, String toTest) throws JSONException { + + JSONObject d1 = new JSONObject(def); + JSONObject d2 = new JSONObject(toTest); + if (nonStrictComarator.compare(d1, d2) != 0) { + throw new AssertionError(message); + } + } + + private static void assertEqualsStrict(String message, String def, String toTest) throws JSONException { + JSONObject d1 = new JSONObject(def); + JSONObject d2 = new JSONObject(toTest); + if (strictComarator.compare(d1, d2) != 0) { + throw new AssertionError(message); + } + } + +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java new file mode 100644 index 000000000..af3979c50 --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java @@ -0,0 +1,180 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient; +import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPResponse; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; + +@SuppressWarnings("restriction") +public class TestBaseHttpClient { + + public static final String HTTPMETHOD_GET = "GET"; + public static final String HTTPMETHOD_POST = "POST"; + public static final String HTTPMETHOD_PUT = "PUT"; + public static final String HTTPMETHOD_DELETE = "DELETE"; + public static final String HTTPMETHOD_OPTIONS = "OPTIONS"; + public static final String RESPONSE_GET = "This is the response get"; + public static final String RESPONSE_POST = "This is the response post"; + public static final String RESPONSE_PUT = "This is the response put"; + public static final String RESPONSE_DELETE = "This is the response delete"; + public static final String RESPONSE_OPTIONS = "This is the response options"; + private static final String TESTURI = "/mwtn/test"; + private static HttpServer server; + private static ExecutorService httpThreadPool; + private static final int testPort = 54440; + + @Test + public void test() { + MyHttpClient httpClient = new MyHttpClient("http://localhost:"+testPort, true); + Map<String, String> headers = new HashMap<String,String>(); + headers.put("Authorization", BaseHTTPClient.getAuthorizationHeaderValue("admin", "admin")); + headers.put("Content-Type","application/json"); + BaseHTTPResponse response=null; + try { + response= httpClient.sendRequest(TESTURI, HTTPMETHOD_GET, null, headers ); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertEquals(RESPONSE_GET, response.body); + try { + response= httpClient.sendRequest(TESTURI, HTTPMETHOD_POST, "{}", headers ); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertEquals(RESPONSE_POST, response.body); + try { + response= httpClient.sendRequest(TESTURI, HTTPMETHOD_PUT, "{}", headers ); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertEquals(RESPONSE_PUT, response.body); + try { + response= httpClient.sendRequest(TESTURI, HTTPMETHOD_DELETE, "{}", headers ); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertEquals(RESPONSE_DELETE, response.body); + + } + + + + + @BeforeClass + public static void initTestWebserver() throws IOException { + server = HttpServer.create(new InetSocketAddress("127.0.0.1", testPort), 0); + httpThreadPool = Executors.newFixedThreadPool(5); + server.setExecutor(httpThreadPool); + server.createContext(TESTURI, new MyHandler()); + //server.createContext("/", new MyRootHandler()); + server.setExecutor(null); // creates a default executor + server.start(); + System.out.println("http server started"); + } + @AfterClass + public static void stopTestWebserver() { + System.out.println("try to stop server"); + if (server != null) { + server.stop(0); + httpThreadPool.shutdownNow(); + System.out.println("http server stopped" ); + } + } + + private class MyHttpClient extends BaseHTTPClient{ + + public MyHttpClient(String base, boolean trustAllCerts) { + super(base, trustAllCerts); + } + + @Override + public BaseHTTPResponse sendRequest(String uri, String method, String body, Map<String, String> headers) + throws IOException { + return super.sendRequest(uri, method, body, headers); + } + } + + public static class MyHandler implements HttpHandler { + + @Override + public void handle(HttpExchange t) throws IOException { + String method = t.getRequestMethod(); + System.out.println(String.format("req received: %s %s" ,method,t.getRequestURI())); + OutputStream os = null; + try { + if (method.equals(HTTPMETHOD_GET)) { + t.sendResponseHeaders(200, RESPONSE_GET.length()); + os = t.getResponseBody(); + os.write(RESPONSE_GET.getBytes()); + } else if (method.equals(HTTPMETHOD_POST)) { + t.sendResponseHeaders(200, RESPONSE_POST.length()); + os = t.getResponseBody(); + os.write(RESPONSE_POST.getBytes()); + } else if (method.equals(HTTPMETHOD_PUT)) { + t.sendResponseHeaders(200, RESPONSE_PUT.length()); + os = t.getResponseBody(); + os.write(RESPONSE_PUT.getBytes()); + } else if (method.equals(HTTPMETHOD_DELETE)) { + t.sendResponseHeaders(200, RESPONSE_DELETE.length()); + os = t.getResponseBody(); + os.write(RESPONSE_DELETE.getBytes()); + } else if (method.equals(HTTPMETHOD_OPTIONS)) { + t.sendResponseHeaders(200, RESPONSE_OPTIONS.length()); + //os = t.getResponseBody(); + //os.write(RESPONSE_OPTIONS.getBytes()); + } else { + t.sendResponseHeaders(404, 0); + } + System.out.println("req handled successful"); + + } catch (Exception e) { + System.out.println(e.getMessage()); + } + finally { + if (os != null) + { + os.flush(); + os.close(); + } + } + } + } +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java new file mode 100644 index 000000000..f6f741197 --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java @@ -0,0 +1,233 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import static org.junit.Assert.*; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Files; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.exception.ConversionException; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo.Protocol; + +public class TestConfig { + + private static final String TESTFILENAME = "test.properties"; + private static final String TESTKEY1 = "abc"; + private static final String TESTKEY2 = "def"; + private static final String TESTKEY3 = "hhh"; + private static final String TESTKEY4 = "hhv"; + + private static final int TESTVALUE1=123; + private static final int TESTVALUE1_2=1234; + private static final boolean TESTVALUE2 = true; + private static final String TESTVALUE3 = "http://localhost:2223"; + private static final String TESTVALUE4 = "httasdasdas"; + private static final String TESTCONTENT1 = " [test]\n" + + TESTKEY1+"="+TESTVALUE1+"\n" + + "#her a comment\n"+ + TESTKEY2+"="+TESTVALUE2+"\n" + + TESTKEY3+"="+TESTVALUE3; + + + + + @After + @Before + public void init() { + File f=new File(TESTFILENAME); + if(f.exists()) { + f.delete(); + } + } + + public void write(String filename,String lines) { + + try { + Files.write(new File(filename).toPath(), lines.getBytes()); + } catch (IOException e) { + fail("problem writing file "+filename); + } + } + @Test + public void testRead() { + this.write(TESTFILENAME, TESTCONTENT1); + ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME); + Section section = confiuration.getSection("test").get(); + assertNotNull(section); + try { + assertEquals(TESTVALUE1, section.getInt(TESTKEY1, 0)); + assertEquals(TESTVALUE2, section.getBoolean(TESTKEY2, !TESTVALUE2)); + assertEquals(TESTVALUE3, section.getString(TESTKEY3, "")); + } catch (ConversionException e) { + fail(e.getMessage()); + } + this.init(); + } + @Test + public void testWrite() { + final String SECTIONNAME = "test"; + //write values + ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME); + Section section=confiuration.addSection(SECTIONNAME); + + section.setProperty(TESTKEY1, String.valueOf(TESTVALUE1)); + section.setProperty(TESTKEY2, String.valueOf(TESTVALUE2)); + section.setProperty(TESTKEY3, String.valueOf(TESTVALUE3)); + confiuration.save(); + + //verify written + ConfigurationFileRepresentation confiuration2=new ConfigurationFileRepresentation(TESTFILENAME); + + section = confiuration2.getSection(SECTIONNAME).get(); + assertNotNull(section); + try { + assertEquals(TESTVALUE1, section.getInt(TESTKEY1, 0)); + assertEquals(TESTVALUE2, section.getBoolean(TESTKEY2, !TESTVALUE2)); + assertEquals(TESTVALUE3, section.getString(TESTKEY3, "")); + } catch (ConversionException e) { + fail(e.getMessage()); + } + this.init(); + + //write directly into base + confiuration=new ConfigurationFileRepresentation(TESTFILENAME); + section=confiuration.addSection(SECTIONNAME); + confiuration.setProperty(SECTIONNAME,TESTKEY1 , TESTVALUE1); + confiuration.setProperty(SECTIONNAME,TESTKEY2 , TESTVALUE2); + confiuration.setProperty(SECTIONNAME,TESTKEY3 , TESTVALUE3); + confiuration.save(); + + //verify + confiuration2=new ConfigurationFileRepresentation(TESTFILENAME); + section = confiuration2.getSection(SECTIONNAME).get(); + assertNotNull(section); + assertEquals(TESTVALUE1, confiuration.getPropertyLong(SECTIONNAME,TESTKEY1).get().intValue()); + assertEquals(TESTVALUE2, confiuration.getPropertyBoolean(SECTIONNAME,TESTKEY2)); + assertEquals(TESTVALUE3, confiuration.getProperty(SECTIONNAME,TESTKEY3)); + this.init(); + + + } + @Test + public void testOverwrite() { + final String SECTIONNAME = "test"; + //write values + ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME); + Section section=confiuration.addSection(SECTIONNAME); + + section.setProperty(TESTKEY1, String.valueOf(TESTVALUE1)); + section.setProperty(TESTKEY2, String.valueOf(TESTVALUE2)); + section.setProperty(TESTKEY3, String.valueOf(TESTVALUE3)); + confiuration.save(); + + //verify written + ConfigurationFileRepresentation confiuration2=new ConfigurationFileRepresentation(TESTFILENAME); + + section = confiuration2.getSection(SECTIONNAME).get(); + + assertNotNull(section); + try { + assertEquals(TESTVALUE1, section.getInt(TESTKEY1, 0)); + assertEquals(TESTVALUE2, section.getBoolean(TESTKEY2, !TESTVALUE2)); + assertEquals(TESTVALUE3, section.getString(TESTKEY3, "")); + } catch (ConversionException e) { + fail(e.getMessage()); + } + + //write directly into base + confiuration=new ConfigurationFileRepresentation(TESTFILENAME); + section=confiuration.addSection(SECTIONNAME); + confiuration.setPropertyIfNotAvailable(SECTIONNAME,TESTKEY1 , TESTVALUE1_2); + confiuration.setPropertyIfNotAvailable(SECTIONNAME,TESTKEY4 , TESTVALUE4); + + confiuration.save(); + + //verify + confiuration2=new ConfigurationFileRepresentation(TESTFILENAME); + section = confiuration2.getSection(SECTIONNAME).get(); + assertNotNull(section); + assertEquals(TESTVALUE1, confiuration.getPropertyLong(SECTIONNAME,TESTKEY1).get().intValue()); + assertEquals(TESTVALUE2, confiuration.getPropertyBoolean(SECTIONNAME,TESTKEY2)); + assertEquals(TESTVALUE3, confiuration.getProperty(SECTIONNAME,TESTKEY3)); + assertEquals(TESTVALUE4, confiuration.getProperty(SECTIONNAME,TESTKEY4)); + this.init(); + + + } + static boolean changeFlag=false; + @Test + public void testChangeListener() { + + changeFlag=false; + this.init(); + ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME); + IConfigChangedListener listener = new IConfigChangedListener() { + + @Override + public void onConfigChanged() { + changeFlag=true; + } + }; + confiuration.registerConfigChangedListener(listener ); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + Thread.interrupted(); + } + this.write(TESTFILENAME, TESTCONTENT1); + int i=10; + while(i-->0) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Thread.interrupted(); + } + if(changeFlag) { + break; + } + } + confiuration.unregisterConfigChangedListener(listener); + assertTrue("changelistener not called",changeFlag); + } + @Test + public void testHostInfo() { + HostInfo hi=HostInfo.getDefault(); + try { + new URL(hi.toUrl()); + } catch (MalformedURLException e) { + fail("url conversion failed: "+e.getMessage()); + } + hi = new HostInfo("localhost", 44444, Protocol.getValueOf("https")); + try { + new URL(hi.toUrl()); + } catch (MalformedURLException e) { + fail("url conversion failed: "+e.getMessage()); + } + + } +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java new file mode 100644 index 000000000..2dd74bbec --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.json.JSONException; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter; + +public class TestDatabaseFilterConversion { + + @Test + public void testStartsWith() { + String re=DbFilter.createDatabaseRegex("abc*"); + assertEquals("abc.*", re); + } + @Test + public void testEndsWith() { + String re=DbFilter.createDatabaseRegex("*abc"); + assertEquals(".*abc", re); + } + @Test + public void testMultiple() { + String re=DbFilter.createDatabaseRegex("abc*ff*fa"); + assertEquals("abc.*ff.*fa", re); + } + + @Test + public void testPlaceholder() { + String re=DbFilter.createDatabaseRegex("abc?ef"); + assertEquals("abc.{1,1}ef", re); + } + @Test + public void testCombined() { + String re=DbFilter.createDatabaseRegex("abc?ff*fa"); + assertEquals("abc.{1,1}ff.*fa", re); + } + @Test + public void testFilterCheck() { + assertTrue(DbFilter.hasSearchParams("abc?")); + assertTrue(DbFilter.hasSearchParams("bac*")); + assertFalse(DbFilter.hasSearchParams("abc+")); + } + @Test + public void testRangeConversion() { + try { + JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"gte\":2230,\"boost\":2}}}}", + DbFilter.getRangeQuery("port", ">=2230").toJSON(),true); + JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"gt\":2230,\"boost\":2}}}}", + DbFilter.getRangeQuery("port", ">2230").toJSON(),true); + JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"lte\":2230,\"boost\":2}}}}", + DbFilter.getRangeQuery("port", "<=2230").toJSON(),true); + JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"lt\":2230,\"boost\":2}}}}", + DbFilter.getRangeQuery("port", "<2230").toJSON(),true); + JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"timestamp\":{\"lt\":\"2018-01-01T23:59:59.0Z\",\"boost\":2}}}}", + DbFilter.getRangeQuery("timestamp", "<2018-01-01T23:59:59.0Z").toJSON(),true); + } catch (JSONException e) { + fail(e.getMessage()); + } + } + +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java new file mode 100644 index 000000000..0d46b4d20 --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import static org.junit.Assert.*; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; + +public class TestDbClient { + + private static HtDatabaseClient dbClient; + private static HostInfo[] hosts = new HostInfo[] { new HostInfo("localhost", Integer + .valueOf(System.getProperty("databaseport") != null ? System.getProperty("databaseport") : "49200")) }; + + @BeforeClass + public static void init() { + + dbClient = new HtDatabaseClient(hosts); + dbClient.waitForYellowStatus(20000); + + } + @Test + public void testCRUD() { + final String IDX = "test23-knmoinsd"; + final String ID = "abcddd"; + final String JSON = "{\"data\":{\"inner\":\"more\"}}"; + final String JSON2 = "{\"data\":{\"inner\":\"more2\"}}"; + //Create + String esId=dbClient.doWriteRaw(IDX, ID, JSON); + assertEquals("inserted id is wrong",ID,esId); + //Read + SearchResult<SearchHit> result = dbClient.doReadByQueryJsonData(IDX, QueryBuilders.matchQuery("_id", ID)); + assertEquals("amount of results is wrong",1,result.getTotal()); + assertEquals("data not valid", JSON,result.getHits().get(0).getSourceAsString()); + //Update + esId= dbClient.doUpdateOrCreate(IDX, ID, JSON2); + assertEquals("update response not successfull",ID,esId); + //Verify + result = dbClient.doReadByQueryJsonData( IDX, QueryBuilders.matchQuery("_id", ID)); + assertEquals("amount of results is wrong",1,result.getTotal()); + assertEquals("data not valid", JSON2,result.getHits().get(0).getSourceAsString()); + //Delete + boolean del=dbClient.doRemove(IDX, ID); + assertTrue("item not deleted",del); + //Verify + result = dbClient.doReadByQueryJsonData(IDX, QueryBuilders.matchQuery("_id", ID)); + assertEquals("amount of results is wrong",0,result.getTotal()); + } + +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java new file mode 100644 index 000000000..40c2cfe9a --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java @@ -0,0 +1,223 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import static org.junit.Assert.fail; + +import org.json.JSONException; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder; +import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert; + + +public class TestDbQueries { + + private static final String MATCH_ALL_QUERY = "{\n" + + " \"query\": {\n" + + " \"match_all\" : {\n" + + " }\n" + + " }\n" + + "}"; + private static final String MATCH_QUERY_KEY = "is-required"; + private static final Object MATCH_QUERY_VALUE = true; + private static final String MATCH_QUERY = "{\n" + + " \"query\": {\n" + + " \"match\" : {\n" + + " \""+MATCH_QUERY_KEY+"\" : "+MATCH_QUERY_VALUE+"\n" + + " }\n" + + " }\n" + + "}"; + private static final String MATCH_QUERY_KEY2 = "node-id"; + private static final Object MATCH_QUERY_VALUE2 = "sim2"; + private static final String BOOL_QUERY = "{\n" + + " \"query\": {\n" + + " \"bool\": {\n" + + " \"must\": [\n" + + " {\n" + + " \"match\": {\n" + + " \""+MATCH_QUERY_KEY+"\": "+MATCH_QUERY_VALUE+"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"match\": {\n" + + " \""+MATCH_QUERY_KEY2+"\":"+MATCH_QUERY_VALUE2+" \n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + " }\n" + + "}"; + private static final String RANGE_QUERY_KEY = "timestamp"; + private static final String RANGE_QUERY_LTEND = "2017-08-10T20:00:00.0Z"; + private static final String RANGE_QUERY = "{\n" + + " \"query\": {\n" + + " \"range\" : {\n" + + " \""+RANGE_QUERY_KEY+"\" : {\n" + + " \"lte\" : \""+RANGE_QUERY_LTEND+"\",\n" + + " \"boost\": 2.0\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + private static final String RANGEBOOL_QUERY="{\n" + + " \"query\": {\n" + + " \"bool\": {\n" + + " \"must\": [\n" + + " {\n" + + " \"match\": {\n" + + " \"is-required\": true\n" + + " }\n" + + " },\n" + + " {\n" + + " \"regexp\": {\n" + + " \"node-id\": {\n" + + " \"max_determinized_states\": 10000,\n" + + " \"flags\": \"ALL\",\n" + + " \"value\": \"sim.*\"\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + " }\n" + + "}"; + private static final String AGG_FIELD = "severity"; + private static final String AGG_QUERY = "{\n" + + " \"query\": {\n" + + " \"match_all\": {}\n" + + " },\n" + + " \"aggs\": {\n" + + " \"severity\": {\n" + + " \"terms\": {\n" + + " \"field\": \""+AGG_FIELD+"\"\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + private static final long FROMANDSIZE_QUERY_SIZE = 20; + private static final long FROMANDSIZE_QUERY_FROM = 120; + private static final String FROMANDSIZE_QUERY = "{\n" + + " \"size\": "+FROMANDSIZE_QUERY_SIZE+",\n" + + " \"query\": {\n" + + " \"match_all\": {}\n" + + " },\n" + + " \"from\":"+FROMANDSIZE_QUERY_FROM+"\n" + + "}"; + private static final String TERMQUERY_KEY = "node-id"; + private static final String TERMQUERY_VALUE = "abc"; + private static final String TERM_QUERY = "{\n" + + " \"query\": {\n" + + " \"term\": {\n" + + " \""+TERMQUERY_KEY+"\": \""+TERMQUERY_VALUE+"\"\n" + + " }\n" + + " }\n" + + "}"; + private static final String SORTING_PROPERTY = "node-id"; + private static final String SORTING_QUERY_ASC = "{\n" + + " \"query\": {\n" + + " \"match_all\": {}\n" + + " },\n" + + " \"sort\": [\n" + + " {\n" + + " \""+SORTING_PROPERTY+"\": {\n" + + " \"order\": \"asc\"\n" + + " }\n" + + " }\n" + + " ]\n" + + "}"; + private static final String SORTING_QUERY_DESC = "{\n" + + " \"query\": {\n" + + " \"match_all\": {}\n" + + " },\n" + + " \"sort\": [\n" + + " {\n" + + " \""+SORTING_PROPERTY+"\": {\n" + + " \"order\": \"desc\"\n" + + " }\n" + + " }\n" + + " ]\n" + + "}"; + + private void testEquals(String message,String json, QueryBuilder query) { + this.testEquals(message, json, query,true); + } + private void testEquals(String message,String json, QueryBuilder query,boolean strict) { + + try { + System.out.println("===test if "+message+"==================="); + System.out.println("orig : "+trim(json)); + System.out.println("totest: "+query.toJSON().trim()); + JSONAssert.assertEquals(json,query.toJSON(),strict); + } catch (JSONException e) { + fail(message); + } + } + + private String trim(String json) { + return json.trim().replaceAll("\n","").replaceAll(" ", ""); + } + + @Test + public void testMatchAll() { + testEquals("match all query is wrong", MATCH_ALL_QUERY, QueryBuilders.matchAllQuery()); + } + @Test + public void testMatch() { + testEquals("match query is wrong", MATCH_QUERY, QueryBuilders.matchQuery(MATCH_QUERY_KEY, MATCH_QUERY_VALUE)); + } + @Test + public void testBool() { + testEquals("bool query is wrong", BOOL_QUERY, + QueryBuilders.boolQuery(). + must(QueryBuilders.matchQuery(MATCH_QUERY_KEY, MATCH_QUERY_VALUE)). + must(QueryBuilders.matchQuery(MATCH_QUERY_KEY2, MATCH_QUERY_VALUE2))); + } + @Test + public void testRange() { + testEquals("range query is wrong", RANGE_QUERY, QueryBuilders.rangeQuery(RANGE_QUERY_KEY).lte(RANGE_QUERY_LTEND)); + + } + @Test + public void testAggregation() { + testEquals("aggregation query is wrong",AGG_QUERY, QueryBuilders.matchAllQuery().aggregations(AGG_FIELD)); + } + @Test + public void testSizeAndFrom() { + testEquals("aggregation query is wrong",FROMANDSIZE_QUERY, QueryBuilders.matchAllQuery().size(FROMANDSIZE_QUERY_SIZE).from(FROMANDSIZE_QUERY_FROM)); + } + @Test + public void testRegex() { + testEquals("range and bool query is wrong1",RANGEBOOL_QUERY,QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("is-required", true)).must(QueryBuilders.regex("node-id", DbFilter.createDatabaseRegex("sim*"))),false); + BoolQueryBuilder q = QueryBuilders.boolQuery().must(QueryBuilders.regex("node-id", DbFilter.createDatabaseRegex("sim*"))); + q.must(QueryBuilders.matchQuery("is-required", true)); + testEquals("range and bool query is wrong2",RANGEBOOL_QUERY,q,false); + } + @Test + public void testTerm() { + testEquals("term query is wrong", TERM_QUERY, QueryBuilders.termQuery(TERMQUERY_KEY, TERMQUERY_VALUE)); + } + @Test + public void testSorting() { + testEquals("sortorder is wrong",SORTING_QUERY_ASC, QueryBuilders.matchAllQuery().sort(SORTING_PROPERTY, SortOrder.ASCENDING)); + testEquals("sortorder is wrong",SORTING_QUERY_DESC, QueryBuilders.matchAllQuery().sort(SORTING_PROPERTY, SortOrder.DESCENDING)); + } +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java new file mode 100644 index 000000000..36bbebefd --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java @@ -0,0 +1,412 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterHealthRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.NodeStatsRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.RefreshIndexRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateByQueryRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterHealthResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.CreateIndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteByQueryResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteIndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.IndexResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.NodeStatsResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateByQueryResponse; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateResponse; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONObject; + +public class TestDbRequests { + + private static HtDatabaseClient dbClient; + private static HostInfo[] hosts = new HostInfo[] { new HostInfo("localhost", Integer + .valueOf(System.getProperty("databaseport") != null ? System.getProperty("databaseport") : "49200")) }; + + @BeforeClass + public static void init() { + + dbClient = new HtDatabaseClient(hosts); + + } + @AfterClass + public static void deinit() { + if(dbClient!=null) { + dbClient.close(); + } + } + @Test + public void testHealth() { + + ClusterHealthResponse response = null; + ClusterHealthRequest request = new ClusterHealthRequest(); + request.timeout(10); + try { + response = dbClient.health(request); + } catch (UnsupportedOperationException | IOException | JSONException e) { + fail(e.getMessage()); + } + assertNotNull("response is null", response); + assertTrue(response.isStatusMinimal(ClusterHealthResponse.HEALTHSTATUS_YELLOW)); + } + + @Test + public void testCount() { + + } + + @Test + public void testCreateAndDeleteIndex() { + final String IDX = "testcidx1"; + CreateIndexRequest request = new CreateIndexRequest(IDX); + CreateIndexResponse response = null; + try { + response = dbClient.createIndex(request); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + + assertTrue("index not existing", dbClient.isExistsIndex(IDX)); + + DeleteIndexRequest request2 = new DeleteIndexRequest(IDX); + + DeleteIndexResponse response2 = null; + try { + response2 = dbClient.deleteIndex(request2); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response2); + assertFalse("index still existing", dbClient.isExistsIndex(IDX)); + this.deleteIndex(IDX); + } + + @Test + public void testInsertAndDelete() { + final String IDX = "test23-knmoinsd"; + final String ID = "abcddd"; + final String JSON = "{\"data\":{\"inner\":\"more\"}}"; + this.insert(IDX, ID, JSON); + // delete data + DeleteRequest request2 = new DeleteRequest(IDX, IDX, ID); + DeleteResponse response2 = null; + try { + response2 = dbClient.delete(request2); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response2); + assertTrue(response2.isDeleted()); + try { + dbClient.refreshIndex(new RefreshIndexRequest(IDX)); + } catch (IOException e) { + fail(e.getMessage()); + } + // verify data deleted + GetRequest request4 = new GetRequest(IDX, IDX, ID); + GetResponse response4 = null; + try { + response4 = dbClient.get(request4); + } catch (IOException e1) { + fail(e1.getMessage()); + } + assertNotNull(response4); + assertFalse("data still existing", response4.isExists()); + this.deleteIndex(IDX); + } + + @Test + public void testInsertAndDeleteByQuery() { + final String IDX = "test34-knmoinsd"; + final String ID = "abcdddseae"; + final String JSON = "{\"data\":{\"inner\":\"more\"}}"; + this.insert(IDX, ID, JSON); + + // delete data + DeleteByQueryRequest request2 = new DeleteByQueryRequest(IDX); + request2.source(QueryBuilders.matchQuery("_id", ID)); + DeleteByQueryResponse response2 = null; + try { + response2 = dbClient.deleteByQuery(request2); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response2); + assertTrue(response2.isResponseSucceeded()); + try { + dbClient.refreshIndex(new RefreshIndexRequest(IDX)); + } catch (IOException e) { + fail(e.getMessage()); + } + // verify data deleted + GetRequest request4 = new GetRequest(IDX, IDX, ID); + GetResponse response4 = null; + try { + response4 = dbClient.get(request4); + } catch (IOException e1) { + fail(e1.getMessage()); + } + assertNotNull(response4); + assertFalse("data still existing", response4.isExists()); + this.deleteIndex(IDX); + } + + private void insert(String IDX, String ID, String JSON) { + + // create data + IndexRequest request = new IndexRequest(IDX, IDX, ID); + request.source(JSON); + IndexResponse response = null; + try { + response = dbClient.index(request); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + if (ID != null) { + assertEquals("id not correct", ID, response.getId()); + } else { + ID = response.getId(); + } + // do db refresh + try { + dbClient.refreshIndex(new RefreshIndexRequest(IDX)); + } catch (IOException e) { + fail(e.getMessage()); + } + // verify data exists + GetRequest request3 = new GetRequest(IDX, IDX, ID); + GetResponse response3 = null; + try { + response3 = dbClient.get(request3); + } catch (IOException e1) { + fail(e1.getMessage()); + } + assertNotNull(response3); + JSONAssert.assertEquals("could not verify update", JSON, response3.getSourceAsBytesRef(), true); + } + + @Test + public void testSearch() { + final String IDX = "test44-moinsd"; + final String ID = "abe"; + final String JSON = "{\"data\":{\"inner\":\"more\"}}"; + final String ID2 = "abe2"; + final String JSON2 = "{\"data\":{\"inner\":\"more2\"}}"; + final String ID3 = "abe3"; + final String JSON3 = "{\"data\":{\"inner\":\"more3\"}}"; + this.insert(IDX, ID, JSON); + this.insert(IDX, ID2, JSON2); + this.insert(IDX, ID3, JSON3); + SearchRequest request = new SearchRequest(IDX, IDX); + request.setQuery(QueryBuilders.matchAllQuery()); + SearchResponse response = null; + try { + response = dbClient.search(request); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertEquals("not all items found", 3, response.getHits().length); + assertEquals("incorrect index",IDX,response.getHits()[0].getIndex()); + assertEquals("incorrect type",IDX,response.getHits()[0].getType()); + this.deleteIndex(IDX); + } + + @Test + public void testUpdate() { + final String IDX = "test4534-moinsd"; + final String ID = "assbe"; + final String JSON = "{\"data\":{\"inner\":\"more\"}}"; + final String JSON2 = "{\"data\":{\"inner\":\"more2\"},\"data2\":\"value2\",\"data3\":true}"; + + this.insert(IDX, ID, JSON); + UpdateRequest request = new UpdateRequest(IDX, IDX, ID); + UpdateResponse response = null; + try { + request.source(new JSONObject(JSON2)); + response = dbClient.update(request); + } catch (JSONException | IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertTrue(response.succeeded()); + // refresh index + try { + dbClient.refreshIndex(new RefreshIndexRequest(IDX)); + } catch (IOException e) { + fail(e.getMessage()); + } + // verify update + GetRequest request3 = new GetRequest(IDX, IDX, ID); + GetResponse response3 = null; + try { + response3 = dbClient.get(request3); + } catch (IOException e1) { + fail(e1.getMessage()); + } + assertNotNull(response3); + JSONAssert.assertEquals("could not verify update", JSON2, response3.getSourceAsBytesRef(), true); + this.deleteIndex(IDX); + } + + @Test + public void testUpdateByQuery() { + final String IDX = "test224534-moinsd"; + final String ID = "asssabe"; + final String JSON = "{\"data\":{\"inner\":\"more\"}}"; + final String JSON2 = "{\"data\":{\"inner\":\"more2\"},\"data2\":\"value2\",\"data3\":true}"; + + this.insert(IDX, ID, JSON); + UpdateByQueryRequest request = new UpdateByQueryRequest(IDX, IDX); + UpdateByQueryResponse response = null; + try { + request.source(ID, new JSONObject(JSON2)); + response = dbClient.update(request); + } catch (JSONException | IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertTrue(response.isUpdated()); + // refresh index + try { + dbClient.refreshIndex(new RefreshIndexRequest(IDX)); + } catch (IOException e) { + fail(e.getMessage()); + } + // verify update + GetRequest request3 = new GetRequest(IDX, IDX, ID); + GetResponse response3 = null; + try { + response3 = dbClient.get(request3); + } catch (IOException e1) { + fail(e1.getMessage()); + } + assertNotNull(response3); + JSONAssert.assertEquals("could not verify update", JSON2, response3.getSourceAsBytesRef(), true); + this.deleteIndex(IDX); + } + + @Test + public void testAggregations() { + final String IDX = "test3227533677-moisnsd"; + final String JSON = "{ \"node-id\":\"sim1\",\"severity\":\"critical\"}"; + final String JSON2 = "{ \"node-id\":\"sim2\",\"severity\":\"critical\"}"; + final String JSON3 = "{ \"node-id\":\"sim3\",\"severity\":\"minor\"}"; + final String JSON4 = "{ \"node-id\":\"sim4\",\"severity\":\"warning\"}"; + final String JSON5 = "{ \"node-id\":\"sim5\",\"severity\":\"major\"}"; + final String MAPPINGS = "{\""+IDX+"\":{\"properties\":{\"node-id\": {\"type\": \"keyword\"},\"severity\": {\"type\": \"keyword\"}}}}"; + //create index with mapping keyword + CreateIndexRequest irequest = new CreateIndexRequest(IDX); + irequest.mappings(new JSONObject(MAPPINGS)); + CreateIndexResponse iresponse = null; + try { + iresponse = dbClient.createIndex(irequest); + } catch (IOException e1) { + fail("unable to create index: "+e1.getMessage()); + } + assertNotNull(iresponse); + assertTrue(iresponse.isAcknowledged()); + // fill index + this.insert(IDX, null, JSON); + this.insert(IDX, null, JSON2); + this.insert(IDX, null, JSON3); + this.insert(IDX, null, JSON4); + this.insert(IDX, null, JSON5); + // refresh index + try { + dbClient.refreshIndex(new RefreshIndexRequest(IDX)); + } catch (IOException e) { + fail(e.getMessage()); + } + + SearchRequest request = new SearchRequest(IDX, IDX); + request.setQuery(QueryBuilders.matchAllQuery().aggregations("severity").size(0)); + SearchResponse response = null; + try { + response = dbClient.search(request); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(response); + assertTrue(response.hasAggregations()); + assertEquals("aggregation size not correct", 4, response.getAggregations("severity").size()); + + List<String> items1 = Arrays.asList(response.getAggregations("severity").getKeysAsPagedStringList(2, 0)); + List<String> items2 = Arrays.asList(response.getAggregations("severity").getKeysAsPagedStringList(2, 2)); + assertEquals("pagination does not work", 2,items1.size()); + assertEquals("pagination does not work", 2,items2.size()); + for(String s:items1) { + assertFalse("pagination overlap is not allowed",items2.contains(s)); + } + for(String s:items2) { + assertFalse("pagination overlap is not allowed",items1.contains(s)); + } + + this.deleteIndex(IDX); + } + + @Test + public void testStatistics() { + NodeStatsResponse stats=null; + try { + stats = dbClient.stats(new NodeStatsRequest()); + } catch (IOException e) { + fail(e.getMessage()); + } + assertNotNull(stats); + System.out.println(stats.getNodesInfo()); + System.out.println(stats.getNodeStatistics()); + } + private void deleteIndex(String idx) { + try { + dbClient.deleteIndex( new DeleteIndexRequest(idx)); + } catch (IOException e) { + + } + } + +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java new file mode 100644 index 000000000..e4e8f9477 --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import static org.junit.Assert.*; + +import org.json.JSONException; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert; + +public class TestJsonAssert { + + @Test + public void testGenericTypes() { + try { + JSONAssert.assertEquals("test boolean","{ \"test\":true}","{ \"test\":true}",true); + } catch (JSONException e) { + fail(e.getMessage()); + } + try { + JSONAssert.assertEquals("test int","{ \"test\":2}","{ \"test\":2}",true); + } catch (JSONException e) { + fail(e.getMessage()); + } + try { + JSONAssert.assertEquals("test string","{ \"test\":\"abc\"}","{ \"test\":\"abc\"}",true); + } catch (JSONException e) { + fail(e.getMessage()); + } + + } + @Test + public void testGenericTypesFails() { + try { + JSONAssert.assertEquals("test boolean","{ \"test\":true}","{ \"test\":false}",true); + fail("test boolean not failed, but has to"); + } catch (JSONException e) { + fail("problem with json"); + }catch(AssertionError e) { + + } + try { + JSONAssert.assertEquals("test int","{ \"test\":2}","{ \"test\":3}",true); + fail("test int not failed, but has to"); + } catch (JSONException e) { + fail("problem with json"); + } catch(AssertionError e) { + + } + try { + JSONAssert.assertEquals("test string","{ \"test\":\"abc\"}","{ \"test\":\"abcd\"}",true); + fail("test string not failed, but has to"); + } catch (JSONException e) { + fail("problem with json"); + }catch(AssertionError e) { + + } + + } + @Test + public void testObject() { + try { + JSONAssert.assertEquals("test object","{ \"test\":{\"more\":{\"x\":1,\"y\":\"2\",\"z\":{}}}}","{ \"test\":{\"more\":{\"x\":1,\"z\":{},\"y\":\"2\"}}}",true); + } catch (JSONException e) { + fail(e.getMessage()); + } + } + @Test + public void testObjectFails() { + try { + JSONAssert.assertEquals("test object","{ \"test\":{\"more\":{\"x\":1,\"y\":\"2\",\"z\":{}}}}","{ \"test\":{\"more\":{\"x\":1,\"z\":{}}}}",true); + fail("test object not failed, but has to"); + } catch (JSONException e) { + fail("problem with json"); + } + catch(AssertionError e) { + + } + } + @Test + public void testArrayStrict() { + try { + JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"b\",\"c\"]}",true); + } catch (JSONException e) { + fail(e.getMessage()); + } + } + @Test + public void testArrayStrictFails() { + try { + JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"c\",\"b\"]}",true); + fail("test object not failed, but has to"); + } catch (JSONException e) { + fail("problem with json"); + } + catch(AssertionError e) { + + } + } + @Test + public void testArrayNonStrict() { + try { + JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"c\",\"b\"]}",false); + } catch (JSONException e) { + fail(e.getMessage()); + } + } + @Test + public void testArrayNonStrictFails() { + try { + JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"c\",\"b\",\"d\"]}",false); + fail("test object not failed, but has to"); + } catch (JSONException e) { + fail("problem with json"); + } + catch(AssertionError e) { + + } + try { + JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"b\",\"d\"]}",false); + fail("test object not failed, but has to"); + } catch (JSONException e) { + fail("problem with json"); + } + catch(AssertionError e) { + + } + } +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java new file mode 100644 index 000000000..9c2ade992 --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries; + +public class TestPageHashMap { + + @Test + public void testGenericTypes() { + AggregationEntries agg = new AggregationEntries(); + + for (int t=0; t < 100; t++) { + agg.put("Key"+t, Long.valueOf(t)); + } + + int x =0; + for (String k : agg.keySet()) { + if (x++ >= 10) + break; + System.out.println("Keys: "+k); + } + + String[] res; + + res = agg.getKeysAsPagedStringList(5, 10); + System.out.println("Entries: "+res.length); + for (int t=0; t < res.length; t++) { + System.out.println("Entry "+t+": "+res[t]); + } + + res = agg.getKeysAsPagedStringList(5, 10); + System.out.println("Entries: "+res.length); + for (int t=0; t < res.length; t++) { + System.out.println("Entry "+t+": "+res[t]); + } + + + } + + +} diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java new file mode 100644 index 000000000..49e0445a1 --- /dev/null +++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.common.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import javax.xml.parsers.ParserConfigurationException; + +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.file.PomFile; +import org.onap.ccsdk.features.sdnr.wt.common.file.PomPropertiesFile; +import org.xml.sax.SAXException; + +public class TestPomfile { + + private static final String TESTPROPERTY_KEY="elasticsearch.version"; + private static final String TESTPROPERTY_VALUE = "6.4.3"; + private static final String POMFILENAME = "pom.xml"; + private static final String POM_PROPERTY = "#Generated by org.apache.felix.bundleplugin\n" + + "#Tue Nov 19 11:20:33 CET 2019\n" + + "version=0.7.0-SNAPSHOT\n" + + "groupId=org.onap.ccsdk.features.sdnr.wt\n" + + "artifactId=sdnr-wt-data-provider-provider\n"; + //private static final Date DATE_EXPECTED = new Date(119, 10, 19, 11, 20, 33); + + @Test + public void test() { + PomFile pom=null; + try { + pom = new PomFile(new FileInputStream(POMFILENAME)); + } catch (ParserConfigurationException | SAXException | IOException e) { + fail(e.getMessage()); + } + assertNotNull(pom); + assertEquals(TESTPROPERTY_VALUE, pom.getProperty(TESTPROPERTY_KEY)); + + } + @Test + public void testProp() { + PomPropertiesFile file = null; + try { + file = new PomPropertiesFile(new ByteArrayInputStream(POM_PROPERTY.getBytes())); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + assertNotNull(file); + assertNotNull(file.getBuildDate()); + } +} diff --git a/sdnr/wt/common/src/test/resources/log4j.properties b/sdnr/wt/common/src/test/resources/log4j.properties new file mode 100644 index 000000000..142663bd2 --- /dev/null +++ b/sdnr/wt/common/src/test/resources/log4j.properties @@ -0,0 +1,12 @@ +log4j.rootLogger=INFO, out + +log4j.logger.org.apache.camel.impl.converter=WARN +log4j.logger.org.apache.camel.management=WARN +log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN +log4j.logger.org.springframework=ERROR + +# CONSOLE appender not used by default +log4j.appender.out=org.apache.log4j.ConsoleAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n + diff --git a/sdnr/wt/common/src/test/resources/log4j2.xml b/sdnr/wt/common/src/test/resources/log4j2.xml new file mode 100644 index 000000000..164e93f54 --- /dev/null +++ b/sdnr/wt/common/src/test/resources/log4j2.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration package="log4j.test" + status="WARN"> + <Appenders> + <Console name="Console" target="SYSTEM_OUT"> + <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> + </Console> + </Appenders> + <Loggers> + <Logger name="log4j.test.Log4jTest" level="debug"> + <AppenderRef ref="Console"/> + </Logger> + <Root level="trace"> + <AppenderRef ref="Console"/> + </Root> + </Loggers> +</Configuration>
\ No newline at end of file diff --git a/sdnr/wt/common/src/test/resources/simplelogger.properties b/sdnr/wt/common/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..a2f1e7e76 --- /dev/null +++ b/sdnr/wt/common/src/test/resources/simplelogger.properties @@ -0,0 +1,6 @@ +org.slf4j.simpleLogger.defaultLogLevel=debug +org.slf4j.simpleLogger.showDateTime=true +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +#org.slf4j.simpleLogger.showThreadName=true +org.slf4j.simpleLogger.showLogName=true +org.slf4j.simpleLogger.showShortLogName=false
\ No newline at end of file diff --git a/sdnr/wt/data-provider/database/src/main/resources/es-init.sh b/sdnr/wt/data-provider/database/src/main/resources/es-init.sh new file mode 100755 index 000000000..be7d487f7 --- /dev/null +++ b/sdnr/wt/data-provider/database/src/main/resources/es-init.sh @@ -0,0 +1,437 @@ +#!/bin/bash +# ============LICENSE_START======================================================================== +# ONAP : ccsdk feature sdnr wt +# ================================================================================================= +# Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. +# ================================================================================================= +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +# or implied. See the License for the specific language governing permissions and limitations under +# the License. +# ============LICENSE_END========================================================================== +# +# Version 2 +# Usage .. see help below + +SDNRNAME=sdnrdb +REPLICAS=1 +SHARDS=5 +PREFIX="" +VERSION="-v1" +VERBOSE=0 +INITFILENAME="Init.script" + +#declare -a ALIAS +#declare -a MAPPING + +# ------------------------------------------------------------ +# Function with definition of mappings +# $1: alias name for index +# $2: mapping properties and additonal parameter for this section + +set_definition() { + def "connectionlog" '{"node-id": {"type": "keyword"},"timestamp": {"type": "date"},"status": {"type": "keyword"}}' + def "maintenancemode" '{"node-id": {"type": "keyword"},"active": {"type": "boolean"}},"date_detection":false}}' + def "faultlog" '{"node-id": {"type": "keyword"},"severity": {"type": "keyword"},"timestamp": {"type": "date"},"problem": {"type": "keyword"},"counter": {"type": "keyword"},"object-id":{"type": "keyword"}}' + def "faultcurrent" '{"node-id": {"type": "keyword"},"severity": {"type": "keyword"},"timestamp": {"type": "date"},"problem": {"type": "keyword"},"counter": {"type": "keyword"},"object-id":{"type": "keyword"}}' + def "eventlog" '{"node-id": {"type": "keyword"},"timestamp": {"type": "date"},"new-value": {"type": "keyword"},"attribute-name": {"type": "keyword"},"counter": {"type": "keyword"},"object-id": {"type": "keyword"}}' + def "inventoryequipment" '{"date": {"type": "keyword"},"model-identifier": {"type": "keyword"},"manufacturer-identifier": {"type": "keyword"},"type-name": {"type": "keyword"},"description": {"type": "keyword"},"uuid": {"type": "keyword"},"version": {"type": "keyword"},"parent-uuid": {"type": "keyword"},"contained-holder": {"type": "keyword"},"node-id": {"type": "keyword"},"tree-level": {"type": "long"},"part-type-id": {"type": "keyword"},"serial": {"type": "keyword"}}' + def "historicalperformance24h" '{"node-name":{"type": "keyword"},"timestamp":{"type": "date"},"suspect-interval-flag":{"type":"boolean"},"scanner-id":{"type": "keyword"},"uuid-interface":{"type": "keyword"},"layer-protocol-name":{"type": "keyword"},"granularity-period":{"type": "keyword"},"radio-signal-id":{"type": "keyword"}}' + def "historicalperformance15min" '{"node-name":{"type": "keyword"},"timestamp":{"type": "date"},"suspect-interval-flag":{"type":"boolean"},"scanner-id":{"type": "keyword"},"uuid-interface":{"type": "keyword"},"layer-protocol-name":{"type": "keyword"},"granularity-period":{"type": "keyword"},"radio-signal-id":{"type": "keyword"}}' + def "mediator-server" '{"url":{"type": "keyword"},"name":{"type": "keyword"}}' + def "networkelement-connection" '{"node-id": {"type": "keyword"},"host": {"type": "keyword"},"port": {"type": "long"},"username": {"type": "keyword"},"password": {"type": "keyword"},"core-model-capability": {"type": "keyword"},"device-type": {"type": "keyword"},"is-required": {"type": "boolean"},"status": {"type": "keyword"}},"date_detection":false' +} + +# ------------------------------------------------------------ +# Functions + +# Get ip of container with database +getsdnrurl() { + if [ ! -z "$DBURL" ]; then + return + fi + cmd=$(which docker) + if [ ! -z "$cmd" ]; then + SDNRIP=$($cmd inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$SDNRNAME") + if [ "$?" = "1" ] ; then + echo "WARN: Container $SDNRNAME not running. Start the sdnrdb container or enter a database url." + echo "continuing with localhost" + SDNRIP="localhost" + fi + else + # if no docker and no db url given + if [ -z "$DBURL" ]; then + echo "WARN: Please enter a database url." + echo "continuing with localhost" + SDNRIP="localhost" + fi + fi + DBURL="http://$SDNRIP:9200" +} + +# Add elements to the array ALIAS and MAPPING +# $1 alias +# $2 mapping properties +def() { + ALIAS=("${ALIAS[@]}" "$1") + MAPPING=("${MAPPING[@]}" "$2") +} + +# $1 Response +print_response() { + response="$1" + body=$(echo $response | sed -E 's/HTTPSTATUS\:[0-9]{3}$//') + code=$(echo $response | tr -d '\n' | sed -E 's/.*HTTPSTATUS:([0-9]{3})$/\1/') + if [ "$VERBOSE" = "0" -a "$code" -ne "200" ] ; then + echo "Error response $code $body" + exit 2 + fi + if [ "$VERBOSE" -ge 1 ] ; then + echo "response $code" + fi + if [ "$VERBOSE" -ge 2 ] ; then + echo "content: $body" + fi +} + +#Write ini file for elasticsearch +# $1 index +# $1 data +file_append() { + echo "PUT:"$1"/:"$2 >> $INITFILENAME +} + +# Send get request to database +# USes DBURL +# $1 url path +# $2 data +http_get_request() { + url="$DBURL/$1" + if [ "$VERBOSE" -ge 2 ] ; then + echo "PUT to $url data $data" + fi + response=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X GET -H "Content-Type: application/json" "$url") + print_response "$response" +} + +# Send put request to database +# USes DBURL +# $1 url path +# $2 data +http_put_request() { + url="$DBURL/$1" + if [ "$VERBOSE" -ge 2 ] ; then + echo "PUT to $url data $data" + fi + response=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X PUT -H "Content-Type: application/json" -d "$2" "$url") + print_response "$response" +} + +# Send delete request to database +# $1 url +http_delete_request() { + url="$DBURL/$1" + if [ "$VERBOSE" -ge 2 ] ; then + echo "DELETE to $url" + fi + echo "DELETE to $url" + response=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X DELETE -H "Content-Type: application/json" $url) + print_response "$response" +} + +# Delete index and alias +# $1 alias +delete_index_alias() { + + echo "deleting alias $alias" + # Delete alias + alias="$PREFIX$1" + index="$PREFIX$1$VERSION" + + url="$index/_alias/$alias" + http_delete_request "$url" + + # Delete index + echo "deleting index $index" + url="$index" + http_delete_request "$url" +} + +# Write mappings +# Uses version, SHARDS and REPLICAS parameters +# $1 alias and datatype "mydatatype" +# $2 mapping properties +# $3 filename or empty for WEB +create_index_alias() { + # Create index + alias="$PREFIX$1" + index="$PREFIX$1$VERSION" + mappings='"mappings":{"'$1'":{"properties":'$2'}}' + settings='"settings":{"index":{"number_of_shards":'$SHARDS',"number_of_replicas":'$REPLICAS'},"analysis":{"analyzer":{"content":{"type":"custom","tokenizer":"whitespace"}}}}' + + if [ -z "$mappings" ]; then + data="{$settings}" + else + data="{$settings,$mappings}" + fi + + url=$index + echo "creating index $index" + if [ -z "$3" ] ; then + http_put_request "$url" "$data" + else + file_append "$url" "$data" + fi + + #Create alias + url="$index/_alias/$alias" + echo "creating alias $alias for $index" + if [ -z "$3" ] ; then + http_put_request "$url" + else + file_append "$url" "{}" + fi +} + +# Wait for status +# $1 time to wait +es_wait_yellow() { + ESSTATUS="yellow" + attempt_counter=0 + max_attempts=5 + echo "Wait up to $max_attempts attempts for $DBURL availability" + until $(curl --output /dev/null --silent --head --fail $DBURL); do + if [ ${attempt_counter} -eq ${max_attempts} ];then + echo "Error: Max attempts reached." + exit 3 + fi + attempt_counter=$(($attempt_counter+1)) + printf '.' + sleep 5 + done + sleep 2 + echo "Wait up to $1 for status $ESSTATUS" + RES=$(curl GET "$DBURL/_cluster/health?wait_for_status=$ESSTATUS&timeout=$1&pretty" 2>/dev/null) + if [ "$?" = "0" ] ; then + if [[ "$RES" =~ .*status.*:.*yellow.* || "$RES" =~ .*status.*:.*green.* ]] ; then + echo "Status $ESSTATUS reached: $RES" + else + echo "Error: DB Reachable, but status $ESSTATUS not reached" + exit 2 + fi + else + echo "Error: $DBURL not reachable" + exit 2 + fi +} + +# Commands + +cmd_create() { + if [ -n "$WAITYELLOW" ] ; then + es_wait_yellow "$WAITYELLOW" + fi + for i in "${!ALIAS[@]}"; do + create_index_alias "${ALIAS[$i]}" "${MAPPING[$i]}" + done +} + +cmd_delete() { + if [ -n "$WAITYELLOW" ] ; then + es_wait_yellow "$WAITYELLOW" + fi + for i in "${!ALIAS[@]}"; do + delete_index_alias "${ALIAS[$i]}" + done +} +cmd_purge() { +# http_get_request '_cat/aliases' +# body=$(echo $response | sed -E 's/HTTPSTATUS\:[0-9]{3}$//') +# echo "$response" | awk '/^([^ ]*)[ ]*([^ ]*).*$/{ print $2"/_alias/"$1 }' +# http_get_request '_cat/indices' +# echo "indices" +# echo "$response" +# echo "$response" | awk '/^[^ ]*[ ]*[^ ]*[ ]*([^ ]*).*$/{ print $3 }' + echo "not yet implemented" +} +cmd_initfile() { + echo "Create script initfile: $INITFILENAME" + if [ -f "$INITFILENAME" ] ; then + rm $INITFILENAME + fi + for i in "${!ALIAS[@]}"; do + create_index_alias "${ALIAS[$i]}" "${MAPPING[$i]}" file + done +} + +# Prepare database startup +cmd_startup() { + ESWAIT=30s + echo "Startup ElasticSearch DBURL=$DBURL CMD=$STARTUP_CMD CLUSTER=$CLUSTER_ENABLED INDEX=$NODE_INDEX" + if $CLUSTER_ENABLED ; then + if [ "$NODE_INDEX" = "0" ] ; then + echo "Cluster node 0 detected .. create" + es_wait_yellow $ESWAIT + cmd_create + else + echo "Cluster node > 0 detected .. do nothing" + fi + else + echo "No cluster" + es_wait_yellow $ESWAIT + cmd_create + fi +} + +# Parse arguments +parse_args() { + while [[ $# -gt 0 ]] + do + par=($(echo $1 | tr '=' '\n')) + echo "" + if [ ${#par[@]} == "2" ] ; then + # Equal sign found + key=${par[0]} + value=${par[1]} + else + # No equal sign + key="$1" + value="$2" + fi + shift + #Further shift if parameter is used + case $key in + -db|--dburl|--database) + DBURL="$value" + shift + ;; + -r|--replicas) + REPLICAS="$value" + shift + ;; + -s|--shards) + SHARDS="$value" + shift + ;; + -p|--prefix) + PREFIX="$value" + shift + ;; + -f|--file) + INITFILENAME="$value" + shift + ;; + -x|--verbose) + VERBOSE="${value:-0}" + shift + ;; + -v|--version) + VERSION="${value:--v1}" + shift + ;; + -vx|--versionx) + VERSION="" + ;; + -w|--wait) + WAITYELLOW="${value:-30s}" + shift + ;; + --cmd) + STARTUP_CMD="$value" + shift + ;; + --odlcluster) + CLUSTER_ENABLED="$value" + shift + ;; + --index) + NODE_INDEX="$value" + shift + ;; + *) + ;; + esac; + done +} + +# ----------------------------------------- +# Main starts here + +TASK=$1 +shift +parse_args "$@" + +set_definition + + +echo "------------------------------" +echo "Elasticsearch for SDN-R helper" +echo "------------------------------" +echo "Uses database container $SDNRNAME" +echo "Database url $DBURL" +echo " shards=$SHARDS replicas=$REPLICAS prefix=$PREFIX verbose=$VERBOSE version='$VERSION'" + + +case "$TASK" in + "create") + getsdnrurl + if [ -z "$DBURL" ] ; then + echo "Error: unable to detect database url." + exit 1 + fi + cmd_create + ;; + "delete") + getsdnrurl + if [ -z "$DBURL" ] ; then + echo "Error: unable to detect database url." + exit 1 + fi + cmd_delete + ;; + "purge") + getsdnrurl + if [ -z "$DBURL" ] ; then + echo "Error: unable to detect database url." + exit 1 + fi + cmd_purge + ;; + "initfile") + cmd_initfile + ;; + "startup") + cmd_startup + ;; + *) + echo "usage:" + echo " es-init.sh COMMAND [OPTIONS]" + echo " Commands:" + echo " create create SDN-R used indices and aliases" + echo " delete delete SDN-R used indices and aliases" + echo " initfile Create initfile for java unit tests" + echo " purge Clear complete database (indices and aliases)" + echo " startup Initial database write if node number 01" + echo " Options:" + echo -e " -db\--database DATABASEURL" + echo -e " -r\--replicas REPLICAS" + echo -e " -s\--shards SHARDS" + echo -e " -p\--prefix DATABASE-PREFIX" + echo -e " -f\--file init filename" + echo -e " -x\--verbose Verbose level less 0 .. 2 full" + echo -e " -v\--version Version prefix" + echo -e " -vx\--versionx Version prefix empty" + echo -e " -i\--ignore Ignore error responses" + echo -e " --odlcluster true/false if odl configured as cluster" + echo -e " --index Cluster node 0.." + echo -e " --cmd startup sub command" + echo " examples:" + echo " single node db:" + echo " es-init.sh create -db http://sdnrdb:9200 -r 0" + ;; +esac diff --git a/sdnr/wt/pom.xml b/sdnr/wt/pom.xml index 595bcd80c..94fa46e75 100644 --- a/sdnr/wt/pom.xml +++ b/sdnr/wt/pom.xml @@ -36,6 +36,7 @@ <description>SDN-R wireless transport micro-services</description> <modules> + <module>common</module> <module>apigateway</module> <module>devicemodel</module> <module>websocketmanager2</module> |