diff options
Diffstat (limited to 'sdnr')
197 files changed, 6048 insertions, 2643 deletions
diff --git a/sdnr/wt/apigateway/feature/pom.xml b/sdnr/wt/apigateway/feature/pom.xml index 43ce83a99..b4ec29993 100644 --- a/sdnr/wt/apigateway/feature/pom.xml +++ b/sdnr/wt/apigateway/feature/pom.xml @@ -21,7 +21,9 @@ * ============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"> + +<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> @@ -34,7 +36,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>single-feature-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <dependencyManagement> diff --git a/sdnr/wt/apigateway/installer/pom.xml b/sdnr/wt/apigateway/installer/pom.xml index fb70b2076..b7cc5312b 100755 --- a/sdnr/wt/apigateway/installer/pom.xml +++ b/sdnr/wt/apigateway/installer/pom.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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> @@ -12,7 +13,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <properties> diff --git a/sdnr/wt/apigateway/pom.xml b/sdnr/wt/apigateway/pom.xml index 289fcc673..c4d7a3f06 100755 --- a/sdnr/wt/apigateway/pom.xml +++ b/sdnr/wt/apigateway/pom.xml @@ -21,7 +21,9 @@ * ============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"> + +<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> diff --git a/sdnr/wt/apigateway/provider/pom.xml b/sdnr/wt/apigateway/provider/pom.xml index 95c6c69d6..75c66cbc6 100644 --- a/sdnr/wt/apigateway/provider/pom.xml +++ b/sdnr/wt/apigateway/provider/pom.xml @@ -11,7 +11,9 @@ 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/maven-v4_0_0.xsd"> +<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> @@ -27,7 +29,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>binding-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <dependencies> <dependency> diff --git a/sdnr/wt/devicemanager/feature/pom.xml b/sdnr/wt/devicemanager/feature/pom.xml index a5efb1f78..d99f071fe 100644 --- a/sdnr/wt/devicemanager/feature/pom.xml +++ b/sdnr/wt/devicemanager/feature/pom.xml @@ -21,7 +21,9 @@ * ============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"> +<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> @@ -34,7 +36,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>single-feature-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <dependencyManagement> diff --git a/sdnr/wt/devicemanager/installer/pom.xml b/sdnr/wt/devicemanager/installer/pom.xml index c41cfa497..08464f538 100755 --- a/sdnr/wt/devicemanager/installer/pom.xml +++ b/sdnr/wt/devicemanager/installer/pom.xml @@ -21,14 +21,16 @@ * ============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"> +<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> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> diff --git a/sdnr/wt/devicemanager/model/pom.xml b/sdnr/wt/devicemanager/model/pom.xml index 8b2c1488d..c2e59e623 100644 --- a/sdnr/wt/devicemanager/model/pom.xml +++ b/sdnr/wt/devicemanager/model/pom.xml @@ -21,7 +21,9 @@ * ============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"> +<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-devicemanager-model</artifactId> @@ -33,7 +35,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>binding-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <properties> @@ -66,3 +68,4 @@ </plugins> </build> </project> + diff --git a/sdnr/wt/devicemanager/provider/pom.xml b/sdnr/wt/devicemanager/provider/pom.xml index 566001b03..f29859fb2 100644 --- a/sdnr/wt/devicemanager/provider/pom.xml +++ b/sdnr/wt/devicemanager/provider/pom.xml @@ -15,7 +15,9 @@ 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"> +<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> @@ -28,7 +30,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>binding-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath></relativePath> </parent> <properties> @@ -95,6 +97,11 @@ <artifactId>sal-netconf-connector</artifactId> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.opendaylight.mdsal</groupId> + <artifactId>mdsal-singleton-common-api</artifactId> + <scope>provided</scope> + </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> @@ -367,6 +374,7 @@ org.opendaylight.controller.md.sal.binding.api;version="[1.6,2)", org.opendaylight.controller.md.sal.common.api.data;version="[1.6,2)", org.opendaylight.controller.sal.binding.api;version="[1.6,2)", + org.opendaylight.mdsal.singleton.common.api;version="[2.0,3)", org.opendaylight.yangtools.concepts;version="[2.0,3)", org.opendaylight.yangtools.yang.binding;version="[0.12,1)", org.opendaylight.yangtools.yang.common;version="[2.0,3)", @@ -486,3 +494,4 @@ </plugins> </build> </project> + diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanProvider.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanProvider.java new file mode 100644 index 000000000..44fae6d61 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanProvider.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * ============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.devicemanager.archiveservice; + +import java.util.Date; + +public interface ArchiveCleanProvider { + + /** + * Remove all index data older, than specified + * @param olderAreOutdated time to specify older elements + * @return number of removed elements + */ + int doIndexClean(Date olderAreOutdated); + + /** + * Get number of elements older then + * @param olderAreOutdated date to compare with and specify older elements + * @return number of elements + */ + public int getNumberOfOldObjects(Date olderAreOutdated); + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanService.java new file mode 100644 index 000000000..eb48b87c4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanService.java @@ -0,0 +1,155 @@ +/******************************************************************************* + * ============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.devicemanager.archiveservice; + +import java.util.Date; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.HtDevicemanagerConfiguration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.IConfigChangedListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.EsConfig; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; + +public class ArchiveCleanService implements AutoCloseable, IConfigChangedListener, Runnable,ClusterSingletonService { + + private static final Logger LOG = LoggerFactory.getLogger(ArchiveCleanService.class); + private static final ServiceGroupIdentifier IDENT = ServiceGroupIdentifier.create("ElasticSearchArchiveCleanService"); + + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private final ArchiveCleanProvider[] indexCleanList; + private final HtDevicemanagerConfiguration htconfig; + private final Runnable doClean; + + private EsConfig config; + private Future<?> taskReference; + private boolean isMaster; + + public ArchiveCleanService(HtDevicemanagerConfiguration config, ArchiveCleanProvider... indexCleanList) { + this.config = config.getEs(); + this.htconfig = config; + this.htconfig.registerConfigChangedListener(this); + this.indexCleanList = indexCleanList; + this.doClean = this; + this.taskReference = null; + + this.reinit(); + } + + private void reinit() { + + if (taskReference != null) { + taskReference.cancel(false); + } + if(this.isMaster) { + if (this.config.getArchiveCheckIntervalSeconds() > 0) { + LOG.info("DBCleanService is turned on for entries older than {} seconds", + this.config.getArchiveLifetimeSeconds()); + taskReference = this.scheduler.scheduleAtFixedRate(doClean, 0, + this.config.getArchiveCheckIntervalSeconds(), TimeUnit.SECONDS); + } else { + LOG.info("DBCleanService is turned off"); + } + } + else { + LOG.info("service is inactive on this node. active on another node."); + } + } + + public Date getDateForOldElements() { + return new Date(System.currentTimeMillis() - config.getArchiveLifetimeSeconds() * 1000); + } + + public int countOldEntries() { + int cnt = 0; + Date olderAreOutdated = getDateForOldElements(); + for (ArchiveCleanProvider indexCleanElement : indexCleanList) { + if (indexCleanElement != null) { + indexCleanElement.getNumberOfOldObjects(olderAreOutdated); + } + } + return cnt; + } + + @Override + public void run() { + + try { + int removed = 0; + Date olderElementToBeRemoved = getDateForOldElements(); + LOG.trace("cleaning logs from entries older than {}", olderElementToBeRemoved); + + for (ArchiveCleanProvider indexCleanElement : indexCleanList) { + if (indexCleanElement != null) { + removed += indexCleanElement.doIndexClean(olderElementToBeRemoved); + } + } + if (removed > 0) { + LOG.trace("Removed elements: {}",removed); + } + } catch (Exception e) { + LOG.warn("problem executing dbclean", e); + } + } + + @Override + public void onConfigChanged() { + LOG.debug("config changed. reninit timer"); + ArchiveCleanService.this.config = EsConfig.reload(); + ArchiveCleanService.this.reinit(); + }; + + @Override + public void close() throws Exception { + this.htconfig.unregisterConfigChangedListener(this); + this.scheduler.shutdown(); + } + + @Override + public String toString() { + return "ArchivCleanService [ArchiveCheckIntervalSeconds=" + config.getArchiveCheckIntervalSeconds() + + "ArchiveLifetimeSeconds=" + config.getArchiveLifetimeSeconds() + "]"; + } + + @Override + public ServiceGroupIdentifier getIdentifier() { + return IDENT; + } + + @Override + public void instantiateServiceInstance() { + LOG.info("We take Leadership"); + this.isMaster=true; + this.reinit(); + } + + @Override + public ListenableFuture<? extends Object> closeServiceInstance() { + LOG.info("We lost Leadership"); + this.isMaster=false; + this.reinit(); + return Futures.immediateFuture(null); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBaseReaderAndWriter.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBaseReaderAndWriter.java index f13b1066f..a742a94b0 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBaseReaderAndWriter.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBaseReaderAndWriter.java @@ -54,7 +54,12 @@ public class HtDataBaseReaderAndWriter<T extends IsEsObject> { this.mapper = new HtMapper<>( clazz ); } - + /** + * @return dataTypeName + */ + public String getDataTypeName() { + return this.dataTypeName; + } /** * Remove Object from database * @param object Object with content @@ -201,23 +206,33 @@ public class HtDataBaseReaderAndWriter<T extends IsEsObject> { } return res; } - - + /** + * Get all elements of related type + * @return all Elements + */ + public List<T> doReadAll() { + return doReadAll(null); + } /** * Read all existing objects of a type + * @param query for the elements * @return the list of all objects */ - public List<T> doReadAll() { + public List<T> doReadAll(QueryBuilder query) { List<T> res = new ArrayList<>(); int idx = 0; //Idx for getAll int iterateLength = 100; //Step width for iterate SearchHit hits[]; - - do { - hits = db.doReadAllJsonData(idx, iterateLength, dataTypeName); + if(query!=null) { + log.trace("read data in {} {} with query {}",db.getNetworkIndex(),dataTypeName,query); + hits=db.doReadByQueryJsonData(0, 99999, dataTypeName, query); + } + else { + hits = db.doReadAllJsonData(idx, iterateLength, dataTypeName); + } log.debug("Read: {} elements: {} Failures: {}",dataTypeName,hits.length, mapper.getMappingFailures()); T object; diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseWebAPIClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseWebAPIClient.java index 25930791a..ed09d34cd 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseWebAPIClient.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseWebAPIClient.java @@ -95,4 +95,8 @@ public class HtDatabaseWebAPIClient { return sresponse; } + + public void insertEntry(String index, String type, JSONObject data) throws IOException { + this.sendRequest(String.format("/%s/%s/", index,type), "POST", data); + } } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Resources.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Resources.java index 330ff8df0..3a899f884 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Resources.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Resources.java @@ -255,7 +255,7 @@ public class Resources { } private static Enumeration<URL> getResourceFolderFiles(String folder) { - LOG.info("Get ressource: {}", folder); + LOG.debug("Get resource: {}", folder); URL url = getUrlForRessource(folder); String path = url.getPath(); File[] files = new File(path).listFiles(); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementFactory.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementFactory.java index bda77f223..2ed02c18c 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementFactory.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementFactory.java @@ -18,7 +18,6 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf; import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.Capabilities; @@ -50,7 +49,6 @@ public class ONFCoreNetworkElementFactory { private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElementFactory.class); - @SuppressWarnings("deprecation") public static @Nonnull ONFCoreNetworkElementRepresentation create(String mountPointNodeName, DataBroker dataBroker, WebSocketServiceClient webSocketService, HtDatabaseEventsService databaseService, InstanceIdentifier<Node> instanceIdentifier, DataBroker mountpointDataBroker, ProviderClient dcaeProvider, @@ -59,7 +57,6 @@ public class ONFCoreNetworkElementFactory { ONFCoreNetworkElementRepresentation res = null; try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction();){ - CheckedFuture<Optional<Node>, ReadFailedException> checkedFuture = tx.read(LogicalDatastoreType.OPERATIONAL, instanceIdentifier); Optional<Node> nodeOption = tx.read(LogicalDatastoreType.OPERATIONAL, instanceIdentifier).checkedGet(); if (nodeOption.isPresent()) { Node node = nodeOption.get(); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/NetconfTimeStamp.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/NetconfTimeStamp.java index a9e451a39..0dc6f0304 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/NetconfTimeStamp.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/NetconfTimeStamp.java @@ -101,10 +101,18 @@ public class NetconfTimeStamp { * @return String with Date in NETCONF/YANG Format Version 1.0. */ public String getTimeStampAsNetconfString() { - return getRightFormattedDate(new Date().getTime()); + return this.getRightFormattedDate(new Date().getTime()); } /** + * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format + + * @return String with Date in NETCONF/YANG Format Version 1.0. + */ + public String getTimeStampAsNetconfString(Date date) { + return getRightFormattedDate(date.getTime()); + } + /** * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format in GMT * * @return DateAndTime Type 1.0. Date in NETCONF/YANG Format Version 1.0. @@ -113,6 +121,15 @@ public class NetconfTimeStamp { return DateAndTime.getDefaultInstance(getTimeStampAsNetconfString()); } + /** + * Get time from date as NETCONF specific type NETCONF/YANG 1.0 Format in GMT + * @param date specifying the date and time + * @return DateAndTime Type 1.0. Date in NETCONF/YANG Format Version 1.0. + */ + public DateAndTime getTimeStamp(Date date) { + return DateAndTime.getDefaultInstance(getTimeStampAsNetconfString(date)); + } + /** * Return the String with a NETCONF time converted to long @@ -252,4 +269,6 @@ public class NetconfTimeStamp { } } + + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AkkaConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AkkaConfig.java index 55d5b9a11..eeccf601f 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AkkaConfig.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AkkaConfig.java @@ -59,6 +59,10 @@ public class AkkaConfig { return this.cluserConfig != null ? this.cluserConfig.isCluster() : false; } + public boolean isClusterAndFirstNode() { + return isSingleNode() || isCluster() && getClusterConfig().getRoleMemberIndex() == 1; + } + public static AkkaConfig load() throws Exception { return load(DEFAULT_FILENAME); } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/EsConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/EsConfig.java index 958a0dfd3..bdfbf655d 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/EsConfig.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/EsConfig.java @@ -29,13 +29,29 @@ public class EsConfig extends BaseSubConfig { public static final String ESDATATYPENAME = "database"; private static final String EMPTY = "empty"; private static final String PROPERTY_KEY_CLUSTER = "esCluster"; + private static final String PROPERTY_KEY_ARCHIVE_INTERVAL = "esArchiveCheckIntervalSeconds"; + private static final String PROPERTY_KEY_ARCHIVE_LIMIT = "esArchiveLifetimeSeconds"; + private static final String DEFAULT_VALUE_CLUSTER = ""; + /** + * check db data in this interval [in seconds] + * 0 deactivated + */ + private static final long DEFAULT_ARCHIVE_INTERVAL_SEC = 0; + /** + * keep data for this time [in seconds] + * 30 days + */ + private static final long DEFAULT_ARCHIVE_LIMIT_SEC = 60 * 60 * 24 * 30; + private static EsConfig esConfig; private String cluster; private String host; private String node; private String index; + private long archiveCheckIntervalSeconds; + private long archiveLifetimeSeconds; private EsConfig() { super(); @@ -43,6 +59,8 @@ public class EsConfig extends BaseSubConfig { this.node = EMPTY; this.index = EMPTY; this.cluster = DEFAULT_VALUE_CLUSTER; + this.archiveCheckIntervalSeconds = DEFAULT_ARCHIVE_INTERVAL_SEC; + this.archiveLifetimeSeconds = DEFAULT_ARCHIVE_LIMIT_SEC; } public EsConfig cloneWithIndex(String _index) { @@ -51,6 +69,8 @@ public class EsConfig extends BaseSubConfig { c.host = this.host; c.node = this.node; c.cluster = this.cluster; + c.archiveCheckIntervalSeconds = this.archiveCheckIntervalSeconds; + c.archiveLifetimeSeconds = this.archiveLifetimeSeconds; return c; } @@ -90,6 +110,22 @@ public class EsConfig extends BaseSubConfig { this.index = index; } + public long getArchiveCheckIntervalSeconds() { + return this.archiveCheckIntervalSeconds; + } + + public void setArchiveCheckIntervalSeconds(long x) { + this.archiveCheckIntervalSeconds = x; + } + + public long getArchiveLifetimeSeconds() { + return this.archiveLifetimeSeconds; + } + + public void setArchiveLimit(long x) { + this.archiveLifetimeSeconds = x; + } + @Override public String toString() { return "EsConfig [cluster=" + cluster + ", host=" + host + ", node=" + node + ", index=" + index + "]"; @@ -112,9 +148,13 @@ public class EsConfig extends BaseSubConfig { this.cluster = c; this.node = String.format("%s%s", this.cluster, "n1"); this.host = "localhost"; + this.archiveCheckIntervalSeconds = this.getLong(PROPERTY_KEY_ARCHIVE_INTERVAL, DEFAULT_ARCHIVE_INTERVAL_SEC); + this.archiveLifetimeSeconds = this.getLong(PROPERTY_KEY_ARCHIVE_LIMIT, DEFAULT_ARCHIVE_LIMIT_SEC); if (save) { config.setProperty(SECTION_MARKER_ES + "." + PROPERTY_KEY_CLUSTER, this.cluster); + config.setProperty(SECTION_MARKER_ES + "." + PROPERTY_KEY_ARCHIVE_INTERVAL, this.archiveCheckIntervalSeconds); + config.setProperty(SECTION_MARKER_ES + "." + PROPERTY_KEY_ARCHIVE_LIMIT, this.archiveLifetimeSeconds); this.save(); } } @@ -170,15 +210,21 @@ public class EsConfig extends BaseSubConfig { } else if (!node.equals(other.node)) { return false; } + if (archiveCheckIntervalSeconds != other.archiveCheckIntervalSeconds) { + return false; + } + if (archiveLifetimeSeconds != other.archiveLifetimeSeconds) { + return false; + } return true; } @Override - public void save() - { + public void save() { this.getConfig().setProperty(SECTION_MARKER_ES + "." + PROPERTY_KEY_CLUSTER, this.cluster); super.save(); } + public static boolean isInstantiated() { return esConfig != null; } @@ -213,7 +259,7 @@ public class EsConfig extends BaseSubConfig { } public static void clear() { - esConfig=null; + esConfig = null; } } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java index 0141b2663..89ee376da 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java @@ -6,9 +6,9 @@ * ================================================================================================= * 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 @@ -61,6 +61,7 @@ import org.slf4j.LoggerFactory; * @author herbert */ +@SuppressWarnings("deprecation") public class DeviceMonitorImpl implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(DeviceMonitorImpl.class); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java index f0efe7aa4..97595ddac 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java @@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.onap.ccsdk.features.sdnr.wt.devicemanager.aaiconnector.impl.AaiProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice.ArchiveCleanService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementFactory; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementRepresentation; @@ -71,6 +72,8 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; @SuppressWarnings("deprecation") public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, ResyncNetworkElementsListener { @@ -92,6 +95,7 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R private RpcProviderRegistry rpcProviderRegistry = null; @SuppressWarnings("unused") private NotificationPublishService notificationPublishService = null; + private ClusterSingletonServiceProvider clusterSingletonServiceProvider; private final ConcurrentHashMap<String, ONFCoreNetworkElementRepresentation> networkElementRepresentations = new ConcurrentHashMap<>(); @@ -116,6 +120,9 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R private Thread threadDoClearCurrentFaultByNodename = null; private int refreshCounter = 0; private AkkaConfig akkaConfig; + private ArchiveCleanService archiveCleanService; + @SuppressWarnings("unused") + private ClusterSingletonServiceRegistration cssRegistration; // Blueprint 1 public DeviceManagerImpl() { @@ -137,7 +144,9 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R public void setMountPointService(MountPointService mountPointService) { this.mountPointService = mountPointService; } - + public void setClusterSingletonService(ClusterSingletonServiceProvider clusterSingletonService) { + this.clusterSingletonServiceProvider = clusterSingletonService; + } public void init() { LOG.info("Session Initiated start {}", APPLICATION_NAME); @@ -146,11 +155,11 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R this.rpcApiService = new DeviceManagerApiServiceImpl(rpcProviderRegistry); // Get configuration HtDevicemanagerConfiguration config = HtDevicemanagerConfiguration.getConfiguration(); - this.akkaConfig = null; try { this.akkaConfig = AkkaConfig.load(); LOG.debug("akka.conf loaded: " + akkaConfig.toString()); } catch (Exception e1) { + this.akkaConfig = null; LOG.warn("problem loading akka.conf: " + e1.getMessage()); } GeoConfig geoConfig = null; @@ -180,8 +189,7 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R LOG.error("Can only run with local database. Stop initialization of devicemanager."); } else { // init Database Values only if singleNode or clusterMember=1 - if (akkaConfig == null || akkaConfig.isSingleNode() || akkaConfig != null && akkaConfig.isCluster() - && akkaConfig.getClusterConfig().getRoleMemberIndex() == 1) { + if (akkaConfig == null || akkaConfig.isClusterAndFirstNode()) { // Create DB index if not existing and if database is running try { this.configService = new IndexConfigService(htDatabase); @@ -192,6 +200,7 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R } // start service for device maintenance service this.maintenanceService = new MaintenanceServiceImpl(htDatabase); + // Websockets try { this.webSocketService = new WebSocketServiceClientImpl2(rpcProviderRegistry); @@ -210,14 +219,17 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R LOG.warn("No configuration available. Don't start event manager"); } else { this.databaseClientEvents = new HtDatabaseEventsService(htDatabase); + //Make sure to start for one cluster node only + if (akkaConfig == null || akkaConfig.isClusterAndFirstNode() || akkaConfig.isSingleNode()) { + } String myDbKeyNameExtended = MYDBKEYNAMEBASE + "-" + dbConfig.getCluster(); - this.odlEventListener = new ODLEventListener(myDbKeyNameExtended, webSocketService, databaseClientEvents, dcaeProviderClient, aotsMProvider, maintenanceService); } - + this.archiveCleanService = new ArchiveCleanService(config, databaseClientEvents, mwtnService); + this.cssRegistration = this.clusterSingletonServiceProvider.registerClusterSingletonService(this.archiveCleanService); // PM PmConfig configurationPM = config.getPm(); LOG.info("Performance manager configuration: {}", configurationPM); @@ -275,7 +287,7 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R close(maintenanceService); close(rpcApiService); close(notificationDelayService); - + close(archiveCleanService); LOG.info("DeviceManagerImpl closing done"); } @@ -300,8 +312,11 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R /** * For each mounted device a mountpoint is created and this listener is called. + * Mountpoint was created or existing. Managed device is now fully connected to node/mountpoint. + * @param action provide action + * @param nNodeId id of the mountpoint + * @param nNode mountpoint contents */ - @Override public void startListenerOnNodeForConnectedState(Action action, NodeId nNodeId, NetconfNode nNode) { String mountPointNodeName = nNodeId.getValue(); @@ -384,7 +399,8 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R ne.initSynchronizationExtension(); // Setup Service that monitors registration/ deregistration of session - odlEventListener.registration(mountPointNodeName); + ConnectionStatus csts = nNode.getConnectionStatus(); + sendCreateOrUpdateNotification(mountPointNodeName, action, csts); if (aaiProviderClient != null) { aaiProviderClient.onDeviceRegistered(mountPointNodeName); @@ -399,52 +415,121 @@ public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, R LOG.info("Starting Event listener on Netconf device :: Name : {} finished", mountPointNodeName); } - @Override - public void enterNonConnectedState(NodeId nNodeId, NetconfNode nNode) { + /** + * Mountpoint created or existing. Managed device is actually disconnected from node/ mountpoint. + * Origin state: Connecting, Connected + * Target state: are UnableToConnect or Connecting + * @param action create or update + * @param nNodeId id of the mountpoint + * @param nNode mountpoint contents + */ + public void enterNonConnectedState(Action action, NodeId nNodeId, NetconfNode nNode) { + String mountPointNodeName = nNodeId.getValue(); + ConnectionStatus csts = nNode.getConnectionStatus(); + + sendCreateOrUpdateNotification(mountPointNodeName, action, csts); + + // Handling if mountpoint exist. connected -> connecting/UnableToConnect + stopListenerOnNodeForConnectedState(mountPointNodeName); + + if (deviceMonitor != null) { + deviceMonitor.deviceDisconnectIndication(mountPointNodeName); + } + + } + + /** + * Mountpoint removed indication. + * @param nNodeId id of the mountpoint + */ + public void removeMountpointState(NodeId nNodeId) { String mountPointNodeName = nNodeId.getValue(); - LOG.info("enter Non ConnectedState for device :: Name : {}", mountPointNodeName); + LOG.info("mountpointNodeRemoved {}", nNodeId.getValue()); + stopListenerOnNodeForConnectedState(mountPointNodeName); + deviceMonitor.removeMountpointIndication(mountPointNodeName); + if (odlEventListener != null) { + odlEventListener.deRegistration(mountPointNodeName); + } + } + + /** + * Do all tasks necessary to move from mountpoint state connected -> connecting + * @param mountPointNodeName provided + * @param ne representing the device connected to mountpoint + */ + private void stopListenerOnNodeForConnectedState( String mountPointNodeName) { ONFCoreNetworkElementRepresentation ne = networkElementRepresentations.remove(mountPointNodeName); if (ne != null) { - // Handling transition mountpoint connected -> connecting this.maintenanceService.deleteIfNotRequired(mountPointNodeName); int problems = ne.removeAllCurrentProblemsOfNode(); LOG.debug("Removed all {} problems from database at deregistration for {}", problems, mountPointNodeName); - if (odlEventListener != null) { - odlEventListener.deRegistration(mountPointNodeName); - } if (performanceManager != null) { performanceManager.deRegistration(mountPointNodeName); } if (aaiProviderClient != null) { aaiProviderClient.onDeviceUnregistered(mountPointNodeName); } - } else { - // Handling -> create not connected mountpoint, or change other beside connected. - ConnectionStatus csts = nNode.getConnectionStatus(); - if (csts != null) { - odlEventListener.updateRegistration(mountPointNodeName, csts.getClass().getSimpleName(), csts.getName()); - } else { - LOG.info("Unknown connection status"); - } - } - if (deviceMonitor != null) { - deviceMonitor.deviceDisconnectIndication(mountPointNodeName); } + } + private void sendCreateOrUpdateNotification(String mountPointNodeName, Action action, ConnectionStatus csts) { + LOG.info("enter Non ConnectedState for device :: Name : {} Action {} ConnectionStatus {}", mountPointNodeName, action, csts); + if (action == Action.CREATE) { + odlEventListener.registration(mountPointNodeName); + } else { + odlEventListener.updateRegistration(mountPointNodeName, ConnectionStatus.class.getSimpleName(), csts != null ? csts.getName() : "null"); + } } + /** + * Handle netconf/mountpoint changes + */ @Override - public void removeMountpointState(NodeId nNodeId) { - String mountPointNodeName = nNodeId.getValue(); - LOG.info("mountpointNodeRemoved {}", nNodeId.getValue()); - deviceMonitor.removeMountpointIndication(mountPointNodeName); + public void netconfChangeHandler(Action action, @Nullable ConnectionStatus csts, NodeId nodeId, NetconfNode nnode) { + switch (action) { + case REMOVE: + removeMountpointState(nodeId); // Stop Monitor + //deviceManagerService.enterNonConnectedState(nodeId, nnode); // Remove Mountpoint handler + break; + + case UPDATE: + case CREATE: + if (csts != null) { + switch (csts) { + case Connected: { + startListenerOnNodeForConnectedState(action, nodeId, nnode); + break; + } + case UnableToConnect: + case Connecting: { + enterNonConnectedState(action, nodeId, nnode); + break; + } + } + } else { + LOG.debug("NETCONF Node handled with null status for action", action); + } + break; + } } /*------------------------------------------------------------------------------------------- * Functions */ + public ArchiveCleanService getArchiveCleanService() { + return this.archiveCleanService; + } + + public HtDatabaseEventsService getDatabaseClientEvents() { + return databaseClientEvents; + } + + public IndexMwtnService getMwtnService() { + return mwtnService; + } + /** * Async RPC Interface implementation */ diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerService.java index 13fbc644e..ce34401d8 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerService.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerService.java @@ -16,8 +16,9 @@ * ============LICENSE_END========================================================================== ******************************************************************************/ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl; -import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; public interface DeviceManagerService { @@ -28,23 +29,11 @@ public interface DeviceManagerService { UPDATE } /** - * Mountpoint was created or existing. Managed device is now fully connected to node/mountpoint. - * @param action provide action - * @param nNodeId id of the mountpoint - * @param nNode mountpoint contents + * MountpointChangeHandler, called to indicate change to DeviceManager + * @param action provided + * @param csts provided + * @param nodeId provided + * @param nnode provided */ - void startListenerOnNodeForConnectedState(@Nonnull Action action, @Nonnull NodeId nNodeId, @Nonnull NetconfNode nNode); - - /** - * Mountpoint created or existing. Managed device is actually disconnected from node/ mountpoint. - * @param nNodeId id of the mountpoint - * @param nNode mountpoint contents - */ - void enterNonConnectedState(@Nonnull NodeId nNodeId, @Nonnull NetconfNode nNode); - - /** - * Mountpoint removed indication. - * @param nNodeId id of the mountpoint - */ - void removeMountpointState(@Nonnull NodeId nNodeId); + void netconfChangeHandler(Action action, @Nullable ConnectionStatus csts, NodeId nodeId, NetconfNode nnode); } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/service/HtDatabaseEventsService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/service/HtDatabaseEventsService.java index 90b07999c..0a38e0f60 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/service/HtDatabaseEventsService.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/service/HtDatabaseEventsService.java @@ -18,23 +18,24 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service; import java.util.ArrayList; +import java.util.Date; import java.util.List; import javax.annotation.Nonnull; +import org.elasticsearch.index.query.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice.ArchiveCleanProvider; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDataBaseReaderAndWriter; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.IndexClientBuilder; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12Equipment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsEventBase; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsFaultCurrent; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsFaultLog; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.EsEquipment; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.EsToplevelEquipment; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.ExtendedEquipment; -import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.MwtNotificationBase; -import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; -import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,9 +45,11 @@ import org.slf4j.LoggerFactory; * * @author herbert */ -public class HtDatabaseEventsService { +public class HtDatabaseEventsService implements ArchiveCleanProvider { private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class); + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + ///** Filename in the resources with maven initialized version information */ //private static final String RESOURCENAME = "version.properties"; // could also be a constant ///** Index name to be used */ @@ -88,19 +91,7 @@ public class HtDatabaseEventsService { // --- Function - public void writeEventLog(ObjectCreationNotificationXml event) { - writeEventGeneric(event); - } - - public void writeEventLog(ObjectDeletionNotificationXml event) { - writeEventGeneric(event); - } - - public void writeEventLog(AttributeValueChangedNotificationXml event) { - writeEventGeneric(event); - } - - private void writeEventGeneric(MwtNotificationBase event) { + public void writeEventLog(MwtNotificationBase event) { if (client == null) { LOG.debug("No DB, can not write: {}",event.toString()); return; @@ -224,5 +215,33 @@ public class HtDatabaseEventsService { } } + @Override + public int doIndexClean(Date olderAreOutdated) { + + String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); + int removed = 0; + + QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp); + removed += eventRWEventLog.doRemoveByQuery(queryEventBase); + + QueryBuilder queryFaultLog = EsFaultLog.getQueryForTimeStamp(netconfTimeStamp); + removed += eventRWFaultLog.doRemoveByQuery(queryFaultLog); + return removed; + } + + @Override + public int getNumberOfOldObjects(Date olderAreOutdated) { + + String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); + int numberOfElements = 0; + + QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp); + numberOfElements += eventRWEventLog.doReadAll(queryEventBase).size(); + + QueryBuilder queryFaultLog = EsFaultLog.getQueryForTimeStamp(netconfTimeStamp); + numberOfElements += eventRWFaultLog.doReadAll(queryFaultLog).size(); + + return numberOfElements; + } } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsEventBase.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsEventBase.java index bcd2849d2..568e01f88 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsEventBase.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsEventBase.java @@ -17,6 +17,8 @@ ******************************************************************************/ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.RangeQueryBuilder; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.MwtNotificationBase; @@ -30,6 +32,9 @@ public class EsEventBase extends EsObject { public static final String ESDATATYPENAME = "eventlog"; + private static final String EVENTLOG_FIELD_TIMESTAMP = "event.timeStamp"; + + private MwtNotificationBase event; public MwtNotificationBase getProblem() { @@ -40,4 +45,13 @@ public class EsEventBase extends EsObject { this.event = event; } + /** + * Query to get older Elements + * @param netconfTimeStamp to identify older Elements + * @return QueryBuilder for older elements related to timestamp + */ + public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) { + return new RangeQueryBuilder(EVENTLOG_FIELD_TIMESTAMP).lt(netconfTimeStamp); + } + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultLog.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultLog.java index 06a893ad7..e15aba5b2 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultLog.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultLog.java @@ -17,6 +17,8 @@ ******************************************************************************/ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.RangeQueryBuilder; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; @@ -30,6 +32,8 @@ public class EsFaultLog extends EsObject { public static final String ESDATATYPENAME = "faultlog"; + private static final String FAULTLOG_FIELD_TIMESTAMP = "fault.timeStamp"; + private ProblemNotificationXml fault; public ProblemNotificationXml getProblem() { @@ -40,4 +44,13 @@ public class EsFaultLog extends EsObject { this.fault = fault; } + /** + * Get older Elements + * @param netconfTimeStamp to identify query elements older than this timestamp. + * @return QueryBuilder for related elements + */ + public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) { + return new RangeQueryBuilder(FAULTLOG_FIELD_TIMESTAMP).lt(netconfTimeStamp); + } + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/NetconfChangeListener.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/NetconfChangeListener.java index fc5607557..a521bb94c 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/NetconfChangeListener.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/NetconfChangeListener.java @@ -45,6 +45,7 @@ import org.slf4j.LoggerFactory; // 07.09.18 Switched to DataTreeChangeListener from ClusteredDataTreeChangeListener -> DM Service is // running at all nodes // This is not correct +@SuppressWarnings("deprecation") public class NetconfChangeListener implements ClusteredDataTreeChangeListener<Node>, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(NetconfChangeListener.class); @@ -156,33 +157,8 @@ public class NetconfChangeListener implements ClusteredDataTreeChangeListener<No if (nodeIdString.equals(CONTROLLER)) { LOG.debug("Stop processing for [{}]", nodeIdString); } else { - // Action related to mountpoint status - switch (action) { - case REMOVE: - deviceManagerService.removeMountpointState(nodeId); // Stop Monitor - deviceManagerService.enterNonConnectedState(nodeId, nnode); // Remove Mountpoint handler - break; - - case UPDATE: - case CREATE: - if (csts != null) { - switch (csts) { - case Connected: { - deviceManagerService.startListenerOnNodeForConnectedState(action, nodeId, - nnode); - break; - } - case UnableToConnect: - case Connecting: { - deviceManagerService.enterNonConnectedState(nodeId, nnode); - break; - } - } - } else { - LOG.debug("NETCONF Node handled with null status for action", action); - } - break; - } + // Action forwarded to devicehandler + deviceManagerService.netconfChangeHandler(action, csts, nodeId, nnode); } } } catch (NullPointerException e) { diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/ODLEventListener.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/ODLEventListener.java index ecaf06b55..4b87b5828 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/ODLEventListener.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/ODLEventListener.java @@ -47,17 +47,18 @@ import org.slf4j.LoggerFactory; public class ODLEventListener { private static final Logger LOG = LoggerFactory.getLogger(ODLEventListener.class); - private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); private final String ownKeyName; - private final WebSocketServiceClient webSocketService; private final HtDatabaseEventsService databaseService; private final ProviderClient dcaeProvider; private final ProviderClient aotsMProvider; - private int eventNumber; private final MaintenanceService maintenanceService; + + private int eventNumber; + /*--------------------------------------------------------------- * Construct */ diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java index 6ca7a5c18..c8f769677 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java @@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory; * Wrapper for forwarding web-socket notifications to the web-socket service, that is running as * bundle. */ +@SuppressWarnings("deprecation") public class WebSocketServiceClientImpl2 implements WebSocketServiceClient { private static final Logger LOG = LoggerFactory.getLogger(ODLEventListener.class); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/database/types/EsEventOdluxLog.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/database/types/EsEventOdluxLog.java new file mode 100644 index 000000000..14f7d2447 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/database/types/EsEventOdluxLog.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.devicemanager.index.database.types; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.RangeQueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; + +/** + * Event log, used by Odlux client. + * Not used for writing any data by devicemanager. + * Type introduced to implement IndexCleanService + */ + +public class EsEventOdluxLog extends EsObject { + + public static final String ESDATATYPENAME = "log"; + + private static final String LOG_FIELD_TIMESTAMP = "timestamp"; + + private String type; + private String component; + private String message; + private String timestamp; + + /** + * For jackson + */ + protected EsEventOdluxLog() { + } + /** + * Constructor + * @param type string + * @param component string + * @param message string + * @param timestamp string with netconf format string + */ + public EsEventOdluxLog(String type, String component, String message, InternalDateAndTime timestamp) { + super(); + this.type = type; + this.component = component; + this.message = message; + this.timestamp = timestamp.getValue(); + } + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("component") + public String getComponent() { + return component; + } + + @JsonProperty("message") + public String getMessage() { + return message; + } + + @JsonProperty(LOG_FIELD_TIMESTAMP) + public String getTimestamp() { + return timestamp; + } + + /** + * Query to get older Elements + * @param netconfTimeStamp to identify older Elements + * @return QueryBuilder for older elements related to timestamp + */ + public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) { + return new RangeQueryBuilder(LOG_FIELD_TIMESTAMP).lt(netconfTimeStamp); + } + + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexMwtnService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexMwtnService.java index e175515ae..0e6b03291 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexMwtnService.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexMwtnService.java @@ -17,9 +17,15 @@ ******************************************************************************/ package org.onap.ccsdk.features.sdnr.wt.devicemanager.index.impl; +import java.util.Date; +import org.elasticsearch.index.query.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice.ArchiveCleanProvider; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDataBaseReaderAndWriter; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.IndexClientBuilder; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.database.types.EsEventOdluxLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,9 +34,10 @@ import org.slf4j.LoggerFactory; * @author herbert * */ -public class IndexMwtnService implements AutoCloseable { +public class IndexMwtnService implements AutoCloseable, ArchiveCleanProvider { private static final Logger LOG = LoggerFactory.getLogger(IndexMwtnService.class); + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); /** Index name to be used */ public static final String INDEX = "mwtn"; @@ -39,6 +46,9 @@ public class IndexMwtnService implements AutoCloseable { /** Location of configuration data **/ private static final String MODELDATA = "elasticsearch/index/mwtn/modelDescription"; + private final HtDataBaseReaderAndWriter<EsEventOdluxLog> eventRWOdluxLog; + + private final HtDatabaseClientAbstract client; // --- Construct and initialize @@ -46,11 +56,15 @@ public class IndexMwtnService implements AutoCloseable { public IndexMwtnService(HtDatabaseNode database) throws Exception { LOG.info("Create {} start", this.getClass().getSimpleName()); + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX) .setMappingSettingJsonFileName(MAPPING) .setModelDataDirectory(MODELDATA); client = clientBuilder.create(database); clientBuilder.close(); + + eventRWOdluxLog = new HtDataBaseReaderAndWriter<>(client, EsEventOdluxLog.ESDATATYPENAME, EsEventOdluxLog.class); + LOG.info("Create {} finished. DB Service sucessfully started.", this.getClass().getSimpleName()); } @@ -62,10 +76,42 @@ public class IndexMwtnService implements AutoCloseable { return client; } + /** + * Write into Odlux log, used by client + * @param logEntry as test data + */ + public void writeOdluxEventForTestpurpose(EsEventOdluxLog logEntry) { + eventRWOdluxLog.doWrite(logEntry); + } @Override public void close() throws Exception { - client.close(); + if (client != null) { + client.close(); + } + } + + @Override + public int doIndexClean(Date olderAreOutdated) { + + String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); + + QueryBuilder queryOdluxLog = EsEventOdluxLog.getQueryForTimeStamp(netconfTimeStamp); + int removed = eventRWOdluxLog.doRemoveByQuery(queryOdluxLog); + return removed; + + } + + @Override + public int getNumberOfOldObjects(Date olderAreOutdated) { + + String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); + int numberOfElements = 0; + + QueryBuilder queryOdluxLog = EsEventOdluxLog.getQueryForTimeStamp(netconfTimeStamp); + numberOfElements += eventRWOdluxLog.doReadAll(queryOdluxLog).size(); + + return numberOfElements; } } diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/maintenancemode.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/maintenancemode.json index 3d0a41424..9e26dfeeb 100644 --- a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/maintenancemode.json +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/maintenancemode.json @@ -1,22 +1 @@ -{ - "maintenancemode": { - "DragonWave-Z3":{ - "node":"DragonWave-Z3", - "filter": [{ - "definition":{}, - "description":"", - "start":"2018-01-01T10:00+00:00", - "end":"2018-10-10T10:00+00:00" - }] - }, - "MaintenanceMode":{ - "node":"MaintenanceMode", - "filter": [{ - "definition":{}, - "description":"", - "start":"2018-01-01T10:00+00:00", - "end":"2018-10-10T10:00+00:00" - }] - } - } -}
\ No newline at end of file +{}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/wt/devicemanager/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml index a9a4e18ec..b946e1035 100644 --- a/sdnr/wt/devicemanager/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml +++ b/sdnr/wt/devicemanager/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml @@ -36,13 +36,16 @@ limitations under the License. <reference id="rpcProviderRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry" odl:type="default" /> - + + <reference id="clusterSingletonService" + interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/> <bean id="provider" class="org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl" init-method="init" destroy-method="close"> <property name="dataBroker" ref="dataBroker"/> <property name="rpcProviderRegistry" ref="rpcProviderRegistry" /> <property name="notificationPublishService" ref="notificationPublishService" /> <property name="mountPointService" ref="mountPointService" /> + <property name="clusterSingletonService" ref="clusterSingletonService" /> </bean> diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevMgrPropertiesFile.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevMgrPropertiesFile.java index 74d2d2263..1f488b2e9 100644 --- a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevMgrPropertiesFile.java +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevMgrPropertiesFile.java @@ -163,14 +163,14 @@ public class TestDevMgrPropertiesFile { } - private void sleep(int milliseconds) { + private static void sleep(int milliseconds) { try { Thread.sleep(milliseconds); } catch (InterruptedException e) { } } - private void writeFile(File f, String content) { + public static void writeFile(File f, String content) { try { Files.asCharSink(f, StandardCharsets.UTF_8).write(content); } catch (IOException e) { diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDeviceManagerWithDatabase.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDeviceManagerWithDatabase.java index 661194c38..435e8e151 100644 --- a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDeviceManagerWithDatabase.java +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDeviceManagerWithDatabase.java @@ -1,22 +1,17 @@ /******************************************************************************* - * ============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 + * ============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 + * 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========================================================= + * 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.devicemanager.test; @@ -30,27 +25,35 @@ import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Scanner; +import java.util.concurrent.TimeUnit; import org.json.JSONException; import org.json.JSONObject; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice.ArchiveCleanService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseWebAPIClient; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Resources; import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.Capabilities; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerService.Action; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.ClusterSingletonServiceProviderMock; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.DataBrokerNetconfMock; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.MountPointMock; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.MountPointServiceMock; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.NotificationPublishServiceMock; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.RpcProviderRegistryMock; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.util.DBCleanServiceHelper; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.util.ReadOnlyTransactionMountpoint1211Mock; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.util.ReadOnlyTransactionMountpoint1211pMock; import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.util.ReadOnlyTransactionMountpoint12Mock; import org.opendaylight.controller.md.sal.binding.api.MountPointService; import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.slf4j.Logger; @@ -63,7 +66,7 @@ public class TestDeviceManagerWithDatabase { private static Path KARAF_ETC = Paths.get("etc"); private static DeviceManagerImpl deviceManager; - private static MountPointMock mountPoint; + private static MountPointMock mountPoint; private static DataBrokerNetconfMock dataBrokerNetconf; private static final Logger LOG = LoggerFactory.getLogger(TestDeviceManagerWithDatabase.class); @@ -73,25 +76,26 @@ public class TestDeviceManagerWithDatabase { @BeforeClass public static void before() throws InterruptedException, IOException { - System.out.println("Logger: "+LOG.getClass().getName() + " " + LOG.getName()); + System.out.println("Logger: " + LOG.getClass().getName() + " " + LOG.getName()); // Call System property to get the classpath value Path etc = KARAF_ETC; delete(etc); - System.out.println("Create empty:"+etc.toString()); + System.out.println("Create empty:" + etc.toString()); Files.createDirectories(etc); - //Create mocks + // Create mocks ReadOnlyTransactionMountpoint12Mock readOnlyTransaction = new ReadOnlyTransactionMountpoint12Mock(); dataBrokerNetconf = new DataBrokerNetconfMock(); dataBrokerNetconf.setReadOnlyTransaction(readOnlyTransaction); mountPoint = new MountPointMock(); mountPoint.setReadOnlyTransaction(readOnlyTransaction); - MountPointService mountPointService = new MountPointServiceMock(mountPoint); + ClusterSingletonServiceProvider clusterSingletonService = new ClusterSingletonServiceProviderMock(); + MountPointService mountPointService = new MountPointServiceMock(mountPoint); NotificationPublishService notificationPublishService = new NotificationPublishServiceMock(); RpcProviderRegistry rpcProviderRegistry = new RpcProviderRegistryMock(); - //start using blueprint interface + // start using blueprint interface String msg = ""; try { deviceManager = new DeviceManagerImpl(); @@ -100,7 +104,7 @@ public class TestDeviceManagerWithDatabase { deviceManager.setMountPointService(mountPointService); deviceManager.setNotificationPublishService(notificationPublishService); deviceManager.setRpcProviderRegistry(rpcProviderRegistry); - + deviceManager.setClusterSingletonService(clusterSingletonService); deviceManager.init(); } catch (Exception e) { StringWriter sw = new StringWriter(); @@ -110,17 +114,17 @@ public class TestDeviceManagerWithDatabase { e.printStackTrace(); } readOnlyTransaction.close(); - System.out.println("Initialization status: "+deviceManager.isDevicemanagerInitializationOk()); - assertTrue("Devicemanager not initialized: "+msg, deviceManager.isDevicemanagerInitializationOk()); + System.out.println("Initialization status: " + deviceManager.isDevicemanagerInitializationOk()); + assertTrue("Devicemanager not initialized: " + msg, deviceManager.isDevicemanagerInitializationOk()); System.out.println("Initialization done"); - + waitfordatabase(); } @AfterClass public static void after() throws InterruptedException, IOException { System.out.println("Start shutdown"); - //close using blueprint interface + // close using blueprint interface try { deviceManager.close(); } catch (Exception e) { @@ -143,18 +147,6 @@ public class TestDeviceManagerWithDatabase { } @Test - public void test1() throws InterruptedException { - - System.out.println("Test1: Wait for database"); - int timeout = DATABASETIMEOUTSECONDS; - while ( !deviceManager.isDatabaseInitializationFinished() && timeout-- > 0) { - System.out.println("Test1: "+timeout); - Thread.sleep(1000); //On second - } - System.out.println("Test1: database initialized"); - } - - @Test public void test2() { System.out.println("Test2: slave mountpoint"); @@ -190,7 +182,7 @@ public class TestDeviceManagerWithDatabase { NodeId nodeId = new NodeId("mountpointTest3"); Capabilities capabilities = Capabilities.getAvailableCapabilities(nNode); - System.out.println("Node capabilites: "+capabilities); + System.out.println("Node capabilites: " + capabilities); try { deviceManager.startListenerOnNodeForConnectedState(Action.CREATE, nodeId, nNode); @@ -223,7 +215,7 @@ public class TestDeviceManagerWithDatabase { NodeId nodeId = new NodeId("mountpointTest4"); Capabilities capabilities = Capabilities.getAvailableCapabilities(nNode); - System.out.println("Node capabilites: "+capabilities); + System.out.println("Node capabilites: " + capabilities); try { deviceManager.startListenerOnNodeForConnectedState(Action.CREATE, nodeId, nNode); @@ -257,7 +249,7 @@ public class TestDeviceManagerWithDatabase { NodeId nodeId = new NodeId("mountpointTest5"); Capabilities capabilities = Capabilities.getAvailableCapabilities(nNode); - System.out.println("Node capabilites: "+capabilities); + System.out.println("Node capabilites: " + capabilities); try { deviceManager.startListenerOnNodeForConnectedState(Action.CREATE, nodeId, nNode); @@ -283,9 +275,9 @@ public class TestDeviceManagerWithDatabase { System.out.println("Test6: Write zip data file file"); File testFile = new File("etc/elasticsearch_update.zip"); Resources.extractFileTo("elasticsearch_update.zip", testFile); - int wait=130; - while ( testFile.exists() && wait-- > 0) { - System.out.println("Waiting "+wait); + int wait = 130; + while (testFile.exists() && wait-- > 0) { + System.out.println("Waiting " + wait); try { Thread.sleep(1000); } catch (InterruptedException e) { @@ -298,11 +290,92 @@ public class TestDeviceManagerWithDatabase { } - //********************* Private + @Test + public void test7() throws Exception { + final int NUM = 5; + final int ARCHIVE_DAYS = 30; + final long ARCHIVE_LIMIT_SEC = TimeUnit.SECONDS.convert(ARCHIVE_DAYS, TimeUnit.DAYS); + final long ARCHIVE_INTERVAL_SEC = 10; + File propFile = KARAF_ETC.resolve("devicemanager.properties").toFile(); + + ArchiveCleanService service = deviceManager.getArchiveCleanService(); + DBCleanServiceHelper helper = new DBCleanServiceHelper(deviceManager); + + // setEsConfg + TestDevMgrPropertiesFile.writeFile(propFile, getContent(ARCHIVE_LIMIT_SEC, ARCHIVE_INTERVAL_SEC)); + //give time to read file + sleep(5); + System.out.println("Archive clean service configuration "+service); + System.out.println("To delete elements older: "+service.getDateForOldElements()); + System.out.println("Status of elements is: "+service.countOldEntries()); + + // create old data and check if the will be cleaned completely + int elements = helper.writeDataToLogs(NUM, ARCHIVE_DAYS+5, 0 /*Hours*/); + System.out.println("Written elements are: "+elements); + + waitForDeletion(service, 2 * ARCHIVE_INTERVAL_SEC, elements, "Entries are not cleared completely as expected"); + + // create partial old and newer data and check that only half of all data are cleaned + // New data are not counted as "old" .. + int elementsToRemove = elements = helper.writeDataToLogs(NUM, ARCHIVE_DAYS+5, 0); + elements += helper.writeDataToLogs(NUM, ARCHIVE_DAYS-5, 0); + waitForDeletion(service, 2 * ARCHIVE_INTERVAL_SEC, elementsToRemove, "Entries are not cleared exactly half as expected"); + + // create only newer data and check that nothing is cleaned + elements = helper.writeDataToLogs(NUM, ARCHIVE_DAYS+2, 0); + waitForDeletion(service, 2 * ARCHIVE_INTERVAL_SEC, elements, "Some entries were removed, but shouldn't."); + + service.close(); + } + + // ********************* Private + + private void waitForDeletion(ArchiveCleanService service, long timeout, long numberAtBeginning, String faultMessage) { + int numberEntries = 0; + while (timeout-- > 0) { + sleep(1000); + numberEntries = service.countOldEntries(); + if (numberEntries <= 0) { + break; + } + } + if (timeout == 0) { + fail(faultMessage + " Timeout at:" + timeout + " Entries at beginning " + numberAtBeginning + + " remaining" + numberEntries); + } + } + + + private static void waitfordatabase() throws InterruptedException { + + System.out.println("Test1: Wait for database"); + int timeout = DATABASETIMEOUTSECONDS; + while (!deviceManager.isDatabaseInitializationFinished() && timeout-- > 0) { + System.out.println("Test1: " + timeout); + Thread.sleep(1000); // On second + } + System.out.println("Ddatabase initialized"); + } + + private static void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + LOG.warn(e.getMessage()); + Thread.interrupted(); + } + } + + private static void waitEnter() { + Scanner sc = new Scanner(System.in); + System.out.println("Enter"); + sc.next(); + sc.close(); + } private static void delete(Path etc) throws IOException { if (Files.exists(etc)) { - System.out.println("Found and remove:"+etc.toString()); + System.out.println("Found and remove:" + etc.toString()); delete(etc.toFile()); } } @@ -318,5 +391,21 @@ public class TestDeviceManagerWithDatabase { } } + private String getContent(long archiveLimitSeconds, long esArchiveCheckIntervalSeconds) { + return "[dcae]\n" + "dcaeUserCredentials=admin:admin\n" + "dcaeUrl=http://localhost:45/abc\n" + + "dcaeHeartbeatPeriodSeconds=120\n" + "dcaeTestCollector=no\n" + "\n" + "[aots]\n" + + "userPassword=passwd\n" + "soapurladd=off\n" + "soapaddtimeout=10\n" + "soapinqtimeout=20\n" + + "userName=user\n" + "inqtemplate=inqreq.tmpl.xml\n" + "assignedto=userid\n" + + "addtemplate=addreq.tmpl.xml\n" + "severitypassthrough=critical,major,minor,warning\n" + + "systemuser=user\n" + "prt-offset=1200\n" + "soapurlinq=off\n" + "#smtpHost=\n" + "#smtpPort=\n" + + "#smtpUsername=\n" + "#smtpPassword=\n" + "#smtpSender=\n" + "#smtpReceivers=\n" + "\n" + "[es]\n" + + "esCluster=sendateodl5\n" + "esArchiveLifetimeSeconds=" + archiveLimitSeconds + "\n" + "esArchiveCheckIntervalSeconds=" + + esArchiveCheckIntervalSeconds + "\n" + "\n" + "[aai]\n" + "#keep comment\n" + + "aaiHeaders=[\"X-TransactionId: 9999\"]\n" + "aaiUrl=off\n" + "aaiUserCredentials=AAI:AAI\n" + + "aaiDeleteOnMountpointRemove=true\n" + "aaiTrustAllCerts=false\n" + "aaiApiVersion=aai/v13\n" + + "aaiPropertiesFile=aaiclient.properties\n" + "\n" + "[pm]\n" + "pmCluster=sendateodl5\n" + + "pmEnabled=true\n" + "[toggleAlarmFilter]\n" + "taEnabled=false\n" + "taDelay=5555\n" + ""; + } + } diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/ClusterSingletonServiceProviderMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/ClusterSingletonServiceProviderMock.java new file mode 100644 index 000000000..30b64817a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/ClusterSingletonServiceProviderMock.java @@ -0,0 +1,19 @@ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; + +public class ClusterSingletonServiceProviderMock implements ClusterSingletonServiceProvider { + + @Override + public void close() throws Exception { + + } + + @Override + public ClusterSingletonServiceRegistration registerClusterSingletonService(ClusterSingletonService service) { + return null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/util/DBCleanServiceHelper.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/util/DBCleanServiceHelper.java new file mode 100644 index 000000000..4e46e1800 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/util/DBCleanServiceHelper.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * ============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.devicemanager.test.util; + +import java.util.Date; +import java.util.concurrent.TimeUnit; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.database.types.EsEventOdluxLog; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.impl.IndexMwtnService; + +public class DBCleanServiceHelper { + + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + + private final HtDatabaseEventsService databaseEventService; + private final IndexMwtnService mwtnService; + + /** + * Helper to fill data into the database + * @param deviceManager devicemanger to get services + */ + public DBCleanServiceHelper(DeviceManagerImpl deviceManager) { + this.databaseEventService = deviceManager.getDatabaseClientEvents(); + this.mwtnService = deviceManager.getMwtnService(); + } + + /** + * Write data into database with specific date and content profile. + * @param number of data to be written for each log + * @param days starting day, relative to actual date + * @param hours starting hour ... increased by one hour for each write + * @return integer with the amount of written data + */ + public int writeDataToLogs(int number, int days, int hours) { + int res = 0; + for (Integer t=0; t < number; t++) { //Test "sdnevents", "eventlog" + ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml( + "Testpoint"+t, t.toString(), getInternalDateAndTime(days, hours+t), "ObjectId"+t); + databaseEventService.writeEventLog(notificationXml); + res++; + } + + for (Integer t=0; t < number; t++) { //Test "sdnevents", "faultlog" + ProblemNotificationXml fault = new ProblemNotificationXml( + "ProblemNode"+t, "Problemuuid", "Problemname", InternalSeverity.Major, t.toString(), getInternalDateAndTime(days, hours+t)); + databaseEventService.writeFaultLog(fault); + res++; + } + + for (Integer t=0; t < number; t++) { //Test "mwtn", "log" + EsEventOdluxLog odluxEvent = new EsEventOdluxLog("Odluxevent"+t, "Problemuuid", "Message", getInternalDateAndTime(days, hours+t)); + mwtnService.writeOdluxEventForTestpurpose(odluxEvent); + res++; + } + + return res; + } + + /************************************************************** + * Private section + */ + + private InternalDateAndTime getInternalDateAndTime(int days, int hours) { + Date actual = new Date(new Date().getTime() - TimeUnit.MILLISECONDS.convert(days, TimeUnit.DAYS) - TimeUnit.MILLISECONDS.convert(hours, TimeUnit.HOURS)); + InternalDateAndTime timeStamp = InternalDateAndTime.valueOf(NETCONFTIME_CONVERTER.getTimeStamp(actual)); + return timeStamp; + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/simplelogger.properties b/sdnr/wt/devicemanager/provider/src/test/resources/simplelogger.properties index 5a8d43145..eec5d3a4c 100644 --- a/sdnr/wt/devicemanager/provider/src/test/resources/simplelogger.properties +++ b/sdnr/wt/devicemanager/provider/src/test/resources/simplelogger.properties @@ -10,9 +10,10 @@ org.slf4j.simpleLogger.defaultLogLevel=info # Must be one of ("trace", "debug", "info", "warn", or "error"). # If not specified, the default logging detail level is used. # org.slf4j.simpleLogger.log.xxx.yyy=debug -org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager=debug +org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager=info +org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice=debug org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Resources=info -org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container=trace +org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container=info # Set to true if you want the current date and time to be included in output messages. # Default is false, and will output the number of milliseconds elapsed since startup. diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/test.properties b/sdnr/wt/devicemanager/provider/src/test/resources/test.properties index 943c25bd9..de49c5893 100644 --- a/sdnr/wt/devicemanager/provider/src/test/resources/test.properties +++ b/sdnr/wt/devicemanager/provider/src/test/resources/test.properties @@ -26,6 +26,14 @@ soapurlinq=off [es] esCluster=sendateodl5 +#time limit to keep increasing data in database [in seconds] +#60*60*24*30 (30days) +esArchiveLimit=2592000 +#folder where removed data will be stored +esArchiveFolder=./backup +#interval to archive database [in seconds] +#60*60*24 (1day) +esArchiveInterval=86400 [aai] #keep comment diff --git a/sdnr/wt/devicemodel/feature/pom.xml b/sdnr/wt/devicemodel/feature/pom.xml index 35b1cc3f1..c460e7140 100644 --- a/sdnr/wt/devicemodel/feature/pom.xml +++ b/sdnr/wt/devicemodel/feature/pom.xml @@ -19,7 +19,8 @@ * 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"> +<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> @@ -32,7 +33,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>single-feature-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <dependencyManagement> @@ -47,8 +48,7 @@ <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>mdsal-artifacts</artifactId> - <version>1.8.1</version> - <!-- <version>${odl.mdsal.version}</version> --> + <version>${odl.controller.mdsal.version}</version> <type>pom</type> <scope>import</scope> </dependency> diff --git a/sdnr/wt/devicemodel/installer/pom.xml b/sdnr/wt/devicemodel/installer/pom.xml index 66c47fd7c..19998efc8 100755 --- a/sdnr/wt/devicemodel/installer/pom.xml +++ b/sdnr/wt/devicemodel/installer/pom.xml @@ -21,22 +21,23 @@ * ============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"> +<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> - <parent> - <groupId>org.onap.ccsdk.parent</groupId> - <artifactId>odlparent-lite</artifactId> - <version>1.2.2-SNAPSHOT</version> - <relativePath/> - </parent> - <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> <artifactId>sdnr-wt-devicemodel-installer</artifactId> <version>0.4.2-SNAPSHOT</version> <packaging>pom</packaging> <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>odlparent-lite</artifactId> + <version>1.2.2-SNAPSHOT</version> + <relativePath /> + </parent> + <properties> <application.name>sdnr-wt-devicemodel</application.name> <include.transitive.dependencies>false</include.transitive.dependencies> diff --git a/sdnr/wt/devicemodel/model/pom.xml b/sdnr/wt/devicemodel/model/pom.xml index 3a8d84e12..5795c3d42 100644 --- a/sdnr/wt/devicemodel/model/pom.xml +++ b/sdnr/wt/devicemodel/model/pom.xml @@ -21,22 +21,23 @@ * ============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"> +<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> - <parent> - <groupId>org.onap.ccsdk.parent</groupId> - <artifactId>binding-parent</artifactId> - <version>1.2.2-SNAPSHOT</version> - <relativePath/> - </parent> - <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> <artifactId>sdnr-wt-devicemodel-model</artifactId> <version>0.4.2-SNAPSHOT</version> <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> <packaging>bundle</packaging> + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>binding-parent</artifactId> + <version>1.2.2-SNAPSHOT</version> + <relativePath /> + </parent> + <properties> <maven.javadoc.skip>true</maven.javadoc.skip> </properties> @@ -71,3 +72,4 @@ </plugins> </build> </project> + diff --git a/sdnr/wt/devicemodel/pom.xml b/sdnr/wt/devicemodel/pom.xml index 60d8cc032..14e4d6a69 100755 --- a/sdnr/wt/devicemodel/pom.xml +++ b/sdnr/wt/devicemodel/pom.xml @@ -24,6 +24,12 @@ <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-devicemodel-top</artifactId> + <version>0.4.2-SNAPSHOT</version> + <packaging>pom</packaging> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> @@ -31,12 +37,6 @@ <relativePath/> </parent> - <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> - <artifactId>sdnr-wt-devicemodel-top</artifactId> - <version>0.4.2-SNAPSHOT</version> - <packaging>pom</packaging> - <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> - <properties> <feature-name>sdnr-wt-devicemodel</feature-name> </properties> diff --git a/sdnr/wt/featureaggregator/feature/pom.xml b/sdnr/wt/featureaggregator/feature/pom.xml index 09cc5aa4c..ec69487a1 100644 --- a/sdnr/wt/featureaggregator/feature/pom.xml +++ b/sdnr/wt/featureaggregator/feature/pom.xml @@ -19,7 +19,8 @@ * 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"> +<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> @@ -32,7 +33,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>single-feature-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <dependencyManagement> @@ -83,7 +84,6 @@ <type>xml</type> <classifier>features</classifier> </dependency> -<!-- <dependency> <groupId>${project.groupId}</groupId> <artifactId>sdnr-wt-odlux-core-feature</artifactId> @@ -98,6 +98,5 @@ <type>xml</type> <classifier>features</classifier> </dependency> ---> </dependencies> </project> diff --git a/sdnr/wt/featureaggregator/installer/pom.xml b/sdnr/wt/featureaggregator/installer/pom.xml index ca714c42f..623073074 100755 --- a/sdnr/wt/featureaggregator/installer/pom.xml +++ b/sdnr/wt/featureaggregator/installer/pom.xml @@ -19,7 +19,9 @@ * 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"> +<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> @@ -32,7 +34,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <properties> @@ -42,7 +44,7 @@ </properties> <dependencies> - <dependency> + <dependency> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> <artifactId>${application.name}</artifactId> <version>${project.version}</version> @@ -119,6 +121,27 @@ <copyPom>false</copyPom> </configuration> </execution> + <execution> + <id>unpack-cache-schema</id> + <goals> + <goal>unpack</goal> + </goals> + <phase>prepare-package</phase> + <configuration> + <artifactItems> + <artifactItem> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-devicemanager-provider</artifactId> + <version>0.4.2-SNAPSHOT</version> + <type>jar</type> + </artifactItem> + </artifactItems> + <outputDirectory>${project.build.directory}/assembly</outputDirectory> + <includes>preload.cache.schema/**</includes> + <overWriteReleases>false</overWriteReleases> + <overWriteSnapshots>true</overWriteSnapshots> + </configuration> + </execution> </executions> </plugin> </plugins> diff --git a/sdnr/wt/featureaggregator/pom.xml b/sdnr/wt/featureaggregator/pom.xml index cc9aa4ae5..3121490f6 100755 --- a/sdnr/wt/featureaggregator/pom.xml +++ b/sdnr/wt/featureaggregator/pom.xml @@ -19,7 +19,9 @@ * 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"> +<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> @@ -32,7 +34,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modules> diff --git a/sdnr/wt/helpserver/feature/pom.xml b/sdnr/wt/helpserver/feature/pom.xml index 7545ce3e9..e2d22b9c6 100644 --- a/sdnr/wt/helpserver/feature/pom.xml +++ b/sdnr/wt/helpserver/feature/pom.xml @@ -21,7 +21,9 @@ * ============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"> + +<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> @@ -34,7 +36,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>single-feature-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> diff --git a/sdnr/wt/helpserver/installer/pom.xml b/sdnr/wt/helpserver/installer/pom.xml index cdf810ef1..84ad2c9d1 100755 --- a/sdnr/wt/helpserver/installer/pom.xml +++ b/sdnr/wt/helpserver/installer/pom.xml @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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> @@ -12,7 +14,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <properties> diff --git a/sdnr/wt/helpserver/pom.xml b/sdnr/wt/helpserver/pom.xml index 89070da44..dcc7dd641 100755 --- a/sdnr/wt/helpserver/pom.xml +++ b/sdnr/wt/helpserver/pom.xml @@ -21,7 +21,9 @@ * ============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"> + +<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> @@ -47,4 +49,4 @@ <properties> <feature-name>sdnr-wt-helpserver</feature-name> </properties> -</project> +</project>
\ No newline at end of file diff --git a/sdnr/wt/helpserver/provider/README.md b/sdnr/wt/helpserver/provider/README.md new file mode 100644 index 000000000..d35aeb580 --- /dev/null +++ b/sdnr/wt/helpserver/provider/README.md @@ -0,0 +1,34 @@ +##Creating help files + +#### Link and references to pictures. + +All links are relative to the current md-file. + +Link to pages located in the same directory: + +``` +[linkname](file.md) +``` + +Link to subpages located in subdirectories: + +``` +[linkname](subfolder/file.md) +``` + +External Links: + +``` +[linkname](linkurl "linktitle") +``` + +Images: + +``` +![SDN-R in ONAP](./ONAP-SDN-R.png "SDN-R in ONAP") +``` + +#### Supported formates + +md-format: +Picture formats: PNG diff --git a/sdnr/wt/helpserver/provider/pom.xml b/sdnr/wt/helpserver/provider/pom.xml index 392ae1a40..7c7d1fd12 100644 --- a/sdnr/wt/helpserver/provider/pom.xml +++ b/sdnr/wt/helpserver/provider/pom.xml @@ -1,83 +1,75 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- * ============LICENSE_START======================================================= - * ONAP : CCSDK.sdnr.wt.apigateway.provider * ================================================================================ - * Copyright (C) 2018 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/maven-v4_0_0.xsd"> +<!-- * ============LICENSE_START======================================================= + * ONAP : CCSDK.sdnr.wt.apigateway.provider * ================================================================================ + * Copyright (C) 2018 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/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> + <modelVersion>4.0.0</modelVersion> - <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> - <artifactId>sdnr-wt-helpserver-provider</artifactId> - <version>0.4.2-SNAPSHOT</version> - <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> - <packaging>bundle</packaging> - <properties> - <checkstyle.skip>true</checkstyle.skip> - <buildtime>${maven.build.timestamp} UTC</buildtime> - <distversion>ONAP Dublin (Flourine-SR1)</distversion> - <buildno>1.15b7491</buildno> - </properties> - <parent> - <groupId>org.onap.ccsdk.parent</groupId> - <artifactId>binding-parent</artifactId> - <version>1.2.2-SNAPSHOT</version> - <relativePath/> - </parent> - <dependencies> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> - <version>2.5</version> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-simple</artifactId> - </dependency> - <dependency> - <groupId>org.json</groupId> - <artifactId>json</artifactId> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.core</artifactId> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.compendium</artifactId> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <scope>test</scope> - </dependency> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-helpserver-provider</artifactId> + <version>0.4.2-SNAPSHOT</version> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + <packaging>bundle</packaging> + <properties> + <checkstyle.skip>true</checkstyle.skip> + </properties> + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>binding-parent</artifactId> + <version>1.2.2-SNAPSHOT</version> + <relativePath /> + </parent> + <dependencies> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + <version>2.5</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + </dependency> + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> - </dependencies> - <build> - <resources> - <!-- replace properties in about.md --> - <resource> - <directory>src/main/resources</directory> - <filtering>true</filtering> - </resource> - </resources> - <plugins> - <!-- fixed bug for sonarcube --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <useSystemClassLoader>false</useSystemClassLoader> - </configuration> - </plugin> - </plugins> - </build> + </dependencies> + <build> + <plugins> + <!-- fixed bug for sonarcube --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <useSystemClassLoader>false</useSystemClassLoader> + </configuration> + </plugin> + </plugins> + </build> </project> diff --git a/sdnr/wt/helpserver/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/helpserver/HelpServlet.java b/sdnr/wt/helpserver/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/helpserver/HelpServlet.java index 35e351563..f91e96b79 100644 --- a/sdnr/wt/helpserver/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/helpserver/HelpServlet.java +++ b/sdnr/wt/helpserver/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/helpserver/HelpServlet.java @@ -26,8 +26,6 @@ import java.io.OutputStream; import java.net.URISyntaxException; import java.net.URLDecoder; import java.nio.file.Path; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -67,11 +65,7 @@ public class HelpServlet extends HttpServlet implements AutoCloseable { resp.addHeader("Access-Control-Allow-Methods", "OPTIONS, HEAD, GET, POST, PUT, DELETE"); resp.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length"); if (query != null && query.contains("meta")) { - /* - * LOG.debug("received post with uri="+req.getRequestURI()); String - * uri=req.getRequestURI().substring(BASEURI.length()); if(uri.startsWith("/")) - * uri=uri.substring(1); - */ + File f = new File(HelpInfrastructureObject.KARAFHELPDIRECTORY, "meta.json"); if (f.exists()) { LOG.debug("found local meta file"); @@ -120,36 +114,20 @@ public class HelpServlet extends HttpServlet implements AutoCloseable { } LOG.debug("delivering file"); OutputStream out = resp.getOutputStream(); - String version = null; - if (REDIRECT_LINKS) { - version = getVersionFromRequestedUri(uri); - } - if (this.isTextFile(f) && REDIRECT_LINKS && version != null) { - final String regex = - "(!?\\[[^\\]]*?\\])\\(((?:(?!http|www\\.|\\#|\\.com|\\.net|\\.info|\\.org|\\.svg|\\.png|\\.jpg|\\.gif|\\.jpeg|\\.pdf).)*?)\\)"; - final Pattern pattern = Pattern.compile(regex); - Matcher matcher; - String line; - try (BufferedReader br = new BufferedReader(new FileReader(f))) { - line = br.readLine(); - while (line != null) { - // check line for internal link - matcher = pattern.matcher(line); - if (matcher.find()) { - // extend link with specific version - line = line.replace(matcher.group(2), - "../" + matcher.group(2) + version + "/README.md"); - } - out.write((line + "\n").getBytes()); - line = br.readLine(); - - } - out.flush(); - out.close(); - br.close(); - } - - } else { +// if (this.isTextFile(f) && REDIRECT_LINKS) { +// String line; +// try (BufferedReader br = new BufferedReader(new FileReader(f))) { +// line = br.readLine(); +// while (line != null) { +// out.write((line + "\n").getBytes()); +// line = br.readLine(); +// } +// out.flush(); +// out.close(); +// br.close(); +// } +// } else + { try (FileInputStream in = new FileInputStream(f)) { byte[] buffer = new byte[1024]; @@ -169,27 +147,6 @@ public class HelpServlet extends HttpServlet implements AutoCloseable { } } - /** - * Extract version from URI string - * @param uri = "help/folder1/folder2/version/README.md" - * @return version as a string - */ - private static String getVersionFromRequestedUri(String uri) { - if (uri == null) { - return null; - } - int lastidx = uri.lastIndexOf("/"); - if (lastidx < 0) { - return null; - } - int slastidx = uri.lastIndexOf("/", lastidx - 1); - if (slastidx < 0) { - return null; - } - return uri.substring(slastidx + 1, lastidx); - - } - private boolean ispdf(File f) { return f != null ? this.ispdf(f.getName()) : false; } diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/README.md index c03217d14..c99967d2b 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/README.md @@ -1,7 +1,7 @@ # MediatorServer ## Description -The mediator server is the physical device on which multiple instances of the [mediators](mediator/) are running. Additionally a small webserver provides an API to control and create the mediators via HTTP-API. These mediators are translating the requests and responses between the SDN-Controller(netconf) and the device(snmp). Because of the restricted snmp protocol (port 162 only) we have to implement a prerouting automatism that forwards the alarms sent by the devices to another local port so that each mediator only gets the alarms of its device. +The mediator server is the physical device on which multiple instances of the [mediators](mediator/README.md) are running. Additionally a small webserver provides an API to control and create the mediators via HTTP-API. These mediators are translating the requests and responses between the SDN-Controller(netconf) and the device(snmp). Because of the restricted snmp protocol (port 162 only) we have to implement a prerouting automatism that forwards the alarms sent by the devices to another local port so that each mediator only gets the alarms of its device. diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/installation/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/installation/README.md index 6fdcbaec0..6fdcbaec0 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/installation/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/installation/README.md diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/mediator/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/mediator/README.md index 9fa43a436..9fa43a436 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/mediator/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/mediatorserver/mediator/README.md diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/meta.json b/sdnr/wt/helpserver/provider/src/main/resources/help/meta.json index b23e8d9d0..0bcd0f3e8 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/meta.json +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/meta.json @@ -1,222 +1,177 @@ { - "sdnr": { - "nodes": { - "connect": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/connect/0.4.0/README.md", - "label": "Connect" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/connect/0.4.0/README.md", - "label": "Connect" - } - }, - "label": "Connect" - }, - "pnfFault": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/pnfFault/0.4.0/README.md", - "label": "pnf Fault" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/pnfFault/0.4.0/README.md", - "label": "pnf Fault" - } - }, - "label": "pnf Fault" - }, - "pnfMaintenance": { - "versions": { - "0.4.0": { - "date": "2018-09-13", - "path": "sdnr/pnfMaintenance/0.4.0/README.md", - "label": "pnf Maintenance" - }, - "current": { - "date": "2018-09-13", - "path": "sdnr/pnfMaintenance/0.4.0/README.md", - "label": "pnf Maintenance" - } - }, - "label": "pnf Maintenance" - }, - "pnfConfig": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/pnfConfig/0.4.0/README.md", - "label": "pnf Config" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/pnfConfig/0.4.0/README.md", - "label": "pnf Config" - } - }, - "label": "pnf Config" - }, - "pnfPerformance": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/pnfPerformance/0.4.0/README.md", - "label": "pnf Performance" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/pnfPerformance/0.4.0/README.md", - "label": "pnf Performance" - } - }, - "label": "pnf Performance" - }, - "pnfInventory": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/pnfInventory/0.4.0/README.md", - "label": "pnf Inventory" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/pnfInventory/0.4.0/README.md", - "label": "pnf Inventory" - } - }, - "label": "pnf Inventory" - }, - "pnfMediator": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/pnfMediator/0.4.0/README.md", - "label": "pnf Mediator" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/pnfMediator/0.4.0/README.md", - "label": "pnf Mediator" - } - }, - "label": "pnf Mediator" - }, - "mwtnTest": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/mwtnTest/0.4.0/README.md", - "label": "LTE RAN Test" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/mwtnTest/0.4.0/README.md", - "label": "LTE RAN Test" - } - }, - "label": "LTE RAN Test" - }, - "mwtnLog": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/mwtnLog/0.4.0/README.md", - "label": "Logs" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/mwtnLog/0.4.0/README.md", - "label": "Logs" - } - }, - "label": "Logs" - } - }, - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/README.md", - "label": "SDN-R" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/README.md", - "label": "SDN-R" - } - }, - "label": "SDN-R" - }, - "mediatorserver":{ - "nodes":{ - "installation":{ - "versions":{ - "0.4.0":{"date":"","path":"mediatorserver/installation/0.4.0/README.md","label":""}, - "current":{"date":"","path":"mediatorserver/installation/0.4.0/README.md","label":""} - }, - "label":"Installation" - }, - "mediator":{ - "versions":{ - "0.4.0":{"date":"","path":"mediatorserver/mediator/0.4.0/README.md","label":""}, - "current":{"date":"","path":"mediatorserver/mediator/0.4.0/README.md","label":""} - }, - "label":"Mediator" - } - }, - "versions":{ - "0.4.0":{"date":"","path":"mediatorserver/0.4.0/README.md","label":""}, - "current":{"date":"","path":"mediatorserver/0.4.0/README.md","label":""} - }, - "label":"MediatorServer" - }, - "faq": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/faq.md", - "label": "FAQ" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/faq.md", - "label": "FAQ" - } - }, - "label": "FAQ" - }, - "abbreviations": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/abbreviations.md", - "label": "Abbreviations" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/abbreviations.md", - "label": "Abbreviations" - } - }, - "label": "Abbreviations" - }, - "about": { - "versions": { - "0.4.0": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/about.md", - "label": "About" - }, - "current": { - "date": "2018-02-24", - "path": "sdnr/0.4.0/about.md", - "label": "About" - } - }, - "label": "About" - } + "sdnr": { + "nodes": { + "connect": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/connect/README.md", + "label": "Connect" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/connect/README.md", + "label": "Connect" + } + }, + "label": "Connect" + }, + "pnfFault": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/pnfFault/README.md", + "label": "Fault" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/pnfFault/README.md", + "label": "Fault" + } + }, + "label": "Fault" + }, + "pnfMaintenance": { + "versions": { + "0.4.0": { + "date": "2018-09-13", + "path": "sdnr/pnfMaintenance/README.md", + "label": "Maintenance" + }, + "current": { + "date": "2018-09-13", + "path": "sdnr/pnfMaintenance/README.md", + "label": "Maintenance" + } + }, + "label": "Maintenance" + }, + "pnfConfig": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/pnfConfig/README.md", + "label": "Config" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/pnfConfig/README.md", + "label": "Config" + } + }, + "label": "Config" + }, + "pnfPerformance": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/pnfPerformance/README.md", + "label": "Performance" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/pnfPerformance/README.md", + "label": "Performance" + } + }, + "label": "Performance" + }, + "pnfInventory": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/pnfInventory/README.md", + "label": "Inventory" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/pnfInventory/README.md", + "label": "Inventory" + } + }, + "label": "Inventory" + }, + "pnfMediator": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/pnfMediator/README.md", + "label": "Mediator" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/pnfMediator/README.md", + "label": "Mediator" + } + }, + "label": "Mediator" + } + }, + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/README.md", + "label": "SDN-R" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/README.md", + "label": "SDN-R" + } + }, + "label": "SDN-R" + }, + "mediatorserver":{ + "nodes":{ + "installation":{ + "versions":{ + "0.4.0":{"date":"","path":"mediatorserver/installation/README.md","label":""}, + "current":{"date":"","path":"mediatorserver/installation/README.md","label":""} + }, + "label":"Installation" + }, + "mediator":{ + "versions":{ + "0.4.0":{"date":"","path":"mediatorserver/mediator/README.md","label":""}, + "current":{"date":"","path":"mediatorserver/mediator/README.md","label":""} + }, + "label":"Mediator" + } + }, + "versions":{ + "0.4.0":{"date":"","path":"mediatorserver/README.md","label":""}, + "current":{"date":"","path":"mediatorserver/README.md","label":""} + }, + "label":"MediatorServer" + }, + "faq": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/faq.md", + "label": "FAQ" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/faq.md", + "label": "FAQ" + } + }, + "label": "FAQ" + }, + "abbreviations": { + "versions": { + "0.4.0": { + "date": "2018-02-24", + "path": "sdnr/abbreviations.md", + "label": "Abbreviations" + }, + "current": { + "date": "2018-02-24", + "path": "sdnr/abbreviations.md", + "label": "Abbreviations" + } + }, + "label": "Abbreviations" + } } diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/about.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/about.md deleted file mode 100644 index 31fd5fef8..000000000 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/about.md +++ /dev/null @@ -1 +0,0 @@ -ONAP SDN-R | ONF Wireless for ${distversion} - Build: ${buildtime} (${buildno})
\ No newline at end of file diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/ONAP-SDN-R.png b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/ONAP-SDN-R.png Binary files differindex cc7bd8a2a..cc7bd8a2a 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/ONAP-SDN-R.png +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/ONAP-SDN-R.png diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/README.md index c0871102b..72e4cad05 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/README.md @@ -2,6 +2,7 @@ SDN-R adds features and functionality to the OpenDaylight-based ONAP controller 'SDN-C'. It is built on the Common Controller Framework to control and manage wireless resources. Wireless resources are virtual network functions (e.g. vBBU, vEPC) or physical network functions (e.g. microwave and millimeter wave radios, eNodeB, RRH, DAS equipment). -SDN-R is integrated into ONAP. Therefore it is interfacing with PNFs and VNFs and with other ONAP components, such as A&AI, DCAE and SO. +SDN-R is integrated into ONAP. Therefore it is interfacing with PNFs and VNFs and with other ONAP components, such as A&AI, DCAE and SO. +[See abbreviations](abbreviations.md) -![SDN-R in ONAP](./ONAP-SDN-R.png "SDN-R in ONAP")
\ No newline at end of file +![SDN-R in ONAP](./ONAP-SDN-R.png "SDN-R in ONAP") diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/abbreviations.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/abbreviations.md index 3704796b4..3704796b4 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/abbreviations.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/abbreviations.md diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/connect/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/connect/README.md index 12e4dbe63..6eba75461 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/connect/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/connect/README.md @@ -4,27 +4,20 @@ The 'Connect' application on OpenDaylight provides up-to-date connectivity infor ## Views -The graphical user interfaces is divided in four sections. +The graphical user interfaces is divided in three sections. ### Required Network Elements Required Network Elements are physical network functions, which are planned or expected in the network. This means the identifier, IP addresses and its required configuration is well-known and available in a planning database or in ONAP A&AI. +This view also offer to manually configure/mount the device with the '+' icon. The SDN controller will then start connecting the Netconf server. + ### Unknown Network Elements Most of the physical network function support an automatic registration procedure to the SDN controller. It may happen, that devices are connected to the SDN Controller but not available in planning data. It might be a normal occurrence for very cheap devices, where an entire planning process to too expensive. But is may also happen that the identifier used in planning process differ from the identifier currently configured in the device. -### Mount NetConf Server - -The view offer manually configuration of a device. The SDN controller will then start connecting the NetConf server. - ### Connection Status Log The log lists the connections status changes between SDN Controller and NetConf servers (devices). - - -## Video - -https://youtu.be/QhchzRV2tac
\ No newline at end of file diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/faq.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/faq.md index d81574640..f9d5e50d7 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/0.4.0/faq.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/faq.md @@ -1,6 +1,6 @@ # Frequently asked questions -- - - + ## Which browser should I use to operate Opendaylight SDN-R User interface? @@ -49,4 +49,24 @@ grep -anr --include=*.log* "Unable to read NE data for mountpoint" . | grep 2018 grep -anr --include=*.log* "LKCYFL79Q01M01MSS801" . | grep 2018 >> 09-LKCYFL79Q01M01MSS801.txt ``` -- - - + +## How to report an odlux issue + +If you would like to report an odlux issue which you have noticed in the Graphical User Interface, please provide the following information: + +1. **Description**: In which application you have noticed the issue? + +2. **Environment**: + - Which browser is used and the version of the browser. eg: *Google chrome - version 71.0.3578.80 / Mozilla Firefox.* + - Which Operating system and version. eg: *Linux/ Windows 10 - version 1803.* + - In which language you are using the application. + - The application URL which is available on the browser address bar. eg: *http://hostname/odlux/index.html#/connectApp* + +3. **Expected Result**: What is the expected result you are looking for? + +4. **Actual Result**: What is the actual result you got? + +5. **Steps to reproduce**: Describe the steps to reproduce the scenario. If possible, please provide the screenshots + +The above information helps us to analyze the problem quicker. + diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnLog/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnLog/README.md index 0096ce831..0096ce831 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnLog/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnLog/README.md diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnTest/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnTest/README.md index 6bd3609c2..6bd3609c2 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnTest/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/mwtnTest/README.md diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfConfig/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfConfig/README.md index d398a8e70..d36ec8e09 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfConfig/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfConfig/README.md @@ -10,6 +10,3 @@ The applications are implemented as OpenDaylight-DLUX web application using the Connections status information are updated automatically due to a web socket for notifications from OpenDaylight to the browser. -## Video - -https://youtu.be/QhchzRV2tac
\ No newline at end of file diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfFault/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfFault/README.md index bfe1774d0..b7db4388e 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfFault/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfFault/README.md @@ -8,7 +8,7 @@ The graphical user interface is separated in three views. ### Current Alarms -It list all current active faults in the network. In addition is also list alarms send by the SDN controller itself, which detects connections losses to the NetConf server (connectionLossOAM) or which detects connection loss to a devices via a mediator to a device (connectionLossNeOAM). +It list all current active faults in the network. In addition it also list alarms sent by the SDN controller itself, which detects connections losses to the NetConf server (connectionLossOAM) or which detects connection loss to a devices via a mediator to a device (connectionLossNeOAM). ### Alarm Notifications @@ -16,18 +16,15 @@ As long as the view is open, it lists all alarm notification reached by the SDN ### Alarm Log -Next to the current active alarms an alarm log list all alarm notifications of the past. +Next to the current active alarms an alarm log lists all alarm notifications of the past. ## Implementation -The application has two parts. While the server is listening for NetConf notifications to store them in the data base the client retrieves the information from the data base and displays them in a grid view. +The application has two parts. While the server is listening for NetConf notifications to store them in the database the client retrieves the information from the database and displays them in a grid view. -The server synchronizes with the current alarm lists of the devices and calculates based on raise and clear notifications the current alarm status of the network. The current alarms are stored in a data base. In addition all Problem Notifications received by the SDN controller are stored. There is no logic implemented on the client. +The server synchronizes with the current alarm lists of the devices and calculates based on raise and clear notifications the current alarm status of the network. The current alarms are stored in a database. In addition all Problem Notifications received by the SDN controller are stored. There is no logic implemented on the client. An alarm status bar on top of each graphical user interface informs the operator about the health status of the network. The OpenDaylight DLUX web application uses web sockets for updating the graphical user interface in case of Problem Notification (devices) and Connection Status Notifications (ODL). -## Video - -https://youtu.be/vONKAtFZ8wc
\ No newline at end of file diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfInventory/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfInventory/0.4.0/README.md deleted file mode 100644 index 436280855..000000000 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfInventory/0.4.0/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Inventory - -The application offers basic inventory management of devices supporting ONF-TR-512. - -After selection of a currently connected physical network function, the inventory data - basically serial-numbers and part-numbers are displaced accroding to the containment of the equipment. - -## Video - -[ONAP / ONF proof of concept](https://cloud-highstreet-technologies.com/nextcloud/index.php/s/m4wFfqkQ1qK3hHe "ONAP / ONF proof of concept") diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfInventory/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfInventory/README.md new file mode 100644 index 000000000..d8122ad0a --- /dev/null +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfInventory/README.md @@ -0,0 +1,21 @@ +# Inventory + +The application offers basic inventory management of devices supporting ONF-TR-512. + +The view displays the inventory data of the network element - basically serial-numbers and part-numbers are displaced according to the containment of the equipment. + +##### Inventory Export: + +As the default pagination size is set to 10, when you export the data only first 10 rows or the first 10 filtered rows shown on the page will be exported to a file. +The inventory export allows the export of up to 1000 entries, when the pagination size is increased to 1000. +So, It is recommended to change the pagination size 'Rows per page' to 1000 if you want to export the complete Inventory data. + +To export the Inventory data: +The behaviour is different depending on the browser: + +a) Some browsers allows you to save the file with the predefined name export.csv. In case your browser does not offer this function please use 'Save as..' + option and define the filename with extension csv. + +b) Some browsers saves the file automatically with the alphanumeric name without an extension. In such case please go to the downloaded file location and rename the file + with the extension after the download. (eg: export_file.csv) + diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMaintenance/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMaintenance/0.4.0/README.md deleted file mode 100644 index 6f5ab5420..000000000 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMaintenance/0.4.0/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Maintenance Mode - -The 'Maintenance' application on the OpenDaylight provides the information of the Network Elements which are set for Maintenance, currently or in the future. - -When a Network Element is mounted with the maintenance mode it automatically shows on this application with the Information like when maintenance will be started or ended. - -Maintenance Mode field in this application shows if the Network Element is in maintenance mode currently or not. -If it is True it means the Network Element is currently undergoing maintenance, If false it means maintenance might have been set for future or maintenance is already completed. - -Users have access to disable the Maintenance mode or change the maintenance start and end dates at any point of time by clicking on the Manage checkbox available.
\ No newline at end of file diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMaintenance/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMaintenance/README.md new file mode 100644 index 000000000..2deadcafc --- /dev/null +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMaintenance/README.md @@ -0,0 +1,10 @@ +# Maintenance + +The 'Maintenance' application on the OpenDaylight provides the information of the Network Elements which are set for Maintenance, currently or in the future. +User can manage devices to set the maintenance mode so that no unnecessary alarms are created. +When the device is in Maintenace alarms are not forwarded to DCAE and when the device maintenance is turned off the alarms will start flowing again. + +'Active' field in this application shows if the Network Element is in maintenance mode currently or not. +If it is 'active' it means the Network Element is currently undergoing maintenance, If 'not active' it means maintenance might have been set for future or maintenance is already completed. + +Users have access to disable the Maintenance mode or change the maintenance start and end dates at any point of time by using the available options in actions column. diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMediator/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMediator/README.md index 246e77b70..246e77b70 100644 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMediator/0.4.0/README.md +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfMediator/README.md diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfPerformance/0.4.0/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfPerformance/0.4.0/README.md deleted file mode 100644 index a1d39186a..000000000 --- a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfPerformance/0.4.0/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Performance Monitoring - -Performance Monitoring values measured by the devices are necessary to analyze and optimize the network. Therefore the application automatically retrieves all historical performance values from the devices and stores them in a data base. The client part just retrieves the values from the database and displays them in graphical and/or grid views. - -## Current performance values - -After selection of a connected PNF supporting ONF-TR-532 and an physical interface, the application collects the current performance values directly from the device and displays then in table views. - -## Performance history values - -After selection of a connected PNF supporting ONF-TR-532 and an physical interface, the application collects the received and centralized stored performance values for this interface and displays then in table views. - -## Performance link values - -After selection of two air-interface creating an air-interface-link, the application collects the received and centralized stored performance values for this link and displays the data in diagrams and table views. - -## Video - -https://youtu.be/fgwbKFt9cos
\ No newline at end of file diff --git a/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfPerformance/README.md b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfPerformance/README.md new file mode 100644 index 000000000..2db5eda81 --- /dev/null +++ b/sdnr/wt/helpserver/provider/src/main/resources/help/sdnr/pnfPerformance/README.md @@ -0,0 +1,8 @@ +# Performance + +Performance Monitoring values measured by the devices are necessary to analyze and optimize the network. Therefore the application automatically retrieves all historical performance values from the devices and stores them in a database. The client part just retrieves the values from the database and displays them in graphical user interface. + +## Performance history values + +After selection of a connected PNF supporting ONF-TR-532 and an physical interface, the application collects the received and centralized stored performance values for this interface and displays them in table views. + diff --git a/sdnr/wt/helpserver/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/helpserver/test/TestMyServlet.java b/sdnr/wt/helpserver/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/helpserver/test/TestMyServlet.java index e51cc6843..2e4f987be 100644 --- a/sdnr/wt/helpserver/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/helpserver/test/TestMyServlet.java +++ b/sdnr/wt/helpserver/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/helpserver/test/TestMyServlet.java @@ -120,7 +120,7 @@ public class TestMyServlet extends Mockito { @Test public void testServlet2() { - this.testGetRequest("test/0.4.0/test.txt"); + this.testGetRequest("test/test.txt"); this.testGetRequest("test.css"); this.testGetRequest("test.eps"); this.testGetRequest("test.pdf"); @@ -156,6 +156,6 @@ public class TestMyServlet extends Mockito { } catch (Exception e) { } - assertEquals(CONTENT,sw.toString().trim()); + assertEquals("compare content for "+fn,CONTENT,sw.toString().trim()); } } diff --git a/sdnr/wt/odlux/LICENSE b/sdnr/wt/odlux/LICENSE index 3556ffa71..c5487c33a 100644 --- a/sdnr/wt/odlux/LICENSE +++ b/sdnr/wt/odlux/LICENSE @@ -1,13 +1,15 @@ -/* - * ============LICENSE_START============================================================================================================= - * Copyright (c) 2018 highstreet-technolgies. - * =================================================================== - * 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=============================================================================================================== - * - */
\ No newline at end of file +============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========================================================================== diff --git a/sdnr/wt/odlux/README.md b/sdnr/wt/odlux/README.md index a0b23fea2..6e02db0e0 100644 --- a/sdnr/wt/odlux/README.md +++ b/sdnr/wt/odlux/README.md @@ -63,6 +63,7 @@ You can install these globally or let it be installed by maven due "mvn clean in ### Default menu positions * from 0 for top to 999 for bottom. + ``` 0 Connect 10 Fault diff --git a/sdnr/wt/odlux/apps/apiDemo/pom.xml b/sdnr/wt/odlux/apps/apiDemo/pom.xml index 8cf7e3243..ae19899b5 100644 --- a/sdnr/wt/odlux/apps/apiDemo/pom.xml +++ b/sdnr/wt/odlux/apps/apiDemo/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -133,7 +135,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/app-feature/pom.xml b/sdnr/wt/odlux/apps/app-feature/pom.xml index ce74a3a0b..beabc38f0 100644 --- a/sdnr/wt/odlux/apps/app-feature/pom.xml +++ b/sdnr/wt/odlux/apps/app-feature/pom.xml @@ -1,68 +1,76 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- * ============LICENSE_START======================================================= - * ONAP : CCSDK.feature.sdnr.wt * ================================================================================ - * Copyright (C) 2018 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> +<!-- * ============LICENSE_START======================================================= + * ONAP : CCSDK.feature.sdnr.wt * ================================================================================ + * Copyright (C) 2018 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========================================================= --> - <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> - <artifactId>sdnr-wt-odlux-apps-feature</artifactId> - <version>0.4.2-SNAPSHOT</version> - <packaging>feature</packaging> - <name>ccsdk-features-sdnr-wt :: ${project.artifactId} :: feature</name> +<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> - <parent> - <groupId>org.onap.ccsdk.parent</groupId> - <artifactId>single-feature-parent</artifactId> - <version>1.2.2-SNAPSHOT</version> - <relativePath/> - </parent> - <licenses> - <license> - <name>Apache License, Version 2.0</name> - <url>http://www.apache.org/licenses/LICENSE-2.0</url> - </license> - </licenses> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-apps-feature</artifactId> + <version>0.4.2-SNAPSHOT</version> + <packaging>feature</packaging> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId} :: feature</name> - <dependencies> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-connectApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-faultApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-helpApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-inventoryApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-maintenanceApp</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>single-feature-parent</artifactId> + <version>1.2.2-SNAPSHOT</version> + <relativePath /> + </parent> + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + + <dependencies> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-connectApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-faultApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-helpApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-inventoryApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-maintenanceApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-performanceHistoryApp</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> </project> diff --git a/sdnr/wt/odlux/apps/app-installer/pom.xml b/sdnr/wt/odlux/apps/app-installer/pom.xml index 1c26e2bf0..3b47d64a1 100755 --- a/sdnr/wt/odlux/apps/app-installer/pom.xml +++ b/sdnr/wt/odlux/apps/app-installer/pom.xml @@ -1,139 +1,146 @@ <?xml version="1.0" encoding="UTF-8"?> -<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> +<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-odlux-apps-installer</artifactId> - <version>0.4.2-SNAPSHOT</version> - <packaging>pom</packaging> - <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-apps-installer</artifactId> + <version>0.4.2-SNAPSHOT</version> + <packaging>pom</packaging> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> - <parent> - <groupId>org.onap.ccsdk.parent</groupId> - <artifactId>odlparent-lite</artifactId> - <version>1.2.2-SNAPSHOT</version> - <relativePath/> - </parent> + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>odlparent-lite</artifactId> + <version>1.2.2-SNAPSHOT</version> + <relativePath /> + </parent> - <properties> - <application.name>sdnr-wt-odlux-apps</application.name> - <include.transitive.dependencies>false</include.transitive.dependencies> - </properties> - <licenses> - <license> - <name>Apache License, Version 2.0</name> - <url>http://www.apache.org/licenses/LICENSE-2.0</url> - </license> - </licenses> + <properties> + <application.name>sdnr-wt-odlux-apps</application.name> + <include.transitive.dependencies>false</include.transitive.dependencies> + </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.onap.ccsdk.features.sdnr.wt</groupId> - <artifactId>${application.name}-feature</artifactId> - <version>${project.version}</version> - <type>xml</type> - <classifier>features</classifier> - <exclusions> - <exclusion> - <groupId>*</groupId> - <artifactId>*</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-apiDemo</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-connectApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-demoApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-faultApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-helpApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-inventoryApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-minimumApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>sdnr-wt-odlux-app-maintenanceApp</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> + <dependencies> + <dependency> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>${application.name}-feature</artifactId> + <version>${project.version}</version> + <type>xml</type> + <classifier>features</classifier> + <exclusions> + <exclusion> + <groupId>*</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-apiDemo</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-connectApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-demoApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-faultApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-helpApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-inventoryApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-minimumApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-maintenanceApp</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-app-performanceHistoryApp</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> - <build> - <plugins> - <plugin> - <artifactId>maven-assembly-plugin</artifactId> - <executions> - <execution> - <id>maven-repo-zip</id> - <goals> - <goal>single</goal> - </goals> - <phase>package</phase> - <configuration> - <attach>true</attach> - <finalName>stage/${application.name}-${project.version}</finalName> - <descriptors> - <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor> - </descriptors> - <appendAssemblyId>true</appendAssemblyId> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <executions> - <execution> - <id>copy-nested-dependencies</id> - <goals> - <goal>copy-dependencies</goal> - </goals> - <phase>prepare-package</phase> - <configuration> - <transitive>true</transitive> - <outputDirectory>${project.build.directory}/assembly/system</outputDirectory> - <overWriteReleases>false</overWriteReleases> - <overWriteSnapshots>true</overWriteSnapshots> - <overWriteIfNewer>true</overWriteIfNewer> - <useRepositoryLayout>true</useRepositoryLayout> - <addParentPoms>false</addParentPoms> - <copyPom>false</copyPom> - <!--<includeArtifactIds>sdnr-wt-apigateway-provider,${application.name}</includeArtifactIds> --> - <!--<scope>provided</scope> --> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <id>maven-repo-zip</id> + <goals> + <goal>single</goal> + </goals> + <phase>package</phase> + <configuration> + <attach>true</attach> + <finalName>stage/${application.name}-${project.version}</finalName> + <descriptors> + <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor> + </descriptors> + <appendAssemblyId>true</appendAssemblyId> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <id>copy-nested-dependencies</id> + <goals> + <goal>copy-dependencies</goal> + </goals> + <phase>prepare-package</phase> + <configuration> + <transitive>true</transitive> + <outputDirectory>${project.build.directory}/assembly/system</outputDirectory> + <overWriteReleases>false</overWriteReleases> + <overWriteSnapshots>true</overWriteSnapshots> + <overWriteIfNewer>true</overWriteIfNewer> + <useRepositoryLayout>true</useRepositoryLayout> + <addParentPoms>false</addParentPoms> + <copyPom>false</copyPom> + <!--<includeArtifactIds>sdnr-wt-apigateway-provider,${application.name}</includeArtifactIds> --> + <!--<scope>provided</scope> --> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> </project> diff --git a/sdnr/wt/odlux/apps/connectApp/pom.xml b/sdnr/wt/odlux/apps/connectApp/pom.xml index d8579e43c..b59a360eb 100644 --- a/sdnr/wt/odlux/apps/connectApp/pom.xml +++ b/sdnr/wt/odlux/apps/connectApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -125,7 +127,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/connectApp/src/components/requiredNetworkElements.tsx b/sdnr/wt/odlux/apps/connectApp/src/components/requiredNetworkElements.tsx index 9cbc368cb..aed81993b 100644 --- a/sdnr/wt/odlux/apps/connectApp/src/components/requiredNetworkElements.tsx +++ b/sdnr/wt/odlux/apps/connectApp/src/components/requiredNetworkElements.tsx @@ -45,7 +45,7 @@ const styles = (theme: Theme) => createStyles({ const mapProps = (state: IApplicationStoreState) => ({ requiredNetworkElementsProperties: createRequiredNetworkElementsProperties(state), - mountedNetworkElements: state.connectApp.mountedNetworkElements + mountedNetworkElements: state.connect.mountedNetworkElements }); const mapDispatch = (dispatcher: IDispatcher) => ({ @@ -74,7 +74,7 @@ export class RequiredNetworkElementsListComponent extends React.Component<Requir }; } - // private navigationCreator + // private navigationCreator render(): JSX.Element { const { classes } = this.props; @@ -123,11 +123,11 @@ export class RequiredNetworkElementsListComponent extends React.Component<Requir <Tooltip title={ "Info" } ><Button className={ classes.button } >I</Button></Tooltip> </div> <div className={ classes.spacer }> - <Tooltip title={ "Fault" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("faultApp", rowData) } >F</Button></Tooltip> - <Tooltip title={ "Configure" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("configureApp", rowData)} >C</Button></Tooltip> - <Tooltip title={ "Accounting " } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("accountingApp", rowData) }>A</Button></Tooltip> - <Tooltip title={ "Performance" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("performanceApp", rowData) }>P</Button></Tooltip> - <Tooltip title={ "Security" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("securityApp", rowData) }>S</Button></Tooltip> + <Tooltip title={ "Fault" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("fault", rowData) } >F</Button></Tooltip> + <Tooltip title={ "Configure" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("configure", rowData)} >C</Button></Tooltip> + <Tooltip title={ "Accounting " } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("accounting", rowData) }>A</Button></Tooltip> + <Tooltip title={ "Performance" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("performance", rowData) }>P</Button></Tooltip> + <Tooltip title={ "Security" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("security", rowData) }>S</Button></Tooltip> </div> </> ) diff --git a/sdnr/wt/odlux/apps/connectApp/src/components/unknownNetworkElements.tsx b/sdnr/wt/odlux/apps/connectApp/src/components/unknownNetworkElements.tsx index fe2c58ced..a72a709e0 100644 --- a/sdnr/wt/odlux/apps/connectApp/src/components/unknownNetworkElements.tsx +++ b/sdnr/wt/odlux/apps/connectApp/src/components/unknownNetworkElements.tsx @@ -32,7 +32,7 @@ const styles = (theme: Theme) => createStyles({ } }); -const mapProps = ({ connectApp: state }: IApplicationStoreState) => ({ +const mapProps = ({ connect: state }: IApplicationStoreState) => ({ mountedNetworkElements: state.mountedNetworkElements }); @@ -126,11 +126,11 @@ export class UnknownNetworkElementsListComponent extends React.Component<Unknown <Tooltip title={ "Info" } ><Button className={ classes.button } >I</Button></Tooltip> </div> <div className={ classes.spacer }> - <Tooltip title={ "Fault" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("faultApp", rowData) } >F</Button></Tooltip> - <Tooltip title={ "Configure" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("configureApp", rowData) } >C</Button></Tooltip> - <Tooltip title={ "Accounting " } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("accountingApp", rowData) }>A</Button></Tooltip> - <Tooltip title={ "Performance" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("performanceApp", rowData) }>P</Button></Tooltip> - <Tooltip title={ "Security" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("securityApp", rowData) }>S</Button></Tooltip> + <Tooltip title={ "Fault" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("fault", rowData) } >F</Button></Tooltip> + <Tooltip title={ "Configure" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("configure", rowData) } >C</Button></Tooltip> + <Tooltip title={ "Accounting " } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("accounting", rowData) }>A</Button></Tooltip> + <Tooltip title={ "Performance" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("performance", rowData) }>P</Button></Tooltip> + <Tooltip title={ "Security" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("security", rowData) }>S</Button></Tooltip> </div> </> ) diff --git a/sdnr/wt/odlux/apps/connectApp/src/handlers/connectAppRootHandler.tsx b/sdnr/wt/odlux/apps/connectApp/src/handlers/connectAppRootHandler.tsx index dd9e3e1df..f67d5b8c9 100644 --- a/sdnr/wt/odlux/apps/connectApp/src/handlers/connectAppRootHandler.tsx +++ b/sdnr/wt/odlux/apps/connectApp/src/handlers/connectAppRootHandler.tsx @@ -11,7 +11,7 @@ export interface IConnectAppStoreState { declare module '../../../../framework/src/store/applicationStore' { interface IApplicationStoreState { - connectApp: IConnectAppStoreState + connect: IConnectAppStoreState } } diff --git a/sdnr/wt/odlux/apps/connectApp/src/handlers/connectionStatusLogHandler.tsx b/sdnr/wt/odlux/apps/connectApp/src/handlers/connectionStatusLogHandler.tsx index 140020eaa..78da2c9af 100644 --- a/sdnr/wt/odlux/apps/connectApp/src/handlers/connectionStatusLogHandler.tsx +++ b/sdnr/wt/odlux/apps/connectApp/src/handlers/connectionStatusLogHandler.tsx @@ -25,6 +25,6 @@ export const { createProperties: createConnectionStatusLogProperties, reloadAction: connectionStatusLogReloadAction, - // set value action, to change a value -} = createExternal<ConnectionStatusLogType>(connectionStatusLogSearchHandler, appState => appState.connectApp.connectionStatusLog); + // set value action, to change a value +} = createExternal<ConnectionStatusLogType>(connectionStatusLogSearchHandler, appState => appState.connect.connectionStatusLog); diff --git a/sdnr/wt/odlux/apps/connectApp/src/handlers/requiredNetworkElementsHandler.tsx b/sdnr/wt/odlux/apps/connectApp/src/handlers/requiredNetworkElementsHandler.tsx index b2d547717..332cb6dcb 100644 --- a/sdnr/wt/odlux/apps/connectApp/src/handlers/requiredNetworkElementsHandler.tsx +++ b/sdnr/wt/odlux/apps/connectApp/src/handlers/requiredNetworkElementsHandler.tsx @@ -13,6 +13,6 @@ export const { createProperties: createRequiredNetworkElementsProperties, reloadAction: requiredNetworkElementsReloadAction, - // set value action, to change a value -} = createExternal<RequiredNetworkElementType>(requiredNetworkElementsSearchHandler, appState => appState.connectApp.requiredNetworkElements); + // set value action, to change a value +} = createExternal<RequiredNetworkElementType>(requiredNetworkElementsSearchHandler, appState => appState.connect.requiredNetworkElements); diff --git a/sdnr/wt/odlux/apps/connectApp/src/plugin.tsx b/sdnr/wt/odlux/apps/connectApp/src/plugin.tsx index 4a02b9f35..4da33e0af 100644 --- a/sdnr/wt/odlux/apps/connectApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/connectApp/src/plugin.tsx @@ -23,20 +23,20 @@ type ObjectNotification = { export function register() { const applicationApi = applicationManager.registerApplication({ - name: "connectApp", + name: "connect", icon: faPlug, rootComponent: ConnectApplication, rootActionHandler: connectAppRootHandler, - menuEntry: "Connect App" + menuEntry: "Connect" }); // subscribe to the websocket notifications - subscribe<ObjectNotification & IFormatedMessage>(["ObjectCreationNotification", "ObjectDeletionNotification"], (msg => { + subscribe<ObjectNotification & IFormatedMessage>(["ObjectCreationNotification", "ObjectDeletionNotification","AttributeValueChangedNotification"], (msg => { const store = applicationApi && applicationApi.applicationStore; if (msg && msg.notifType === "ObjectCreationNotification" && store) { store.dispatch(addMountedNetworkElementAsyncActionCreator(msg.objectId)); store.dispatch(new AddSnackbarNotification({ message: `Adding network element [${ msg.objectId }]`, options: { variant: 'info' } })); - } else if (msg && msg.notifType === "ObjectDeletionNotification" && store) { + } else if (msg && (msg.notifType === "ObjectDeletionNotification" || msg.notifType === "AttributeValueChangedNotification") && store) { store.dispatch(new AddSnackbarNotification({ message: `Updating network element [${ msg.objectId }]`, options: { variant: 'info' } })); store.dispatch(updateMountedNetworkElementAsyncActionCreator(msg.objectId)); } diff --git a/sdnr/wt/odlux/apps/demoApp/pom.xml b/sdnr/wt/odlux/apps/demoApp/pom.xml index 6e7065664..1d8b9d739 100644 --- a/sdnr/wt/odlux/apps/demoApp/pom.xml +++ b/sdnr/wt/odlux/apps/demoApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -125,7 +127,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/demoApp/src/handlers/demoAppRootHandler.ts b/sdnr/wt/odlux/apps/demoApp/src/handlers/demoAppRootHandler.ts index ee21a9c90..00546fd07 100644 --- a/sdnr/wt/odlux/apps/demoApp/src/handlers/demoAppRootHandler.ts +++ b/sdnr/wt/odlux/apps/demoApp/src/handlers/demoAppRootHandler.ts @@ -13,7 +13,7 @@ export interface IDemoAppStoreState { declare module '../../../../framework/src/store/applicationStore' { interface IApplicationStoreState { - demoApp: IDemoAppStoreState + demo: IDemoAppStoreState } } diff --git a/sdnr/wt/odlux/apps/demoApp/src/plugin.tsx b/sdnr/wt/odlux/apps/demoApp/src/plugin.tsx index f450275c2..cd9efe136 100644 --- a/sdnr/wt/odlux/apps/demoApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/demoApp/src/plugin.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import * as React from "react"; import { withRouter, RouteComponentProps, Route, Switch, Redirect } from 'react-router-dom'; import { faAddressBook, faRegistered } from '@fortawesome/free-solid-svg-icons'; @@ -17,21 +17,21 @@ type AppProps = RouteComponentProps & Connect; const App = (props: AppProps) => ( <Switch> - <Route exact path={ `${ props.match.path }/authors` } component={AuthorsList} /> - <Route path={ `${ props.match.path }/authors/:authorId` } component={EditAuthor } /> + <Route exact path={ `${ props.match.path }/authors` } component={AuthorsList} /> + <Route path={ `${ props.match.path }/authors/:authorId` } component={EditAuthor } /> <Redirect to={ `${ props.match.path }/authors` } /> </Switch> -); - -const FinalApp = withRouter(connect()(App)); +); + +const FinalApp = withRouter(connect()(App)); export function register() { const applicationApi = applicationManager.registerApplication({ - name: "demoApp", + name: "demo", icon: faAddressBook, rootComponent: FinalApp, rootActionHandler: demoAppRootHandler, exportedComponents: { counter: Counter }, - menuEntry: "Demo App" + menuEntry: "Demo" }); } diff --git a/sdnr/wt/odlux/apps/demoApp/src/views/authorsList.tsx b/sdnr/wt/odlux/apps/demoApp/src/views/authorsList.tsx index b192fccf8..75761cd19 100644 --- a/sdnr/wt/odlux/apps/demoApp/src/views/authorsList.tsx +++ b/sdnr/wt/odlux/apps/demoApp/src/views/authorsList.tsx @@ -20,7 +20,7 @@ interface IAuthorsListProps { } class AuthorsListComponent extends React.Component<RouteComponentProps & IAuthorsListProps> { - + render(): JSX.Element { const { authors, busy } = this.props; return ( @@ -58,7 +58,7 @@ class AuthorsListComponent extends React.Component<RouteComponentProps & IAuthor export const AuthorsList = withRouter( connect( - ({ demoApp: state }) => ({ + ({ demo: state }) => ({ authors: state.listAuthors.authors, busy: state.listAuthors.busy }), diff --git a/sdnr/wt/odlux/apps/faultApp/pom.xml b/sdnr/wt/odlux/apps/faultApp/pom.xml index 376449bc0..5bfcd52ec 100644 --- a/sdnr/wt/odlux/apps/faultApp/pom.xml +++ b/sdnr/wt/odlux/apps/faultApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> @@ -126,7 +128,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/faultApp/src/handlers/alarmLogEntriesHandler.ts b/sdnr/wt/odlux/apps/faultApp/src/handlers/alarmLogEntriesHandler.ts index 0b974207b..3cc467546 100644 --- a/sdnr/wt/odlux/apps/faultApp/src/handlers/alarmLogEntriesHandler.ts +++ b/sdnr/wt/odlux/apps/faultApp/src/handlers/alarmLogEntriesHandler.ts @@ -19,6 +19,6 @@ export const { createProperties: createAlarmLogEntriesProperties, reloadAction: alarmLogEntriesReloadAction, - // set value action, to change a value -} = createExternal<Fault>(alarmLogEntriesSearchHandler, appState => appState.faultApp.alarmLogEntries); + // set value action, to change a value +} = createExternal<Fault>(alarmLogEntriesSearchHandler, appState => appState.fault.alarmLogEntries); diff --git a/sdnr/wt/odlux/apps/faultApp/src/handlers/currentProblemsHandler.ts b/sdnr/wt/odlux/apps/faultApp/src/handlers/currentProblemsHandler.ts index 6bbe2976f..67eb10d32 100644 --- a/sdnr/wt/odlux/apps/faultApp/src/handlers/currentProblemsHandler.ts +++ b/sdnr/wt/odlux/apps/faultApp/src/handlers/currentProblemsHandler.ts @@ -19,6 +19,6 @@ export const { createProperties: createCurrentProblemsProperties, reloadAction: currentProblemsReloadAction, - // set value action, to change a value -} = createExternal<Fault>(currentProblemsSearchHandler, appState => appState.faultApp.currentProblems); + // set value action, to change a value +} = createExternal<Fault>(currentProblemsSearchHandler, appState => appState.fault.currentProblems); diff --git a/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts b/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts index 005e3e5a4..a887a3327 100644 --- a/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts +++ b/sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts @@ -27,7 +27,7 @@ const currentOpenPanelHandler: IActionHandler<string | null> = (state = null, ac declare module '../../../../framework/src/store/applicationStore' { interface IApplicationStoreState { - faultApp: IFaultAppStoreState; + fault: IFaultAppStoreState; } } diff --git a/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx b/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx index 6f83e74dc..c4545ad1a 100644 --- a/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/faultApp/src/plugin.tsx @@ -1,7 +1,7 @@ // app configuration and main entry point for the app -import * as React from "react"; +import * as React from "react"; import { withRouter, RouteComponentProps, Route, Switch, Redirect } from 'react-router-dom'; import connect, { Connect, IDispatcher } from '../../../framework/src/flux/connect'; @@ -22,7 +22,7 @@ import { AddFaultNotificationAction } from "./actions/notificationActions"; import { createCurrentProblemsProperties, createCurrentProblemsActions } from "./handlers/currentProblemsHandler"; -let currentMountId: string | undefined = undefined; +let currentMountId: string | undefined = undefined; const mapProps = (state: IApplicationStoreState) => ({ currentProblemsProperties: createCurrentProblemsProperties(state), @@ -35,7 +35,7 @@ const mapDisp = (dispatcher: IDispatcher) => ({ const FaultApplicationRouteAdapter = connect(mapProps, mapDisp)((props: RouteComponentProps<{ mountId?: string }> & Connect<typeof mapProps, typeof mapDisp>) => { if (currentMountId !== props.match.params.mountId) { - // route parameter has changed + // route parameter has changed currentMountId = props.match.params.mountId || undefined; // Hint: This timeout is need, since it is not recommended to change the state while rendering is in progress ! window.setTimeout(() => { @@ -54,14 +54,14 @@ const FaultApplicationRouteAdapter = connect(mapProps, mapDisp)((props: RouteCom const App = withRouter((props: RouteComponentProps) => ( <Switch> - <Route path={ `${ props.match.path }/:mountId?` } component={ FaultApplicationRouteAdapter } /> + <Route path={ `${ props.match.path }/:mountId?` } component={ FaultApplicationRouteAdapter } /> <Redirect to={ `${ props.match.path }` } /> </Switch> -)); - +)); + export function register() { const applicationApi = applicationManager.registerApplication({ - name: "faultApp", + name: "fault", icon: faBell, rootComponent: App, rootActionHandler: faultAppRootHandler, diff --git a/sdnr/wt/odlux/apps/faultApp/src/views/faultApplication.tsx b/sdnr/wt/odlux/apps/faultApp/src/views/faultApplication.tsx index 9eb3a00ff..d4c7c597a 100644 --- a/sdnr/wt/odlux/apps/faultApp/src/views/faultApplication.tsx +++ b/sdnr/wt/odlux/apps/faultApp/src/views/faultApplication.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { withRouter, RouteComponentProps } from 'react-router-dom'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; +import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; import { Panel } from '../../../../framework/src/components/material-ui'; @@ -19,9 +19,9 @@ import { createAlarmLogEntriesProperties, createAlarmLogEntriesActions, alarmLog import { SetPanelAction } from '../actions/panelChangeActions'; const mapProps = (state: IApplicationStoreState) => ({ - activePanel: state.faultApp.currentOpenPanel, + activePanel: state.fault.currentOpenPanel, currentProblemsProperties: createCurrentProblemsProperties(state), - faultNotifications: state.faultApp.faultNotifications, + faultNotifications: state.fault.faultNotifications, alarmLogEntriesProperties: createAlarmLogEntriesProperties(state) }); @@ -39,15 +39,15 @@ type FaultApplicationComponentProps = RouteComponentProps & Connect<typeof mapPr const FaultTable = MaterialTable as MaterialTableCtorType<Fault>; class FaultApplicationComponent extends React.Component<FaultApplicationComponentProps>{ - + render(): JSX.Element { - + const { activePanel } = this.props; - + const onTogglePanel = (panelId: PanelId) => { const nextActivePanel = panelId === this.props.activePanel ? null : panelId; this.props.setCurrentPanel(nextActivePanel); - + switch (nextActivePanel) { case 'CurrentProblem': this.props.reloadCurrentProblems(); @@ -66,7 +66,7 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen return ( <> <Panel activePanel={ activePanel } panelId={ 'CurrentProblem' } onToggle={ onTogglePanel } title={ 'Current Problem List' }> - <FaultTable idProperty={ '_id' } columns={ [ + <FaultTable idProperty={ '_id' } columns={ [ { property: "icon", title: "", type: ColumnType.custom, customControl: this.renderIcon }, { property: "timeStamp", type: ColumnType.text, title: "Time Stamp" }, { property: "nodeName", title: "Node Name", type: ColumnType.text }, @@ -76,7 +76,7 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen { property: "severity", title: "Severity", type: ColumnType.text, width: "140px" }, ] } { ...this.props.currentProblemsProperties } { ...this.props.currentProblemsActions } /> </Panel> - <Panel activePanel={ activePanel } panelId={ 'AlarmNotifications' } onToggle={ onTogglePanel } title={ `Alarm Notifications ${this.props.faultNotifications.faults.length} ${this.props.faultNotifications.since}` }> + <Panel activePanel={ activePanel } panelId={ 'AlarmNotifications' } onToggle={ onTogglePanel } title={ `Alarm Notifications ${this.props.faultNotifications.faults.length} since ${this.props.faultNotifications.since}` }> <FaultTable rows={ this.props.faultNotifications.faults } asynchronus columns={ [ { property: "icon", title: "", type: ColumnType.custom, customControl: this.renderIcon }, { property: "timeStamp", title: "Time Stamp" }, @@ -104,9 +104,9 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen private renderIcon = (props: { rowData: Fault }) => { return ( - <FontAwesomeIcon icon={ faExclamationTriangle } /> + <FontAwesomeIcon icon={ faExclamationTriangle } /> ); - }; + }; } diff --git a/sdnr/wt/odlux/apps/helpApp/pom.xml b/sdnr/wt/odlux/apps/helpApp/pom.xml index 3e1d4e0ca..9115d896a 100644 --- a/sdnr/wt/odlux/apps/helpApp/pom.xml +++ b/sdnr/wt/odlux/apps/helpApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -125,7 +127,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/helpApp/src/components/subMenuEntry.tsx b/sdnr/wt/odlux/apps/helpApp/src/components/subMenuEntry.tsx index 72bb39e39..2328b12b3 100644 --- a/sdnr/wt/odlux/apps/helpApp/src/components/subMenuEntry.tsx +++ b/sdnr/wt/odlux/apps/helpApp/src/components/subMenuEntry.tsx @@ -13,23 +13,23 @@ import { TocTreeNode } from '../models/tocNode'; const TocTree = TreeView as any as TreeViewCtorType<TocTreeNode>; const mapProps = (state: IApplicationStoreState) => ({ - helpToc: state.helpApp.toc, - helpBusy: state.helpApp.busy + helpToc: state.help.toc, + helpBusy: state.help.busy }); const mapDisp = (dispatcher: IDispatcher) => ({ - requestDocument: (node: TocTreeNode) => dispatcher.dispatch(new NavigateToApplication("helpApp", node.uri)) + requestDocument: (node: TocTreeNode) => dispatcher.dispatch(new NavigateToApplication("help", node.uri)) }); const SubMenuEntryComponent: React.SFC<Connect<typeof mapProps, typeof mapDisp>> = (props) => { return props.helpToc ? ( - <TocTree items={ props.helpToc } contentProperty={ "label" } childrenProperty={ "nodes" } depthOffset={ 1 } + <TocTree items={ props.helpToc } contentProperty={ "label" } childrenProperty={ "nodes" } depthOffset={ 1 } useFolderIcons={ false } enableSearchBar={ false } onItemClick={ props.requestDocument } /> ) - : ( - <ListItemText >Loading ...</ListItemText> - ) + : ( + <ListItemText >Loading ...</ListItemText> + ) }; export const SubMenuEntry = connect(mapProps, mapDisp)(SubMenuEntryComponent); diff --git a/sdnr/wt/odlux/apps/helpApp/src/handlers/helpAppRootHandler.ts b/sdnr/wt/odlux/apps/helpApp/src/handlers/helpAppRootHandler.ts index efdc6e83d..b9ddc50af 100644 --- a/sdnr/wt/odlux/apps/helpApp/src/handlers/helpAppRootHandler.ts +++ b/sdnr/wt/odlux/apps/helpApp/src/handlers/helpAppRootHandler.ts @@ -14,14 +14,14 @@ export interface IHelpAppStoreState { declare module '../../../../framework/src/store/applicationStore' { interface IApplicationStoreState { - helpApp: IHelpAppStoreState + help: IHelpAppStoreState } } const helpAppStoreStateInit: IHelpAppStoreState = { busy: false, toc: undefined, - content: undefined, + content: undefined, currentPath: undefined }; diff --git a/sdnr/wt/odlux/apps/helpApp/src/index.html b/sdnr/wt/odlux/apps/helpApp/src/index.html index 2d20410e0..6865db051 100644 --- a/sdnr/wt/odlux/apps/helpApp/src/index.html +++ b/sdnr/wt/odlux/apps/helpApp/src/index.html @@ -17,7 +17,7 @@ // run the application require(["app", "helpApp"], function (app, helpApp) { helpApp.register(); - app("./app.tsx") + app("./app.tsx").runApplication(); }); </script> </body> diff --git a/sdnr/wt/odlux/apps/helpApp/src/plugin.tsx b/sdnr/wt/odlux/apps/helpApp/src/plugin.tsx index d1cf80804..f871ab9d9 100644 --- a/sdnr/wt/odlux/apps/helpApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/helpApp/src/plugin.tsx @@ -1,6 +1,6 @@ // app configuration and main entry point for the app -import * as React from "react"; +import * as React from "react"; import { withRouter, RouteComponentProps, Route, Switch, Redirect } from 'react-router-dom'; import { faFirstAid } from '@fortawesome/free-solid-svg-icons'; // select app icon @@ -18,7 +18,7 @@ import { SubMenuEntry } from "./components/subMenuEntry"; import '!style-loader!css-loader!highlight.js/styles/default.css'; const mapProps = (state: IApplicationStoreState) => ({ - + }); const mapDisp = (dispatcher: IDispatcher) => ({ @@ -31,7 +31,7 @@ let currentHelpPath: string | undefined = undefined; const HelpApplicationRouteAdapter = connect(mapProps, mapDisp)((props: RouteComponentProps<{ '0'?: string }> & Connect<typeof mapProps, typeof mapDisp>) => { if (currentHelpPath !== props.match.params["0"]) { - // route parameter has changed + // route parameter has changed currentHelpPath = props.match.params["0"] || undefined; // Hint: This timeout is need, since it is not recommended to change the state while rendering is in progress ! window.setTimeout(() => { @@ -54,7 +54,7 @@ const App = withRouter((props: RouteComponentProps) => ( export async function register() { const applicationApi = applicationManager.registerApplication({ - name: "helpApp", + name: "help", icon: faFirstAid, rootComponent: App, rootActionHandler: helpAppRootHandler, @@ -63,7 +63,7 @@ export async function register() { }); // start the initial toc request after the application store is initalized - const store = await applicationApi.applicationStoreInitialized; + const store = await applicationApi.applicationStoreInitialized; store.dispatch(requestTocAsyncAction); }
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts b/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts index 480cdd04e..800e0b47f 100644 --- a/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts +++ b/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts @@ -9,7 +9,7 @@ class HelpService { public async getDocument(path: string): Promise<string | null> { // check if the result is allready in the cache if (this.documents[path]) return Promise.resolve(this.documents[path]); - + // request the document const result = await requestRest<string>(`/help/${ path }`.replace(/\/{2,}/i, '/')); if (result) { @@ -23,7 +23,7 @@ class HelpService { if (this.tocNodeCollection) return Promise.resolve(this.tocNodeCollection); // request the table of contents - const result = await requestRest<TocNodeCollection>('/help/?meta'); + const result = await requestRest<TocNodeCollection>('/help/?meta', undefined, false); if (result !== false) { const mapNodesCollection = (col: TocNodeCollection): TocTreeNode[] => { return Object.keys(col).reduce <TocTreeNode[]>((acc, key) => { diff --git a/sdnr/wt/odlux/apps/helpApp/src/views/helpApplication.tsx b/sdnr/wt/odlux/apps/helpApp/src/views/helpApplication.tsx index dedb93607..54f708458 100644 --- a/sdnr/wt/odlux/apps/helpApp/src/views/helpApplication.tsx +++ b/sdnr/wt/odlux/apps/helpApp/src/views/helpApplication.tsx @@ -11,8 +11,8 @@ import { Markdown } from "../components/markdown"; import '!style-loader!css-loader!github-markdown-css/github-markdown.css' const mapProps = (state: IApplicationStoreState) => ({ - content: state.helpApp.content, - currentPath: state.helpApp.currentPath + content: state.help.content, + currentPath: state.help.currentPath }); type HelpApplicationComponentProps = Connect<typeof mapProps>; @@ -22,27 +22,27 @@ class HelpApplicationComponent extends React.Component<HelpApplicationComponentP /** * Initializes a new instance. */ - constructor(props: HelpApplicationComponentProps) { + constructor (props: HelpApplicationComponentProps) { super(props); - + this.renderer = new marked.Renderer(); this.renderer.link = (href: string, title: string, text: string) => { // check if href is rel or abs const absUrlMatch = href.trim().match(/^https?:\/\//i); - return `<a href="${ absUrlMatch ? href : resolvePath('#/helpApp/', this.props.currentPath || '/', href) }" title="${ title }" >${ text }</a>` + return `<a href="${absUrlMatch ? href : resolvePath('#/help/', this.props.currentPath || '/', href)}" title="${title}" >${text}</a>` }; this.renderer.image = (href: string, title: string) => { - return `<img src="${ resolvePath('/help/', this.props.currentPath || '/', href) }" alt="${ title }" />` + return `<img src="${resolvePath('/help/', this.props.currentPath || '/', href)}" alt="${title}" />` }; } render(): JSX.Element { return this.props.content ? ( - <Markdown text={ this.props.content } markedOptions={ { renderer: this.renderer } } className="markdown-body" - style={{ maxWidth: "960px", margin: "1.5em auto" }} /> + <Markdown text={this.props.content} markedOptions={{ renderer: this.renderer }} className="markdown-body" + style={{ maxWidth: "960px", margin: "1.5em auto" }} /> ) : (<h2>Loading ...</h2>) } diff --git a/sdnr/wt/odlux/apps/helpApp/webpack.config.js b/sdnr/wt/odlux/apps/helpApp/webpack.config.js index fdae7d957..f9448a310 100644 --- a/sdnr/wt/odlux/apps/helpApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/helpApp/webpack.config.js @@ -143,8 +143,26 @@ module.exports = (env) => { colors: true }, proxy: { - "/help": { - target: "http://localhost:8181", + "/oauth2/": { + target: "http://localhost:3000", + secure: false + }, + "/database/": { + target: "http://localhost:3000", + secure: false + }, + "/restconf/": { + target: "http://localhost:3000", + secure: false + }, + "/help/": { + target: "http://localhost:3000", + secure: false + }, + "/websocket/": { + target: "http://localhost:3000", + ws: true, + changeOrigin: true, secure: false } } diff --git a/sdnr/wt/odlux/apps/inventoryApp/pom.xml b/sdnr/wt/odlux/apps/inventoryApp/pom.xml index b2572563f..713dd3606 100644 --- a/sdnr/wt/odlux/apps/inventoryApp/pom.xml +++ b/sdnr/wt/odlux/apps/inventoryApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -125,7 +127,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/inventoryApp/src/plugin.tsx b/sdnr/wt/odlux/apps/inventoryApp/src/plugin.tsx index 52e1d4802..6022d9569 100644 --- a/sdnr/wt/odlux/apps/inventoryApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/inventoryApp/src/plugin.tsx @@ -9,9 +9,9 @@ import { Dashboard } from './views/dashboard'; export function register() { applicationManager.registerApplication({ - name: "inventoryApp", + name: "inventory", icon: faShoppingBag, rootComponent: Dashboard, - menuEntry: "Inventory App" + menuEntry: "Inventory" }); } diff --git a/sdnr/wt/odlux/apps/inventoryApp/src/views/dashboard.tsx b/sdnr/wt/odlux/apps/inventoryApp/src/views/dashboard.tsx index 8d07fa88c..b2361af7f 100644 --- a/sdnr/wt/odlux/apps/inventoryApp/src/views/dashboard.tsx +++ b/sdnr/wt/odlux/apps/inventoryApp/src/views/dashboard.tsx @@ -6,13 +6,13 @@ import { Result, InventoryType } from '../models/inventory'; const url = `${ window.location.origin}/database/sdnevents/inventoryequipment/_search`; -const fetchData: DataCallback = async (page, rowsPerPage, orderBy, order, filter) => { +const fetchData: DataCallback = async (page, rowsPerPage, orderBy, order, filter) => { const from = rowsPerPage && page != null && !isNaN(+page) ? (+page) * rowsPerPage : null; const filterKeys = filter && Object.keys(filter) || []; - + const query = { ...filterKeys.length > 0 ? { query: { @@ -30,7 +30,7 @@ const fetchData: DataCallback = async (page, rowsPerPage, orderBy, order, filter ...from ? { "from": from } : {}, ...orderBy && order ? { "sort": [{ [orderBy]: order }] } : {}, }; - + const result = await fetch(url, { method: "POST", // *GET, POST, PUT, DELETE, etc. mode: "no-cors", // no-cors, cors, *same-origin @@ -45,8 +45,13 @@ const fetchData: DataCallback = async (page, rowsPerPage, orderBy, order, filter if (result.ok) { const queryResult: Result<InventoryType> = await result.json(); const data = { - page: Math.min(page || 0, queryResult.hits.total || 0 / (rowsPerPage || 1)), rowCount: queryResult.hits.total, rows: queryResult && queryResult.hits && queryResult.hits.hits && queryResult.hits.hits.map(h => ( - { ...h._source, _id: h._id } + page: Math.min(page || 0, queryResult.hits.total || 0 / (rowsPerPage || 1)), + rowCount: queryResult.hits.total, + rows: queryResult && queryResult.hits && queryResult.hits.hits && queryResult.hits.hits.map(h => ( + { + ...h._source, + _id: h._id + } )) || [] }; return data; diff --git a/sdnr/wt/odlux/apps/maintenanceApp/pom.xml b/sdnr/wt/odlux/apps/maintenanceApp/pom.xml index cdbc9b096..87ff29043 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/pom.xml +++ b/sdnr/wt/odlux/apps/maintenanceApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -125,7 +127,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/actions/maintenenceActions.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/actions/maintenenceActions.ts index 753c1183f..3fe75ad51 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/src/actions/maintenenceActions.ts +++ b/sdnr/wt/odlux/apps/maintenanceApp/src/actions/maintenenceActions.ts @@ -30,7 +30,7 @@ export const loadAllMainteneceEntriesAsyncAction = (dispatch: Dispatch , getStat } // combine ell entries from the maintenance index with all networkelements - const networkElements = getState().connectApp.mountedNetworkElements; + const networkElements = getState().connect.mountedNetworkElements; const maintenenceEntries = networkElements.elements.reduce((acc, cur) => { const entry = entries.find(e => e.mountId === cur.mountId); acc.push(entry || { diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenanceAppRootHandler.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenanceAppRootHandler.ts index 956d05843..d2e387cc4 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenanceAppRootHandler.ts +++ b/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenanceAppRootHandler.ts @@ -14,8 +14,8 @@ export interface IMaintenanceAppStoreState { declare module '../../../../framework/src/store/applicationStore' { interface IApplicationStoreState { - maintenanceApp: IMaintenanceAppStoreState, - connectApp: IConnectAppStoreState + maintenance: IMaintenanceAppStoreState, + connect: IConnectAppStoreState } } diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/plugin.tsx b/sdnr/wt/odlux/apps/maintenanceApp/src/plugin.tsx index 19e188ec2..f23a875e3 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/maintenanceApp/src/plugin.tsx @@ -16,11 +16,11 @@ const App : React.SFC = (props) => { export function register() { applicationManager.registerApplication({ - name: "maintenanceApp", + name: "maintenance", icon: faLock, rootComponent: App, rootActionHandler: maintenanceAppRootHandler, - menuEntry: "Maintenance App" + menuEntry: "Maintenance" }); } diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx b/sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx index f048d6cc5..0a8ad4a59 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx +++ b/sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx @@ -37,8 +37,8 @@ const styles = (theme: Theme) => createStyles({ const MaintenenceEntriesTable = MaterialTable as MaterialTableCtorType<MaintenenceEntry>; const mapProps = (state: IApplicationStoreState) => ({ - maintenenceEntries: state.maintenanceApp.maintenenceEntries.entries, - busy: state.maintenanceApp.maintenenceEntries.busy + maintenenceEntries: state.maintenance.maintenenceEntries.entries, + busy: state.maintenance.maintenenceEntries.busy }); const mapDispatcher = (dispatcher: IDispatcher) => ({ diff --git a/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js b/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js index 0a2f5abb8..325e70380 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js @@ -127,11 +127,11 @@ module.exports = (env) => { }, proxy: { "/restconf": { - target: "http://localhost:8181", + target: "http://localhost:3000", secure: false }, "/database": { - target: "http://localhost:8181", + target: "http://localhost:3000", secure: false } } diff --git a/sdnr/wt/odlux/apps/mediatorApp/pom.xml b/sdnr/wt/odlux/apps/mediatorApp/pom.xml index 826e6b586..a8c9cea9f 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/pom.xml +++ b/sdnr/wt/odlux/apps/mediatorApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> - <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <version>1.1.2</version> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> @@ -126,7 +128,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorConfigActions.ts b/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorConfigActions.ts index fcfc63e22..058110614 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorConfigActions.ts +++ b/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorConfigActions.ts @@ -38,11 +38,11 @@ export class RemoveMediatorConfig extends BaseAction { export const startMediatorByNameAsyncActionCreator = (name: string) => (dispatch: Dispatch, getState: () => IApplicationStoreState) => { dispatch(new SetMediatorBusyByName(name, true)); - const { mediatorApp: { mediatorServerState: { url } } } = getState(); + const { mediator: { mediatorServerState: { url } } } = getState(); if (url) { mediatorService.startMediatorByName(url, name).then(msg => { dispatch(new AddSnackbarNotification({ message: msg + ' ' + name, options: { variant: 'info' } })); - // since there is no notification, a timeout will be need here + // since there is no notification, a timeout will be need here window.setTimeout(() => { mediatorService.getMediatorServerConfigByName(url, name).then(config => { if (config) { @@ -62,11 +62,11 @@ export const startMediatorByNameAsyncActionCreator = (name: string) => (dispatch export const stopMediatorByNameAsyncActionCreator = (name: string) => (dispatch: Dispatch, getState: () => IApplicationStoreState) => { dispatch(new SetMediatorBusyByName(name, true)); - const { mediatorApp: { mediatorServerState: { url } } } = getState(); + const { mediator: { mediatorServerState: { url } } } = getState(); if (url) { mediatorService.stopMediatorByName(url, name).then(msg => { dispatch(new AddSnackbarNotification({ message: msg + ' ' + name, options: { variant: 'info' } })); - // since there is no notification, a timeout will be need here + // since there is no notification, a timeout will be need here window.setTimeout(() => { mediatorService.getMediatorServerConfigByName(url, name).then(config => { if (config) { @@ -86,11 +86,11 @@ export const stopMediatorByNameAsyncActionCreator = (name: string) => (dispatch: export const addMediatorConfigAsyncActionCreator = (config: MediatorConfig) => (dispatch: Dispatch, getState: () => IApplicationStoreState) => { const { Name: name } = config; - const { mediatorApp: { mediatorServerState: { url } } } = getState(); + const { mediator: { mediatorServerState: { url } } } = getState(); if (url) { mediatorService.createMediatorConfig(url, config).then(msg => { dispatch(new AddSnackbarNotification({ message: msg + ' ' + name, options: { variant: 'info' } })); - // since there is no notification, a timeout will be need here + // since there is no notification, a timeout will be need here window.setTimeout(() => { mediatorService.getMediatorServerConfigByName(url, name).then(config => { if (config) { @@ -112,11 +112,11 @@ export const updateMediatorConfigAsyncActionCreator = (config: MediatorConfig) = export const removeMediatorConfigAsyncActionCreator = (config: MediatorConfig) => (dispatch: Dispatch, getState: () => IApplicationStoreState) => { const { Name: name } = config; - const { mediatorApp: { mediatorServerState: { url } } } = getState(); + const { mediator: { mediatorServerState: { url } } } = getState(); if (url) { mediatorService.deleteMediatorConfigByName(url, name).then(msg => { dispatch(new AddSnackbarNotification({ message: msg + ' ' + name, options: { variant: 'info' } })); - // since there is no notification, a timeout will be need here + // since there is no notification, a timeout will be need here window.setTimeout(() => { mediatorService.getMediatorServerConfigByName(url, config.Name).then(config => { if (!config) { diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorServerActions.ts b/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorServerActions.ts index b8e8c7e94..e7719aac5 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorServerActions.ts +++ b/sdnr/wt/odlux/apps/mediatorApp/src/actions/mediatorServerActions.ts @@ -62,11 +62,11 @@ export const initializeMediatorServerAsyncActionCreator = (serverId: string) => if (!mediatorServer) { dispatch(new SetMediatorServerBusy(false)); dispatch(new AddSnackbarNotification({ message: `Error loading mediator server [${serverId}]`, options: { variant: 'error' } })); - dispatch(new NavigateToApplication("mediatorApp")); - return; + dispatch(new NavigateToApplication("mediator")); + return; } dispatch(new SetMediatorServerInfo(mediatorServer.name, mediatorServer.url)); - + mediatorService.getMediatorServerVersion(mediatorServer.url).then(versionInfo => { dispatch(new SetMediatorServerVersion(versionInfo)); }); diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorConfigDialog.tsx b/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorConfigDialog.tsx index c1167c4a7..ef12ee253 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorConfigDialog.tsx +++ b/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorConfigDialog.tsx @@ -78,7 +78,7 @@ export enum EditMediatorConfigDialogMode { } const mapProps = (state: IApplicationStoreState) => ({ - supportedDevices: state.mediatorApp.mediatorServerState.supportedDevices + supportedDevices: state.mediator.mediatorServerState.supportedDevices }); const mapDispatch = (dispatcher: IDispatcher) => ({ @@ -182,7 +182,7 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf <Tab label="Config" /> <Tab label="ODL AutoConnect" /> </Tabs> - { this.state.activeTab === 0 ? <TabContainer > + {this.state.activeTab === 0 ? <TabContainer > <TextField disabled={setting.readonly || setting.readonlyName} spellCheck={false} autoFocus margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.Name} onChange={(event) => { this.setState({ Name: event.target.value }); }} /> <FormControl fullWidth disabled={setting.readonly}> <InputLabel htmlFor="deviceType">Device</InputLabel> @@ -204,15 +204,15 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf {this.props.supportedDevices.map(device => (<MenuItem key={device.id} value={device.id} >{`${device.vendor} - ${device.device} (${device.version || '0.0.0'}) `}</MenuItem>))} </Select> </FormControl> - <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ipAddress" label="IP Address" type="text" fullWidth value={this.state.DeviceIp} onChange={(event) => { this.setState({ DeviceIp: event.target.value }); }} /> - <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="devicePort" label="Port" type="number" fullWidth value={this.state.DevicePort || ""} onChange={(event) => { this.setState({ DevicePort: +event.target.value }); }} /> + <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ipAddress" label="Device IP" type="text" fullWidth value={this.state.DeviceIp} onChange={(event) => { this.setState({ DeviceIp: event.target.value }); }} /> + <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="devicePort" label="Device SNMP Port" type="number" fullWidth value={this.state.DevicePort || ""} onChange={(event) => { this.setState({ DevicePort: +event.target.value }); }} /> <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="trapsPort" label="TrapsPort" type="number" fullWidth value={this.state.TrapPort || ""} onChange={(event) => { this.setState({ TrapPort: +event.target.value }); }} /> <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncUser" label="Netconf User" type="text" fullWidth value={this.state.NcUsername} onChange={(event) => { this.setState({ NcUsername: event.target.value }); }} /> <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncPassword" label="Netconf Password" type="password" fullWidth value={this.state.NcPassword} onChange={(event) => { this.setState({ NcPassword: event.target.value }); }} /> <TextField disabled={setting.readonly} spellCheck={false} autoFocus margin="dense" id="ncPort" label="Netconf Port" type="number" fullWidth value={this.state.NcPort || ""} onChange={(event) => { this.setState({ NcPort: +event.target.value }); }} /> </TabContainer> : null} - { this.state.activeTab === 1 ? <TabContainer > - { this.state.ODLConfig && this.state.ODLConfig.length > 0 + {this.state.activeTab === 1 ? <TabContainer > + {this.state.ODLConfig && this.state.ODLConfig.length > 0 ? this.state.ODLConfig.map((cfg, ind) => { const panelId = `panel-${ind}`; const deleteButton = (<IconButton onClick={() => { @@ -227,15 +227,15 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf <Panel title={cfg.Server && `${cfg.User ? `${cfg.User}@` : ''}${cfg.Protocol}://${cfg.Server}:${cfg.Port}` || "new odl config"} key={panelId} panelId={panelId} activePanel={this.state.activeOdlConfig} customActionButtons={[deleteButton]} onToggle={(id) => this.setState({ activeOdlConfig: (this.state.activeOdlConfig === id) ? "" : (id || "") })} > <div className={classes.alignInOneLine}> - <FormControl className={classes.left} margin={"dense"} > + <FormControl className={classes.left} margin={"dense"} > <InputLabel htmlFor={`protocol-${ind}`}>Protocoll</InputLabel> - <Select value={cfg.Protocol} onChange={ this.odlConfigValueChangeHandlerCreator(ind, "Protocol", e => (e.target.value)) } inputProps={{ name: `protocol-${ind}`, id: `protocol-${ind}` }} fullWidth > + <Select value={cfg.Protocol} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Protocol", e => (e.target.value))} inputProps={{ name: `protocol-${ind}`, id: `protocol-${ind}` }} fullWidth > <MenuItem value={"http"}>http</MenuItem> <MenuItem value={"https"}>https</MenuItem> </Select> </FormControl> <TextField className={classes.left} spellCheck={false} margin="dense" id="hostname" label="Hostname" type="text" value={cfg.Server} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Server", e => e.target.value)} /> - <TextField className={classes.right} style={{ maxWidth: "65px"}} spellCheck={false} margin="dense" id="port" label="Port" type="number" value={cfg.Port|| ""} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Port", e => +e.target.value)} /> + <TextField className={classes.right} style={{ maxWidth: "65px" }} spellCheck={false} margin="dense" id="port" label="Port" type="number" value={cfg.Port || ""} onChange={this.odlConfigValueChangeHandlerCreator(ind, "Port", e => +e.target.value)} /> </div> <div className={classes.alignInOneLine}> <TextField className={classes.left} spellCheck={false} margin="dense" id="username" label="Username" type="text" value={cfg.User} onChange={this.odlConfigValueChangeHandlerCreator(ind, "User", e => e.target.value)} /> @@ -310,6 +310,4 @@ class EditMediatorConfigDialogComponent extends React.Component<EditMediatorConf } export const EditMediatorConfigDialog = withStyles(styles)(connect(mapProps, mapDispatch)(EditMediatorConfigDialogComponent)); -export default EditMediatorConfigDialog; - - +export default EditMediatorConfigDialog;
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorServerDialog.tsx b/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorServerDialog.tsx index 3937e9731..39f9036a6 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorServerDialog.tsx +++ b/sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorServerDialog.tsx @@ -49,14 +49,14 @@ const settings: { [key: string]: DialogSettings } = { readonly: true, }, [EditMediatorServerDialogMode.AddMediatorServer]: { - dialogTitle: "Add Medator Server", + dialogTitle: "Add Mediator Server", dialogDescription: "", applyButtonText: "Add", cancelButtonText: "Cancel", readonly: false, }, [EditMediatorServerDialogMode.EditMediatorServer]: { - dialogTitle: "Edit Medator Server", + dialogTitle: "Edit Mediator Server", dialogDescription: "", applyButtonText: "Update", cancelButtonText: "Cancel", @@ -71,18 +71,18 @@ const settings: { [key: string]: DialogSettings } = { }, }; -type EditMediatorServerDialogComponentProps = Connect<undefined,typeof mapDispatch> & { +type EditMediatorServerDialogComponentProps = Connect<undefined, typeof mapDispatch> & { mode: EditMediatorServerDialogMode; mediatorServer: MediatorServer; onClose: () => void; }; -type EditMediatorServerDialogComponentState = MediatorServer ; +type EditMediatorServerDialogComponentState = MediatorServer; class EditMediatorServerDialogComponent extends React.Component<EditMediatorServerDialogComponentProps, EditMediatorServerDialogComponentState> { - constructor(props: EditMediatorServerDialogComponentProps) { + constructor (props: EditMediatorServerDialogComponentProps) { super(props); - + this.state = { ...this.props.mediatorServer }; @@ -91,18 +91,18 @@ class EditMediatorServerDialogComponent extends React.Component<EditMediatorServ render(): JSX.Element { const setting = settings[this.props.mode]; return ( - <Dialog open={ this.props.mode !== EditMediatorServerDialogMode.None }> - <DialogTitle id="form-dialog-title">{ setting.dialogTitle }</DialogTitle> + <Dialog open={this.props.mode !== EditMediatorServerDialogMode.None}> + <DialogTitle id="form-dialog-title">{setting.dialogTitle}</DialogTitle> <DialogContent> <DialogContentText> - { setting.dialogDescription } + {setting.dialogDescription} </DialogContentText> - <TextField disabled spellCheck={false} autoFocus margin="dense" id="id" label="Id" type="text" fullWidth value={ this.state._id } onChange={(event)=>{ this.setState({_id: event.target.value}); } } /> - <TextField disabled={ setting.readonly } spellCheck={false} margin="dense" id="name" label="Name" type="text" fullWidth value={ this.state.name } onChange={(event)=>{ this.setState({name: event.target.value}); } }/> - <TextField disabled={ setting.readonly } spellCheck={false} margin="dense" id="url" label="Url" type="text" fullWidth value={ this.state.url } onChange={(event)=>{ this.setState({url: event.target.value}); } }/> - </DialogContent> + {/* <TextField disabled spellCheck={false} autoFocus margin="dense" id="id" label="Id" type="text" fullWidth value={ this.state._id } onChange={(event)=>{ this.setState({_id: event.target.value}); } } /> */} + <TextField disabled={setting.readonly} spellCheck={false} margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.name} onChange={(event) => { this.setState({ name: event.target.value }); }} /> + <TextField disabled={setting.readonly} spellCheck={false} margin="dense" id="url" label="Url" type="text" fullWidth value={this.state.url} onChange={(event) => { this.setState({ url: event.target.value }); }} /> + </DialogContent> <DialogActions> - <Button onClick={ (event) => { + <Button onClick={(event) => { this.onApply({ _id: this.state._id, name: this.state.name, @@ -110,12 +110,12 @@ class EditMediatorServerDialogComponent extends React.Component<EditMediatorServ }); event.preventDefault(); event.stopPropagation(); - } } > { setting.applyButtonText } </Button> - <Button onClick={ (event) => { + }} > {setting.applyButtonText} </Button> + <Button onClick={(event) => { this.onCancel(); event.preventDefault(); event.stopPropagation(); - } } color="secondary"> { setting.cancelButtonText } </Button> + }} color="secondary"> {setting.cancelButtonText} </Button> </DialogActions> </Dialog> ) diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/handlers/avaliableMediatorServersHandler.ts b/sdnr/wt/odlux/apps/mediatorApp/src/handlers/avaliableMediatorServersHandler.ts index 447e5e5bd..244a9d185 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/handlers/avaliableMediatorServersHandler.ts +++ b/sdnr/wt/odlux/apps/mediatorApp/src/handlers/avaliableMediatorServersHandler.ts @@ -15,5 +15,5 @@ export const { createProperties: createAvaliableMediatorServersProperties, reloadAction: avaliableMediatorServersReloadAction, - // set value action, to change a value -} = createExternal<MediatorServer>(avaliableMediatorServersSearchHandler, appState => appState.mediatorApp.avaliableMediatorServers);
\ No newline at end of file + // set value action, to change a value +} = createExternal<MediatorServer>(avaliableMediatorServersSearchHandler, appState => appState.mediator.avaliableMediatorServers);
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/handlers/mediatorAppRootHandler.ts b/sdnr/wt/odlux/apps/mediatorApp/src/handlers/mediatorAppRootHandler.ts index bfebbdf5d..b64c0a72a 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/handlers/mediatorAppRootHandler.ts +++ b/sdnr/wt/odlux/apps/mediatorApp/src/handlers/mediatorAppRootHandler.ts @@ -13,7 +13,7 @@ export interface IMediatorAppStoreState { declare module '../../../../framework/src/store/applicationStore' { interface IApplicationStoreState { - mediatorApp: IMediatorAppStoreState + mediator: IMediatorAppStoreState } } diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/plugin.tsx b/sdnr/wt/odlux/apps/mediatorApp/src/plugin.tsx index 0878fee65..7f440a2ae 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/mediatorApp/src/plugin.tsx @@ -16,7 +16,7 @@ import { MediatorApplication } from "./views/mediatorApplication"; import { MediatorServerSelection } from "./views/mediatorServerSelection"; import { initializeMediatorServerAsyncActionCreator } from "./actions/mediatorServerActions"; -let currentMediatorServerId: string | undefined = undefined; +let currentMediatorServerId: string | undefined = undefined; const mapDisp = (dispatcher: IDispatcher) => ({ loadMediatorServer : (mediatorServerId: string) => dispatcher.dispatch(initializeMediatorServerAsyncActionCreator(mediatorServerId)), @@ -24,7 +24,7 @@ const mapDisp = (dispatcher: IDispatcher) => ({ const MediatorServerRouteAdapter = connect(undefined, mapDisp)((props: RouteComponentProps<{ mediatorServerId: string }> & Connect<undefined, typeof mapDisp>) => { if (currentMediatorServerId !== props.match.params.mediatorServerId) { - // route parameter has changed + // route parameter has changed currentMediatorServerId = props.match.params.mediatorServerId || undefined; // Hint: This timeout is need, since it is not recommended to change the state while rendering is in progress ! window.setTimeout(() => { @@ -42,21 +42,21 @@ type AppProps = RouteComponentProps & Connect; const App = (props: AppProps) => ( <Switch> - <Route exact path={ `${ props.match.path }` } component={ MediatorServerSelection } /> - <Route path={ `${ props.match.path }/:mediatorServerId` } component={ MediatorServerRouteAdapter } /> + <Route exact path={ `${ props.match.path }` } component={ MediatorServerSelection } /> + <Route path={ `${ props.match.path }/:mediatorServerId` } component={ MediatorServerRouteAdapter } /> <Redirect to={ `${ props.match.path }` } /> </Switch> -); +); const FinalApp = withRouter(connect()(App)); export function register() { const applicationApi = applicationManager.registerApplication({ - name: "mediatorApp", + name: "mediator", icon: faGlobe, rootComponent: FinalApp, rootActionHandler: mediatorAppRootHandler, - menuEntry: "Mediator App" + menuEntry: "Mediator" }); // prefetch all avaliable mediator servers diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorApplication.tsx b/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorApplication.tsx index 6b1532cc8..95dee8df7 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorApplication.tsx +++ b/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorApplication.tsx @@ -50,13 +50,13 @@ const styles = (theme: Theme) => createStyles({ }); const mapProps = (state: IApplicationStoreState) => ({ - serverName: state.mediatorApp.mediatorServerState.name, - serverUrl: state.mediatorApp.mediatorServerState.url, - serverVersion: state.mediatorApp.mediatorServerState.serverVersion, - mediatorVersion: state.mediatorApp.mediatorServerState.mediatorVersion, - configurations: state.mediatorApp.mediatorServerState.configurations, - supportedDevices: state.mediatorApp.mediatorServerState.supportedDevices, - busy: state.mediatorApp.mediatorServerState.busy, + serverName: state.mediator.mediatorServerState.name, + serverUrl: state.mediator.mediatorServerState.url, + serverVersion: state.mediator.mediatorServerState.serverVersion, + mediatorVersion: state.mediator.mediatorServerState.mediatorVersion, + configurations: state.mediator.mediatorServerState.configurations, + supportedDevices: state.mediator.mediatorServerState.supportedDevices, + busy: state.mediator.mediatorServerState.busy, }); const mapDispatch = (dispatcher: IDispatcher) => ({ diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorServerSelection.tsx b/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorServerSelection.tsx index 38bbdecb4..4e221b613 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorServerSelection.tsx +++ b/sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorServerSelection.tsx @@ -37,7 +37,7 @@ const mapProps = (state: IApplicationStoreState) => ({ const mapDispatch = (dispatcher: IDispatcher) => ({ mediatorServersActions: createAvaliableMediatorServersActions(dispatcher.dispatch), - selectMediatorServer: (mediatorServerId: string) => mediatorServerId && dispatcher.dispatch(new NavigateToApplication("mediatorApp", mediatorServerId)), + selectMediatorServer: (mediatorServerId: string) => mediatorServerId && dispatcher.dispatch(new NavigateToApplication("mediator", mediatorServerId)), }); const emptyMediatorServer: MediatorServer = { @@ -77,7 +77,7 @@ class MediatorServerSelectionComponent extends React.Component<MediatorServerSel }; return ( <> - <MediatorServersTable customActionButtons={[addMediatorServerActionButton]} idProperty={"_id"} + <MediatorServersTable customActionButtons={[addMediatorServerActionButton]} idProperty={"_id"} {...this.props.mediatorServersActions} {...this.props.mediatorServersProperties} columns={[ { property: "name", title: "Name", type: ColumnType.text }, { property: "url", title: "Url", type: ColumnType.text }, @@ -90,7 +90,7 @@ class MediatorServerSelectionComponent extends React.Component<MediatorServerSel ) } ]} onHandleClick={ this.onSelectMediatorServer } /> - <EditMediatorServerDialog + <EditMediatorServerDialog mediatorServer={ this.state.mediatorServerToEdit } mode={ this.state.mediatorServerEditorMode } onClose={ this.onCloseEditMediatorServerDialog } /> @@ -103,7 +103,7 @@ class MediatorServerSelectionComponent extends React.Component<MediatorServerSel event.stopPropagation(); this.props.selectMediatorServer(server && server._id); - } + } private onEditMediatorServer = (event: React.MouseEvent<HTMLElement>, server: MediatorServer) => { event.preventDefault(); @@ -121,7 +121,7 @@ class MediatorServerSelectionComponent extends React.Component<MediatorServerSel mediatorServerEditorMode: EditMediatorServerDialogMode.RemoveMediatorServer, mediatorServerToEdit: server, }); - } + } private onCloseEditMediatorServerDialog = () => { this.setState({ diff --git a/sdnr/wt/odlux/apps/minimumApp/pom.xml b/sdnr/wt/odlux/apps/minimumApp/pom.xml index f8ee69737..9003ed74e 100644 --- a/sdnr/wt/odlux/apps/minimumApp/pom.xml +++ b/sdnr/wt/odlux/apps/minimumApp/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -125,7 +127,7 @@ <configuration> <instructions> <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> - <Private-Package/> + <Private-Package></Private-Package> </instructions> </configuration> </plugin> diff --git a/sdnr/wt/odlux/apps/minimumApp/src/handlers/minimumAppRootHandler.ts b/sdnr/wt/odlux/apps/minimumApp/src/handlers/minimumAppRootHandler.ts index d1d030488..ae7d7c0bd 100644 --- a/sdnr/wt/odlux/apps/minimumApp/src/handlers/minimumAppRootHandler.ts +++ b/sdnr/wt/odlux/apps/minimumApp/src/handlers/minimumAppRootHandler.ts @@ -9,7 +9,7 @@ export interface IMinimumAppStoreState { declare module '../../../../framework/src/store/applicationStore' { interface IApplicationStoreState { - minimumApp: IMinimumAppStoreState + minimum: IMinimumAppStoreState } } diff --git a/sdnr/wt/odlux/apps/minimumApp/src/plugin.tsx b/sdnr/wt/odlux/apps/minimumApp/src/plugin.tsx index dc698e11b..5209abac1 100644 --- a/sdnr/wt/odlux/apps/minimumApp/src/plugin.tsx +++ b/sdnr/wt/odlux/apps/minimumApp/src/plugin.tsx @@ -20,11 +20,11 @@ const FinalApp = withRouter(connect()(App)); export function register() { applicationManager.registerApplication({ - name: "minimumApp", + name: "minimum", icon: faLock, rootComponent: FinalApp, rootActionHandler: minimumAppRootHandler, - menuEntry: "Minimum App" + menuEntry: "Minimum" }); } diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/.babelrc b/sdnr/wt/odlux/apps/performanceHistoryApp/.babelrc new file mode 100644 index 000000000..3d8cd1260 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/.babelrc @@ -0,0 +1,17 @@ +{ + "presets": [ + ["@babel/preset-react"], + ["@babel/preset-env", { + "targets": { + "chrome": "66" + }, + "spec": true, + "loose": false, + "modules": false, + "debug": false, + "useBuiltIns": "usage", + "forceAllTransforms": true + }] + ], + "plugins": [] +} diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/package.json b/sdnr/wt/odlux/apps/performanceHistoryApp/package.json new file mode 100644 index 000000000..b066010b9 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/package.json @@ -0,0 +1,40 @@ +{ + "name": "@odlux/performancehistory-app", + "version": "0.1.1", + "description": "A react based modular UI to display performance history data from a database.", + "main": "index.js", + "scripts": { + "start": "webpack-dev-server --env debug", + "build": "webpack --env release --config webpack.config.js", + "build:dev": "webpack --env debug --config webpack.config.js" + }, + "repository": { + "type": "git", + "url": "https://git.mfico.de/highstreet-technologies/odlux.git" + }, + "keywords": [ + "reactjs", + "redux", + "ui", + "framework" + ], + "author": "Sai Neetha Phulmali", + "license": "MIT", + "dependencies": { + "@odlux/framework" : "*" + }, + "peerDependencies": { + "@types/react": "16.4.14", + "@types/react-dom": "16.0.8", + "@types/react-router-dom": "4.3.1", + "@material-ui/core": "3.8.3", + "@material-ui/icons": "3.0.2", + "@types/classnames": "2.2.6", + "@types/flux": "3.1.8", + "@types/jquery": "3.3.10", + "jquery": "3.3.1", + "react": "16.5.2", + "react-dom": "16.5.2", + "react-router-dom": "4.3.1" + } +}
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/pom.xml b/sdnr/wt/odlux/apps/performanceHistoryApp/pom.xml new file mode 100644 index 000000000..d24bfddf0 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/pom.xml @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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"> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>odlparent</artifactId> + <version>1.2.2-SNAPSHOT</version> + <relativePath /> + </parent> + <modelVersion>4.0.0</modelVersion> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-app-performanceHistoryApp</artifactId> + <version>0.4.2-SNAPSHOT</version> + <packaging>bundle</packaging> + <name>sdnr-wt-odlux-app-performanceHistoryApp</name> + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + <dependencies> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-core-model</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-core-provider</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <sourceDirectory>src2/main/java</sourceDirectory> + <plugins> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <configuration> + <filesets> + <fileset> + <directory>dist</directory> + <followSymlinks>false</followSymlinks> + </fileset> + <fileset> + <directory>node</directory> + <followSymlinks>false</followSymlinks> + </fileset> + <fileset> + <directory>node_modules</directory> + <followSymlinks>false</followSymlinks> + </fileset> + <fileset> + <directory>../node_modules</directory> + <followSymlinks>false</followSymlinks> + </fileset> + <!-- eclipse bug build bin folder in basedir --> + <fileset> + <directory>bin</directory> + <followSymlinks>false</followSymlinks> + </fileset> + </filesets> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <id>add-test-source</id> + <phase>generate-test-sources</phase> + <goals> + <goal>add-test-source</goal> + </goals> + <configuration> + <sources> + <source>src2/test/java</source> + </sources> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>de.jacksitlab</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <version>1.7.1</version> + <executions> + <execution> + <id>install node and yarn</id> + <goals> + <goal>install-node-and-yarn</goal> + </goals> + <!-- optional: default phase is "generate-resources" --> + <phase>initialize</phase> + <configuration> + <nodeVersion>v8.10.0</nodeVersion> + <yarnVersion>v1.12.3</yarnVersion> + </configuration> + </execution> + <execution> + <id>yarn build</id> + <goals> + <goal>yarn</goal> + </goals> + <configuration> + <arguments>run build</arguments> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.model.*,com.opensymphony.*</Import-Package> + <Private-Package></Private-Package> + </instructions> + </configuration> + </plugin> + </plugins> + <resources> + <resource> + <directory>dist</directory> + <targetPath>odlux</targetPath> + </resource> + <resource> + <directory>src2/main/resources</directory> + </resource> + <resource> + <directory>src2/test/resources</directory> + </resource> + </resources> + </build> + <pluginRepositories> + <pluginRepository> + <id>highstreet repo</id> + <url>https://cloud-highstreet-technologies.com/mvn/</url> + <snapshots> + <enabled>true</enabled> + <updatePolicy>always</updatePolicy> + </snapshots> + </pluginRepository> + </pluginRepositories> +</project> diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/connectedNetworkElementsActions.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/connectedNetworkElementsActions.ts new file mode 100644 index 000000000..0906584b7 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/connectedNetworkElementsActions.ts @@ -0,0 +1,41 @@ +import { Action } from '../../../../framework/src/flux/action'; +import { Dispatch } from '../../../../framework/src/flux/store'; + +import { ConnectedNetworkElements } from '../models/connectedNetworkElements'; +import { PerformanceHistoryService } from '../services/performanceHistoryService'; + +/** + * Represents the base action. + */ +export class BaseAction extends Action { } + +/** + * Represents an action causing the store to load all connected network elements. + */ +export class LoadAllConnectedNetworkElementsAction extends BaseAction { } + +/** + * Represents an action causing the store to update all connected network elements. + */ +export class AllConnectedNetworkElementsLoadedAction extends BaseAction { + /** + * Initialize this instance. + * + * @param connectedNetworkElements The network elements which are returned from the restconf. + */ + constructor(public connectedNetworkElements: ConnectedNetworkElements[] | null, public error?: string) { + super(); + } +} + +/** + * Represents an asynchronous thunk action to load all connected network elements from the restconf. + */ +export const loadAllConnectedNetworkElementsAsync = (dispatch: Dispatch) => { + dispatch(new LoadAllConnectedNetworkElementsAction()); + PerformanceHistoryService.getConnectedNetworkElementsList().then(networkElements => { + networkElements && dispatch(new AllConnectedNetworkElementsLoadedAction(networkElements)); + }).catch(error => { + dispatch(new AllConnectedNetworkElementsLoadedAction(null, error)); + }); +};
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/ltpAction.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/ltpAction.ts new file mode 100644 index 000000000..d8842ffbe --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/ltpAction.ts @@ -0,0 +1,75 @@ +import { Action } from '../../../../framework/src/flux/action'; +import { Dispatch } from '../../../../framework/src/flux/store'; + +import { Ltp } from '../models/availableLtps'; +import { PerformanceHistoryService } from '../services/performanceHistoryService'; + +/** + * Represents the base action. + */ +export class BaseAction extends Action { } + +/** + * Represents an action causing the store to load available ltps. + */ +export class LoadAllAvailableLtpsAction extends BaseAction { } + +/** + * Represents an action causing the store to update available ltps. + */ +export class AllAvailableLtpsLoadedAction extends BaseAction { + /** + * Initialize this instance. + * @param availableLtps The available ltps which are returned from the database. + */ + constructor(public availableLtps: Ltp[] | null, public error?: string) { + super(); + } +} + + +/** + * Represents an asynchronous thunk action to load available distinctLtps by networkElement from the database and set the returned first Ltp as default. + * @param networkElement The network element sent to database to get its available distinct Ltps. + * @param selectedTimePeriod The time period selected sent to database to get the distinct Ltps of the selected network element. + * @param selectedLtp The Ltp which is selected in the dropdown. + * @param selectFirstLtp The function to get the first ltp returned from the database to be selected as default on selection upon network element. + * @param resetLtp The function to verify if the selected ltp is also available in the selected time period database else reset the Ltp dropdown to select. + */ +export const loadDistinctLtpsbyNetworkElementAsync = (networkElement: string, selectedTimePeriod: string, selectedLtp: string, selectFirstLtp?: Function, resetLtp?: Function) => (dispatch: Dispatch) => { + if (selectedTimePeriod == "15min") { + dispatch(new LoadAllAvailableLtpsAction()); + PerformanceHistoryService.getDistinctLtpsFrom15minDatabase(networkElement).then(distinctLtps => { + if(distinctLtps) { + let ltpNotSelected: boolean = true; + selectFirstLtp && selectFirstLtp(distinctLtps[0].key); + distinctLtps.forEach((value: Ltp) => { + if(value.key === selectedLtp) { + ltpNotSelected = false; + } + }); + resetLtp && resetLtp(ltpNotSelected); + dispatch(new AllAvailableLtpsLoadedAction(distinctLtps)) + } + }).catch(error => { + dispatch(new AllAvailableLtpsLoadedAction(null, error)); + }); + } else { + dispatch(new LoadAllAvailableLtpsAction()); + PerformanceHistoryService.getDistinctLtpsFrom24hoursDatabase(networkElement).then(distinctLtps => { + if(distinctLtps) { + let ltpNotSelected: boolean = true; + selectFirstLtp && selectFirstLtp(distinctLtps[0].key); + distinctLtps.forEach((value: Ltp) => { + if(value.key === selectedLtp) { + ltpNotSelected = false; + } + }); + resetLtp && resetLtp(ltpNotSelected); + dispatch(new AllAvailableLtpsLoadedAction(distinctLtps)) + } + }).catch(error => { + dispatch(new AllAvailableLtpsLoadedAction(null, error)); + }); + } +};
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/panelChangeActions.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/panelChangeActions.ts new file mode 100644 index 000000000..82072c7fe --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/actions/panelChangeActions.ts @@ -0,0 +1,15 @@ +import { Action } from '../../../../framework/src/flux/action'; +import { PanelId } from '../models/panelId'; + +/** + * Represents an action causing the store to update the panel. + */ +export class SetPanelAction extends Action { + /** + * Initialize this instance. + * @param panelId Action to set the current panel by its Id. + */ + constructor(public panelId: PanelId) { + super(); + } +} diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/adaptiveModulation.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/adaptiveModulation.tsx new file mode 100644 index 000000000..024315c3a --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/adaptiveModulation.tsx @@ -0,0 +1,140 @@ +import * as React from 'react'; + +import { withRouter, RouteComponentProps } from 'react-router-dom'; + +import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; + +import { AdaptiveModulationDataType } from '../models/adaptiveModulationDataType'; +import { createAdaptiveModulation15minProperties, createAdaptiveModulation15minActions, adaptiveModulation15minReloadAction } from '../handlers/adaptiveModulation15minHandler'; +import { createAdaptiveModulation24hoursProperties, createAdaptiveModulation24hoursActions, adaptiveModulation24hoursReloadAction } from '../handlers/adaptiveModulation24hoursHandler'; + + +const mapProps = (state: IApplicationStoreState) => ({ + adaptiveModulation15minProperties: createAdaptiveModulation15minProperties(state), + adaptiveModulation24hoursProperties: createAdaptiveModulation24hoursProperties(state), +}); + +const mapDisp = (dispatcher: IDispatcher) => ({ + adaptiveModulation15minActions: createAdaptiveModulation15minActions(dispatcher.dispatch), + adaptiveModulation24hoursActions: createAdaptiveModulation24hoursActions(dispatcher.dispatch), +}); + +type AdaptiveModulationComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & { + selectedTimePeriod: string +}; + +const AdaptiveModulationTable = MaterialTable as MaterialTableCtorType<AdaptiveModulationDataType>; + +/** + * The Component which gets the adaptiveModulation data from the database based on the selected time period. + */ +class AdaptiveModulationComponent extends React.Component<AdaptiveModulationComponentProps>{ + render(): JSX.Element { + if (this.props.selectedTimePeriod == "15min") { + return ( + <AdaptiveModulationTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "time2-states-s", title: "QAM2S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2-states", title: "QAM2", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2-states-l", title: "QAM2L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4-states-s", title: "QAM4S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4-states", title: "QAM4", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4-states-l", title: "QAM4L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time16-states-s", title: "QAM16S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time16-states", title: "QAM16", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time16-states-l", title: "QAM16L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time32-states-s", title: "QAM32S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time32-states", title: "QAM32", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time32-states-l", title: "QAM32L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time64-states-s", title: "QAM64S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time64-states", title: "QAM64", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time64-states-l", title: "QAM64L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time128-states-s", title: "QAM128S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time128-states", title: "QAM128", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time128-states-l", title: "QAM128L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time256-states-s", title: "QAM256S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time256-states", title: "QAM256", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time256-states-l", title: "QAM256L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time512-states-s", title: "QAM512S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time512-states", title: "QAM512", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time512-states-l", title: "QAM512L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time1024-states-s", title: "QAM1024S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time1024-states", title: "QAM1024", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time1024-states-l", title: "QAM1024L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2048-states-s", title: "QAM2048S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2048-states", title: "QAM2048", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2048-states-l", title: "QAM2048L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4096-states-s", title: "QAM4096S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4096-states", title: "QAM4096", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4096-states-l", title: "QAM4096L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time8192-states-s", title: "QAM8192S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time8192-states", title: "QAM8192", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time8192-states-l", title: "QAM8192L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.adaptiveModulation15minProperties} {...this.props.adaptiveModulation15minActions} /> + ); + } else { + return ( + <AdaptiveModulationTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "time2-states-s", title: "QAM2S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2-states", title: "QAM2", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2-states-l", title: "QAM2L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4-states-s", title: "QAM4S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4-states", title: "QAM4", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4-states-l", title: "QAM4L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time16-states-s", title: "QAM16S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time16-states", title: "QAM16", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time16-states-l", title: "QAM16L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time32-states-s", title: "QAM32S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time32-states", title: "QAM32", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time32-states-l", title: "QAM32L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time64-states-s", title: "QAM64S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time64-states", title: "QAM64", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time64-states-l", title: "QAM64L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time128-states-s", title: "QAM128S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time128-states", title: "QAM128", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time128-states-l", title: "QAM128L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time256-states-s", title: "QAM256S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time256-states", title: "QAM256", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time256-states-l", title: "QAM256L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time512-states-s", title: "QAM512S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time512-states", title: "QAM512", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time512-states-l", title: "QAM512L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time1024-states-s", title: "QAM1024S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time1024-states", title: "QAM1024", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time1024-states-l", title: "QAM1024L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2048-states-s", title: "QAM2048S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2048-states", title: "QAM2048", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time2048-states-l", title: "QAM2048L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4096-states-s", title: "QAM4096S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4096-states", title: "QAM4096", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time4096-states-l", title: "QAM4096L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time8192-states-s", title: "QAM8192S", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time8192-states", title: "QAM8192", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "time8192-states-l", title: "QAM8192L", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.adaptiveModulation24hoursProperties} {...this.props.adaptiveModulation24hoursActions} /> + ); + } + }; +} + +export const AdaptiveModulation = withRouter(connect(mapProps, mapDisp)(AdaptiveModulationComponent)); +export default AdaptiveModulation; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/crossPolarDiscrimination.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/crossPolarDiscrimination.tsx new file mode 100644 index 000000000..bbed8abfe --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/crossPolarDiscrimination.tsx @@ -0,0 +1,74 @@ +import * as React from 'react'; + +import { withRouter, RouteComponentProps } from 'react-router-dom'; + +import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; + +import { CrossPolarDiscriminationDataType } from '../models/crossPolarDiscriminationDataType'; +import { createCrossPolarDiscrimination15minProperties, createCrossPolarDiscrimination15minActions, crossPolarDiscrimination15minReloadAction } from '../handlers/crossPolarDiscrimination15minHandler'; +import { createCrossPolarDiscrimination24hoursProperties, createCrossPolarDiscrimination24hoursActions, crossPolarDiscrimination24hoursReloadAction } from '../handlers/crossPolarDiscrimination24hoursHandler'; + + +const mapProps = (state: IApplicationStoreState) => ({ + crossPolarDiscrimination15minProperties: createCrossPolarDiscrimination15minProperties(state), + crossPolarDiscrimination24hoursProperties: createCrossPolarDiscrimination24hoursProperties(state), +}); + +const mapDisp = (dispatcher: IDispatcher) => ({ + crossPolarDiscrimination15minActions: createCrossPolarDiscrimination15minActions(dispatcher.dispatch), + crossPolarDiscrimination24hoursActions: createCrossPolarDiscrimination24hoursActions(dispatcher.dispatch), +}); + +type CrossPolarDiscriminationComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & { + selectedTimePeriod: string +}; + +const CrossPolarDiscriminationTable = MaterialTable as MaterialTableCtorType<CrossPolarDiscriminationDataType>; + +/** + * The Component which gets the crossPolarDiscrimination data from the database based on the selected time period. + */ +class CrossPolarDiscriminationComponent extends React.Component<CrossPolarDiscriminationComponentProps>{ + render(): JSX.Element { + if (this.props.selectedTimePeriod == "15min") { + return ( + <CrossPolarDiscriminationTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "xpd-min", title: "CPD (min)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "xpd-avg", title: "CPD (avg)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "xpd-max", title: "CPD (max)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.crossPolarDiscrimination15minProperties} {...this.props.crossPolarDiscrimination15minActions} /> + ); + } else { + return ( + <CrossPolarDiscriminationTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "xpd-min", title: "CPD (min)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "xpd-avg", title: "CPD (avg)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "xpd-max", title: "CPD (max)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.crossPolarDiscrimination24hoursProperties} {...this.props.crossPolarDiscrimination24hoursActions} /> + ); + } + }; +} + +export const CrossPolarDiscrimination = withRouter(connect(mapProps, mapDisp)(CrossPolarDiscriminationComponent)); +export default CrossPolarDiscrimination; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/performanceData.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/performanceData.tsx new file mode 100644 index 000000000..e9a373b11 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/performanceData.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; + +import { withRouter, RouteComponentProps } from 'react-router-dom'; + +import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; + +import { PerformanceDataType } from '../models/performanceDataType'; +import { createPerformanceData15minProperties, createPerformanceData15minActions } from '../handlers/performanceData15minHandler'; +import { createPerformanceData24hoursProperties, createPerformanceData24hoursActions } from '../handlers/performanceData24hoursHandler'; + +const mapProps = (state: IApplicationStoreState) => ({ + performanceData15minProperties: createPerformanceData15minProperties(state), + performanceData24hoursProperties: createPerformanceData24hoursProperties(state), +}); + +const mapDisp = (dispatcher: IDispatcher) => ({ + performanceData15minActions: createPerformanceData15minActions(dispatcher.dispatch), + performanceData24hoursActions: createPerformanceData24hoursActions(dispatcher.dispatch), +}); + +type PerformanceDataComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & { + selectedTimePeriod: string +}; + +const PerformanceDataTable = MaterialTable as MaterialTableCtorType<PerformanceDataType>; + +/** + * The Component which gets the performance data from the database based on the selected time period. + */ +class PerformanceDataComponent extends React.Component<PerformanceDataComponentProps>{ + render(): JSX.Element { + if (this.props.selectedTimePeriod == "15min") { + return ( + <PerformanceDataTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "es", title: "ES", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "ses", title: "SES", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "unavailability", title: "UAS", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.performanceData15minProperties} {...this.props.performanceData15minActions} + /> + ); + } else { + return ( + <PerformanceDataTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "es", title: "ES", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "ses", title: "SES", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "unavailability", title: "UAS", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.performanceData24hoursProperties} {...this.props.performanceData24hoursActions} + /> + ); + } + }; +} + +export const PerformanceData = withRouter(connect(mapProps, mapDisp)(PerformanceDataComponent)); +export default PerformanceData; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/receiveLevel.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/receiveLevel.tsx new file mode 100644 index 000000000..5f62e585a --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/receiveLevel.tsx @@ -0,0 +1,74 @@ +import * as React from 'react'; + +import { withRouter, RouteComponentProps } from 'react-router-dom'; + +import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; + +import { ReceiveLevelDataType } from '../models/receiveLevelDataType'; +import { createReceiveLevel15minProperties, createReceiveLevel15minActions, receiveLevel15minReloadAction } from '../handlers/receiveLevel15minHandler'; +import { createReceiveLevel24hoursProperties, createReceiveLevel24hoursActions, receiveLevel24hoursReloadAction } from '../handlers/receiveLevel24hoursHandler'; + + +const mapProps = (state: IApplicationStoreState) => ({ + receiveLevel15minProperties: createReceiveLevel15minProperties(state), + receiveLevel24hoursProperties: createReceiveLevel24hoursProperties(state), +}); + +const mapDisp = (dispatcher: IDispatcher) => ({ + receiveLevel15minActions: createReceiveLevel15minActions(dispatcher.dispatch), + receiveLevel24hoursActions: createReceiveLevel24hoursActions(dispatcher.dispatch), +}); + +type ReceiveLevelComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & { + selectedTimePeriod: string +}; + +const ReceiveLevelTable = MaterialTable as MaterialTableCtorType<ReceiveLevelDataType>; + +/** + * The Component which gets the receiveLevel data from the database based on the selected time period. + */ +class ReceiveLevelComponent extends React.Component<ReceiveLevelComponentProps>{ + render(): JSX.Element { + if (this.props.selectedTimePeriod == "15min") { + return ( + <ReceiveLevelTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "rx-level-min", title: "Rx min", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rx-level-avg", title: "Rx avg", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rx-level-max", title: "Rx max", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.receiveLevel15minProperties} {...this.props.receiveLevel15minActions} /> + ); + } else { + return ( + <ReceiveLevelTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "rx-level-min", title: "Rx min", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rx-level-avg", title: "Rx avg", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rx-level-max", title: "Rx max", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.receiveLevel24hoursProperties} {...this.props.receiveLevel24hoursActions} /> + ); + } + }; +} + +export const ReceiveLevel = withRouter(connect(mapProps, mapDisp)(ReceiveLevelComponent)); +export default ReceiveLevel; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/signalToInterference.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/signalToInterference.tsx new file mode 100644 index 000000000..bd612822e --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/signalToInterference.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; + +import { withRouter, RouteComponentProps } from 'react-router-dom'; + +import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; + +import { SignalToInterferenceDataType } from '../models/signalToInteferenceDataType'; +import { createSignalToInterference15minProperties, createSignalToInterference15minActions } from '../handlers/signalToInterference15minHandler'; +import { createSignalToInterference24hoursProperties, createSignalToInterference24hoursActions } from '../handlers/signalToInterference24hoursHandler'; + +const mapProps = (state: IApplicationStoreState) => ({ + signalToInterference15minProperties: createSignalToInterference15minProperties(state), + signalToInterference24hoursProperties: createSignalToInterference24hoursProperties(state), +}); + +const mapDisp = (dispatcher: IDispatcher) => ({ + signalToInterference15minActions: createSignalToInterference15minActions(dispatcher.dispatch), + signalToInterference24hoursActions: createSignalToInterference24hoursActions(dispatcher.dispatch), +}); + +type SignalToInterferenceComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & { + selectedTimePeriod: string +}; + +const SignalToInterferenceTable = MaterialTable as MaterialTableCtorType<SignalToInterferenceDataType>; + +/** + * The Component which gets the signal to interference data from the database based on the selected time period. + */ +class SignalToInterferenceComponent extends React.Component<SignalToInterferenceComponentProps>{ + render(): JSX.Element { + if (this.props.selectedTimePeriod == "15min") { + return ( + <SignalToInterferenceTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "snir-min", title: "SINR (min)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "snir-avg", title: "SINR (avg)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "snir-max", title: "SINR (max)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.signalToInterference15minProperties} {...this.props.signalToInterference15minActions} + /> + ); + } else { + return ( + <SignalToInterferenceTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "snir-min", title: "SINR (min)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "snir-avg", title: "SINR (avg)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "snir-max", title: "SINR (max)[db]", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.signalToInterference24hoursProperties} {...this.props.signalToInterference24hoursActions} + /> + ); + } + }; +} + +export const SignalToInterference = withRouter(connect(mapProps, mapDisp)(SignalToInterferenceComponent)); +export default SignalToInterference; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/temperature.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/temperature.tsx new file mode 100644 index 000000000..1496396aa --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/temperature.tsx @@ -0,0 +1,74 @@ +import * as React from 'react'; + +import { withRouter, RouteComponentProps } from 'react-router-dom'; + +import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; + +import { TemperatureDataType } from '../models/temperatureDataType'; +import { createTemperature15minProperties, createTemperature15minActions, temperature15minReloadAction } from '../handlers/temperature15minHandler'; +import { createTemperature24hoursProperties, createTemperature24hoursActions, temperature24hoursReloadAction } from '../handlers/temperature24hoursHandler'; + + +const mapProps = (state: IApplicationStoreState) => ({ + temperature15minProperties: createTemperature15minProperties(state), + temperature24hoursProperties: createTemperature24hoursProperties(state), +}); + +const mapDisp = (dispatcher: IDispatcher) => ({ + temperature15minActions: createTemperature15minActions(dispatcher.dispatch), + temperature24hoursActions: createTemperature24hoursActions(dispatcher.dispatch), +}); + +type TemperatureComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & { + selectedTimePeriod: string +}; + +const TemperatureTable = MaterialTable as MaterialTableCtorType<TemperatureDataType>; + +/** + * The Component which gets the temperature data from the database based on the selected time period. + */ +class TemperatureComponent extends React.Component<TemperatureComponentProps>{ + render(): JSX.Element { + if (this.props.selectedTimePeriod == "15min") { + return ( + <TemperatureTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "rf-temp-min", title: "Rx min", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rf-temp-avg", title: "Rx avg", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rf-temp-max", title: "Rx max", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.temperature15minProperties} {...this.props.temperature15minActions} /> + ); + } else { + return ( + <TemperatureTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "rf-temp-min", title: "Rx min", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rf-temp-avg", title: "Rx avg", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "rf-temp-max", title: "Rx max", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.temperature24hoursProperties} {...this.props.temperature24hoursActions} /> + ); + } + }; +} + +export const Temperature = withRouter(connect(mapProps, mapDisp)(TemperatureComponent)); +export default Temperature; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/transmissionPower.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/transmissionPower.tsx new file mode 100644 index 000000000..10c25874a --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/components/transmissionPower.tsx @@ -0,0 +1,74 @@ +import * as React from 'react'; + +import { withRouter, RouteComponentProps } from 'react-router-dom'; + +import { MaterialTable, ColumnType, MaterialTableCtorType } from '../../../../framework/src/components/material-table'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; + +import { TransmissionPowerDataType } from '../models/transmissionPowerDataType'; +import { createTransmissionPower15minProperties, createTransmissionPower15minActions } from '../handlers/transmissionPower15minHandler'; +import { createTransmissionPower24hoursProperties, createTransmissionPower24hoursActions } from '../handlers/transmissionPower24hoursHandler'; + + +const mapProps = (state: IApplicationStoreState) => ({ + transmissionPower15minProperties: createTransmissionPower15minProperties(state), + transmissionPower24hoursProperties: createTransmissionPower24hoursProperties(state), +}); + +const mapDisp = (dispatcher: IDispatcher) => ({ + transmissionPower15minActions: createTransmissionPower15minActions(dispatcher.dispatch), + transmissionPower24hoursActions: createTransmissionPower24hoursActions(dispatcher.dispatch), +}); + +type TransmissionPowerComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp> & { + selectedTimePeriod: string +} + +const TransmissionPowerTable = MaterialTable as MaterialTableCtorType<TransmissionPowerDataType>; + +/** + * The Component which gets the transmission power data from the database based on the selected time period. + */ +class TransmissionPowerComponent extends React.Component<TransmissionPowerComponentProps>{ + render(): JSX.Element { + if (this.props.selectedTimePeriod == "15min") { + return ( + <TransmissionPowerTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "tx-level-min", title: "Tx min", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "tx-level-avg", title: "Tx avg", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "tx-level-max", title: "Tx max", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.transmissionPower15minProperties} {...this.props.transmissionPower15minActions} /> + ); + } else { + return ( + <TransmissionPowerTable idProperty={"_id"} columns={[ + { property: "radio-signal-id", title: "Radio signal", type: ColumnType.text }, + { property: "scanner-id", title: "Scanner ID", type: ColumnType.text }, + { property: "time-stamp", title: "End Time", type: ColumnType.text, disableFilter: true }, + { + property: "suspect-interval-flag", title: "Suspect Interval", type: ColumnType.custom, customControl: ({ rowData }) => { + const suspectIntervalFlag = rowData["suspect-interval-flag"].toString(); + return <div >{suspectIntervalFlag} </div> + } + }, + { property: "tx-level-min", title: "Tx min", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "tx-level-avg", title: "Tx avg", type: ColumnType.text, disableFilter: true, disableSorting: true }, + { property: "tx-level-max", title: "Tx max", type: ColumnType.text, disableFilter: true, disableSorting: true }, + ]} {...this.props.transmissionPower24hoursProperties} {...this.props.transmissionPower24hoursActions} /> + ); + } + }; +} + +export const TransmissionPower = withRouter(connect(mapProps, mapDisp)(TransmissionPowerComponent)); +export default TransmissionPower; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/adaptiveModulation15minHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/adaptiveModulation15minHandler.ts new file mode 100644 index 000000000..6072cf0fb --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/adaptiveModulation15minHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { AdaptiveModulationDataType, AdaptiveModulation, AdaptiveModulationResult } from '../models/adaptiveModulationDataType'; + +export interface IAdaptiveModulation15minState extends IExternalTableState<AdaptiveModulationDataType> { } + +/** + * Creates elastic search material data fetch handler for Adaptive modulation from historicalperformance15min database. + */ +const adaptiveModulationSearchHandler = createSearchDataHandler<AdaptiveModulationResult, AdaptiveModulation>( + "sdnperformance/historicalperformance15min", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: adaptiveModulation15minActionHandler, + createActions: createAdaptiveModulation15minActions, + createProperties: createAdaptiveModulation15minProperties, + createPreActions: createAdaptiveModulation15minPreActions, + reloadAction: adaptiveModulation15minReloadAction, +} = createExternal<AdaptiveModulationDataType>(adaptiveModulationSearchHandler, appState => appState.performanceHistory.adaptiveModulation15min); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/adaptiveModulation24hoursHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/adaptiveModulation24hoursHandler.ts new file mode 100644 index 000000000..466b22966 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/adaptiveModulation24hoursHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { AdaptiveModulationDataType, AdaptiveModulation, AdaptiveModulationResult } from '../models/adaptiveModulationDataType'; + +export interface IAdaptiveModulation24hoursState extends IExternalTableState<AdaptiveModulationDataType> { } + +/** + * Creates elastic search material data fetch handler for Adaptive modulation from historicalperformance24h database. + */ +const adaptiveModulationSearchHandler = createSearchDataHandler<AdaptiveModulationResult, AdaptiveModulation>( + "sdnperformance/historicalperformance24h", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: adaptiveModulation24hoursActionHandler, + createActions: createAdaptiveModulation24hoursActions, + createProperties: createAdaptiveModulation24hoursProperties, + createPreActions: createAdaptiveModulation24hoursPreActions, + reloadAction: adaptiveModulation24hoursReloadAction, +} = createExternal<AdaptiveModulationDataType>(adaptiveModulationSearchHandler, appState => appState.performanceHistory.adaptiveModulation24hours); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/availableLtpsActionHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/availableLtpsActionHandler.ts new file mode 100644 index 000000000..2fd0ac8f1 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/availableLtpsActionHandler.ts @@ -0,0 +1,43 @@ +import { IActionHandler } from '../../../../framework/src/flux/action'; + +import { + AllAvailableLtpsLoadedAction, + LoadAllAvailableLtpsAction, +} from '../actions/ltpAction'; + +import { Ltp } from '../models/availableLtps'; + +export interface IAvailableLtpsState { + distinctLtps: Ltp[]; + busy: boolean; +} + +const connectedNetworkElementsStateInit: IAvailableLtpsState = { + distinctLtps: [], + busy: false +}; + +export const availableLtpsActionHandler: IActionHandler<IAvailableLtpsState> = (state = connectedNetworkElementsStateInit, action) => { + if (action instanceof LoadAllAvailableLtpsAction) { + + state = { + ...state, + busy: true + }; + + } else if (action instanceof AllAvailableLtpsLoadedAction) { + if (!action.error && action.availableLtps) { + state = { + ...state, + distinctLtps: action.availableLtps, + busy: false + }; + } else { + state = { + ...state, + busy: false + }; + } + } + return state; +};
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/connectedNetworkElementsActionHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/connectedNetworkElementsActionHandler.ts new file mode 100644 index 000000000..039ae5357 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/connectedNetworkElementsActionHandler.ts @@ -0,0 +1,43 @@ +import { IActionHandler } from '../../../../framework/src/flux/action'; + +import { + AllConnectedNetworkElementsLoadedAction, + LoadAllConnectedNetworkElementsAction, +} from '../actions/connectedNetworkElementsActions'; + +import { ConnectedNetworkElements } from '../models/connectedNetworkElements'; + +export interface IConnectedNetworkElementsState { + connectedNetworkElements: ConnectedNetworkElements[]; + busy: boolean; +} + +const connectedNetworkElementsStateInit: IConnectedNetworkElementsState = { + connectedNetworkElements: [], + busy: false +}; + +export const connectedNetworkElementsActionHandler: IActionHandler<IConnectedNetworkElementsState> = (state = connectedNetworkElementsStateInit, action) => { + if (action instanceof LoadAllConnectedNetworkElementsAction) { + + state = { + ...state, + busy: true + }; + + } else if (action instanceof AllConnectedNetworkElementsLoadedAction) { + if (!action.error && action.connectedNetworkElements) { + state = { + ...state, + connectedNetworkElements: action.connectedNetworkElements, + busy: false + }; + } else { + state = { + ...state, + busy: false + }; + } + } + return state; +};
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/crossPolarDiscrimination15minHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/crossPolarDiscrimination15minHandler.ts new file mode 100644 index 000000000..81418db94 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/crossPolarDiscrimination15minHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { CrossPolarDiscriminationDataType, CrossPolarDiscrimination, CrossPolarDiscriminationResult } from '../models/crossPolarDiscriminationDataType'; + +export interface ICrossPolarDiscrimination15minState extends IExternalTableState<CrossPolarDiscriminationDataType> { } + +/** + * Creates elastic search material data fetch handler for CPD from historicalperformance15min database. + */ +const crossPolarDiscriminationSearchHandler = createSearchDataHandler<CrossPolarDiscriminationResult, CrossPolarDiscrimination>( + "sdnperformance/historicalperformance15min", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: crossPolarDiscrimination15minActionHandler, + createActions: createCrossPolarDiscrimination15minActions, + createProperties: createCrossPolarDiscrimination15minProperties, + createPreActions: createCrossPolarDiscrimination15minPreActions, + reloadAction: crossPolarDiscrimination15minReloadAction, +} = createExternal<CrossPolarDiscriminationDataType>(crossPolarDiscriminationSearchHandler, appState => appState.performanceHistory.crossPolarDiscrimination15min); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/crossPolarDiscrimination24hoursHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/crossPolarDiscrimination24hoursHandler.ts new file mode 100644 index 000000000..b4d9da393 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/crossPolarDiscrimination24hoursHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { CrossPolarDiscriminationDataType, CrossPolarDiscrimination, CrossPolarDiscriminationResult } from '../models/crossPolarDiscriminationDataType'; + +export interface ICrossPolarDiscrimination24hoursState extends IExternalTableState<CrossPolarDiscriminationDataType> { } + +/** + * Creates elastic search material data fetch handler for CPD from historicalperformance24h database. + */ +const crossPolarDiscriminationSearchHandler = createSearchDataHandler<CrossPolarDiscriminationResult, CrossPolarDiscrimination>( + "sdnperformance/historicalperformance24h", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: crossPolarDiscrimination24hoursActionHandler, + createActions: createCrossPolarDiscrimination24hoursActions, + createProperties: createCrossPolarDiscrimination24hoursProperties, + createPreActions: createCrossPolarDiscrimination24hoursPreActions, + reloadAction: crossPolarDiscrimination24hoursReloadAction, +} = createExternal<CrossPolarDiscriminationDataType>(crossPolarDiscriminationSearchHandler, appState => appState.performanceHistory.crossPolarDiscrimination24hours); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceData15minHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceData15minHandler.ts new file mode 100644 index 000000000..4f284a27e --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceData15minHandler.ts @@ -0,0 +1,28 @@ +import { createExternal,IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + +import { PerformanceDataType, Performance,PerformanceResult } from '../models/performanceDataType'; + +export interface IPerformanceData15minState extends IExternalTableState<PerformanceDataType> {} + +/** + * Creates elastic search material data fetch handler for performance data from historicalperformance15min database. + */ + const performanceDataSearchHandler = createSearchDataHandler<PerformanceResult, Performance>( + "sdnperformance/historicalperformance15min", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}` ); + +export const { + actionHandler: performanceData15minActionHandler, + createActions: createPerformanceData15minActions, + createProperties: createPerformanceData15minProperties, + createPreActions: createPerformanceData15minPreActions, + reloadAction: performanceData15minReloadAction +} = createExternal<PerformanceDataType>(performanceDataSearchHandler, appState => appState.performanceHistory.performanceData15min); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceData24hoursHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceData24hoursHandler.ts new file mode 100644 index 000000000..4136ce482 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceData24hoursHandler.ts @@ -0,0 +1,28 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + +import { PerformanceDataType, Performance, PerformanceResult } from '../models/performanceDataType'; + +export interface IPerformanceData24hoursState extends IExternalTableState<PerformanceDataType> { } + +/** + * Creates elastic search material data fetch handler for performance data from historicalperformance24h database. + */ +const performanceDataSearchHandler = createSearchDataHandler<PerformanceResult, Performance>( + "sdnperformance/historicalperformance24h", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: performanceData24hoursActionHandler, + createActions: createPerformanceData24hoursActions, + createProperties: createPerformanceData24hoursProperties, + createPreActions: createPerformanceData24hoursPreActions, + reloadAction: performanceData24hoursReloadAction +} = createExternal<PerformanceDataType>(performanceDataSearchHandler, appState => appState.performanceHistory.performanceData24hours); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceHistoryRootHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceHistoryRootHandler.ts new file mode 100644 index 000000000..1cf814b5a --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/performanceHistoryRootHandler.ts @@ -0,0 +1,83 @@ +// main state handler + +import { combineActionHandler } from '../../../../framework/src/flux/middleware'; + +// ** do not remove ** +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import { IActionHandler } from '../../../../framework/src/flux/action'; + +import { IPerformanceData15minState, performanceData15minActionHandler } from './performanceData15minHandler'; +import { IReceiveLevel15minState, receiveLevel15minActionHandler } from './receiveLevel15minHandler'; +import { ITransmissionPower15minState, transmissionPower15minActionHandler } from './transmissionPower15minHandler'; +import { IAdaptiveModulation15minState, adaptiveModulation15minActionHandler } from './adaptiveModulation15minHandler'; +import { ITemperature15minState, temperature15minActionHandler } from './temperature15minHandler'; +import { ISignalToInterference15minState, signalToInterference15minActionHandler } from './signalToInterference15minHandler'; +import { ICrossPolarDiscrimination15minState, crossPolarDiscrimination15minActionHandler } from './crossPolarDiscrimination15minHandler'; +import { IPerformanceData24hoursState, performanceData24hoursActionHandler } from './performanceData24hoursHandler'; +import { IReceiveLevel24hoursState, receiveLevel24hoursActionHandler } from './receiveLevel24hoursHandler'; +import { ITransmissionPower24hoursState, transmissionPower24hoursActionHandler } from './transmissionPower24hoursHandler'; +import { IAdaptiveModulation24hoursState, adaptiveModulation24hoursActionHandler } from './adaptiveModulation24hoursHandler'; +import { ITemperature24hoursState, temperature24hoursActionHandler } from './temperature24hoursHandler'; +import { ISignalToInterference24hoursState, signalToInterference24hoursActionHandler } from './signalToInterference24hoursHandler'; +import { ICrossPolarDiscrimination24hoursState, crossPolarDiscrimination24hoursActionHandler } from './crossPolarDiscrimination24hoursHandler'; +import { SetPanelAction } from '../actions/panelChangeActions'; +import { IConnectedNetworkElementsState, connectedNetworkElementsActionHandler } from './connectedNetworkElementsActionHandler'; +import { IAvailableLtpsState, availableLtpsActionHandler } from './availableLtpsActionHandler'; + +export interface IPerformanceHistoryStoreState { + networkElements: IConnectedNetworkElementsState; + ltps: IAvailableLtpsState; + performanceData15min: IPerformanceData15minState; + performanceData24hours: IPerformanceData24hoursState; + receiveLevel15min: IReceiveLevel15minState; + receiveLevel24hours: IReceiveLevel24hoursState; + transmissionPower15min: ITransmissionPower15minState; + transmissionPower24hours: ITransmissionPower24hoursState; + adaptiveModulation15min: IAdaptiveModulation15minState; + adaptiveModulation24hours: IAdaptiveModulation24hoursState; + temperature15min: ITemperature15minState; + temperature24hours: ITemperature24hoursState; + signalToInterference15min:ISignalToInterference15minState; + signalToInterference24hours:ISignalToInterference24hoursState; + crossPolarDiscrimination15min: ICrossPolarDiscrimination15minState; + crossPolarDiscrimination24hours: ICrossPolarDiscrimination24hoursState; + currentOpenPanel: string | null; + +} + +const currentOpenPanelHandler: IActionHandler<string | null> = (state = null, action) => { + if (action instanceof SetPanelAction) { + state = action.panelId; + } + return state; +} + +declare module '../../../../framework/src/store/applicationStore' { + interface IApplicationStoreState { + performanceHistory: IPerformanceHistoryStoreState; + } +} + +const actionHandlers = { + networkElements: connectedNetworkElementsActionHandler, + ltps: availableLtpsActionHandler, + performanceData15min: performanceData15minActionHandler, + performanceData24hours: performanceData24hoursActionHandler, + receiveLevel15min: receiveLevel15minActionHandler, + receiveLevel24hours: receiveLevel24hoursActionHandler, + transmissionPower15min: transmissionPower15minActionHandler, + transmissionPower24hours: transmissionPower24hoursActionHandler, + adaptiveModulation15min: adaptiveModulation15minActionHandler, + adaptiveModulation24hours: adaptiveModulation24hoursActionHandler, + temperature15min: temperature15minActionHandler, + temperature24hours: temperature24hoursActionHandler, + signalToInterference15min: signalToInterference15minActionHandler, + signalToInterference24hours: signalToInterference24hoursActionHandler, + crossPolarDiscrimination15min: crossPolarDiscrimination15minActionHandler, + crossPolarDiscrimination24hours: crossPolarDiscrimination24hoursActionHandler, + currentOpenPanel: currentOpenPanelHandler, +}; + +export const performanceHistoryRootHandler = combineActionHandler<IPerformanceHistoryStoreState>(actionHandlers); +export default performanceHistoryRootHandler; + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/receiveLevel15minHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/receiveLevel15minHandler.ts new file mode 100644 index 000000000..c7c5e177f --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/receiveLevel15minHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { ReceiveLevelDataType, ReceiveLevel, ReceiveLevelResult } from '../models/receiveLevelDataType'; + +export interface IReceiveLevel15minState extends IExternalTableState<ReceiveLevelDataType> { } + +/** + * Creates elastic search material data fetch handler for receiveLevel from historicalperformance15min database. + */ +const receiveLevelSearchHandler = createSearchDataHandler<ReceiveLevelResult, ReceiveLevel>( + "sdnperformance/historicalperformance15min", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: receiveLevel15minActionHandler, + createActions: createReceiveLevel15minActions, + createProperties: createReceiveLevel15minProperties, + createPreActions: createReceiveLevel15minPreActions, + reloadAction: receiveLevel15minReloadAction, +} = createExternal<ReceiveLevelDataType>(receiveLevelSearchHandler, appState => appState.performanceHistory.receiveLevel15min); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/receiveLevel24hoursHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/receiveLevel24hoursHandler.ts new file mode 100644 index 000000000..f665dfdc6 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/receiveLevel24hoursHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { ReceiveLevelDataType, ReceiveLevel, ReceiveLevelResult } from '../models/receiveLevelDataType'; + +export interface IReceiveLevel24hoursState extends IExternalTableState<ReceiveLevelDataType> { } + +/** + * Creates elastic search material data fetch handler for receiveLevel from historicalperformance24h database. + */ +const receiveLevelSearchHandler = createSearchDataHandler<ReceiveLevelResult, ReceiveLevel>( + "sdnperformance/historicalperformance24h", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: receiveLevel24hoursActionHandler, + createActions: createReceiveLevel24hoursActions, + createProperties: createReceiveLevel24hoursProperties, + createPreActions: createReceiveLevel24hoursPreActions, + reloadAction: receiveLevel24hoursReloadAction, +} = createExternal<ReceiveLevelDataType>(receiveLevelSearchHandler, appState => appState.performanceHistory.receiveLevel24hours); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/signalToInterference15minHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/signalToInterference15minHandler.ts new file mode 100644 index 000000000..536a89ea7 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/signalToInterference15minHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { SignalToInterferenceDataType, SignalToInterference, SignalToInterferenceResult } from '../models/signalToInteferenceDataType'; + +export interface ISignalToInterference15minState extends IExternalTableState<SignalToInterferenceDataType> { } + +/** + * Creates elastic search material data fetch handler for SINR from historicalperformance15min database. + */ +const signalToInterferenceSearchHandler = createSearchDataHandler<SignalToInterferenceResult, SignalToInterference>( + "sdnperformance/historicalperformance15min", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: signalToInterference15minActionHandler, + createActions: createSignalToInterference15minActions, + createProperties: createSignalToInterference15minProperties, + createPreActions: createSignalToInterference15minPreActions, + reloadAction: signalToInterference15minReloadAction, +} = createExternal<SignalToInterferenceDataType>(signalToInterferenceSearchHandler, appState => appState.performanceHistory.signalToInterference15min); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/signalToInterference24hoursHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/signalToInterference24hoursHandler.ts new file mode 100644 index 000000000..a95d0aecf --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/signalToInterference24hoursHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { SignalToInterferenceDataType, SignalToInterference, SignalToInterferenceResult } from '../models/signalToInteferenceDataType'; + +export interface ISignalToInterference24hoursState extends IExternalTableState<SignalToInterferenceDataType> { } + +/** + * Creates elastic search material data fetch handler for SINR from historicalperformance24h database. + */ +const signalToInterferenceSearchHandler = createSearchDataHandler<SignalToInterferenceResult, SignalToInterference>( + "sdnperformance/historicalperformance24h", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: signalToInterference24hoursActionHandler, + createActions: createSignalToInterference24hoursActions, + createProperties: createSignalToInterference24hoursProperties, + createPreActions: createSignalToInterference24hoursPreActions, + reloadAction: signalToInterference24hoursReloadAction, +} = createExternal<SignalToInterferenceDataType>(signalToInterferenceSearchHandler, appState => appState.performanceHistory.signalToInterference24hours); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/temperature15minHandler.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/temperature15minHandler.tsx new file mode 100644 index 000000000..20fb57035 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/temperature15minHandler.tsx @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { TemperatureDataType, Temperature, TemperatureResult } from '../models/temperatureDataType'; + +export interface ITemperature15minState extends IExternalTableState<TemperatureDataType> { } + +/** + * Creates elastic search material data fetch handler for Temperature from historicalperformance15min database. + */ +const temperatureSearchHandler = createSearchDataHandler<TemperatureResult, Temperature>( + "sdnperformance/historicalperformance15min", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: temperature15minActionHandler, + createActions: createTemperature15minActions, + createProperties: createTemperature15minProperties, + createPreActions: createTemperature15minPreActions, + reloadAction: temperature15minReloadAction, +} = createExternal<TemperatureDataType>(temperatureSearchHandler, appState => appState.performanceHistory.temperature15min); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/temperature24hoursHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/temperature24hoursHandler.ts new file mode 100644 index 000000000..1c36ef876 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/temperature24hoursHandler.ts @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { TemperatureDataType, Temperature, TemperatureResult } from '../models/temperatureDataType'; + +export interface ITemperature24hoursState extends IExternalTableState<TemperatureDataType> { } + +/** + * Creates elastic search material data fetch handler for temperature from historicalperformance24h database. + */ +const temperatureSearchHandler = createSearchDataHandler<TemperatureResult, Temperature>( + "sdnperformance/historicalperformance24h", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: temperature24hoursActionHandler, + createActions: createTemperature24hoursActions, + createProperties: createTemperature24hoursProperties, + createPreActions: createTemperature24hoursPreActions, + reloadAction: temperature24hoursReloadAction, +} = createExternal<TemperatureDataType>(temperatureSearchHandler, appState => appState.performanceHistory.temperature24hours); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/transmissionPower15minHandler.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/transmissionPower15minHandler.tsx new file mode 100644 index 000000000..e6ba90f10 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/transmissionPower15minHandler.tsx @@ -0,0 +1,29 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + + +import { TransmissionPowerDataType, TransmissionPower, TransmissionPowerResult } from '../models/transmissionPowerDataType'; + +export interface ITransmissionPower15minState extends IExternalTableState<TransmissionPowerDataType> { } + +/** + * Creates elastic search material data fetch handler for Transmission power from historicalperformance15min database. + */ +const transmissionPowerSearchHandler = createSearchDataHandler<TransmissionPowerResult, TransmissionPower>( + "sdnperformance/historicalperformance15min", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: transmissionPower15minActionHandler, + createActions: createTransmissionPower15minActions, + createProperties: createTransmissionPower15minProperties, + createPreActions: createTransmissionPower15minPreActions, + reloadAction: transmissionPower15minReloadAction, +} = createExternal<TransmissionPowerDataType>(transmissionPowerSearchHandler, appState => appState.performanceHistory.transmissionPower15min); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/transmissionPower24hoursHandler.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/transmissionPower24hoursHandler.ts new file mode 100644 index 000000000..de50629e1 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/handlers/transmissionPower24hoursHandler.ts @@ -0,0 +1,28 @@ +import { createExternal, IExternalTableState } from '../../../../framework/src/components/material-table/utilities'; +import { createSearchDataHandler } from '../../../../framework/src/utilities/elasticSearch'; + +import { TransmissionPowerDataType, TransmissionPower, TransmissionPowerResult } from '../models/transmissionPowerDataType'; + +export interface ITransmissionPower24hoursState extends IExternalTableState<TransmissionPowerDataType> { } + +/** + * Creates elastic search material data fetch handler for transmission power from historicalperformance24h database. + */ +const transmissionPowerSearchHandler = createSearchDataHandler<TransmissionPowerResult, TransmissionPower>( + "sdnperformance/historicalperformance24h", + null, + (hit) => ({ + _id: hit._id, + ...hit._source, + ...hit._source["performance-data"] + }), + (name) => `${name}`); + +export const { + actionHandler: transmissionPower24hoursActionHandler, + createActions: createTransmissionPower24hoursActions, + createProperties: createTransmissionPower24hoursProperties, + createPreActions: createTransmissionPower24hoursPreActions, + reloadAction: transmissionPower24hoursReloadAction, +} = createExternal<TransmissionPowerDataType>(transmissionPowerSearchHandler, appState => appState.performanceHistory.transmissionPower24hours); + diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/index.html b/sdnr/wt/odlux/apps/performanceHistoryApp/src/index.html new file mode 100644 index 000000000..fce395d33 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/index.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <link rel="stylesheet" href="./vendor.css" > + <title>PM History Application</title> +</head> + +<body> + <div id="app"></div> + <script type="text/javascript" src="./require.js"></script> + <script type="text/javascript" src="./config.js"></script> + <script> + // run the application + require(["app","performanceHistoryApp"], function (app, performanceHistoryApp) { + performanceHistoryApp.register(); + app("./app.tsx").runApplication(); + }); + </script> +</body> + +</html>
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/adaptiveModulationDataType.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/adaptiveModulationDataType.ts new file mode 100644 index 000000000..686e3bc96 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/adaptiveModulationDataType.ts @@ -0,0 +1,53 @@ +export { HitEntry, Result } from '../../../../framework/src/models'; + +/** + * Represents Adaptive Modulation data fields of the performance history table. + */ +export type AdaptiveModulationDataType = { + "_id": string; + "radio-signal-id": string; + "scanner-id": string; + "time-stamp": string; + "suspect-interval-flag": boolean; + "time2-states-s": string; + "time2-states": string; + "time2-states-l": string; + "time4-states-s": string; + "time4-states": string; + "time4-states-l": string; + "time16-states-s": string; + "time16-states": string; + "time16-states-l": string; + "time32-states-s": string; + "time32-states": string; + "time32-states-l": string; + "time64-states-s": string; + "time64-states": string; + "time64-states-l": string; + "time128-states-s": string; + "time128-states": string; + "time128-states-l": string; + "time256-states-s": string; + "time256-states": string; + "time256-states-l": string; + "time512-states-s": string; + "time512-states": string; + "time512-states-l": string; + "time1024-states-s": string; + "time1024-states": string; + "time1024-states-l": string; + "time2048-states-s": string; + "time2048-states": string; + "time2048-states-l": string; + "time4096-states-s": string; + "time4096-states": string; + "time4096-states-l": string; + "time8192-states-s": string; + "time8192-states": string; + "time8192-states-l": string; +}; + + +export type AdaptiveModulationResult = { "performance-data": AdaptiveModulationDataType }; + +export type AdaptiveModulation = AdaptiveModulationDataType & { _id: string };
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/availableLtps.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/availableLtps.ts new file mode 100644 index 000000000..15a27f147 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/availableLtps.ts @@ -0,0 +1,14 @@ + export type Ltp = { + key: string + } + + export type Bucket={ + buckets: Ltp[] + } + +/** + * Represents distinct available ltps using elasticsearch aggregations structure. + */ + export type DistinctLtp = { + "uuid-interface": Bucket + } diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/connectedNetworkElements.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/connectedNetworkElements.ts new file mode 100644 index 000000000..f4afa645d --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/connectedNetworkElements.ts @@ -0,0 +1,6 @@ +/** + * Represents connected network elements. + */ +export type ConnectedNetworkElements = { + mountId: string, + } diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/crossPolarDiscriminationDataType.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/crossPolarDiscriminationDataType.ts new file mode 100644 index 000000000..2dc183eda --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/crossPolarDiscriminationDataType.ts @@ -0,0 +1,20 @@ +export { HitEntry, Result } from '../../../../framework/src/models'; + +/** + * Represents CPD data fields of the performance history table. + */ +export type CrossPolarDiscriminationDataType = { + "_id": string; + "radio-signal-id": string; + "scanner-id": string; + "time-stamp": string; + "suspect-interval-flag": boolean; + "xpd-min": string; + "xpd-avg": string; + "xpd-max": string; +}; + + +export type CrossPolarDiscriminationResult = { "performance-data": CrossPolarDiscriminationDataType }; + +export type CrossPolarDiscrimination = CrossPolarDiscriminationDataType & { _id: string };
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/panelId.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/panelId.ts new file mode 100644 index 000000000..1f05b47cc --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/panelId.ts @@ -0,0 +1,4 @@ +/** + * Represents PanelIds for the available Expansional panels. + */ +export type PanelId = null | "PerformanceData" | "ReceiveLevel" | "TransmissionPower" | "AdaptiveModulation" | "Temperature" | "SINR" | "CPD";
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/performanceDataType.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/performanceDataType.ts new file mode 100644 index 000000000..6972998b6 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/performanceDataType.ts @@ -0,0 +1,20 @@ +export { HitEntry, Result } from '../../../../framework/src/models'; + +/** + * Represents performance data fields of the performance history table. + */ +export type PerformanceDataType = { + "_id": string; + "radio-signal-id": string; + "scanner-id": string; + "time-stamp": string; + "suspect-interval-flag": boolean; + "es": string; + "ses": string; + "unavailability": string; +}; + + +export type PerformanceResult = { "performance-data": PerformanceDataType }; + +export type Performance = PerformanceDataType & { _id: string };
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/receiveLevelDataType.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/receiveLevelDataType.ts new file mode 100644 index 000000000..9f51c8fee --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/receiveLevelDataType.ts @@ -0,0 +1,20 @@ +export { HitEntry, Result } from '../../../../framework/src/models'; + +/** + * Represents Receive level data fields of the performance history table. + */ +export type ReceiveLevelDataType = { + "_id": string; + "radio-signal-id": string; + "scanner-id": string; + "time-stamp": string; + "suspect-interval-flag": boolean; + "rx-level-min": string; + "rx-level-avg": string; + "rx-level-max": string; +}; + + +export type ReceiveLevelResult = { "performance-data": ReceiveLevelDataType }; + +export type ReceiveLevel = ReceiveLevelDataType & { _id: string };
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/signalToInteferenceDataType.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/signalToInteferenceDataType.ts new file mode 100644 index 000000000..73934bd85 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/signalToInteferenceDataType.ts @@ -0,0 +1,20 @@ +export { HitEntry, Result } from '../../../../framework/src/models'; + +/** + * Represents Signal to interference data fields of the performance history table. + */ +export type SignalToInterferenceDataType = { + "_id": string; + "radio-signal-id": string; + "scanner-id": string; + "time-stamp": string; + "suspect-interval-flag": boolean; + "snir-min": string; + "snir-avg": string; + "snir-max": string; +}; + + +export type SignalToInterferenceResult = { "performance-data": SignalToInterferenceDataType }; + +export type SignalToInterference = SignalToInterferenceDataType & { _id: string };
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/temperatureDataType.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/temperatureDataType.ts new file mode 100644 index 000000000..e5be6e36c --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/temperatureDataType.ts @@ -0,0 +1,20 @@ +export { HitEntry, Result } from '../../../../framework/src/models'; + +/** + * Represents Temperature data fields of the performance history table. + */ +export type TemperatureDataType = { + "_id": string; + "radio-signal-id": string; + "scanner-id": string; + "time-stamp": string; + "suspect-interval-flag": boolean; + "rf-temp-min": string; + "rf-temp-avg": string; + "rf-temp-max": string; +}; + + +export type TemperatureResult = { "performance-data": TemperatureDataType }; + +export type Temperature = TemperatureDataType & { _id: string };
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/topologyNetConf.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/topologyNetConf.ts new file mode 100644 index 000000000..84548ce45 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/topologyNetConf.ts @@ -0,0 +1,12 @@ +export interface TopologyNode { + "node-id": string; + "netconf-node-topology:connection-status": string; +} + +/** + * Represents restConf network element topology. + */ +export interface Topology { + "topology-id": string; + "node": TopologyNode[]; +} diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/transmissionPowerDataType.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/transmissionPowerDataType.ts new file mode 100644 index 000000000..948baff12 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/models/transmissionPowerDataType.ts @@ -0,0 +1,20 @@ +export { HitEntry, Result } from '../../../../framework/src/models'; + +/** + * Represents the TransmissionPower data fields of the performance history table. + */ +export type TransmissionPowerDataType = { + "_id": string; + "radio-signal-id": string; + "scanner-id": string; + "time-stamp": string; + "suspect-interval-flag": boolean; + "tx-level-min": string; + "tx-level-avg": string; + "tx-level-max": string; +}; + + +export type TransmissionPowerResult = { "performance-data": TransmissionPowerDataType }; + +export type TransmissionPower = TransmissionPowerDataType & { _id: string };
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/plugin.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/plugin.tsx new file mode 100644 index 000000000..3e1263e34 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/plugin.tsx @@ -0,0 +1,17 @@ + +import { faBook } from '@fortawesome/free-solid-svg-icons'; + +import applicationManager from '../../../framework/src/services/applicationManager'; + +import performanceHistoryRootHandler from './handlers/performanceHistoryRootHandler'; +import PerformanceHistoryApplication from './views/performanceHistoryApplication'; + +export function register() { + applicationManager.registerApplication({ + name: "performanceHistory", + icon: faBook, + rootComponent: PerformanceHistoryApplication, + rootActionHandler: performanceHistoryRootHandler, + menuEntry: "Performance" + }); +}
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/services/performanceHistoryService.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/services/performanceHistoryService.tsx new file mode 100644 index 000000000..a1cdcffcc --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/services/performanceHistoryService.tsx @@ -0,0 +1,93 @@ +import { requestRest } from '../../../../framework/src/services/restService'; +import { Result } from '../../../../framework/src/models/elasticSearch'; + +import { ConnectedNetworkElements } from '../models/connectedNetworkElements'; +import { DistinctLtp, Ltp } from '../models/availableLtps'; +import { Topology, TopologyNode } from '../models/topologyNetConf'; + +/** + * Represents a web api accessor service for Network elements actions. + */ +class PerformanceService { + + private static networkElementTopology = (mountPoint: TopologyNode) => { + const mountId = mountPoint["node-id"]; + return { + mountId: mountId, + } + } + + /** + * Get all connected network elements from restconf. + */ + public async getConnectedNetworkElementsList(): Promise<ConnectedNetworkElements[] | null> { + const path = "restconf/operational/network-topology:network-topology/topology/topology-netconf"; + const topologyRequestPomise = requestRest<{ topology: Topology[] | null }>(path, { method: "GET" }, true); + const [netconfResponse] = await Promise.all([topologyRequestPomise]); + const topologyNetconf = netconfResponse && netconfResponse.topology && netconfResponse.topology.find(topology => topology["topology-id"] === "topology-netconf"); + let mountPoints = topologyNetconf && topologyNetconf.node && topologyNetconf.node.filter( + mountPoint => mountPoint["netconf-node-topology:connection-status"] == "connected").map(mountedElement => { + return PerformanceService.networkElementTopology(mountedElement); + }); + return mountPoints || []; + } + + /** + * Get distinct ltps based on the selected network element and time period from the historicalperformance15min database table. + */ + public async getDistinctLtpsFrom15minDatabase(networkElement: string): Promise<Ltp[] | null> { + const path = 'database/sdnperformance/historicalperformance15min/_search'; + const query = { + "size": 0, + "query": { + "match": { + "node-name": networkElement + } + }, + "aggs": { + "uuid-interface": { + "terms": { + "field": "uuid-interface" + } + } + } + }; + const result = await requestRest<Result<DistinctLtp>>(path, { method: "POST", body: JSON.stringify(query) }); + if(result && result.aggregations) { + } + return result && result.aggregations && result.aggregations["uuid-interface"].buckets.map(ne=>({ + key:ne.key + }))|| null; + } + + /** + * Get distinct ltps based on the selected network element and time period from the historicalperformance24h database table. + */ + public async getDistinctLtpsFrom24hoursDatabase(networkElement: string): Promise<Ltp[] | null> { + const path = 'database/sdnperformance/historicalperformance24h/_search'; + const query = { + "size": 0, + "query": { + "match": { + "node-name": networkElement + } + }, + "aggs": { + "uuid-interface": { + "terms": { + "field": "uuid-interface" + } + } + } + }; + const result = await requestRest<Result<DistinctLtp>>(path, { method: "POST", body: JSON.stringify(query) }); + if(result && result.aggregations) { + } + return result && result.aggregations && result.aggregations["uuid-interface"].buckets.map(ne=>({ + key:ne.key + }))|| null; + } +} + +export const PerformanceHistoryService = new PerformanceService(); +export default PerformanceHistoryService; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/views/performanceHistoryApplication.tsx b/sdnr/wt/odlux/apps/performanceHistoryApp/src/views/performanceHistoryApplication.tsx new file mode 100644 index 000000000..12027e499 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/views/performanceHistoryApplication.tsx @@ -0,0 +1,363 @@ +import * as React from 'react'; + +import { createStyles, Theme, withStyles, WithStyles } from '@material-ui/core/styles'; +import FormControl from '@material-ui/core/FormControl'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; + +import connect, { Connect, IDispatcher } from '../../../../framework/src/flux/connect'; +import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore'; +import { Panel } from '../../../../framework/src/components/material-ui'; + +import { PanelId } from '../models/panelId'; +import { PerformanceData } from '../components/performanceData'; +import { ReceiveLevel } from '../components/receiveLevel'; +import { TransmissionPower } from '../components/transmissionPower'; +import { AdaptiveModulation } from '../components/adaptiveModulation'; +import { Temperature } from '../components/temperature'; +import { SignalToInterference } from '../components/signalToInterference'; +import { CrossPolarDiscrimination } from '../components/crossPolarDiscrimination'; +import { loadAllConnectedNetworkElementsAsync } from '../actions/connectedNetworkElementsActions'; +import { loadDistinctLtpsbyNetworkElementAsync } from '../actions/ltpAction'; +import { SetPanelAction } from '../actions/panelChangeActions'; +import { createPerformanceData15minPreActions, performanceData15minReloadAction } from '../handlers/performanceData15minHandler'; +import { createPerformanceData24hoursPreActions, performanceData24hoursReloadAction } from '../handlers/performanceData24hoursHandler'; +import { createReceiveLevel15minPreActions, receiveLevel15minReloadAction } from '../handlers/receiveLevel15minHandler'; +import { createReceiveLevel24hoursPreActions, receiveLevel24hoursReloadAction } from '../handlers/receiveLevel24hoursHandler'; +import { createTransmissionPower15minPreActions, transmissionPower15minReloadAction } from '../handlers/transmissionPower15minHandler'; +import { createTransmissionPower24hoursPreActions, transmissionPower24hoursReloadAction } from '../handlers/transmissionPower24hoursHandler'; +import { createAdaptiveModulation15minPreActions, adaptiveModulation15minReloadAction } from '../handlers/adaptiveModulation15minHandler'; +import { createAdaptiveModulation24hoursPreActions, adaptiveModulation24hoursReloadAction } from '../handlers/adaptiveModulation24hoursHandler'; +import { createTemperature15minPreActions, temperature15minReloadAction } from '../handlers/temperature15minHandler'; +import { createTemperature24hoursPreActions, temperature24hoursReloadAction } from '../handlers/temperature24hoursHandler'; +import { createSignalToInterference15minPreActions, signalToInterference15minReloadAction } from '../handlers/signalToInterference15minHandler'; +import { createSignalToInterference24hoursPreActions, signalToInterference24hoursReloadAction } from '../handlers/signalToInterference24hoursHandler'; +import { createCrossPolarDiscrimination15minPreActions, crossPolarDiscrimination15minReloadAction } from '../handlers/crossPolarDiscrimination15minHandler'; +import { createCrossPolarDiscrimination24hoursPreActions, crossPolarDiscrimination24hoursReloadAction } from '../handlers/crossPolarDiscrimination24hoursHandler'; + +const PerformanceHistoryComponentStyles = (theme: Theme) => createStyles({ + root: { + display: "flex", + flexWrap: "wrap", + }, + margin: { + margin: theme.spacing.unit, + }, + display: { + display: "inline-block" + }, + selectDropdown: { + borderRadius: 1, + position: "relative", + backgroundColor: theme.palette.background.paper, + border: "1px solid #ced4da", + fontSize: 16, + width: "auto", + padding: "5px 26px 5px 12px", + transition: theme.transitions.create(["border-color", "box-shadow"]), + } +}); + +const mapProps = (state: IApplicationStoreState) => ({ + activePanel: state.performanceHistory.currentOpenPanel, + availableLtps: state.performanceHistory.ltps.distinctLtps, + networkElements: state.performanceHistory.networkElements.connectedNetworkElements +}); + +const mapDispatcher = (dispatcher: IDispatcher) => ({ + reloadPerformanceData15min: () => dispatcher.dispatch(performanceData15minReloadAction), + reloadPerformanceData24hours: () => dispatcher.dispatch(performanceData24hoursReloadAction), + reloadReceiveLevel15min: () => dispatcher.dispatch(receiveLevel15minReloadAction), + reloadReceiveLevel24hours: () => dispatcher.dispatch(receiveLevel24hoursReloadAction), + reloadTransmissionPower15min: () => dispatcher.dispatch(transmissionPower15minReloadAction), + reloadTransmissionPower24hours: () => dispatcher.dispatch(transmissionPower24hoursReloadAction), + reloadAdaptiveModulation15min: () => dispatcher.dispatch(adaptiveModulation15minReloadAction), + reloadAdaptiveModulation24hours: () => dispatcher.dispatch(adaptiveModulation24hoursReloadAction), + reloadTemperature15min: () => dispatcher.dispatch(temperature15minReloadAction), + reloadTemperature24hours: () => dispatcher.dispatch(temperature24hoursReloadAction), + reloadSignalToInterference15min: () => dispatcher.dispatch(signalToInterference15minReloadAction), + reloadSignalToInterference24hours: () => dispatcher.dispatch(signalToInterference24hoursReloadAction), + reloadCrossPolarDiscrimination15min: () => dispatcher.dispatch(crossPolarDiscrimination15minReloadAction), + reloadCrossPolarDiscrimination24hours: () => dispatcher.dispatch(crossPolarDiscrimination24hoursReloadAction), + performanceData15minPreActions: createPerformanceData15minPreActions(dispatcher.dispatch), + performanceData24hoursPreActions: createPerformanceData24hoursPreActions(dispatcher.dispatch), + receiveLevel15minPreActions: createReceiveLevel15minPreActions(dispatcher.dispatch), + receiveLevel24hoursPreActions: createReceiveLevel24hoursPreActions(dispatcher.dispatch), + transmissionPower15minPreActions: createTransmissionPower15minPreActions(dispatcher.dispatch), + transmissionPower24hoursPreActions: createTransmissionPower24hoursPreActions(dispatcher.dispatch), + adaptiveModulation15minPreActions: createAdaptiveModulation15minPreActions(dispatcher.dispatch), + adaptiveModulation24hoursPreActions: createAdaptiveModulation24hoursPreActions(dispatcher.dispatch), + temperature15minPreActions: createTemperature15minPreActions(dispatcher.dispatch), + temperature24hoursPreActions: createTemperature24hoursPreActions(dispatcher.dispatch), + signalToInterference15minPreActions: createSignalToInterference15minPreActions(dispatcher.dispatch), + signalToInterference24hoursPreActions: createSignalToInterference24hoursPreActions(dispatcher.dispatch), + crossPolarDiscrimination15minPreActions: createCrossPolarDiscrimination15minPreActions(dispatcher.dispatch), + crossPolarDiscrimination24hoursPreActions: createCrossPolarDiscrimination24hoursPreActions(dispatcher.dispatch), + getConnectedNetworkElements: () => dispatcher.dispatch(loadAllConnectedNetworkElementsAsync), + getDistinctLtps: (selectedNetworkElement: string, selectedTimePeriod: string, selectedLtp: string, selectFirstLtp?: Function, resetLTP?: Function) => dispatcher.dispatch(loadDistinctLtpsbyNetworkElementAsync(selectedNetworkElement, selectedTimePeriod, selectedLtp, selectFirstLtp, resetLTP)), + setCurrentPanel: (panelId: PanelId) => dispatcher.dispatch(new SetPanelAction(panelId)) +}); + +type PerformanceHistoryComponentProps = Connect<typeof mapProps, typeof mapDispatcher> & WithStyles<typeof PerformanceHistoryComponentStyles>; + +type PerformanceHistoryComponentState = { + selectedNetworkElement: string, + selectedTimePeriod: string, + selectedLtp: string, + showLtps: boolean, + showPanels: boolean +}; + +/** + * Represents the component for Performance history application. + */ +class PerformanceHistoryComponent extends React.Component<PerformanceHistoryComponentProps, PerformanceHistoryComponentState>{ + /** + * Initialises this instance + */ + constructor(props: PerformanceHistoryComponentProps) { + super(props); + this.state = { + selectedNetworkElement: "-1", + selectedTimePeriod: "15min", + selectedLtp: "-1", + showLtps: false, + showPanels: false + }; + } + + render(): JSX.Element { + const { classes } = this.props; + const { activePanel } = this.props; + + const onTogglePanel = (panelId: PanelId) => { + const nextActivePanel = panelId === this.props.activePanel ? null : panelId; + this.props.setCurrentPanel(nextActivePanel); + switch (nextActivePanel) { + case "PerformanceData": + if (this.state.selectedTimePeriod == "15min") { + this.props.reloadPerformanceData15min(); + } else { + + this.props.reloadPerformanceData24hours(); + } + break; + case "ReceiveLevel": + if (this.state.selectedTimePeriod == "15min") { + this.props.reloadReceiveLevel15min(); + } else { + this.props.reloadReceiveLevel24hours(); + } + break; + case "TransmissionPower": + if (this.state.selectedTimePeriod == "15min") { + this.props.reloadTransmissionPower15min(); + } else { + this.props.reloadTransmissionPower24hours(); + } + break; + case "AdaptiveModulation": + if (this.state.selectedTimePeriod == "15min") { + this.props.reloadAdaptiveModulation15min(); + } else { + this.props.reloadAdaptiveModulation24hours(); + } + break; + case "Temperature": + if (this.state.selectedTimePeriod == "15min") { + this.props.reloadTemperature15min(); + } else { + this.props.reloadTemperature24hours(); + } + break; + case "SINR": + if (this.state.selectedTimePeriod == "15min") { + this.props.reloadSignalToInterference15min(); + } else { + this.props.reloadSignalToInterference24hours(); + } + break; + case "CPD": + if (this.state.selectedTimePeriod == "15min") { + this.props.reloadCrossPolarDiscrimination15min(); + } else { + this.props.reloadCrossPolarDiscrimination24hours(); + } + break; + case null: + break; + default: + break; + } + } + + return ( + <> + <div> + <form className={ classes.root } autoComplete="off"> + <FormControl className={ classes.margin }> + <span> Select Network element </span> + <Select className={ classes.selectDropdown } value={ this.state.selectedNetworkElement } onChange={ this.handleNetworkElementChange } + > + <MenuItem value={ "-1" }><em>--Select--</em></MenuItem> + { this.props.networkElements.map(ne => + (<MenuItem value={ ne.mountId } key={ ne.mountId }>{ ne.mountId }</MenuItem>))} + </Select> + </FormControl> + </form> + </div> + { this.state.showLtps && ( + <div> + <FormControl className={ classes.display }> + <span> + Select LTP + </span> + <Select className={ classes.selectDropdown } value={ this.state.selectedLtp } onChange={ this.handleLtpChange } > + <MenuItem value={ "-1" }><em>--Select--</em></MenuItem> + { this.props.availableLtps.map(ltp => + (<MenuItem value={ltp.key} key={ltp.key}>{ltp.key}</MenuItem>)) } + </Select> + <span> Time-Period </span> + <Select className={ classes.selectDropdown } value={ this.state.selectedTimePeriod } onChange={ this.handleTimePeriodChange } > + <MenuItem value={ "15min" }>15min</MenuItem> + <MenuItem value={ "24hours" }>24hours</MenuItem> + </Select> + </FormControl> + { this.state.showPanels && ( + <div> + <Panel activePanel={ activePanel } panelId={ "PerformanceData" } onToggle={ onTogglePanel } title={ "Performance Data" }> + <PerformanceData selectedTimePeriod={ this.state.selectedTimePeriod} /> + </Panel> + <Panel activePanel={ activePanel } panelId={ "ReceiveLevel" } onToggle={ onTogglePanel } title={ "Receive Level" }> + <ReceiveLevel selectedTimePeriod={ this.state.selectedTimePeriod} /> + </Panel> + <Panel activePanel={ activePanel } panelId={ "TransmissionPower" } onToggle={ onTogglePanel } title={ "Transmission Power" }> + <TransmissionPower selectedTimePeriod={ this.state.selectedTimePeriod} /> + </Panel> + <Panel activePanel={ activePanel } panelId={ "AdaptiveModulation" } onToggle={ onTogglePanel } title={ "Adaptive Modulation" }> + <AdaptiveModulation selectedTimePeriod={ this.state.selectedTimePeriod} /> + </Panel> + <Panel activePanel={ activePanel } panelId={ "Temperature" } onToggle={ onTogglePanel } title={ "Temperature" }> + <Temperature selectedTimePeriod={ this.state.selectedTimePeriod} /> + </Panel> + <Panel activePanel={ activePanel } panelId={ "SINR" } onToggle={ onTogglePanel } title={ "Signal-to-interference-plus-noise ratio (SINR)" }> + <SignalToInterference selectedTimePeriod={ this.state.selectedTimePeriod} /> + </Panel> + <Panel activePanel={ activePanel } panelId={ "CPD" } onToggle={ onTogglePanel } title={ "Cross Polar Discrimination" }> + <CrossPolarDiscrimination selectedTimePeriod={ this.state.selectedTimePeriod } /> + </Panel> + </div> + )} + </div> + )} + </> + ); + }; + + public componentDidMount() { + this.props.getConnectedNetworkElements(); + } + + /** + * Function which selects the first ltp returned from the database on selection of network element. + */ + private selectFirstLtp = (firstLtp: string) => { + this.setState({ + showPanels: true, + selectedLtp: firstLtp + }); + this.preFilterChangeAndReload(this.state.selectedNetworkElement, this.state.selectedTimePeriod, firstLtp); + } + + /** + * A function which loads the tables based on prefilters defined by network element and ltp on selected time period. + */ + private preFilterChangeAndReload = (networkElement: string, timePeriod: string, ltp: string) => { + const preFilter = { + "node-name": networkElement, + "uuid-interface": ltp + }; + if (timePeriod == "15min") { + this.props.performanceData15minPreActions.onPreFilterChanged(preFilter); + this.props.receiveLevel15minPreActions.onPreFilterChanged(preFilter); + this.props.transmissionPower15minPreActions.onPreFilterChanged(preFilter); + this.props.adaptiveModulation15minPreActions.onPreFilterChanged(preFilter); + this.props.temperature15minPreActions.onPreFilterChanged(preFilter); + this.props.signalToInterference15minPreActions.onPreFilterChanged(preFilter); + this.props.crossPolarDiscrimination15minPreActions.onPreFilterChanged(preFilter); + } else if (timePeriod == "24hours") { + this.props.performanceData24hoursPreActions.onPreFilterChanged(preFilter); + this.props.receiveLevel24hoursPreActions.onPreFilterChanged(preFilter); + this.props.transmissionPower24hoursPreActions.onPreFilterChanged(preFilter); + this.props.adaptiveModulation24hoursPreActions.onPreFilterChanged(preFilter); + this.props.temperature24hoursPreActions.onPreFilterChanged(preFilter); + this.props.signalToInterference24hoursPreActions.onPreFilterChanged(preFilter); + this.props.crossPolarDiscrimination24hoursPreActions.onPreFilterChanged(preFilter); + } + } + + /** + * Function which handles network element changes. + */ + private handleNetworkElementChange = (event: React.ChangeEvent<HTMLSelectElement>) => { + var showLtps: boolean = true; + if (event.target.value === "-1") { + showLtps = false; + } else if (event.target.value !== this.state.selectedNetworkElement) { + this.setState({ + showPanels: false + }); + } + this.setState({ + showLtps: showLtps, + selectedNetworkElement: event.target.value, + selectedLtp: "-1" + }); + this.props.getDistinctLtps(event.target.value, this.state.selectedTimePeriod, "-1", this.selectFirstLtp); + } + + /** + * Function which resets the ltps to "--select--" in the state if the passed parameter @ltpNotSelected is true. + * @param ltpNotSelected: true, if existing selected is not available in the given time period, else false + */ + private resetLtpDropdown = (ltpNotSelected: boolean) => { + if (ltpNotSelected) { + this.setState({ + selectedLtp: "-1", + }); + } + } + + /** + * Function which handles the time period changes. + */ + private handleTimePeriodChange = (event: React.ChangeEvent<HTMLSelectElement>) => { + this.setState({ + selectedTimePeriod: event.target.value, + }); + if (event.target.value == "15min") { + this.props.getDistinctLtps(this.state.selectedNetworkElement, event.target.value, this.state.selectedLtp, undefined, this.resetLtpDropdown); + } else if (event.target.value == "24hours") { + this.props.getDistinctLtps(this.state.selectedNetworkElement, event.target.value, this.state.selectedLtp, undefined, this.resetLtpDropdown); + } + this.preFilterChangeAndReload(this.state.selectedNetworkElement, event.target.value, this.state.selectedLtp); + } + + /** + * Function which handles the ltp changes. + */ + private handleLtpChange = (event: React.ChangeEvent<HTMLSelectElement>) => { + var showPanels: boolean = true; + if (event.target.value === "-1") { + showPanels = false; + } + this.setState({ + showPanels: showPanels, + selectedLtp: event.target.value + }); + this.preFilterChangeAndReload(this.state.selectedNetworkElement, this.state.selectedTimePeriod, event.target.value); + } +} + +export const PerformanceHistoryApplication = withStyles(PerformanceHistoryComponentStyles)(connect(mapProps, mapDispatcher)(PerformanceHistoryComponent)); +export default PerformanceHistoryApplication; diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java new file mode 100644 index 000000000..1e882fc69 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * ============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.odlux.bundles; + +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader; + +public class MyOdluxBundle extends OdluxBundle { + + @Override + public void initialize() { + super.initialize(); + } + + @Override + public void clean() { + super.clean(); + } + + @Override + public String getResourceFileContent(String filename) { + return super.getResourceFileContent(filename); + } + + @Override + public boolean hasResource(String filename) { + return super.hasResource(filename); + } + + @Override + public void setBundleName(String bundleName) { + super.setBundleName(bundleName); + } + + @Override + public void setLoader(OdluxBundleLoader loader) { + super.setLoader(loader); + } + + @Override + public String getBundleName() { + return super.getBundleName(); + } + + @Override + public OdluxBundleLoader getLoader() { + return super.getLoader(); + } + + public MyOdluxBundle() { + super(); + } +} diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml new file mode 100644 index 000000000..1bcbf0127 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,9 @@ +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> + <reference id="loadersvc" availability="mandatory" activation="eager" interface="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader"/> + + <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle"> + <property name="loader" ref="loadersvc"/> + <property name="bundleName" value="performanceHistoryApp"/> + <property name="index" value="55"/> + </bean> +</blueprint> diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java new file mode 100644 index 000000000..edf68e096 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * ============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.odlux.bundles.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl; +import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle; + +public class TestBundleRes { + + @Test + public void test() { + OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance(); + MyOdluxBundle b = new MyOdluxBundle(); + b.setLoader(loader); + b.setIndex(0); + b.setBundleName("abc"); + b.initialize(); + assertTrue(loader.getNumberOfBundles()==1); + assertNotNull(b.getLoader()); + assertEquals("abc",b.getBundleName()); + assertTrue(b.hasResource("test.js")); + assertNotNull(b.getResourceFileContent("test.js")); + b.clean(); + assertTrue(loader.getNumberOfBundles()==0); + } + +} diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/test/resources/test.js new file mode 100644 index 000000000..b47fdc39f --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src2/test/resources/test.js @@ -0,0 +1,5 @@ +asdac sad +as +d +sad + sadfa
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/tsconfig.json b/sdnr/wt/odlux/apps/performanceHistoryApp/tsconfig.json new file mode 100644 index 000000000..a66b5d828 --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "baseUrl": "./src", + "outDir": "./dist", + "sourceMap": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "strictNullChecks": true, + "pretty": true, + "newLine": "LF", + "module": "es2015", + "target": "es2016", + "moduleResolution": "node", + "experimentalDecorators": true, + "jsx": "preserve", + "lib": [ + "dom", + "es2015", + "es2016" + ], + "types": [ + "prop-types", + "react", + "react-dom" + ] + }, + "exclude": [ + "dist", + "node_modules" + ] +} diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js b/sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js new file mode 100644 index 000000000..27a5949ac --- /dev/null +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js @@ -0,0 +1,139 @@ +/** + * Webpack 4 configuration file + * see https://webpack.js.org/configuration/ + * see https://webpack.js.org/configuration/dev-server/ + */ + +"use strict"; + +const path = require("path"); +const webpack = require("webpack"); +const CopyWebpackPlugin = require("copy-webpack-plugin"); +const TerserPlugin = require('terser-webpack-plugin'); + +// const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname()); + +module.exports = (env) => { + const distPath = path.resolve(__dirname, env === "release" ? "." : "../..", "dist"); + const frameworkPath = path.resolve(__dirname, env === "release" ? "../../framework" : "../..", "dist"); + return [{ + name: "App", + + mode: "none", //disable default behavior + + target: "web", + + context: path.resolve(__dirname, "src"), + + entry: { + performanceHistoryApp: ["./plugin.tsx"] + }, + + devtool: env === "release" ? false : "source-map", + + resolve: { + extensions: [".ts", ".tsx", ".js", ".jsx"] + }, + + output: { + path: distPath, + filename: "[name].js", + library: "[name]", + libraryTarget: "umd2", + chunkFilename: "[name].js" + }, + module: { + rules: [{ + test: /\.tsx?$/, + exclude: /node_modules/, + use: [{ + loader: "babel-loader" + }, { + loader: "ts-loader" + }] + }, { + test: /\.jsx?$/, + exclude: /node_modules/, + use: [{ + loader: "babel-loader" + }] + }] + }, + + optimization: { + noEmitOnErrors: true, + namedModules: env !== "release", + minimize: env === "release", + minimizer: env !== "release" ? [] : [new TerserPlugin({ + terserOptions: { + warnings: false, // false, true, "verbose" + compress: { + drop_console: true, + drop_debugger: true, + } + } + })], + }, + plugins: [ + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, "../../framework/src"), + manifest: require(path.resolve(frameworkPath, "vendor-manifest.json")), + sourceType: "umd2" + }), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, "../../framework/src"), + manifest: require(path.resolve(frameworkPath, "app-manifest.json")), + sourceType: "umd2" + }), + ...(env === "release") ? [ + new webpack.DefinePlugin({ + "process.env": { + NODE_ENV: "'production'", + VERSION: JSON.stringify(require("./package.json").version) + } + }), + ] : [ + new webpack.DefinePlugin({ + "process.env": { + NODE_ENV: "'development'", + VERSION: JSON.stringify(require("./package.json").version) + } + }), + new CopyWebpackPlugin([{ + from: 'index.html', + to: distPath + }]), + ] + ], + + devServer: { + public: "http://localhost:3100", + contentBase: frameworkPath, + + compress: true, + headers: { + "Access-Control-Allow-Origin": "*" + }, + host: "0.0.0.0", + port: 3100, + disableHostCheck: true, + historyApiFallback: true, + inline: true, + hot: false, + quiet: false, + stats: { + colors: true + }, + proxy: { + "/restconf": { + target: "http://localhost:8181", + secure: false + }, + "/database": { + target: "http://localhost:8181", + secure: false + } + } + } + }]; +} diff --git a/sdnr/wt/odlux/core/features/pom.xml b/sdnr/wt/odlux/core/features/pom.xml index 667f3b49c..945e5777c 100644 --- a/sdnr/wt/odlux/core/features/pom.xml +++ b/sdnr/wt/odlux/core/features/pom.xml @@ -11,7 +11,10 @@ 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"> + +<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> @@ -24,7 +27,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>single-feature-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <licenses> <license> diff --git a/sdnr/wt/odlux/core/installer/pom.xml b/sdnr/wt/odlux/core/installer/pom.xml index f093de04e..13eb78d22 100755 --- a/sdnr/wt/odlux/core/installer/pom.xml +++ b/sdnr/wt/odlux/core/installer/pom.xml @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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> @@ -12,7 +14,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <properties> diff --git a/sdnr/wt/odlux/core/model/pom.xml b/sdnr/wt/odlux/core/model/pom.xml index 200e9225a..931d12fb8 100644 --- a/sdnr/wt/odlux/core/model/pom.xml +++ b/sdnr/wt/odlux/core/model/pom.xml @@ -1,5 +1,6 @@ -<?xml version="1.0" encoding="UTF-8"?> -<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"> +<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> @@ -12,7 +13,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>binding-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <licenses> <license> diff --git a/sdnr/wt/odlux/core/pom.xml b/sdnr/wt/odlux/core/pom.xml index 3bd327864..f41a5484d 100644 --- a/sdnr/wt/odlux/core/pom.xml +++ b/sdnr/wt/odlux/core/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent-lite</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> diff --git a/sdnr/wt/odlux/core/provider/pom.xml b/sdnr/wt/odlux/core/provider/pom.xml index 0df54aa21..0ae59e5c5 100644 --- a/sdnr/wt/odlux/core/provider/pom.xml +++ b/sdnr/wt/odlux/core/provider/pom.xml @@ -1,5 +1,6 @@ -<?xml version="1.0" encoding="UTF-8"?> -<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"> +<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> @@ -12,7 +13,7 @@ <groupId>org.onap.ccsdk.parent</groupId> <artifactId>binding-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <licenses> <license> @@ -105,4 +106,4 @@ </plugin> </plugins> </build> -</project> +</project>
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/pom.xml b/sdnr/wt/odlux/framework/pom.xml index 5d4eb3e6a..06142f618 100644 --- a/sdnr/wt/odlux/framework/pom.xml +++ b/sdnr/wt/odlux/framework/pom.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>odlparent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> + <relativePath /> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> @@ -13,6 +15,12 @@ <version>0.4.2-SNAPSHOT</version> <packaging>jar</packaging> <name>sdnr-wt-odlux-framework</name> + <properties> + <buildtime>${maven.build.timestamp}</buildtime> + <distversion>ONAP Dublin (Flourine-SR2)</distversion> + <buildno>6.aa84511(19/03/28)</buildno> + <odlux.version>ONAP SDN-R | ONF Wireless for ${distversion} - Build: ${buildtime} ${buildno} ${project.version}</odlux.version> + </properties> <licenses> <license> <name>Apache License, Version 2.0</name> @@ -74,7 +82,7 @@ </goals> <phase>initialize</phase> <configuration> - <arguments>-W add lerna</arguments> + <arguments>add lerna@3.13.1 -W --exact</arguments> <installDirectory>${project.basedir}</installDirectory> <workingDirectory>${project.basedir}/../</workingDirectory> </configuration> @@ -106,6 +114,32 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> </plugin> + <plugin> + <groupId>com.google.code.maven-replacer-plugin</groupId> + <artifactId>replacer</artifactId> + <version>1.5.2</version> + <executions> + <execution> + <id>replace version</id> + <phase>prepare-package</phase> + <goals> + <goal>replace</goal> + </goals> + </execution> + </executions> + <configuration> + <basedir>${project.build.directory}/classes/odlux</basedir> + <includes> + <include>app.js</include> + </includes> + <replacements> + <replacement> + <token>##odlux.version##</token> + <value>${odlux.version}</value> + </replacement> + </replacements> + </configuration> + </plugin> </plugins> <resources> <resource> diff --git a/sdnr/wt/odlux/framework/src/components/material-table/index.tsx b/sdnr/wt/odlux/framework/src/components/material-table/index.tsx index 61a990d81..402d1007e 100644 --- a/sdnr/wt/odlux/framework/src/components/material-table/index.tsx +++ b/sdnr/wt/odlux/framework/src/components/material-table/index.tsx @@ -1,425 +1,464 @@ -import * as React from 'react';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
-
-import Table from '@material-ui/core/Table';
-import TableBody from '@material-ui/core/TableBody';
-import TableCell from '@material-ui/core/TableCell';
-import TablePagination from '@material-ui/core/TablePagination';
-import TableRow from '@material-ui/core/TableRow';
-import Paper from '@material-ui/core/Paper';
-import Checkbox from '@material-ui/core/Checkbox';
-
-import { TableToolbar } from './tableToolbar';
-import { EnhancedTableHead } from './tableHead';
-import { EnhancedTableFilter } from './tableFilter';
-
-import { ColumnModel, ColumnType } from './columnModel';
-import { Omit } from '@material-ui/core';
-import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon';
-export { ColumnModel, ColumnType } from './columnModel';
-
-type propType = string | number | null | undefined | (string|number)[];
-type dataType = { [prop: string]: propType };
-type resultType<TData = dataType> = { page: number, rowCount: number, rows: TData[] };
-
-export type DataCallback<TData = dataType> = (page?: number, rowsPerPage?: number, orderBy?: string | null, order?: 'asc' | 'desc' | null, filter?: { [property: string]: string }) =>resultType<TData> | Promise<resultType<TData>>;
-
-function desc(a: dataType, b: dataType, orderBy: string) {
- if ((b[orderBy] || "") < (a[orderBy] || "") ) {
- return -1;
- }
- if ((b[orderBy] || "") > (a[orderBy] || "") ) {
- return 1;
- }
- return 0;
-}
-
-function stableSort(array: dataType[], cmp: (a: dataType, b: dataType) => number) {
- const stabilizedThis = array.map((el, index) => [el, index]) as [dataType, number][];
- stabilizedThis.sort((a, b) => {
- const order = cmp(a[0], b[0]);
- if (order !== 0) return order;
- return a[1] - b[1];
- });
- return stabilizedThis.map(el => el[0]);
-}
-
-function getSorting(order: 'asc' | 'desc' | null, orderBy: string) {
- return order === 'desc' ? (a: dataType, b: dataType) => desc(a, b, orderBy) : (a: dataType, b: dataType) => -desc(a, b, orderBy);
-}
-
-const styles = (theme: Theme) => createStyles({
- root: {
- width: '100%',
- marginTop: theme.spacing.unit * 3,
- },
- table: {
- minWidth: 1020,
- },
- tableWrapper: {
- overflowX: 'auto',
- },
-});
-
-export type MaterialTableComponentState<TData = {}> = {
- order: 'asc' | 'desc';
- orderBy: string | null;
- selected: any[] | null;
- rows: TData[];
- rowCount: number;
- page: number;
- rowsPerPage: number;
- loading: boolean;
- showFilter: boolean;
- filter: { [property: string]: string };
-};
-
-export type TableApi = { forceRefresh?: () => Promise<void> };
-
-type MaterialTableComponentBaseProps<TData> = WithStyles<typeof styles> & {
- columns: ColumnModel<TData>[];
- idProperty: keyof TData | ((data: TData) => React.Key );
- title?: string;
- enableSelection?: boolean;
- disableSorting?: boolean;
- disableFilter?: boolean;
- customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, onClick: () => void }[];
- onHandleClick?(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData): void;
-};
-
-type MaterialTableComponentPropsWithRows<TData={}> = MaterialTableComponentBaseProps<TData> & { rows: TData[]; asynchronus?: boolean; };
-type MaterialTableComponentPropsWithRequestData<TData={}> = MaterialTableComponentBaseProps<TData> & { onRequestData: DataCallback; tableApi?: TableApi; };
-type MaterialTableComponentPropsWithExternalState<TData={}> = MaterialTableComponentBaseProps<TData> & MaterialTableComponentState & {
- onToggleFilter: () => void;
- onFilterChanged: (property: string, filterTerm: string) => void;
- onHandleChangePage: (page: number) => void;
- onHandleChangeRowsPerPage: (rowsPerPage: number | null) => void;
- onHandleRequestSort: (property: string) => void;
-};
-
-type MaterialTableComponentProps<TData = {}> =
- MaterialTableComponentPropsWithRows<TData> |
- MaterialTableComponentPropsWithRequestData<TData> |
- MaterialTableComponentPropsWithExternalState<TData>;
-
-function isMaterialTableComponentPropsWithRows(props: MaterialTableComponentProps): props is MaterialTableComponentPropsWithRows {
- return (props as MaterialTableComponentPropsWithRows).rows !== undefined && (props as MaterialTableComponentPropsWithRows).rows instanceof Array;
-}
-
-function isMaterialTableComponentPropsWithRequestData(props: MaterialTableComponentProps): props is MaterialTableComponentPropsWithRequestData {
- return (props as MaterialTableComponentPropsWithRequestData).onRequestData !== undefined && (props as MaterialTableComponentPropsWithRequestData).onRequestData instanceof Function;
-}
-
-function isMaterialTableComponentPropsWithRowsAndRequestData(props: MaterialTableComponentProps): props is MaterialTableComponentPropsWithExternalState {
- const propsWithExternalState = (props as MaterialTableComponentPropsWithExternalState)
- return propsWithExternalState.onFilterChanged instanceof Function ||
- propsWithExternalState.onHandleChangePage instanceof Function ||
- propsWithExternalState.onHandleChangeRowsPerPage instanceof Function ||
- propsWithExternalState.onToggleFilter instanceof Function ||
- propsWithExternalState.onHandleRequestSort instanceof Function
-}
-
-class MaterialTableComponent<TData extends {} = {}> extends React.Component<MaterialTableComponentProps, MaterialTableComponentState> {
-
- constructor(props: MaterialTableComponentProps) {
- super(props);
-
- const page = isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.page : 0;
- const rowsPerPage = isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.rowsPerPage || 10 : 10;
-
- this.state = {
- filter: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.filter || {} : {},
- showFilter: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.showFilter : false,
- loading: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.loading : false,
- order: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.order : 'asc',
- orderBy: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.orderBy : null,
- selected: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.selected : null,
- rows: isMaterialTableComponentPropsWithRows(this.props) && this.props.rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) || [],
- rowCount: isMaterialTableComponentPropsWithRows(this.props) && this.props.rows.length || 0,
- page,
- rowsPerPage,
- };
-
- if (isMaterialTableComponentPropsWithRequestData(this.props)) {
- this.update();
-
- if (this.props.tableApi) {
- this.props.tableApi.forceRefresh = () => this.update();
- }
- }
- }
- render(): JSX.Element {
- const { classes, columns } = this.props;
- const { rows, rowCount, order, orderBy, selected, rowsPerPage, page, showFilter, filter } = this.state;
- const emptyRows = rowsPerPage - Math.min(rowsPerPage, rowCount - page * rowsPerPage);
- const getId = typeof this.props.idProperty !== "function" ? (data: TData) => ((data as {[key:string]: any })[this.props.idProperty as any as string] as string | number) : this.props.idProperty;
- const toggleFilter = isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.onToggleFilter : () => { !this.props.disableFilter && this.setState({ showFilter: !showFilter }, this.update) }
- return (
- <Paper className={ classes.root }>
- <TableToolbar numSelected={ selected && selected.length } title={ this.props.title } customActionButtons={ this.props.customActionButtons } onExportToCsv={ this.exportToCsv }
- onToggleFilter={ toggleFilter } />
- <div className={ classes.tableWrapper }>
- <Table className={ classes.table } aria-labelledby="tableTitle">
- <EnhancedTableHead
- columns={ columns }
- numSelected={ selected && selected.length }
- order={ order }
- orderBy={ orderBy }
- onSelectAllClick={ this.handleSelectAllClick }
- onRequestSort={ this.onHandleRequestSort }
- rowCount={ rows.length }
- enableSelection={ this.props.enableSelection }
- />
- <TableBody>
- { showFilter && <EnhancedTableFilter columns={ columns } filter={ filter } onFilterChanged={ this.onFilterChanged } enableSelection={this.props.enableSelection} /> || null }
- { rows // may need ordering here
- .map((entry: TData & { [key: string]: any }) => {
- const entryId = getId(entry);
- const isSelected = this.isSelected(entryId);
- return (
- <TableRow
- hover
- onClick={ event => this.handleClick(event, entry, entryId) }
- role="checkbox"
- aria-checked={ isSelected }
- tabIndex={ -1 }
- key={ entryId }
- selected={ isSelected }
- >
- { this.props.enableSelection
- ? <TableCell padding="checkbox" style={ { width: "50px" } }>
- <Checkbox checked={ isSelected } />
- </TableCell>
- : null
- }
- {
- this.props.columns.map(
- col => {
- const style = col.width ? { width: col.width } : { };
- return (
- <TableCell key={ col.property } align={ col.type === ColumnType.numeric && !col.align ? "right": col.align } style={ style }>
- { col.type === ColumnType.custom && col.customControl
- ? <col.customControl className={col.className} style={col.style} rowData={ entry } />
- : col.type === ColumnType.boolean
- ? <span className={col.className} style={col.style}>{col.labels ? col.labels[entry[col.property] ? "true": "false"] : String(entry[col.property]) }</span>
- : <span className={col.className} style={col.style}>{String(entry[col.property])}</span>
- }
- </TableCell>
- );
- }
- )
- }
- </TableRow>
- );
- }) }
- { emptyRows > 0 && (
- <TableRow style={ { height: 49 * emptyRows } }>
- <TableCell colSpan={ this.props.columns.length } />
- </TableRow>
- ) }
- </TableBody>
- </Table>
- </div>
- <TablePagination
- rowsPerPageOptions={ [5, 10, 25] }
- component="div"
- count={ rowCount }
- rowsPerPage={ rowsPerPage }
- page={ page }
- backIconButtonProps={ {
- 'aria-label': 'Previous Page',
- } }
- nextIconButtonProps={ {
- 'aria-label': 'Next Page',
- } }
- onChangePage={ this.onHandleChangePage }
- onChangeRowsPerPage={ this.onHandleChangeRowsPerPage }
- />
- </Paper>
- );
- }
-
- static getDerivedStateFromProps(props: MaterialTableComponentProps, state: MaterialTableComponentState & { _rawRows: {}[] }): MaterialTableComponentState & { _rawRows: {}[] } {
- if (isMaterialTableComponentPropsWithRowsAndRequestData(props)) {
- return {
- ...state,
- rows: props.rows,
- rowCount: props.rowCount,
- orderBy: props.orderBy,
- order: props.order,
- filter: props.filter,
- loading: props.loading,
- showFilter: props.showFilter,
- page: props.page,
- rowsPerPage: props.rowsPerPage
- }
- } else if (isMaterialTableComponentPropsWithRows(props) && props.asynchronus && state._rawRows !== props.rows) {
- const newState = MaterialTableComponent.updateRows(props, state);
- return {
- ...state,
- ...newState,
- _rawRows: props.rows || []
- };
- }
- return state;
- }
-
- private static updateRows(props: MaterialTableComponentPropsWithRows, state: MaterialTableComponentState): { rows: {}[], rowCount: number } {
- try {
- const { page, rowsPerPage, order, orderBy, filter } = state;
- let data: dataType[] = props.rows || [];
- let filtered = false;
- if (state.showFilter) {
- Object.keys(filter).forEach(prop => {
- const exp = filter[prop];
- filtered = filtered || exp !== undefined;
- data = exp !== undefined ? data.filter((val) => {
- const value = val[prop];
- return (value == exp) || (value && value.toString().indexOf(String(exp)) > -1);
- }) : data;
- });
- }
-
- const rowCount = data.length;
-
- data = (orderBy && order
- ? stableSort(data, getSorting(order, orderBy))
- : data).slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
-
- return {
- rows: data,
- rowCount
- };
- } catch{
- return {
- rows: [],
- rowCount: 0
- }
- }
- }
-
- private async update() {
- if (isMaterialTableComponentPropsWithRequestData(this.props)) {
- const response = await Promise.resolve(
- this.props.onRequestData(
- this.state.page, this.state.rowsPerPage, this.state.orderBy, this.state.order, this.state.showFilter && this.state.filter || {})
- );
- this.setState(response);
- } else {
- this.setState(MaterialTableComponent.updateRows(this.props, this.state));
- }
- }
-
- private onFilterChanged = (property: string, filterTerm: string) => {
- if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) {
- this.props.onFilterChanged(property, filterTerm);
- return;
- }
- if (this.props.disableFilter) return;
- const colDefinition = this.props.columns && this.props.columns.find(col => col.property === property);
- if (colDefinition && colDefinition.disableFilter) return;
-
- const filter = { ...this.state.filter, [property]: filterTerm };
- this.setState({
- filter
- }, this.update);
- };
-
- private onHandleRequestSort = (event: React.SyntheticEvent, property: string) => {
- if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) {
- this.props.onHandleRequestSort(property);
- return;
- }
- if (this.props.disableSorting) return;
- const colDefinition = this.props.columns && this.props.columns.find(col => col.property === property);
- if (colDefinition && colDefinition.disableSorting) return;
-
- const orderBy = this.state.orderBy === property && this.state.order === 'desc' ? null : property;
- const order = this.state.orderBy === property && this.state.order === 'asc' ? 'desc' : 'asc';
- this.setState({
- order,
- orderBy
- }, this.update);
- };
-
- handleSelectAllClick: () => {};
-
- private onHandleChangePage = (event: React.MouseEvent<HTMLButtonElement> | null, page: number) => {
- if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) {
- this.props.onHandleChangePage(page);
- return;
- }
- this.setState({
- page
- }, this.update);
- };
-
- private onHandleChangeRowsPerPage = (event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {
- if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) {
- this.props.onHandleChangeRowsPerPage(+(event && event.target.value));
- return;
- }
- const rowsPerPage = +(event && event.target.value);
- if (rowsPerPage && rowsPerPage > 0) {
- this.setState({
- rowsPerPage
- }, this.update);
- }
- };
-
- private isSelected(id: string | number): boolean {
- let selected = this.state.selected || [];
- const selectedIndex = selected.indexOf(id);
- return (selectedIndex > -1);
- }
-
- private handleClick(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData, id: string | number): void {
- if (this.props.onHandleClick instanceof Function) {
- this.props.onHandleClick(event, rowData);
- return;
- }
- if (!this.props.enableSelection){
- return;
- }
- let selected = this.state.selected || [];
- const selectedIndex = selected.indexOf(id);
- if (selectedIndex > -1) {
- selected = [
- ...selected.slice(0, selectedIndex),
- ...selected.slice(selectedIndex + 1)
- ];
- } else {
- selected = [
- ...selected,
- id
- ];
- }
- this.setState({
- selected
- });
- }
-
- private exportToCsv = () => {
- let file;
- const data: string[] = [];
- data.push(this.props.columns.map(col => col.title || col.property).join(',')+"\r\n");
- this.state.rows && this.state.rows.forEach((row : any)=> {
- data.push(this.props.columns.map(col => row[col.property]).join(',') + "\r\n");
- });
- const properties = { type: 'text/csv' }; // Specify the file's mime-type.
- try {
- // Specify the filename using the File constructor, but ...
- file = new File(data, "export.csv", properties);
- } catch (e) {
- // ... fall back to the Blob constructor if that isn't supported.
- file = new Blob(data, properties);
- }
- const url = URL.createObjectURL(file);
- window.location.replace(url);
- }
-}
-
-export type MaterialTableCtorType<TData extends {} = {}> = new () => React.Component<Omit<MaterialTableComponentProps<TData>, 'classes'>>;
-
-export const MaterialTable = withStyles(styles)(MaterialTableComponent);
+import * as React from 'react'; +import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles'; + +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TablePagination from '@material-ui/core/TablePagination'; +import TableRow from '@material-ui/core/TableRow'; +import Paper from '@material-ui/core/Paper'; +import Checkbox from '@material-ui/core/Checkbox'; + +import { TableToolbar } from './tableToolbar'; +import { EnhancedTableHead } from './tableHead'; +import { EnhancedTableFilter } from './tableFilter'; + +import { ColumnModel, ColumnType } from './columnModel'; +import { Omit } from '@material-ui/core'; +import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon'; +export { ColumnModel, ColumnType } from './columnModel'; + +type propType = string | number | null | undefined | (string|number)[]; +type dataType = { [prop: string]: propType }; +type resultType<TData = dataType> = { page: number, rowCount: number, rows: TData[] }; + +export type DataCallback<TData = dataType> = (page?: number, rowsPerPage?: number, orderBy?: string | null, order?: 'asc' | 'desc' | null, filter?: { [property: string]: string }) =>resultType<TData> | Promise<resultType<TData>>; + +function desc(a: dataType, b: dataType, orderBy: string) { + if ((b[orderBy] || "") < (a[orderBy] || "") ) { + return -1; + } + if ((b[orderBy] || "") > (a[orderBy] || "") ) { + return 1; + } + return 0; +} + +function stableSort(array: dataType[], cmp: (a: dataType, b: dataType) => number) { + const stabilizedThis = array.map((el, index) => [el, index]) as [dataType, number][]; + stabilizedThis.sort((a, b) => { + const order = cmp(a[0], b[0]); + if (order !== 0) return order; + return a[1] - b[1]; + }); + return stabilizedThis.map(el => el[0]); +} + +function getSorting(order: 'asc' | 'desc' | null, orderBy: string) { + return order === 'desc' ? (a: dataType, b: dataType) => desc(a, b, orderBy) : (a: dataType, b: dataType) => -desc(a, b, orderBy); +} + +const styles = (theme: Theme) => createStyles({ + root: { + width: '100%', + marginTop: theme.spacing.unit * 3, + }, + table: { + minWidth: 1020, + }, + tableWrapper: { + overflowX: 'auto', + }, +}); + +export type MaterialTableComponentState<TData = {}> = { + order: 'asc' | 'desc'; + orderBy: string | null; + selected: any[] | null; + rows: TData[]; + rowCount: number; + page: number; + rowsPerPage: number; + loading: boolean; + showFilter: boolean; + filter: { [property: string]: string }; +}; + +export type TableApi = { forceRefresh?: () => Promise<void> }; + +type MaterialTableComponentBaseProps<TData> = WithStyles<typeof styles> & { + columns: ColumnModel<TData>[]; + idProperty: keyof TData | ((data: TData) => React.Key ); + title?: string; + enableSelection?: boolean; + disableSorting?: boolean; + disableFilter?: boolean; + customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, onClick: () => void }[]; + onHandleClick?(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData): void; +}; + +type MaterialTableComponentPropsWithRows<TData={}> = MaterialTableComponentBaseProps<TData> & { rows: TData[]; asynchronus?: boolean; }; +type MaterialTableComponentPropsWithRequestData<TData={}> = MaterialTableComponentBaseProps<TData> & { onRequestData: DataCallback; tableApi?: TableApi; }; +type MaterialTableComponentPropsWithExternalState<TData={}> = MaterialTableComponentBaseProps<TData> & MaterialTableComponentState & { + onToggleFilter: () => void; + onFilterChanged: (property: string, filterTerm: string) => void; + onHandleChangePage: (page: number) => void; + onHandleChangeRowsPerPage: (rowsPerPage: number | null) => void; + onHandleRequestSort: (property: string) => void; +}; + +type MaterialTableComponentProps<TData = {}> = + MaterialTableComponentPropsWithRows<TData> | + MaterialTableComponentPropsWithRequestData<TData> | + MaterialTableComponentPropsWithExternalState<TData>; + +function isMaterialTableComponentPropsWithRows(props: MaterialTableComponentProps): props is MaterialTableComponentPropsWithRows { + return (props as MaterialTableComponentPropsWithRows).rows !== undefined && (props as MaterialTableComponentPropsWithRows).rows instanceof Array; +} + +function isMaterialTableComponentPropsWithRequestData(props: MaterialTableComponentProps): props is MaterialTableComponentPropsWithRequestData { + return (props as MaterialTableComponentPropsWithRequestData).onRequestData !== undefined && (props as MaterialTableComponentPropsWithRequestData).onRequestData instanceof Function; +} + +function isMaterialTableComponentPropsWithRowsAndRequestData(props: MaterialTableComponentProps): props is MaterialTableComponentPropsWithExternalState { + const propsWithExternalState = (props as MaterialTableComponentPropsWithExternalState) + return propsWithExternalState.onFilterChanged instanceof Function || + propsWithExternalState.onHandleChangePage instanceof Function || + propsWithExternalState.onHandleChangeRowsPerPage instanceof Function || + propsWithExternalState.onToggleFilter instanceof Function || + propsWithExternalState.onHandleRequestSort instanceof Function +} + +class MaterialTableComponent<TData extends {} = {}> extends React.Component<MaterialTableComponentProps, MaterialTableComponentState> { + + constructor(props: MaterialTableComponentProps) { + super(props); + + const page = isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.page : 0; + const rowsPerPage = isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.rowsPerPage || 10 : 10; + + this.state = { + filter: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.filter || {} : {}, + showFilter: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.showFilter : false, + loading: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.loading : false, + order: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.order : 'asc', + orderBy: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.orderBy : null, + selected: isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.selected : null, + rows: isMaterialTableComponentPropsWithRows(this.props) && this.props.rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) || [], + rowCount: isMaterialTableComponentPropsWithRows(this.props) && this.props.rows.length || 0, + page, + rowsPerPage, + }; + + if (isMaterialTableComponentPropsWithRequestData(this.props)) { + this.update(); + + if (this.props.tableApi) { + this.props.tableApi.forceRefresh = () => this.update(); + } + } + } + render(): JSX.Element { + const { classes, columns } = this.props; + const { rows, rowCount, order, orderBy, selected, rowsPerPage, page, showFilter, filter } = this.state; + const emptyRows = rowsPerPage - Math.min(rowsPerPage, rowCount - page * rowsPerPage); + const getId = typeof this.props.idProperty !== "function" ? (data: TData) => ((data as {[key:string]: any })[this.props.idProperty as any as string] as string | number) : this.props.idProperty; + const toggleFilter = isMaterialTableComponentPropsWithRowsAndRequestData(this.props) ? this.props.onToggleFilter : () => { !this.props.disableFilter && this.setState({ showFilter: !showFilter }, this.update) } + return ( + <Paper className={ classes.root }> + <TableToolbar numSelected={ selected && selected.length } title={ this.props.title } customActionButtons={ this.props.customActionButtons } onExportToCsv={ this.exportToCsv } + onToggleFilter={ toggleFilter } /> + <div className={ classes.tableWrapper }> + <Table className={ classes.table } aria-labelledby="tableTitle"> + <EnhancedTableHead + columns={ columns } + numSelected={ selected && selected.length } + order={ order } + orderBy={ orderBy } + onSelectAllClick={ this.handleSelectAllClick } + onRequestSort={ this.onHandleRequestSort } + rowCount={ rows.length } + enableSelection={ this.props.enableSelection } + /> + <TableBody> + { showFilter && <EnhancedTableFilter columns={ columns } filter={ filter } onFilterChanged={ this.onFilterChanged } enableSelection={this.props.enableSelection} /> || null } + { rows // may need ordering here + .map((entry: TData & { [key: string]: any }) => { + const entryId = getId(entry); + const isSelected = this.isSelected(entryId); + return ( + <TableRow + hover + onClick={ event => this.handleClick(event, entry, entryId) } + role="checkbox" + aria-checked={ isSelected } + tabIndex={ -1 } + key={ entryId } + selected={ isSelected } + > + { this.props.enableSelection + ? <TableCell padding="checkbox" style={ { width: "50px" } }> + <Checkbox checked={ isSelected } /> + </TableCell> + : null + } + { + this.props.columns.map( + col => { + const style = col.width ? { width: col.width } : { }; + return ( + <TableCell key={ col.property } align={ col.type === ColumnType.numeric && !col.align ? "right": col.align } style={ style }> + { col.type === ColumnType.custom && col.customControl + ? <col.customControl className={col.className} style={col.style} rowData={ entry } /> + : col.type === ColumnType.boolean + ? <span className={col.className} style={col.style}>{col.labels ? col.labels[entry[col.property] ? "true": "false"] : String(entry[col.property]) }</span> + : <span className={col.className} style={col.style}>{String(entry[col.property])}</span> + } + </TableCell> + ); + } + ) + } + </TableRow> + ); + }) } + { emptyRows > 0 && ( + <TableRow style={ { height: 49 * emptyRows } }> + <TableCell colSpan={ this.props.columns.length } /> + </TableRow> + ) } + </TableBody> + </Table> + </div> + <TablePagination + rowsPerPageOptions={[5, 10, 20, 50] } + component="div" + count={ rowCount } + rowsPerPage={ rowsPerPage } + page={ page } + backIconButtonProps={ { + 'aria-label': 'Previous Page', + } } + nextIconButtonProps={ { + 'aria-label': 'Next Page', + } } + onChangePage={ this.onHandleChangePage } + onChangeRowsPerPage={ this.onHandleChangeRowsPerPage } + /> + </Paper> + ); + } + + static getDerivedStateFromProps(props: MaterialTableComponentProps, state: MaterialTableComponentState & { _rawRows: {}[] }): MaterialTableComponentState & { _rawRows: {}[] } { + if (isMaterialTableComponentPropsWithRowsAndRequestData(props)) { + return { + ...state, + rows: props.rows, + rowCount: props.rowCount, + orderBy: props.orderBy, + order: props.order, + filter: props.filter, + loading: props.loading, + showFilter: props.showFilter, + page: props.page, + rowsPerPage: props.rowsPerPage + } + } else if (isMaterialTableComponentPropsWithRows(props) && props.asynchronus && state._rawRows !== props.rows) { + const newState = MaterialTableComponent.updateRows(props, state); + return { + ...state, + ...newState, + _rawRows: props.rows || [] + }; + } + return state; + } + + private static updateRows(props: MaterialTableComponentPropsWithRows, state: MaterialTableComponentState): { rows: {}[], rowCount: number } { + try { + const { page, rowsPerPage, order, orderBy, filter } = state; + let data: dataType[] = props.rows || []; + let filtered = false; + if (state.showFilter) { + Object.keys(filter).forEach(prop => { + const exp = filter[prop]; + filtered = filtered || exp !== undefined; + data = exp !== undefined ? data.filter((val) => { + const value = val[prop]; + return (value == exp) || (value && value.toString().indexOf(String(exp)) > -1); + }) : data; + }); + } + + const rowCount = data.length; + + data = (orderBy && order + ? stableSort(data, getSorting(order, orderBy)) + : data).slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage); + + return { + rows: data, + rowCount + }; + } catch{ + return { + rows: [], + rowCount: 0 + } + } + } + + private async update() { + if (isMaterialTableComponentPropsWithRequestData(this.props)) { + const response = await Promise.resolve( + this.props.onRequestData( + this.state.page, this.state.rowsPerPage, this.state.orderBy, this.state.order, this.state.showFilter && this.state.filter || {}) + ); + this.setState(response); + } else { + this.setState(MaterialTableComponent.updateRows(this.props, this.state)); + } + } + + private onFilterChanged = (property: string, filterTerm: string) => { + if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) { + this.props.onFilterChanged(property, filterTerm); + return; + } + if (this.props.disableFilter) return; + const colDefinition = this.props.columns && this.props.columns.find(col => col.property === property); + if (colDefinition && colDefinition.disableFilter) return; + + const filter = { ...this.state.filter, [property]: filterTerm }; + this.setState({ + filter + }, this.update); + }; + + private onHandleRequestSort = (event: React.SyntheticEvent, property: string) => { + if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) { + this.props.onHandleRequestSort(property); + return; + } + if (this.props.disableSorting) return; + const colDefinition = this.props.columns && this.props.columns.find(col => col.property === property); + if (colDefinition && colDefinition.disableSorting) return; + + const orderBy = this.state.orderBy === property && this.state.order === 'desc' ? null : property; + const order = this.state.orderBy === property && this.state.order === 'asc' ? 'desc' : 'asc'; + this.setState({ + order, + orderBy + }, this.update); + }; + + handleSelectAllClick: () => {}; + + private onHandleChangePage = (event: React.MouseEvent<HTMLButtonElement> | null, page: number) => { + if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) { + this.props.onHandleChangePage(page); + return; + } + this.setState({ + page + }, this.update); + }; + + private onHandleChangeRowsPerPage = (event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => { + if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) { + this.props.onHandleChangeRowsPerPage(+(event && event.target.value)); + return; + } + const rowsPerPage = +(event && event.target.value); + if (rowsPerPage && rowsPerPage > 0) { + this.setState({ + rowsPerPage + }, this.update); + } + }; + + private isSelected(id: string | number): boolean { + let selected = this.state.selected || []; + const selectedIndex = selected.indexOf(id); + return (selectedIndex > -1); + } + + private handleClick(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData, id: string | number): void { + if (this.props.onHandleClick instanceof Function) { + this.props.onHandleClick(event, rowData); + return; + } + if (!this.props.enableSelection){ + return; + } + let selected = this.state.selected || []; + const selectedIndex = selected.indexOf(id); + if (selectedIndex > -1) { + selected = [ + ...selected.slice(0, selectedIndex), + ...selected.slice(selectedIndex + 1) + ]; + } else { + selected = [ + ...selected, + id + ]; + } + this.setState({ + selected + }); + } + + private exportToCsv = async () => { + let file; + let data: dataType[] | null = null; + let csv: string[] = []; + + + if (isMaterialTableComponentPropsWithRequestData(this.props)) { + this.setState({ loading: true }); + const result = await Promise.resolve( + this.props.onRequestData( 1, 1000, this.state.orderBy, this.state.order, this.state.showFilter && this.state.filter || {}) + ); + data = result.rows; + this.setState({ loading: true }); + } else { + data = MaterialTableComponent.updateRows(this.props, this.state).rows; + } + + if (data && data.length > 0) { + csv.push(this.props.columns.map(col => col.title || col.property).join(',') + "\r\n"); + this.state.rows && this.state.rows.forEach((row: any) => { + csv.push(this.props.columns.map(col => row[col.property]).join(',') + "\r\n"); + }); + const properties = { type: "text/csv;charset=utf-8" }; // Specify the file's mime-type. + try { + // Specify the filename using the File constructor, but ... + file = new File(csv, "export.csv", properties); + } catch (e) { + // ... fall back to the Blob constructor if that isn't supported. + file = new Blob(csv, properties); + } + } + if (!file) return; + var reader = new FileReader(); + reader.onload = function (e) { + const dataUri = reader.result as any; + const link = document.createElement("a"); + if (typeof link.download === 'string') { + link.href = dataUri; + link.download = "export.csv"; + + //Firefox requires the link to be in the body + document.body.appendChild(link); + + //simulate click + link.click(); + + //remove the link when done + document.body.removeChild(link); + } else { + window.open(dataUri); + } + } + reader.readAsDataURL(file); + + // const url = URL.createObjectURL(file); + // window.location.replace(url); + } +} + +export type MaterialTableCtorType<TData extends {} = {}> = new () => React.Component<Omit<MaterialTableComponentProps<TData>, 'classes'>>; + +export const MaterialTable = withStyles(styles)(MaterialTableComponent); export default MaterialTable;
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/components/material-table/utilities.ts b/sdnr/wt/odlux/framework/src/components/material-table/utilities.ts index e52fdb731..3d6326349 100644 --- a/sdnr/wt/odlux/framework/src/components/material-table/utilities.ts +++ b/sdnr/wt/odlux/framework/src/components/material-table/utilities.ts @@ -16,6 +16,7 @@ export interface IExternalTableState<TData> { loading: boolean; showFilter: boolean; filter: { [property: string]: string }; + preFilter: { [property: string]: string }; } /** Create an actionHandler and actions for external table states. */ @@ -24,7 +25,7 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState //#region Actions abstract class TableAction extends Action { } - + class RequestSortAction extends TableAction { constructor(public orderBy: string) { super(); @@ -49,8 +50,14 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState } } + class SetPreFilterChangedAction extends TableAction { + constructor(public preFilter: {[key: string]: string}) { + super(); + } + } + class SetFilterChangedAction extends TableAction { - constructor(public filter: {[key: string]: string}) { + constructor (public filter: { [key: string]: string }) { super(); } } @@ -74,7 +81,7 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState } // #endregion - + //#region Action Handler const externalTableStateInit: IExternalTableState<TData> = { order: 'asc', @@ -86,7 +93,8 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState rowsPerPage: 10, loading: false, showFilter: false, - filter: {} + filter: {}, + preFilter: {} }; const externalTableStateActionHandler: IActionHandler<IExternalTableState<TData>> = (state = externalTableStateInit, action) => { @@ -117,6 +125,12 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState loading: true, showFilter: action.show } + } else if (action instanceof SetPreFilterChangedAction) { + state = { + ...state, + loading: true, + preFilter: action.preFilter + } } else if (action instanceof SetFilterChangedAction) { state = { ...state, @@ -135,7 +149,7 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState loading: true, rowsPerPage: action.rowsPerPage } - } + } return state; } @@ -145,11 +159,21 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState const reloadAction = (dispatch: Dispatch, getAppState: () => IApplicationStoreState) => { dispatch(new RefreshAction()); const ownState = selectState(getAppState()); - Promise.resolve(callback(ownState.page, ownState.rowsPerPage, ownState.orderBy, ownState.order, ownState.showFilter && ownState.filter || {})).then(result => { + const filter = { ...ownState.preFilter, ...(ownState.showFilter && ownState.filter || {})}; + Promise.resolve(callback(ownState.page, ownState.rowsPerPage, ownState.orderBy, ownState.order, filter )).then(result => { dispatch(new SetResultAction(result)); }).catch(error => new AddErrorInfoAction(error)); }; + const createPreActions = (dispatch: Dispatch, skipRefresh: boolean = false) => { + return { + onPreFilterChanged: (preFilter: { [key: string]: string }) => { + dispatch(new SetPreFilterChangedAction(preFilter)); + (!skipRefresh) && dispatch(reloadAction); + } + }; + } + const createActions = (dispatch: Dispatch, skipRefresh: boolean = false) => { return { onRefresh: () => { @@ -176,7 +200,7 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState (!skipRefresh) && dispatch(reloadAction); }); }, - onHandleChangePage: (page: number) => { + onHandleChangePage: (page: number) => { dispatch((dispatch: Dispatch) => { dispatch(new SetPageAction(page)); (!skipRefresh) && dispatch(reloadAction); @@ -195,13 +219,14 @@ export function createExternal<TData>(callback: DataCallback<TData>, selectState const createProperties = (state: IApplicationStoreState) => { return { ...selectState(state) - } + } } - + return { reloadAction: reloadAction, createActions: createActions, createProperties: createProperties, + createPreActions: createPreActions, actionHandler: externalTableStateActionHandler } }
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/components/material-ui/index.ts b/sdnr/wt/odlux/framework/src/components/material-ui/index.ts index 890312ce2..287c018b6 100644 --- a/sdnr/wt/odlux/framework/src/components/material-ui/index.ts +++ b/sdnr/wt/odlux/framework/src/components/material-ui/index.ts @@ -1,3 +1,5 @@ export { ListItemLink } from './listItemLink';
export { Panel } from './panel';
export { ToggleButton, ToggleButtonClassKey } from './toggleButton';
+export { TreeView, ITreeItem, TreeViewCtorType} from './treeView';
+
diff --git a/sdnr/wt/odlux/framework/src/components/navigationMenu.tsx b/sdnr/wt/odlux/framework/src/components/navigationMenu.tsx index 3a7725b1b..3da5b2f8a 100644 --- a/sdnr/wt/odlux/framework/src/components/navigationMenu.tsx +++ b/sdnr/wt/odlux/framework/src/components/navigationMenu.tsx @@ -37,8 +37,8 @@ export const NavigationMenu = withStyles(styles)(connect()(({ classes, state }: <div className={classes.toolbar} />
{ /* https://fiffty.github.io/react-treeview-mui/ */}
<List component="nav">
- { process.env.NODE_ENV === "development" ? <ListItemLink exact to="/" primary="Home" icon={<FontAwesomeIcon icon={faHome} />} /> : null }
- <Divider />
+ <ListItemLink exact to="/" primary="Home" icon={<FontAwesomeIcon icon={faHome} />} />
+ <Divider />
{
state.framework.applicationRegistraion && Object.keys(state.framework.applicationRegistraion).map(key => {
const reg = state.framework.applicationRegistraion[key];
@@ -53,7 +53,7 @@ export const NavigationMenu = withStyles(styles)(connect()(({ classes, state }: }) || null
}
<Divider />
- { process.env.NODE_ENV === "development" ? <ListItemLink to="/about" primary="About" icon={<FontAwesomeIcon icon={faAddressBook} />} /> : null }
+ <ListItemLink to="/about" primary="About" icon={<FontAwesomeIcon icon={faAddressBook} />} />
</List>
</> || null
}
diff --git a/sdnr/wt/odlux/framework/src/components/titleBar.tsx b/sdnr/wt/odlux/framework/src/components/titleBar.tsx index 439e9bc12..a3ba571ec 100644 --- a/sdnr/wt/odlux/framework/src/components/titleBar.tsx +++ b/sdnr/wt/odlux/framework/src/components/titleBar.tsx @@ -32,7 +32,8 @@ const styles = (theme: Theme) => createStyles({ marginRight: 20,
},
icon: {
- marginRight: 12
+ marginLeft: 16,
+ marginRight: 8
}
});
diff --git a/sdnr/wt/odlux/framework/src/design/default.ts b/sdnr/wt/odlux/framework/src/design/default.ts index ecc4ebcf2..a57685d9c 100644 --- a/sdnr/wt/odlux/framework/src/design/default.ts +++ b/sdnr/wt/odlux/framework/src/design/default.ts @@ -1,12 +1,12 @@ /****************************************************************************** * Copyright 2018 highstreet technologies GmbH - * + * * 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. @@ -17,37 +17,28 @@ import { createMuiTheme } from '@material-ui/core/styles'; const theme = createMuiTheme({ - design: { - id: "onap", - name: "Open Networking Automation Plattform (ONAP)", - url: "https://www.onap.org/wp-content/uploads/sites/20/2017/02/logo_onap_2017.png", - height: 49, - width: 229, - logoHeight: 32, + design: { + id: "onap", + name: "Open Networking Automation Plattform (ONAP)", + url: "https://www.onap.org/wp-content/uploads/sites/20/2017/02/logo_onap_2017.png", + height: 49, + width: 229, + logoHeight: 32, + }, + palette: { + primary: { + light: "#eeeeee", + main: "#ffffff", + dark: "#e0e0e0", + contrastText: "#07819B" }, - palette: { - type: "light", - common: { - black: "#000", - white: "#fff" - }, - background: { - paper: "#fff", - default: "#fafafa" - }, - primary: { - light: "#eee", - main: "#fff", - dark: "#e0e0e0", - contrastText: "#07819B" - }, - secondary: { - light: "#07819b5e", - main: "#07819bc9", - dark: "#07819B", - contrastText: "#fff" - }, - } - }); + secondary: { + light: "rgba(7, 129, 155, 94)", + main: "rgba(7, 129, 155, 201)", + dark: "#07819B", + contrastText: "#ffffff" + }, + } +}); - export default theme;
\ No newline at end of file +export default theme;
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/index.html b/sdnr/wt/odlux/framework/src/index.html index 36d937775..1a373392d 100644 --- a/sdnr/wt/odlux/framework/src/index.html +++ b/sdnr/wt/odlux/framework/src/index.html @@ -1,24 +1,24 @@ -<!DOCTYPE html>
-<html lang="en">
-
-<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
- <!-- <link rel="stylesheet" href="./vendor.css" > -->
- <title>O D L UX</title>
-</head>
-
-<body>
- <div id="app"></div>
- <script type="text/javascript" src="./require.js"></script>
- <script type="text/javascript" src="./config.js"></script>
- <script>
- // run the application
- require(["run"], function (run) {
- run.runApplication();
- });
- </script>
-</body>
-
+<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <!-- <link rel="stylesheet" href="./vendor.css" > --> + <title>O D L UX</title> +</head> + +<body> + <div id="app"></div> + <script type="text/javascript" src="./require.js"></script> + <script type="text/javascript" src="./config.js"></script> + <script> + // run the application + require(["run"], function (run) { + run.runApplication(); + }); + </script> +</body> + </html>
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/models/elasticSearch.ts b/sdnr/wt/odlux/framework/src/models/elasticSearch.ts index 7c12f97d3..a9936c0ad 100644 --- a/sdnr/wt/odlux/framework/src/models/elasticSearch.ts +++ b/sdnr/wt/odlux/framework/src/models/elasticSearch.ts @@ -1,4 +1,5 @@ export type Result<TSource extends {}> = {
+ aggregations: TSource;
took: number;
timed_out: boolean;
_shards: {
@@ -30,7 +31,7 @@ type ActionResponse ={ successful: number,
failed: number
},
-
+
}
export type PostResponse = ActionResponse & {
diff --git a/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts b/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts index 690324e1c..bbf907c80 100644 --- a/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts +++ b/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts @@ -1,71 +1,71 @@ -
-import { DataCallback } from '../components/material-table';
-import { Result, HitEntry } from '../models';
-
-import { requestRest } from '../services/restService';
-
-type propType = string | number | null | undefined | (string | number)[];
-type dataType = { [prop: string]: propType };
-type resultType<TData = dataType> = { page: number, rowCount: number, rows: TData[] };
-
-export function createSearchDataHandler<TResult extends {} = dataType>(uri: string, additionalParameters?: {}): DataCallback<(TResult & { _id: string })>;
-export function createSearchDataHandler<TResult extends {} = dataType, TData = dataType>(uri: string, additionalParameters: {} | null | undefined, mapResult: (res: HitEntry<TResult>, index: number, arr: HitEntry<TResult>[]) => (TData & { _id: string }), mapRequest?: (name?: string | null) => string): DataCallback<(TData & { _id: string })>
-export function createSearchDataHandler<TResult, TData>(uri: string, additionalParameters?: {} | null | undefined, mapResult?: (res: HitEntry<TResult>, index: number, arr: HitEntry<TResult>[]) => (TData & { _id: string }), mapRequest?: (name?: string | null) => string): DataCallback<(TData & { _id: string })> {
- const url = `${ window.location.origin }/database/${uri}/_search`;
- const fetchData: DataCallback<(TData & { _id: string }) > = async (page, rowsPerPage, orderBy, order, filter) => {
- const from = rowsPerPage && page != null && !isNaN(+page)
- ? (+page) * rowsPerPage
- : null;
-
- const filterKeys = filter && Object.keys(filter) || [];
-
- const query = {
- ...filterKeys.length > 0 ? {
- query: {
- bool: {
- must: filterKeys.reduce((acc, cur) => {
- if (acc && filter && filter[cur]) {
- acc.push({ [filter[cur].indexOf("*") > -1 || filter[cur].indexOf("?") > -1 ? "wildcard" : "prefix"]: { [mapRequest ? mapRequest(cur) : cur]: filter[cur] } });
- }
- return acc;
- }, [] as any[])
- }
- }
- } : { "query": { "match_all": {} } },
- ...rowsPerPage ? { "size": rowsPerPage } : {},
- ...from ? { "from": from } : {},
- ...orderBy && order ? { "sort": [{ [mapRequest ? mapRequest(orderBy) : orderBy]: order }] } : {},
- ...additionalParameters ? additionalParameters : {}
- };
- const result = await requestRest<Result<TResult & { _id: string }>>(url, {
- method: "POST", // *GET, POST, PUT, DELETE, etc.
- mode: "no-cors", // no-cors, cors, *same-origin
- cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
- headers: {
- "Content-Type": "application/json; charset=utf-8",
- // "Content-Type": "application/x-www-form-urlencoded",
- },
- body: JSON.stringify(query), // body data type must match "Content-Type" header
- });
-
- if (result) {
- let rows: (TData & { _id: string })[] = [];
-
- if (result && result.hits && result.hits.hits) {
- rows = result.hits.hits.map( mapResult ? mapResult : h => (
- { ...(h._source as any as TData), _id: h._id }
- )) || []
- }
-
- const data = {
- page: Math.min(page || 0, result.hits.total || 0 / (rowsPerPage || 1)), rowCount: result.hits.total, rows: rows
- };
- return data;
- }
-
- return { page: 0, rowCount: 0, rows: [] };
- };
-
- return fetchData;
-}
-
+ +import { DataCallback } from '../components/material-table'; +import { Result, HitEntry } from '../models'; + +import { requestRest } from '../services/restService'; + +type propType = string | number | null | undefined | (string | number)[]; +type dataType = { [prop: string]: propType }; +type resultType<TData = dataType> = { page: number, rowCount: number, rows: TData[] }; + +export function createSearchDataHandler<TResult extends {} = dataType>(uri: string, additionalParameters?: {}): DataCallback<(TResult & { _id: string })>; +export function createSearchDataHandler<TResult extends {} = dataType, TData = dataType>(uri: string, additionalParameters: {} | null | undefined, mapResult: (res: HitEntry<TResult>, index: number, arr: HitEntry<TResult>[]) => (TData & { _id: string }), mapRequest?: (name?: string | null) => string): DataCallback<(TData & { _id: string })> +export function createSearchDataHandler<TResult, TData>(uri: string, additionalParameters?: {} | null | undefined, mapResult?: (res: HitEntry<TResult>, index: number, arr: HitEntry<TResult>[]) => (TData & { _id: string }), mapRequest?: (name?: string | null) => string): DataCallback<(TData & { _id: string })> { + const url = `${ window.location.origin }/database/${uri}/_search`; + const fetchData: DataCallback<(TData & { _id: string }) > = async (page, rowsPerPage, orderBy, order, filter) => { + const from = rowsPerPage && page != null && !isNaN(+page) + ? (+page) * rowsPerPage + : null; + + const filterKeys = filter && Object.keys(filter) || []; + + const query = { + ...filterKeys.length > 0 ? { + query: { + bool: { + must: filterKeys.reduce((acc, cur) => { + if (acc && filter && filter[cur]) { + acc.push({ [filter[cur].indexOf("*") > -1 || filter[cur].indexOf("?") > -1 ? "wildcard" : "term"]: { [mapRequest ? mapRequest(cur) : cur]: filter[cur] } }); + } + return acc; + }, [] as any[]) + } + } + } : { "query": { "match_all": {} } }, + ...rowsPerPage ? { "size": rowsPerPage } : {}, + ...from ? { "from": from } : {}, + ...orderBy && order ? { "sort": [{ [mapRequest ? mapRequest(orderBy) : orderBy]: order }] } : {}, + ...additionalParameters ? additionalParameters : {} + }; + const result = await requestRest<Result<TResult & { _id: string }>>(url, { + method: "POST", // *GET, POST, PUT, DELETE, etc. + mode: "no-cors", // no-cors, cors, *same-origin + cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached + headers: { + "Content-Type": "application/json; charset=utf-8", + // "Content-Type": "application/x-www-form-urlencoded", + }, + body: JSON.stringify(query), // body data type must match "Content-Type" header + }); + + if (result) { + let rows: (TData & { _id: string })[] = []; + + if (result && result.hits && result.hits.hits) { + rows = result.hits.hits.map( mapResult ? mapResult : h => ( + { ...(h._source as any as TData), _id: h._id } + )) || [] + } + + const data = { + page: Math.min(page || 0, result.hits.total || 0 / (rowsPerPage || 1)), rowCount: result.hits.total, rows: rows + }; + return data; + } + + return { page: 0, rowCount: 0, rows: [] }; + }; + + return fetchData; +} + diff --git a/sdnr/wt/odlux/framework/src/views/about.tsx b/sdnr/wt/odlux/framework/src/views/about.tsx index f905e0e75..4cd544b5f 100644 --- a/sdnr/wt/odlux/framework/src/views/about.tsx +++ b/sdnr/wt/odlux/framework/src/views/about.tsx @@ -1,859 +1,14 @@ import * as React from 'react';
-import { withComponents, WithComponents } from '../utilities/withComponents';
-import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles';
-
-import ExpansionPanel from '@material-ui/core/ExpansionPanel';
-import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary';
-import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails';
-import Typography from '@material-ui/core/Typography';
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
-
-import { MaterialTable, MaterialTableCtorType, ColumnType } from '../components/material-table';
-import { TreeView, ITreeItem, TreeViewCtorType } from '../components/material-ui/treeView';
-import { SvgIconProps } from '@material-ui/core/SvgIcon';
-
-const styles = (theme: Theme) => createStyles({
- root: {
- width: '100%',
- },
- heading: {
- fontSize: theme.typography.pxToRem(15),
- fontWeight: theme.typography.fontWeightRegular,
- },
-});
-
-class SampleData {
- _id: string;
- index: number;
- guid: string;
- isActive: boolean;
- balance: string;
- age: number;
- firstName: string;
- lastName: string;
- company: string;
- email: string;
- registered: string;
- latitude: string;
- longitude: string;
-}
-
-// https://next.json-generator.com/NJ5Bv-v1I
-const tableData: SampleData[] = [
- {
- "_id": "5c0e18399919a5c43636fdf2",
- "index": 0,
- "guid": "48728d8e-8300-4d0f-b967-e2166d023066",
- "isActive": false,
- "balance": "$3,480.16",
- "age": 33,
- "firstName": "Brooke",
- "lastName": "Morris",
- "company": "ZORROMOP",
- "email": "brooke.morris@zorromop.de",
- "registered": "Sunday, February 11, 2018 2:55 PM",
- "latitude": "-69.109379",
- "longitude": "113.735639"
- },
- {
- "_id": "5c0e1839b61e3eeaf164259d",
- "index": 1,
- "guid": "28723570-1507-422e-b78c-924402371fb1",
- "isActive": false,
- "balance": "$1,305.01",
- "age": 28,
- "firstName": "Jolene",
- "lastName": "Everett",
- "company": "ZENCO",
- "email": "jolene.everett@zenco.de",
- "registered": "Saturday, December 8, 2018 5:17 PM",
- "latitude": "13.683025",
- "longitude": "85.101421"
- },
- {
- "_id": "5c0e1839e81f57913c5d2147",
- "index": 2,
- "guid": "e914dc5d-91a3-405d-ac48-aee6f0cd391a",
- "isActive": true,
- "balance": "$1,418.37",
- "age": 28,
- "firstName": "Elva",
- "lastName": "Travis",
- "company": "ZYTREK",
- "email": "elva.travis@zytrek.de",
- "registered": "Thursday, March 10, 2016 5:13 PM",
- "latitude": "53.75862",
- "longitude": "-67.784532"
- },
- {
- "_id": "5c0e1839bc9224a2b54c0f69",
- "index": 3,
- "guid": "88cbdce0-0bcc-4d16-83c3-3017690503c4",
- "isActive": true,
- "balance": "$1,709.60",
- "age": 21,
- "firstName": "Ellis",
- "lastName": "Mcpherson",
- "company": "DIGIPRINT",
- "email": "ellis.mcpherson@digiprint.de",
- "registered": "Sunday, December 21, 2014 5:25 AM",
- "latitude": "46.486149",
- "longitude": "-66.657067"
- },
- {
- "_id": "5c0e183951b51475db0f35d1",
- "index": 4,
- "guid": "c887ac86-7ba1-4eb6-9b47-e88a1bcb3713",
- "isActive": true,
- "balance": "$3,578.54",
- "age": 25,
- "firstName": "Marcia",
- "lastName": "Rocha",
- "company": "ZAPPIX",
- "email": "marcia.rocha@zappix.de",
- "registered": "Tuesday, June 16, 2015 11:21 AM",
- "latitude": "-39.905461",
- "longitude": "150.873895"
- },
- {
- "_id": "5c0e18398c5be8d362a578eb",
- "index": 5,
- "guid": "0d160697-9b5b-4941-9b5f-4ba3a7f97b49",
- "isActive": true,
- "balance": "$414.98",
- "age": 32,
- "firstName": "Lavonne",
- "lastName": "Wilkins",
- "company": "FARMAGE",
- "email": "lavonne.wilkins@farmage.de",
- "registered": "Monday, February 1, 2016 5:27 PM",
- "latitude": "-16.839256",
- "longitude": "-105.824746"
- },
- {
- "_id": "5c0e18399804086c836d7d56",
- "index": 6,
- "guid": "715a5f63-35b6-4903-a46e-ba584b005e64",
- "isActive": false,
- "balance": "$1,755.78",
- "age": 32,
- "firstName": "Wise",
- "lastName": "Berg",
- "company": "ZIZZLE",
- "email": "wise.berg@zizzle.de",
- "registered": "Saturday, March 28, 2015 1:40 AM",
- "latitude": "51.15269",
- "longitude": "65.795093"
- },
- {
- "_id": "5c0e18399c4d13538bcaf8c9",
- "index": 7,
- "guid": "7ee50269-23e8-499e-9a16-09f393d7600c",
- "isActive": false,
- "balance": "$342.52",
- "age": 27,
- "firstName": "Isabel",
- "lastName": "Battle",
- "company": "EZENTIA",
- "email": "isabel.battle@ezentia.de",
- "registered": "Thursday, June 7, 2018 12:16 AM",
- "latitude": "-53.318152",
- "longitude": "-153.516824"
- },
- {
- "_id": "5c0e18398d7fb9a4eceeffa2",
- "index": 8,
- "guid": "1e30c9ac-2297-4f16-83e6-9559b1ebe92c",
- "isActive": true,
- "balance": "$3,184.71",
- "age": 36,
- "firstName": "Lenora",
- "lastName": "Crawford",
- "company": "KIDGREASE",
- "email": "lenora.crawford@kidgrease.de",
- "registered": "Saturday, January 7, 2017 6:17 PM",
- "latitude": "-72.431496",
- "longitude": "9.413359"
- },
- {
- "_id": "5c0e18395837069ab6b79d00",
- "index": 9,
- "guid": "d04a02ed-5899-4729-a7e5-2d85b5d03973",
- "isActive": true,
- "balance": "$1,553.28",
- "age": 35,
- "firstName": "Sasha",
- "lastName": "Bridges",
- "company": "IDEALIS",
- "email": "sasha.bridges@idealis.de",
- "registered": "Sunday, February 4, 2018 7:02 PM",
- "latitude": "8.095691",
- "longitude": "-105.758195"
- },
- {
- "_id": "5c0e18390be19bf65acad180",
- "index": 10,
- "guid": "3a1a77e6-ef15-4598-8274-c68ac3bb922a",
- "isActive": false,
- "balance": "$3,587.96",
- "age": 20,
- "firstName": "Wilkins",
- "lastName": "Beasley",
- "company": "DIGIFAD",
- "email": "wilkins.beasley@digifad.de",
- "registered": "Monday, March 5, 2018 1:27 PM",
- "latitude": "-88.062704",
- "longitude": "149.95661"
- },
- {
- "_id": "5c0e1839ffbbad5c9954e49f",
- "index": 11,
- "guid": "97a56950-a08c-4e00-8002-ba2d5de4da5d",
- "isActive": false,
- "balance": "$1,997.80",
- "age": 31,
- "firstName": "Sullivan",
- "lastName": "Mcclain",
- "company": "EARTHMARK",
- "email": "sullivan.mcclain@earthmark.de",
- "registered": "Saturday, October 27, 2018 2:51 PM",
- "latitude": "-81.86349",
- "longitude": "-79.596991"
- },
- {
- "_id": "5c0e183914bd464d55e7325f",
- "index": 12,
- "guid": "294f6485-d0f9-4b25-b998-325ae90fa769",
- "isActive": true,
- "balance": "$1,405.46",
- "age": 24,
- "firstName": "Herminia",
- "lastName": "Fischer",
- "company": "ECOLIGHT",
- "email": "herminia.fischer@ecolight.de",
- "registered": "Thursday, January 16, 2014 4:48 PM",
- "latitude": "48.224363",
- "longitude": "11.08339"
- },
- {
- "_id": "5c0e183968ec2556d8f6566c",
- "index": 13,
- "guid": "16edfea4-7b37-4e54-868c-c369b413dd78",
- "isActive": false,
- "balance": "$3,440.67",
- "age": 39,
- "firstName": "Blanchard",
- "lastName": "Blackwell",
- "company": "GEOFORMA",
- "email": "blanchard.blackwell@geoforma.de",
- "registered": "Wednesday, July 30, 2014 4:07 AM",
- "latitude": "-52.169297",
- "longitude": "10.415879"
- },
- {
- "_id": "5c0e183939a0fc955f2d94da",
- "index": 14,
- "guid": "4ed454e2-dde1-4ab5-a434-4a82205ced2d",
- "isActive": true,
- "balance": "$1,883.27",
- "age": 35,
- "firstName": "Gayle",
- "lastName": "Little",
- "company": "AQUAZURE",
- "email": "gayle.little@aquazure.de",
- "registered": "Tuesday, December 12, 2017 5:08 PM",
- "latitude": "-58.473236",
- "longitude": "38.022269"
- },
- {
- "_id": "5c0e1839099f9221ccd968ac",
- "index": 15,
- "guid": "1d052fd4-7c54-45fb-b0db-7de1acc4262a",
- "isActive": false,
- "balance": "$2,601.94",
- "age": 31,
- "firstName": "Jocelyn",
- "lastName": "Richards",
- "company": "GINK",
- "email": "jocelyn.richards@gink.de",
- "registered": "Sunday, October 30, 2016 9:12 PM",
- "latitude": "-43.489676",
- "longitude": "2.557869"
- },
- {
- "_id": "5c0e183970f320f377321c3f",
- "index": 16,
- "guid": "45bca125-8831-48c3-b22b-29ae318e7096",
- "isActive": false,
- "balance": "$3,441.74",
- "age": 34,
- "firstName": "Berta",
- "lastName": "Valentine",
- "company": "ISOSPHERE",
- "email": "berta.valentine@isosphere.de",
- "registered": "Sunday, March 19, 2017 8:22 PM",
- "latitude": "-40.188039",
- "longitude": "-170.085092"
- },
- {
- "_id": "5c0e1839ab960bb0a9f4f392",
- "index": 17,
- "guid": "d7b5122a-94c9-423c-b799-1a8f8314b152",
- "isActive": false,
- "balance": "$56.39",
- "age": 21,
- "firstName": "Russell",
- "lastName": "Powers",
- "company": "TETAK",
- "email": "russell.powers@tetak.de",
- "registered": "Thursday, November 3, 2016 9:23 PM",
- "latitude": "-51.610519",
- "longitude": "-133.280363"
- },
- {
- "_id": "5c0e183998f0195404b9aaa4",
- "index": 18,
- "guid": "a043ba97-ea7e-48ce-bb15-18ee09fb393d",
- "isActive": true,
- "balance": "$1,503.57",
- "age": 37,
- "firstName": "Rosario",
- "lastName": "Brennan",
- "company": "VIAGRAND",
- "email": "rosario.brennan@viagrand.de",
- "registered": "Saturday, March 17, 2018 10:32 PM",
- "latitude": "-43.773365",
- "longitude": "47.58682"
- },
- {
- "_id": "5c0e1839bcb2a5cc567129ac",
- "index": 19,
- "guid": "de6d5d36-201e-4f87-9976-ed31f3160e42",
- "isActive": false,
- "balance": "$1,160.18",
- "age": 29,
- "firstName": "Anita",
- "lastName": "Hodges",
- "company": "TUBALUM",
- "email": "anita.hodges@tubalum.de",
- "registered": "Sunday, November 26, 2017 11:54 AM",
- "latitude": "7.080244",
- "longitude": "-9.970715"
- },
- {
- "_id": "5c0e18394b37e854a1ef371c",
- "index": 20,
- "guid": "9407113b-896a-4699-ac1b-363bc3c6f8ad",
- "isActive": false,
- "balance": "$34.81",
- "age": 31,
- "firstName": "Barrett",
- "lastName": "Weaver",
- "company": "DUOFLEX",
- "email": "barrett.weaver@duoflex.de",
- "registered": "Tuesday, November 3, 2015 9:31 AM",
- "latitude": "40.30558",
- "longitude": "-69.986664"
- },
- {
- "_id": "5c0e1839b5658f90e16a86e0",
- "index": 21,
- "guid": "81f894c4-c931-422d-a30e-593824d95bf9",
- "isActive": true,
- "balance": "$2,808.63",
- "age": 26,
- "firstName": "Baxter",
- "lastName": "Chase",
- "company": "BUNGA",
- "email": "baxter.chase@bunga.de",
- "registered": "Friday, October 28, 2016 7:10 AM",
- "latitude": "-49.05652",
- "longitude": "63.123535"
- },
- {
- "_id": "5c0e1839cb9462c9ecbb59af",
- "index": 22,
- "guid": "92e67862-4fdf-43af-a3ef-ef3edb8d6706",
- "isActive": true,
- "balance": "$3,552.71",
- "age": 29,
- "firstName": "Olga",
- "lastName": "Kemp",
- "company": "OHMNET",
- "email": "olga.kemp@ohmnet.de",
- "registered": "Saturday, March 26, 2016 11:51 AM",
- "latitude": "-17.450481",
- "longitude": "-13.945794"
- },
- {
- "_id": "5c0e18396f999c2b8ac731a9",
- "index": 23,
- "guid": "a682eaae-34f0-4973-b8a0-30972de0732b",
- "isActive": false,
- "balance": "$1,999.20",
- "age": 21,
- "firstName": "Ebony",
- "lastName": "Le",
- "company": "MULTRON",
- "email": "ebony.le@multron.de",
- "registered": "Friday, March 27, 2015 9:23 AM",
- "latitude": "-70.380014",
- "longitude": "173.20685"
- },
- {
- "_id": "5c0e18391cfb28263eb42db7",
- "index": 24,
- "guid": "f1cddb5f-0b89-453e-b0c9-8193a56cc610",
- "isActive": true,
- "balance": "$2,950.91",
- "age": 30,
- "firstName": "Norman",
- "lastName": "Price",
- "company": "COMVEX",
- "email": "norman.price@comvex.de",
- "registered": "Tuesday, August 21, 2018 11:17 PM",
- "latitude": "86.501469",
- "longitude": "159.545352"
- },
- {
- "_id": "5c0e18394a6be11128c7e5ca",
- "index": 25,
- "guid": "dadb738a-40fd-45b6-abac-023a803d95c2",
- "isActive": true,
- "balance": "$2,767.09",
- "age": 25,
- "firstName": "Sara",
- "lastName": "Ruiz",
- "company": "AUSTECH",
- "email": "sara.ruiz@austech.de",
- "registered": "Wednesday, June 20, 2018 6:34 AM",
- "latitude": "86.784904",
- "longitude": "-120.331325"
- },
- {
- "_id": "5c0e183974631549eda97cea",
- "index": 26,
- "guid": "b5c43ee5-14ed-4ab5-b3db-b31a8bb65ceb",
- "isActive": true,
- "balance": "$3,235.42",
- "age": 32,
- "firstName": "Holly",
- "lastName": "Santos",
- "company": "LOVEPAD",
- "email": "holly.santos@lovepad.de",
- "registered": "Thursday, November 22, 2018 9:26 PM",
- "latitude": "-19.640066",
- "longitude": "50.410992"
- },
- {
- "_id": "5c0e1839ab9b933881429d78",
- "index": 27,
- "guid": "94961092-65ca-41b9-bc69-3e40ce2cafc9",
- "isActive": true,
- "balance": "$2,106.34",
- "age": 39,
- "firstName": "Rachel",
- "lastName": "Douglas",
- "company": "DEMINIMUM",
- "email": "rachel.douglas@deminimum.de",
- "registered": "Sunday, April 9, 2017 3:55 AM",
- "latitude": "31.395281",
- "longitude": "-1.899514"
- },
- {
- "_id": "5c0e183937f743155859c5a9",
- "index": 28,
- "guid": "07d7ef18-bcef-483d-999e-0b3da4a7098b",
- "isActive": true,
- "balance": "$2,260.65",
- "age": 40,
- "firstName": "Reed",
- "lastName": "Workman",
- "company": "BUZZMAKER",
- "email": "reed.workman@buzzmaker.de",
- "registered": "Wednesday, May 28, 2014 3:44 PM",
- "latitude": "23.789646",
- "longitude": "106.938375"
- },
- {
- "_id": "5c0e1839f8f4b60beb28b7ed",
- "index": 29,
- "guid": "9b4952e5-aa0e-4919-9e17-7c357a297394",
- "isActive": false,
- "balance": "$702.99",
- "age": 27,
- "firstName": "Cochran",
- "lastName": "Ware",
- "company": "HIVEDOM",
- "email": "cochran.ware@hivedom.de",
- "registered": "Monday, October 16, 2017 5:51 AM",
- "latitude": "85.953108",
- "longitude": "124.590037"
- },
- {
- "_id": "5c0e1839342fbd54a88269df",
- "index": 30,
- "guid": "30937d5b-9514-4ebd-b628-2cfb5017fe41",
- "isActive": false,
- "balance": "$385.88",
- "age": 35,
- "firstName": "Cote",
- "lastName": "Hess",
- "company": "TERAPRENE",
- "email": "cote.hess@teraprene.de",
- "registered": "Thursday, March 15, 2018 4:42 PM",
- "latitude": "81.38211",
- "longitude": "64.516797"
- },
- {
- "_id": "5c0e18395b6dc85d73ce1fb3",
- "index": 31,
- "guid": "f34847da-7f96-4cd8-8d8a-b06c0eb0a8f2",
- "isActive": true,
- "balance": "$3,494.56",
- "age": 27,
- "firstName": "Daniels",
- "lastName": "Ayala",
- "company": "BESTO",
- "email": "daniels.ayala@besto.de",
- "registered": "Sunday, December 18, 2016 10:52 AM",
- "latitude": "47.704227",
- "longitude": "41.674767"
- },
- {
- "_id": "5c0e183974587cdccf30b13f",
- "index": 32,
- "guid": "fdbb6d83-0e47-4453-b8a7-b47f44e4164b",
- "isActive": false,
- "balance": "$2,087.38",
- "age": 26,
- "firstName": "Powers",
- "lastName": "Drake",
- "company": "GENESYNK",
- "email": "powers.drake@genesynk.de",
- "registered": "Saturday, September 29, 2018 12:24 AM",
- "latitude": "40.580432",
- "longitude": "110.940759"
- },
- {
- "_id": "5c0e18397b51245e971c58b8",
- "index": 33,
- "guid": "6adfe544-238b-4001-b2a6-f50ea3094da3",
- "isActive": true,
- "balance": "$3,566.22",
- "age": 34,
- "firstName": "Pacheco",
- "lastName": "Ramsey",
- "company": "ENVIRE",
- "email": "pacheco.ramsey@envire.de",
- "registered": "Friday, September 11, 2015 12:14 AM",
- "latitude": "-30.691235",
- "longitude": "69.343692"
- },
- {
- "_id": "5c0e18391ede9c0996fd09e7",
- "index": 34,
- "guid": "d190b32f-d33b-4c17-a18a-bb2f57e79ba7",
- "isActive": false,
- "balance": "$1,671.63",
- "age": 32,
- "firstName": "Mcintyre",
- "lastName": "Chan",
- "company": "ORBAXTER",
- "email": "mcintyre.chan@orbaxter.de",
- "registered": "Wednesday, May 7, 2014 7:11 PM",
- "latitude": "7.380435",
- "longitude": "70.955103"
- },
- {
- "_id": "5c0e1839fe48069c9c260fa9",
- "index": 35,
- "guid": "a41c064b-6bf4-4ba5-b229-9b657d286936",
- "isActive": false,
- "balance": "$24.02",
- "age": 27,
- "firstName": "Genevieve",
- "lastName": "Sparks",
- "company": "ZBOO",
- "email": "genevieve.sparks@zboo.de",
- "registered": "Saturday, December 16, 2017 2:51 PM",
- "latitude": "-63.406337",
- "longitude": "118.662621"
- },
- {
- "_id": "5c0e1839a7e8e76accf0803e",
- "index": 36,
- "guid": "3e71864d-4be5-418e-ace8-346c3d7a9c5f",
- "isActive": true,
- "balance": "$3,261.01",
- "age": 30,
- "firstName": "Powell",
- "lastName": "Patterson",
- "company": "GAZAK",
- "email": "powell.patterson@gazak.de",
- "registered": "Thursday, May 18, 2017 10:10 AM",
- "latitude": "-10.428548",
- "longitude": "64.979192"
- },
- {
- "_id": "5c0e183984b0320f1118a8b0",
- "index": 37,
- "guid": "ec5b292c-6efb-471b-9bf5-a47286e03515",
- "isActive": false,
- "balance": "$918.71",
- "age": 37,
- "firstName": "Tara",
- "lastName": "Mcmillan",
- "company": "GRAINSPOT",
- "email": "tara.mcmillan@grainspot.de",
- "registered": "Sunday, May 17, 2015 1:01 PM",
- "latitude": "-13.519031",
- "longitude": "67.931062"
- },
- {
- "_id": "5c0e183965875876835ccd79",
- "index": 38,
- "guid": "b7e97ffb-439a-4454-90af-7f5ebd565ebc",
- "isActive": true,
- "balance": "$574.99",
- "age": 28,
- "firstName": "Pennington",
- "lastName": "Gallegos",
- "company": "CEDWARD",
- "email": "pennington.gallegos@cedward.de",
- "registered": "Wednesday, September 26, 2018 6:01 AM",
- "latitude": "-63.693261",
- "longitude": "-38.352153"
- },
- {
- "_id": "5c0e183922505dd21be49009",
- "index": 39,
- "guid": "5187aa39-4357-462b-9508-3c537d26d70d",
- "isActive": false,
- "balance": "$2,447.08",
- "age": 26,
- "firstName": "Meagan",
- "lastName": "Irwin",
- "company": "SENTIA",
- "email": "meagan.irwin@sentia.de",
- "registered": "Saturday, April 2, 2016 4:39 PM",
- "latitude": "1.051313",
- "longitude": "-86.168315"
- },
- {
- "_id": "5c0e183900a9f7f896e5b3b1",
- "index": 40,
- "guid": "31889843-79e7-4636-9ca1-4eb5cbcb0ae3",
- "isActive": true,
- "balance": "$1,992.25",
- "age": 22,
- "firstName": "Kelly",
- "lastName": "Cobb",
- "company": "BOVIS",
- "email": "kelly.cobb@bovis.de",
- "registered": "Tuesday, August 9, 2016 5:36 PM",
- "latitude": "-85.547579",
- "longitude": "-89.794104"
- },
- {
- "_id": "5c0e18393b25b8552ff950e2",
- "index": 41,
- "guid": "0bf02edc-ca1b-4cfe-8356-b65881bdca11",
- "isActive": true,
- "balance": "$465.96",
- "age": 27,
- "firstName": "Angela",
- "lastName": "Booker",
- "company": "EQUICOM",
- "email": "angela.booker@equicom.de",
- "registered": "Thursday, July 30, 2015 1:39 AM",
- "latitude": "-9.345395",
- "longitude": "107.070665"
- },
- {
- "_id": "5c0e183955d747ebbe25437b",
- "index": 42,
- "guid": "6405e559-5849-4d12-ae4e-520f13b4dffe",
- "isActive": true,
- "balance": "$15.63",
- "age": 28,
- "firstName": "Carrie",
- "lastName": "Mclean",
- "company": "BOINK",
- "email": "carrie.mclean@boink.de",
- "registered": "Wednesday, February 1, 2017 1:50 PM",
- "latitude": "72.287519",
- "longitude": "-135.436286"
- },
- {
- "_id": "5c0e1839e9cfe1b28e31e7e6",
- "index": 43,
- "guid": "e49e7ca7-a6cc-4cdb-bebe-5a3b6ba931eb",
- "isActive": true,
- "balance": "$3,127.94",
- "age": 33,
- "firstName": "Callie",
- "lastName": "Cooley",
- "company": "MUSIX",
- "email": "callie.cooley@musix.de",
- "registered": "Wednesday, August 30, 2017 4:58 PM",
- "latitude": "-38.954739",
- "longitude": "-152.706424"
- },
- {
- "_id": "5c0e18391bafa0750ff4f280",
- "index": 44,
- "guid": "c245ffd3-4924-4dce-ae4a-f4cabf057b54",
- "isActive": false,
- "balance": "$1,320.36",
- "age": 35,
- "firstName": "Terry",
- "lastName": "Bennett",
- "company": "EXOTECHNO",
- "email": "terry.bennett@exotechno.de",
- "registered": "Friday, June 17, 2016 11:54 PM",
- "latitude": "-48.946183",
- "longitude": "32.53167"
- },
- {
- "_id": "5c0e1839e91b27fcce34b70f",
- "index": 45,
- "guid": "0860cb66-de4c-410e-8233-aeef5ee9d64e",
- "isActive": false,
- "balance": "$1,187.75",
- "age": 30,
- "firstName": "Phoebe",
- "lastName": "Bartlett",
- "company": "VORATAK",
- "email": "phoebe.bartlett@voratak.de",
- "registered": "Tuesday, July 25, 2017 2:57 AM",
- "latitude": "-63.208957",
- "longitude": "-91.209743"
- },
- {
- "_id": "5c0e183987e8a4e98415c8dd",
- "index": 46,
- "guid": "49219833-172c-4659-9192-d1116a5ca833",
- "isActive": false,
- "balance": "$3,225.24",
- "age": 38,
- "firstName": "Jordan",
- "lastName": "Evans",
- "company": "PHARMACON",
- "email": "jordan.evans@pharmacon.de",
- "registered": "Sunday, April 23, 2017 6:27 PM",
- "latitude": "-59.454678",
- "longitude": "67.251185"
- },
- {
- "_id": "5c0e183944979692cc1a3e48",
- "index": 47,
- "guid": "680c4d15-d539-4db9-8793-a2f6d3f354aa",
- "isActive": false,
- "balance": "$2,913.14",
- "age": 28,
- "firstName": "Goodman",
- "lastName": "Cain",
- "company": "CAXT",
- "email": "goodman.cain@caxt.de",
- "registered": "Tuesday, November 1, 2016 6:11 PM",
- "latitude": "-30.187547",
- "longitude": "-164.313273"
- },
- {
- "_id": "5c0e1839ef5312ac08e3cbc3",
- "index": 48,
- "guid": "85f5fa5d-b6b3-47c6-ad1b-faee10a4e1bd",
- "isActive": true,
- "balance": "$544.97",
- "age": 27,
- "firstName": "Aisha",
- "lastName": "Oliver",
- "company": "MINGA",
- "email": "aisha.oliver@minga.de",
- "registered": "Sunday, July 3, 2016 8:18 AM",
- "latitude": "-21.527536",
- "longitude": "141.029691"
- },
- {
- "_id": "5c0e1839c2e58f5da04f29fd",
- "index": 49,
- "guid": "e2ee9b25-5887-49a9-a1c6-17432154d266",
- "isActive": true,
- "balance": "$3,621.65",
- "age": 31,
- "firstName": "Erin",
- "lastName": "Lester",
- "company": "SLOFAST",
- "email": "erin.lester@slofast.de",
- "registered": "Saturday, February 20, 2016 5:13 AM",
- "latitude": "-30.080798",
- "longitude": "-1.291093"
- }
-];
-
-const components = {
- 'counter': 'demoApp.counter'
-};
-
-class TreeDemoItem implements ITreeItem {
- title: string;
- children?: TreeDemoItem[];
- disabled?: boolean;
- icon?: React.ComponentType<SvgIconProps>;
-}
-
-const treeData: TreeDemoItem[] = [
- { title: "Erste Ebene", children: [
- { title: "Zweite Ebene", children: [
- { title: "Dritte Ebene" },
- ]
- },
- { title: "Zweite Ebene 2" },
- ]
- },
- { title: "Erste Ebene 3" },
-];
-
-const SampleDataMaterialTable = MaterialTable as MaterialTableCtorType<SampleData>;
-
-const SampleTree = TreeView as any as TreeViewCtorType<TreeDemoItem>;
-
-const AboutComponent = (props: WithComponents<typeof components> & WithStyles<typeof styles>) => {
+const AboutComponent = () => {
return (
<div>
<h2>About</h2>
- <ExpansionPanel>
- <ExpansionPanelSummary expandIcon={ <ExpandMoreIcon /> }>
- <Typography className={ props.classes.heading }>Client Side Table Demo</Typography>
- </ExpansionPanelSummary>
- <ExpansionPanelDetails>
- <SampleDataMaterialTable rows={ tableData } columns={
- [
- { property: "index", type: ColumnType.text, title: "Index", width: "80px", disableFilter:true, disableSorting:true, disablePadding:true },
- { property: "firstName", type: ColumnType.text, title: "First Name" },
- { property: "lastName", type: ColumnType.text, title: "Last Name" },
- { property: "age", type: ColumnType.numeric, title: "Age", width: "60px" },
- { property: "email", type: ColumnType.text, title: "eMail" },
- { property: "actions", type: ColumnType.custom, title: "Actions", customControl: ({ rowData }) => (<div>Button</div>) },
- ]
- } idProperty={ "_id" } title={ "Customers 2018" } >
- </SampleDataMaterialTable>
- </ExpansionPanelDetails>
- </ExpansionPanel>
- <ExpansionPanel>
- <ExpansionPanelSummary expandIcon={ <ExpandMoreIcon /> }>
- <Typography className={ props.classes.heading }>Tree Demo</Typography>
- </ExpansionPanelSummary>
- <ExpansionPanelDetails>
- <SampleTree items={ treeData } contentProperty={"title"} childrenProperty={"children"} useFolderIcons enableSearchBar />
- </ExpansionPanelDetails>
- </ExpansionPanel>
+ <div style={{ margin: "0 auto" }}>##odlux.version##</div>
</div>
- )
+ );
};
-export const About = withComponents(components)(withStyles(styles)(AboutComponent));
+export const About = AboutComponent;
export default About;
\ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/views/frame.tsx b/sdnr/wt/odlux/framework/src/views/frame.tsx index fd943319d..69b981bb3 100644 --- a/sdnr/wt/odlux/framework/src/views/frame.tsx +++ b/sdnr/wt/odlux/framework/src/views/frame.tsx @@ -13,6 +13,7 @@ import SnackDisplay from '../components/material-ui/snackDisplay'; import Home from '../views/home';
import Login from '../views/login';
import About from '../views/about';
+import Test from '../views/test';
import applicationService from '../services/applicationManager';
import { SnackbarProvider } from 'notistack';
@@ -28,7 +29,7 @@ const styles = (theme: Theme) => createStyles({ },
content: {
flexGrow: 1,
- display: "flex",
+ display: "flex",
flexDirection: "column",
backgroundColor: theme.palette.background.default,
padding: theme.spacing.unit * 3,
@@ -59,7 +60,12 @@ export const Frame = withStyles(styles)(({ classes }: WithStyles<typeof styles>) <AppFrame title={ "About" } icon={ faAddressBook } >
<About />
</AppFrame>
- ) } />
+ )} />
+ { process.env.NODE_ENV === "development" ? <Route path="/test" component={() => (
+ <AppFrame title={"Test"} icon={faAddressBook} >
+ <Test />
+ </AppFrame>
+ )} /> : null}
<Route path="/login" component={ () => (
<AppFrame title={ "Login" } icon={ faSignInAlt } >
<Login />
@@ -82,4 +88,4 @@ export const Frame = withStyles(styles)(({ classes }: WithStyles<typeof styles>) );
});
-export default Frame;
+export default Frame;
diff --git a/sdnr/wt/odlux/framework/src/views/home.tsx b/sdnr/wt/odlux/framework/src/views/home.tsx index 3d7497401..18f94f70b 100644 --- a/sdnr/wt/odlux/framework/src/views/home.tsx +++ b/sdnr/wt/odlux/framework/src/views/home.tsx @@ -1,36 +1,9 @@ import * as React from 'react';
-import Button from '@material-ui/core/Button';
-
-class BuggyCounter extends React.Component<{}, {counter:number}> {
- constructor(props: {}) {
- super(props);
- this.state = { counter: 0 };
- this.handleClick = this.handleClick.bind(this);
- }
-
- handleClick() {
- this.setState(({ counter }) => ({
- counter: counter + 1
- }));
- }
-
- render() {
- if (this.state.counter === 5) {
- // Simulate a JS error
- throw new Error('I crashed!');
- }
- return <h1 onClick={ this.handleClick }>{ this.state.counter }</h1>;
- }
-}
export const Home = (props: React.Props<any>) => {
return (
<div>
<h1>Welcome to ODLUX.</h1>
- <Button variant="contained" color="secondary" onClick={ () => { throw new Error("This is an error") } }>
- Throw an Error1
- </Button>
- <BuggyCounter />
</div>
)
}
diff --git a/sdnr/wt/odlux/framework/src/views/login.tsx b/sdnr/wt/odlux/framework/src/views/login.tsx index 513e24712..054ae4f2e 100644 --- a/sdnr/wt/odlux/framework/src/views/login.tsx +++ b/sdnr/wt/odlux/framework/src/views/login.tsx @@ -41,7 +41,7 @@ const styles = (theme: Theme) => createStyles({ display: 'flex', flexDirection: 'column', alignItems: 'center', - padding: `${ theme.spacing.unit * 2 }px ${ theme.spacing.unit * 3 }px ${ theme.spacing.unit * 3 }px`, + padding: `${theme.spacing.unit * 2}px ${theme.spacing.unit * 3}px ${theme.spacing.unit * 3}px`, }, avatar: { margin: theme.spacing.unit, @@ -56,11 +56,11 @@ const styles = (theme: Theme) => createStyles({ }, }); -type LoginProps = RouteComponentProps<{}> & WithStyles<typeof styles> & Connect ; +type LoginProps = RouteComponentProps<{}> & WithStyles<typeof styles> & Connect; interface ILoginState { busy: boolean; - email: string; + username: string; password: string; scope: string; message: string; @@ -70,12 +70,12 @@ interface ILoginState { // todo: ggf. redirect to einbauen class LoginComponent extends React.Component<LoginProps, ILoginState> { - constructor(props: LoginProps) { + constructor (props: LoginProps) { super(props); this.state = { busy: false, - email: '', + username: '', password: '', scope: 'sdn', message: '' @@ -87,19 +87,19 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> { return ( <React.Fragment> <CssBaseline /> - <main className={ classes.layout }> - <Paper className={ classes.paper }> - <Avatar className={ classes.avatar }> + <main className={classes.layout}> + <Paper className={classes.paper}> + <Avatar className={classes.avatar}> <LockIcon /> </Avatar> <Typography variant="caption">Sign in</Typography> - <form className={ classes.form }> + <form className={classes.form}> <FormControl margin="normal" required fullWidth> - <InputLabel htmlFor="email">Email Address</InputLabel> - <Input id="email" name="email" autoComplete="email" autoFocus - disabled={ this.state.busy } - value = {this.state.email } - onChange={ event => { this.setState({ email: event.target.value }) } }/> + <InputLabel htmlFor="username">Username</InputLabel> + <Input id="username" name="username" autoComplete="username" autoFocus + disabled={this.state.busy} + value={this.state.username} + onChange={event => { this.setState({ username: event.target.value }) }} /> </FormControl> <FormControl margin="normal" required fullWidth> <InputLabel htmlFor="password">Password</InputLabel> @@ -108,13 +108,13 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> { type="password" id="password" autoComplete="current-password" - disabled={ this.state.busy } - value={ this.state.password } - onChange={ event => { this.setState({ password: event.target.value }) } } + disabled={this.state.busy} + value={this.state.password} + onChange={event => { this.setState({ password: event.target.value }) }} /> </FormControl> <FormControl margin="normal" required fullWidth> - <InputLabel htmlFor="password">Scope</InputLabel> + <InputLabel htmlFor="password">Domain</InputLabel> <Input name="scope" type="scope" @@ -125,7 +125,7 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> { /> </FormControl> <FormControlLabel - control={ <Checkbox value="remember" color="primary" /> } + control={<Checkbox value="remember" color="primary" />} label="Remember me" /> <Button @@ -133,9 +133,9 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> { fullWidth variant="raised" color="primary" - disabled = { this.state.busy } - className={ classes.submit } - onClick = { this.onSignIn } + disabled={this.state.busy} + className={classes.submit} + onClick={this.onSignIn} > Sign in </Button> @@ -144,14 +144,14 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> { </main> <Dialog open={!!this.state.message} - onClose={() => { this.setState({message: ''})}} + onClose={() => { this.setState({ message: '' }) }} aria-labelledby="alert-dialog-title" aria-describedby="alert-dialog-description" > <DialogTitle id="alert-dialog-title">{"Error"}</DialogTitle> <DialogContent> <DialogContentText id="alert-dialog-description"> - { this.state.message } + {this.state.message} </DialogContentText> </DialogContent> <DialogActions> @@ -168,7 +168,7 @@ class LoginComponent extends React.Component<LoginProps, ILoginState> { event.preventDefault(); this.setState({ busy: true }); - const token = await authenticationService.authenticateUser(this.state.email, this.state.password, this.state.scope); + const token = await authenticationService.authenticateUser(this.state.username, this.state.password, this.state.scope); this.props.dispatch(new UpdateAuthentication(token)); this.setState({ busy: false }); diff --git a/sdnr/wt/odlux/framework/src/views/test.tsx b/sdnr/wt/odlux/framework/src/views/test.tsx new file mode 100644 index 000000000..8efe357d1 --- /dev/null +++ b/sdnr/wt/odlux/framework/src/views/test.tsx @@ -0,0 +1,861 @@ +import * as React from 'react'; + +import { withComponents, WithComponents } from '../utilities/withComponents'; +import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/styles'; + +import ExpansionPanel from '@material-ui/core/ExpansionPanel'; +import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; +import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; + +import { MaterialTable, MaterialTableCtorType, ColumnType } from '../components/material-table'; +import { TreeView, ITreeItem, TreeViewCtorType } from '../components/material-ui/treeView'; +import { SvgIconProps } from '@material-ui/core/SvgIcon'; + +const styles = (theme: Theme) => createStyles({ + root: { + width: '100%', + }, + heading: { + fontSize: theme.typography.pxToRem(15), + fontWeight: theme.typography.fontWeightRegular, + }, +}); + +class SampleData { + _id: string; + index: number; + guid: string; + isActive: boolean; + balance: string; + age: number; + firstName: string; + lastName: string; + company: string; + email: string; + registered: string; + latitude: string; + longitude: string; +} + +// https://next.json-generator.com/NJ5Bv-v1I +const tableData: SampleData[] = [ + { + "_id": "5c0e18399919a5c43636fdf2", + "index": 0, + "guid": "48728d8e-8300-4d0f-b967-e2166d023066", + "isActive": false, + "balance": "$3,480.16", + "age": 33, + "firstName": "Brooke", + "lastName": "Morris", + "company": "ZORROMOP", + "email": "brooke.morris@zorromop.de", + "registered": "Sunday, February 11, 2018 2:55 PM", + "latitude": "-69.109379", + "longitude": "113.735639" + }, + { + "_id": "5c0e1839b61e3eeaf164259d", + "index": 1, + "guid": "28723570-1507-422e-b78c-924402371fb1", + "isActive": false, + "balance": "$1,305.01", + "age": 28, + "firstName": "Jolene", + "lastName": "Everett", + "company": "ZENCO", + "email": "jolene.everett@zenco.de", + "registered": "Saturday, December 8, 2018 5:17 PM", + "latitude": "13.683025", + "longitude": "85.101421" + }, + { + "_id": "5c0e1839e81f57913c5d2147", + "index": 2, + "guid": "e914dc5d-91a3-405d-ac48-aee6f0cd391a", + "isActive": true, + "balance": "$1,418.37", + "age": 28, + "firstName": "Elva", + "lastName": "Travis", + "company": "ZYTREK", + "email": "elva.travis@zytrek.de", + "registered": "Thursday, March 10, 2016 5:13 PM", + "latitude": "53.75862", + "longitude": "-67.784532" + }, + { + "_id": "5c0e1839bc9224a2b54c0f69", + "index": 3, + "guid": "88cbdce0-0bcc-4d16-83c3-3017690503c4", + "isActive": true, + "balance": "$1,709.60", + "age": 21, + "firstName": "Ellis", + "lastName": "Mcpherson", + "company": "DIGIPRINT", + "email": "ellis.mcpherson@digiprint.de", + "registered": "Sunday, December 21, 2014 5:25 AM", + "latitude": "46.486149", + "longitude": "-66.657067" + }, + { + "_id": "5c0e183951b51475db0f35d1", + "index": 4, + "guid": "c887ac86-7ba1-4eb6-9b47-e88a1bcb3713", + "isActive": true, + "balance": "$3,578.54", + "age": 25, + "firstName": "Marcia", + "lastName": "Rocha", + "company": "ZAPPIX", + "email": "marcia.rocha@zappix.de", + "registered": "Tuesday, June 16, 2015 11:21 AM", + "latitude": "-39.905461", + "longitude": "150.873895" + }, + { + "_id": "5c0e18398c5be8d362a578eb", + "index": 5, + "guid": "0d160697-9b5b-4941-9b5f-4ba3a7f97b49", + "isActive": true, + "balance": "$414.98", + "age": 32, + "firstName": "Lavonne", + "lastName": "Wilkins", + "company": "FARMAGE", + "email": "lavonne.wilkins@farmage.de", + "registered": "Monday, February 1, 2016 5:27 PM", + "latitude": "-16.839256", + "longitude": "-105.824746" + }, + { + "_id": "5c0e18399804086c836d7d56", + "index": 6, + "guid": "715a5f63-35b6-4903-a46e-ba584b005e64", + "isActive": false, + "balance": "$1,755.78", + "age": 32, + "firstName": "Wise", + "lastName": "Berg", + "company": "ZIZZLE", + "email": "wise.berg@zizzle.de", + "registered": "Saturday, March 28, 2015 1:40 AM", + "latitude": "51.15269", + "longitude": "65.795093" + }, + { + "_id": "5c0e18399c4d13538bcaf8c9", + "index": 7, + "guid": "7ee50269-23e8-499e-9a16-09f393d7600c", + "isActive": false, + "balance": "$342.52", + "age": 27, + "firstName": "Isabel", + "lastName": "Battle", + "company": "EZENTIA", + "email": "isabel.battle@ezentia.de", + "registered": "Thursday, June 7, 2018 12:16 AM", + "latitude": "-53.318152", + "longitude": "-153.516824" + }, + { + "_id": "5c0e18398d7fb9a4eceeffa2", + "index": 8, + "guid": "1e30c9ac-2297-4f16-83e6-9559b1ebe92c", + "isActive": true, + "balance": "$3,184.71", + "age": 36, + "firstName": "Lenora", + "lastName": "Crawford", + "company": "KIDGREASE", + "email": "lenora.crawford@kidgrease.de", + "registered": "Saturday, January 7, 2017 6:17 PM", + "latitude": "-72.431496", + "longitude": "9.413359" + }, + { + "_id": "5c0e18395837069ab6b79d00", + "index": 9, + "guid": "d04a02ed-5899-4729-a7e5-2d85b5d03973", + "isActive": true, + "balance": "$1,553.28", + "age": 35, + "firstName": "Sasha", + "lastName": "Bridges", + "company": "IDEALIS", + "email": "sasha.bridges@idealis.de", + "registered": "Sunday, February 4, 2018 7:02 PM", + "latitude": "8.095691", + "longitude": "-105.758195" + }, + { + "_id": "5c0e18390be19bf65acad180", + "index": 10, + "guid": "3a1a77e6-ef15-4598-8274-c68ac3bb922a", + "isActive": false, + "balance": "$3,587.96", + "age": 20, + "firstName": "Wilkins", + "lastName": "Beasley", + "company": "DIGIFAD", + "email": "wilkins.beasley@digifad.de", + "registered": "Monday, March 5, 2018 1:27 PM", + "latitude": "-88.062704", + "longitude": "149.95661" + }, + { + "_id": "5c0e1839ffbbad5c9954e49f", + "index": 11, + "guid": "97a56950-a08c-4e00-8002-ba2d5de4da5d", + "isActive": false, + "balance": "$1,997.80", + "age": 31, + "firstName": "Sullivan", + "lastName": "Mcclain", + "company": "EARTHMARK", + "email": "sullivan.mcclain@earthmark.de", + "registered": "Saturday, October 27, 2018 2:51 PM", + "latitude": "-81.86349", + "longitude": "-79.596991" + }, + { + "_id": "5c0e183914bd464d55e7325f", + "index": 12, + "guid": "294f6485-d0f9-4b25-b998-325ae90fa769", + "isActive": true, + "balance": "$1,405.46", + "age": 24, + "firstName": "Herminia", + "lastName": "Fischer", + "company": "ECOLIGHT", + "email": "herminia.fischer@ecolight.de", + "registered": "Thursday, January 16, 2014 4:48 PM", + "latitude": "48.224363", + "longitude": "11.08339" + }, + { + "_id": "5c0e183968ec2556d8f6566c", + "index": 13, + "guid": "16edfea4-7b37-4e54-868c-c369b413dd78", + "isActive": false, + "balance": "$3,440.67", + "age": 39, + "firstName": "Blanchard", + "lastName": "Blackwell", + "company": "GEOFORMA", + "email": "blanchard.blackwell@geoforma.de", + "registered": "Wednesday, July 30, 2014 4:07 AM", + "latitude": "-52.169297", + "longitude": "10.415879" + }, + { + "_id": "5c0e183939a0fc955f2d94da", + "index": 14, + "guid": "4ed454e2-dde1-4ab5-a434-4a82205ced2d", + "isActive": true, + "balance": "$1,883.27", + "age": 35, + "firstName": "Gayle", + "lastName": "Little", + "company": "AQUAZURE", + "email": "gayle.little@aquazure.de", + "registered": "Tuesday, December 12, 2017 5:08 PM", + "latitude": "-58.473236", + "longitude": "38.022269" + }, + { + "_id": "5c0e1839099f9221ccd968ac", + "index": 15, + "guid": "1d052fd4-7c54-45fb-b0db-7de1acc4262a", + "isActive": false, + "balance": "$2,601.94", + "age": 31, + "firstName": "Jocelyn", + "lastName": "Richards", + "company": "GINK", + "email": "jocelyn.richards@gink.de", + "registered": "Sunday, October 30, 2016 9:12 PM", + "latitude": "-43.489676", + "longitude": "2.557869" + }, + { + "_id": "5c0e183970f320f377321c3f", + "index": 16, + "guid": "45bca125-8831-48c3-b22b-29ae318e7096", + "isActive": false, + "balance": "$3,441.74", + "age": 34, + "firstName": "Berta", + "lastName": "Valentine", + "company": "ISOSPHERE", + "email": "berta.valentine@isosphere.de", + "registered": "Sunday, March 19, 2017 8:22 PM", + "latitude": "-40.188039", + "longitude": "-170.085092" + }, + { + "_id": "5c0e1839ab960bb0a9f4f392", + "index": 17, + "guid": "d7b5122a-94c9-423c-b799-1a8f8314b152", + "isActive": false, + "balance": "$56.39", + "age": 21, + "firstName": "Russell", + "lastName": "Powers", + "company": "TETAK", + "email": "russell.powers@tetak.de", + "registered": "Thursday, November 3, 2016 9:23 PM", + "latitude": "-51.610519", + "longitude": "-133.280363" + }, + { + "_id": "5c0e183998f0195404b9aaa4", + "index": 18, + "guid": "a043ba97-ea7e-48ce-bb15-18ee09fb393d", + "isActive": true, + "balance": "$1,503.57", + "age": 37, + "firstName": "Rosario", + "lastName": "Brennan", + "company": "VIAGRAND", + "email": "rosario.brennan@viagrand.de", + "registered": "Saturday, March 17, 2018 10:32 PM", + "latitude": "-43.773365", + "longitude": "47.58682" + }, + { + "_id": "5c0e1839bcb2a5cc567129ac", + "index": 19, + "guid": "de6d5d36-201e-4f87-9976-ed31f3160e42", + "isActive": false, + "balance": "$1,160.18", + "age": 29, + "firstName": "Anita", + "lastName": "Hodges", + "company": "TUBALUM", + "email": "anita.hodges@tubalum.de", + "registered": "Sunday, November 26, 2017 11:54 AM", + "latitude": "7.080244", + "longitude": "-9.970715" + }, + { + "_id": "5c0e18394b37e854a1ef371c", + "index": 20, + "guid": "9407113b-896a-4699-ac1b-363bc3c6f8ad", + "isActive": false, + "balance": "$34.81", + "age": 31, + "firstName": "Barrett", + "lastName": "Weaver", + "company": "DUOFLEX", + "email": "barrett.weaver@duoflex.de", + "registered": "Tuesday, November 3, 2015 9:31 AM", + "latitude": "40.30558", + "longitude": "-69.986664" + }, + { + "_id": "5c0e1839b5658f90e16a86e0", + "index": 21, + "guid": "81f894c4-c931-422d-a30e-593824d95bf9", + "isActive": true, + "balance": "$2,808.63", + "age": 26, + "firstName": "Baxter", + "lastName": "Chase", + "company": "BUNGA", + "email": "baxter.chase@bunga.de", + "registered": "Friday, October 28, 2016 7:10 AM", + "latitude": "-49.05652", + "longitude": "63.123535" + }, + { + "_id": "5c0e1839cb9462c9ecbb59af", + "index": 22, + "guid": "92e67862-4fdf-43af-a3ef-ef3edb8d6706", + "isActive": true, + "balance": "$3,552.71", + "age": 29, + "firstName": "Olga", + "lastName": "Kemp", + "company": "OHMNET", + "email": "olga.kemp@ohmnet.de", + "registered": "Saturday, March 26, 2016 11:51 AM", + "latitude": "-17.450481", + "longitude": "-13.945794" + }, + { + "_id": "5c0e18396f999c2b8ac731a9", + "index": 23, + "guid": "a682eaae-34f0-4973-b8a0-30972de0732b", + "isActive": false, + "balance": "$1,999.20", + "age": 21, + "firstName": "Ebony", + "lastName": "Le", + "company": "MULTRON", + "email": "ebony.le@multron.de", + "registered": "Friday, March 27, 2015 9:23 AM", + "latitude": "-70.380014", + "longitude": "173.20685" + }, + { + "_id": "5c0e18391cfb28263eb42db7", + "index": 24, + "guid": "f1cddb5f-0b89-453e-b0c9-8193a56cc610", + "isActive": true, + "balance": "$2,950.91", + "age": 30, + "firstName": "Norman", + "lastName": "Price", + "company": "COMVEX", + "email": "norman.price@comvex.de", + "registered": "Tuesday, August 21, 2018 11:17 PM", + "latitude": "86.501469", + "longitude": "159.545352" + }, + { + "_id": "5c0e18394a6be11128c7e5ca", + "index": 25, + "guid": "dadb738a-40fd-45b6-abac-023a803d95c2", + "isActive": true, + "balance": "$2,767.09", + "age": 25, + "firstName": "Sara", + "lastName": "Ruiz", + "company": "AUSTECH", + "email": "sara.ruiz@austech.de", + "registered": "Wednesday, June 20, 2018 6:34 AM", + "latitude": "86.784904", + "longitude": "-120.331325" + }, + { + "_id": "5c0e183974631549eda97cea", + "index": 26, + "guid": "b5c43ee5-14ed-4ab5-b3db-b31a8bb65ceb", + "isActive": true, + "balance": "$3,235.42", + "age": 32, + "firstName": "Holly", + "lastName": "Santos", + "company": "LOVEPAD", + "email": "holly.santos@lovepad.de", + "registered": "Thursday, November 22, 2018 9:26 PM", + "latitude": "-19.640066", + "longitude": "50.410992" + }, + { + "_id": "5c0e1839ab9b933881429d78", + "index": 27, + "guid": "94961092-65ca-41b9-bc69-3e40ce2cafc9", + "isActive": true, + "balance": "$2,106.34", + "age": 39, + "firstName": "Rachel", + "lastName": "Douglas", + "company": "DEMINIMUM", + "email": "rachel.douglas@deminimum.de", + "registered": "Sunday, April 9, 2017 3:55 AM", + "latitude": "31.395281", + "longitude": "-1.899514" + }, + { + "_id": "5c0e183937f743155859c5a9", + "index": 28, + "guid": "07d7ef18-bcef-483d-999e-0b3da4a7098b", + "isActive": true, + "balance": "$2,260.65", + "age": 40, + "firstName": "Reed", + "lastName": "Workman", + "company": "BUZZMAKER", + "email": "reed.workman@buzzmaker.de", + "registered": "Wednesday, May 28, 2014 3:44 PM", + "latitude": "23.789646", + "longitude": "106.938375" + }, + { + "_id": "5c0e1839f8f4b60beb28b7ed", + "index": 29, + "guid": "9b4952e5-aa0e-4919-9e17-7c357a297394", + "isActive": false, + "balance": "$702.99", + "age": 27, + "firstName": "Cochran", + "lastName": "Ware", + "company": "HIVEDOM", + "email": "cochran.ware@hivedom.de", + "registered": "Monday, October 16, 2017 5:51 AM", + "latitude": "85.953108", + "longitude": "124.590037" + }, + { + "_id": "5c0e1839342fbd54a88269df", + "index": 30, + "guid": "30937d5b-9514-4ebd-b628-2cfb5017fe41", + "isActive": false, + "balance": "$385.88", + "age": 35, + "firstName": "Cote", + "lastName": "Hess", + "company": "TERAPRENE", + "email": "cote.hess@teraprene.de", + "registered": "Thursday, March 15, 2018 4:42 PM", + "latitude": "81.38211", + "longitude": "64.516797" + }, + { + "_id": "5c0e18395b6dc85d73ce1fb3", + "index": 31, + "guid": "f34847da-7f96-4cd8-8d8a-b06c0eb0a8f2", + "isActive": true, + "balance": "$3,494.56", + "age": 27, + "firstName": "Daniels", + "lastName": "Ayala", + "company": "BESTO", + "email": "daniels.ayala@besto.de", + "registered": "Sunday, December 18, 2016 10:52 AM", + "latitude": "47.704227", + "longitude": "41.674767" + }, + { + "_id": "5c0e183974587cdccf30b13f", + "index": 32, + "guid": "fdbb6d83-0e47-4453-b8a7-b47f44e4164b", + "isActive": false, + "balance": "$2,087.38", + "age": 26, + "firstName": "Powers", + "lastName": "Drake", + "company": "GENESYNK", + "email": "powers.drake@genesynk.de", + "registered": "Saturday, September 29, 2018 12:24 AM", + "latitude": "40.580432", + "longitude": "110.940759" + }, + { + "_id": "5c0e18397b51245e971c58b8", + "index": 33, + "guid": "6adfe544-238b-4001-b2a6-f50ea3094da3", + "isActive": true, + "balance": "$3,566.22", + "age": 34, + "firstName": "Pacheco", + "lastName": "Ramsey", + "company": "ENVIRE", + "email": "pacheco.ramsey@envire.de", + "registered": "Friday, September 11, 2015 12:14 AM", + "latitude": "-30.691235", + "longitude": "69.343692" + }, + { + "_id": "5c0e18391ede9c0996fd09e7", + "index": 34, + "guid": "d190b32f-d33b-4c17-a18a-bb2f57e79ba7", + "isActive": false, + "balance": "$1,671.63", + "age": 32, + "firstName": "Mcintyre", + "lastName": "Chan", + "company": "ORBAXTER", + "email": "mcintyre.chan@orbaxter.de", + "registered": "Wednesday, May 7, 2014 7:11 PM", + "latitude": "7.380435", + "longitude": "70.955103" + }, + { + "_id": "5c0e1839fe48069c9c260fa9", + "index": 35, + "guid": "a41c064b-6bf4-4ba5-b229-9b657d286936", + "isActive": false, + "balance": "$24.02", + "age": 27, + "firstName": "Genevieve", + "lastName": "Sparks", + "company": "ZBOO", + "email": "genevieve.sparks@zboo.de", + "registered": "Saturday, December 16, 2017 2:51 PM", + "latitude": "-63.406337", + "longitude": "118.662621" + }, + { + "_id": "5c0e1839a7e8e76accf0803e", + "index": 36, + "guid": "3e71864d-4be5-418e-ace8-346c3d7a9c5f", + "isActive": true, + "balance": "$3,261.01", + "age": 30, + "firstName": "Powell", + "lastName": "Patterson", + "company": "GAZAK", + "email": "powell.patterson@gazak.de", + "registered": "Thursday, May 18, 2017 10:10 AM", + "latitude": "-10.428548", + "longitude": "64.979192" + }, + { + "_id": "5c0e183984b0320f1118a8b0", + "index": 37, + "guid": "ec5b292c-6efb-471b-9bf5-a47286e03515", + "isActive": false, + "balance": "$918.71", + "age": 37, + "firstName": "Tara", + "lastName": "Mcmillan", + "company": "GRAINSPOT", + "email": "tara.mcmillan@grainspot.de", + "registered": "Sunday, May 17, 2015 1:01 PM", + "latitude": "-13.519031", + "longitude": "67.931062" + }, + { + "_id": "5c0e183965875876835ccd79", + "index": 38, + "guid": "b7e97ffb-439a-4454-90af-7f5ebd565ebc", + "isActive": true, + "balance": "$574.99", + "age": 28, + "firstName": "Pennington", + "lastName": "Gallegos", + "company": "CEDWARD", + "email": "pennington.gallegos@cedward.de", + "registered": "Wednesday, September 26, 2018 6:01 AM", + "latitude": "-63.693261", + "longitude": "-38.352153" + }, + { + "_id": "5c0e183922505dd21be49009", + "index": 39, + "guid": "5187aa39-4357-462b-9508-3c537d26d70d", + "isActive": false, + "balance": "$2,447.08", + "age": 26, + "firstName": "Meagan", + "lastName": "Irwin", + "company": "SENTIA", + "email": "meagan.irwin@sentia.de", + "registered": "Saturday, April 2, 2016 4:39 PM", + "latitude": "1.051313", + "longitude": "-86.168315" + }, + { + "_id": "5c0e183900a9f7f896e5b3b1", + "index": 40, + "guid": "31889843-79e7-4636-9ca1-4eb5cbcb0ae3", + "isActive": true, + "balance": "$1,992.25", + "age": 22, + "firstName": "Kelly", + "lastName": "Cobb", + "company": "BOVIS", + "email": "kelly.cobb@bovis.de", + "registered": "Tuesday, August 9, 2016 5:36 PM", + "latitude": "-85.547579", + "longitude": "-89.794104" + }, + { + "_id": "5c0e18393b25b8552ff950e2", + "index": 41, + "guid": "0bf02edc-ca1b-4cfe-8356-b65881bdca11", + "isActive": true, + "balance": "$465.96", + "age": 27, + "firstName": "Angela", + "lastName": "Booker", + "company": "EQUICOM", + "email": "angela.booker@equicom.de", + "registered": "Thursday, July 30, 2015 1:39 AM", + "latitude": "-9.345395", + "longitude": "107.070665" + }, + { + "_id": "5c0e183955d747ebbe25437b", + "index": 42, + "guid": "6405e559-5849-4d12-ae4e-520f13b4dffe", + "isActive": true, + "balance": "$15.63", + "age": 28, + "firstName": "Carrie", + "lastName": "Mclean", + "company": "BOINK", + "email": "carrie.mclean@boink.de", + "registered": "Wednesday, February 1, 2017 1:50 PM", + "latitude": "72.287519", + "longitude": "-135.436286" + }, + { + "_id": "5c0e1839e9cfe1b28e31e7e6", + "index": 43, + "guid": "e49e7ca7-a6cc-4cdb-bebe-5a3b6ba931eb", + "isActive": true, + "balance": "$3,127.94", + "age": 33, + "firstName": "Callie", + "lastName": "Cooley", + "company": "MUSIX", + "email": "callie.cooley@musix.de", + "registered": "Wednesday, August 30, 2017 4:58 PM", + "latitude": "-38.954739", + "longitude": "-152.706424" + }, + { + "_id": "5c0e18391bafa0750ff4f280", + "index": 44, + "guid": "c245ffd3-4924-4dce-ae4a-f4cabf057b54", + "isActive": false, + "balance": "$1,320.36", + "age": 35, + "firstName": "Terry", + "lastName": "Bennett", + "company": "EXOTECHNO", + "email": "terry.bennett@exotechno.de", + "registered": "Friday, June 17, 2016 11:54 PM", + "latitude": "-48.946183", + "longitude": "32.53167" + }, + { + "_id": "5c0e1839e91b27fcce34b70f", + "index": 45, + "guid": "0860cb66-de4c-410e-8233-aeef5ee9d64e", + "isActive": false, + "balance": "$1,187.75", + "age": 30, + "firstName": "Phoebe", + "lastName": "Bartlett", + "company": "VORATAK", + "email": "phoebe.bartlett@voratak.de", + "registered": "Tuesday, July 25, 2017 2:57 AM", + "latitude": "-63.208957", + "longitude": "-91.209743" + }, + { + "_id": "5c0e183987e8a4e98415c8dd", + "index": 46, + "guid": "49219833-172c-4659-9192-d1116a5ca833", + "isActive": false, + "balance": "$3,225.24", + "age": 38, + "firstName": "Jordan", + "lastName": "Evans", + "company": "PHARMACON", + "email": "jordan.evans@pharmacon.de", + "registered": "Sunday, April 23, 2017 6:27 PM", + "latitude": "-59.454678", + "longitude": "67.251185" + }, + { + "_id": "5c0e183944979692cc1a3e48", + "index": 47, + "guid": "680c4d15-d539-4db9-8793-a2f6d3f354aa", + "isActive": false, + "balance": "$2,913.14", + "age": 28, + "firstName": "Goodman", + "lastName": "Cain", + "company": "CAXT", + "email": "goodman.cain@caxt.de", + "registered": "Tuesday, November 1, 2016 6:11 PM", + "latitude": "-30.187547", + "longitude": "-164.313273" + }, + { + "_id": "5c0e1839ef5312ac08e3cbc3", + "index": 48, + "guid": "85f5fa5d-b6b3-47c6-ad1b-faee10a4e1bd", + "isActive": true, + "balance": "$544.97", + "age": 27, + "firstName": "Aisha", + "lastName": "Oliver", + "company": "MINGA", + "email": "aisha.oliver@minga.de", + "registered": "Sunday, July 3, 2016 8:18 AM", + "latitude": "-21.527536", + "longitude": "141.029691" + }, + { + "_id": "5c0e1839c2e58f5da04f29fd", + "index": 49, + "guid": "e2ee9b25-5887-49a9-a1c6-17432154d266", + "isActive": true, + "balance": "$3,621.65", + "age": 31, + "firstName": "Erin", + "lastName": "Lester", + "company": "SLOFAST", + "email": "erin.lester@slofast.de", + "registered": "Saturday, February 20, 2016 5:13 AM", + "latitude": "-30.080798", + "longitude": "-1.291093" + } +]; + +const components = { + 'counter': 'demoApp.counter' +}; + +class TreeDemoItem implements ITreeItem { + title: string; + children?: TreeDemoItem[]; + disabled?: boolean; + icon?: React.ComponentType<SvgIconProps>; +} + +const treeData: TreeDemoItem[] = [ + { + title: "Erste Ebene", children: [ + { + title: "Zweite Ebene", children: [ + { title: "Dritte Ebene" }, + ] + }, + { title: "Zweite Ebene 2" }, + ] + }, + { title: "Erste Ebene 3" }, +]; + +const SampleDataMaterialTable = MaterialTable as MaterialTableCtorType<SampleData>; + +const SampleTree = TreeView as any as TreeViewCtorType<TreeDemoItem>; + +const TestComponent = (props: WithComponents<typeof components> & WithStyles<typeof styles>) => { + + return ( + <div> + <h2>About</h2> + <ExpansionPanel> + <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}> + <Typography className={props.classes.heading}>Client Side Table Demo</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <SampleDataMaterialTable rows={tableData} columns={ + [ + { property: "index", type: ColumnType.text, title: "Index", width: "80px", disableFilter: true, disableSorting: true }, + { property: "firstName", type: ColumnType.text, title: "First Name" }, + { property: "lastName", type: ColumnType.text, title: "Last Name" }, + { property: "age", type: ColumnType.numeric, title: "Age", width: "60px" }, + { property: "email", type: ColumnType.text, title: "eMail" }, + { property: "actions", type: ColumnType.custom, title: "Actions", customControl: ({ rowData }) => (<div>Button</div>) }, + ] + } idProperty={"_id"} title={"Customers 2018"} > + </SampleDataMaterialTable> + </ExpansionPanelDetails> + </ExpansionPanel> + <ExpansionPanel> + <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}> + <Typography className={props.classes.heading}>Tree Demo</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <SampleTree items={treeData} contentProperty={"title"} childrenProperty={"children"} useFolderIcons enableSearchBar /> + </ExpansionPanelDetails> + </ExpansionPanel> + </div> + ) +}; + +export const Test = withComponents(components)(withStyles(styles)(TestComponent)); +export default Test; diff --git a/sdnr/wt/odlux/package.json b/sdnr/wt/odlux/package.json index f24b48489..609dc5ce2 100644 --- a/sdnr/wt/odlux/package.json +++ b/sdnr/wt/odlux/package.json @@ -20,7 +20,7 @@ "@types/flux": "3.1.8", "@types/jquery": "3.3.10", "@types/jsonwebtoken": "7.2.8", - "@types/node": "11.9.5", + "@types/node": "11.11.6", "@types/react": "16.4.14", "@types/react-dom": "16.0.8", "@types/react-router-dom": "4.3.1", @@ -29,7 +29,7 @@ "classnames": "2.2.6", "jquery": "3.3.1", "jsonwebtoken": "8.3.0", - "lerna": "^3.13.1", + "lerna": "3.13.1", "notistack": "0.4.1", "prop-types": "15.6.2", "react": "16.5.2", diff --git a/sdnr/wt/odlux/pom.xml b/sdnr/wt/odlux/pom.xml index 121340f3e..8683bd71c 100644 --- a/sdnr/wt/odlux/pom.xml +++ b/sdnr/wt/odlux/pom.xml @@ -1,35 +1,38 @@ <?xml version="1.0" encoding="UTF-8"?> -<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"> +<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"> - <parent> - <groupId>org.onap.ccsdk.parent</groupId> - <artifactId>odlparent-lite</artifactId> - <version>1.2.2-SNAPSHOT</version> - <relativePath/> - </parent> + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>odlparent-lite</artifactId> + <version>1.2.2-SNAPSHOT</version> + <relativePath /> + </parent> - <modelVersion>4.0.0</modelVersion> - <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> - <artifactId>odlux-top</artifactId> - <version>0.4.2-SNAPSHOT</version> - <packaging>pom</packaging> - <name>odlux</name> + <modelVersion>4.0.0</modelVersion> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>odlux-top</artifactId> + <version>0.4.2-SNAPSHOT</version> + <packaging>pom</packaging> + <name>odlux</name> + + <modules> + <module>framework</module> + <module>core</module> + <module>apps/apiDemo</module> + <module>apps/connectApp</module> + <module>apps/demoApp</module> + <module>apps/faultApp</module> + <module>apps/helpApp</module> + <module>apps/inventoryApp</module> + <module>apps/mediatorApp</module> + <module>apps/maintenanceApp</module> + <module>apps/minimumApp</module> + <module>apps/performanceHistoryApp</module> + <module>apps/app-feature</module> + <module>apps/app-installer</module> + </modules> - <modules> - <module>framework</module> - <module>core</module> - <module>apps/apiDemo</module> - <module>apps/connectApp</module> - <module>apps/demoApp</module> - <module>apps/faultApp</module> - <module>apps/helpApp</module> - <module>apps/inventoryApp</module> - <module>apps/mediatorApp</module> - <module>apps/maintenanceApp</module> - <module>apps/minimumApp</module> - <module>apps/app-feature</module> - <module>apps/app-installer</module> - </modules> - </project> diff --git a/sdnr/wt/odlux/yarn.lock b/sdnr/wt/odlux/yarn.lock index 247a0f2f8..8f0be1d67 100644 --- a/sdnr/wt/odlux/yarn.lock +++ b/sdnr/wt/odlux/yarn.lock @@ -1335,10 +1335,10 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@octokit/endpoint@^3.1.1": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.1.3.tgz#f6e9c2521b83b74367600e474b24efec2b0471c4" - integrity sha512-vAWzeoj9Lzpl3V3YkWKhGzmDUoMfKpyxJhpq74/ohMvmLXDoEuAGnApy/7TRi3OmnjyX2Lr+e9UGGAD0919ohA== +"@octokit/endpoint@^3.2.0": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.2.3.tgz#bd9aea60cd94ce336656b57a5c9cb7f10be8f4f3" + integrity sha512-yUPCt4vMIOclox13CUxzuKiPJIFo46b/6GhUnUTw5QySczN1L0DtSxgmIZrZV4SAb9EyAqrceoyrWoYVnfF2AA== dependencies: deepmerge "3.2.0" is-plain-object "^2.0.4" @@ -1346,32 +1346,36 @@ url-template "^2.0.8" "@octokit/plugin-enterprise-rest@^2.1.1": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-2.1.2.tgz#259bd5ac00825a8a482ff6584ae9aed60acd0b41" - integrity sha512-EWKrEqhSgzqWXI9DuEsEI691PNJppm/a4zW62//te27I8pYI5zSNVR3wtNUk0NWPlvs7054YzGZochwbUbhI8A== + version "2.2.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-2.2.2.tgz#c0e22067a043e19f96ff9c7832e2a3019f9be75c" + integrity sha512-CTZr64jZYhGWNTDGlSJ2mvIlFsm9OEO3LqWn9I/gmoHI4jRBp4kpHoFYNemG4oA75zUAcmbuWblb7jjP877YZw== -"@octokit/request@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-2.4.0.tgz#729fc5ea7654ab7cb74e0ae1935f69462a33b5e6" - integrity sha512-Bm2P0duVRUeKhyepNyFg5GX+yhCK71fqdtpsw5Rz+PQPjSha8HYwPMF5QfpzpD8b6/Xl3xhTgu3V90W362gZ1A== +"@octokit/request@2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-2.4.2.tgz#87c36e820dd1e43b1629f4f35c95b00cd456320b" + integrity sha512-lxVlYYvwGbKSHXfbPk5vxEA8w4zHOH1wobado4a9EfsyD3Cbhuhus1w0Ye9Ro0eMubGO8kNy5d+xNFisM3Tvaw== dependencies: - "@octokit/endpoint" "^3.1.1" + "@octokit/endpoint" "^3.2.0" + deprecation "^1.0.1" is-plain-object "^2.0.4" node-fetch "^2.3.0" + once "^1.4.0" universal-user-agent "^2.0.1" "@octokit/rest@^16.16.0": - version "16.16.3" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.16.3.tgz#89b64b1f5ed1f85cfd1925f0c4b968c403b895db" - integrity sha512-8v5xyqXZwQbQ1WsTLU3G25nAlcKYEgIXzDeqLgTFpbzzJXcey0C8Mcs/LZiAgU8dDINZtO2dAPgd1cVKgK9DQw== + version "16.21.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.21.0.tgz#858b99d0d454a9c9746c0e9ed01654fb8b7f5204" + integrity sha512-4tT+uUPqwOHfPdSSt8RtSZw6vgAbBMTGb+BualKkq3vjpeqmSfmN9h5VxhM4xqV1KAGCeLzBGdH6nwgf18eEPA== dependencies: - "@octokit/request" "2.4.0" - before-after-hook "^1.2.0" + "@octokit/request" "2.4.2" + before-after-hook "^1.4.0" btoa-lite "^1.0.0" + deprecation "^1.0.1" lodash.get "^4.4.2" lodash.set "^4.3.2" lodash.uniq "^4.5.0" octokit-pagination-methods "^1.1.0" + once "^1.4.0" universal-user-agent "^2.0.0" url-template "^2.0.8" @@ -1431,10 +1435,10 @@ version "10.11.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.11.1.tgz#adc48781dd50b2635a8a7854d99c759a26ede840" -"@types/node@11.9.5": - version "11.9.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.9.5.tgz#011eece9d3f839a806b63973e228f85967b79ed3" - integrity sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== "@types/prop-types@*": version "15.5.6" @@ -1691,7 +1695,7 @@ acorn@^6.0.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== -agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: +agent-base@4, agent-base@^4.1.0, agent-base@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== @@ -1761,10 +1765,10 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" -ansi-regex@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" - integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-styles@^2.2.1: version "2.2.1" @@ -2167,10 +2171,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.3.2.tgz#7bfbf844ad670aa7a96b5a4e4e15bd74b08ed66b" - integrity sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w== +before-after-hook@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== big.js@^3.1.3: version "3.2.0" @@ -2993,14 +2997,13 @@ cosmiconfig@^4.0.0: require-from-string "^2.0.1" cosmiconfig@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.1.0.tgz#6c5c35e97f37f985061cdf653f114784231185cf" - integrity sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q== + version "5.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" + integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== dependencies: import-fresh "^2.0.0" is-directory "^0.3.1" - js-yaml "^3.9.0" - lodash.get "^4.4.2" + js-yaml "^3.13.0" parse-json "^4.0.0" create-ecdh@^4.0.0: @@ -3346,6 +3349,11 @@ depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" +deprecation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-1.0.1.tgz#2df79b79005752180816b7b6e079cbd80490d711" + integrity sha512-ccVHpE72+tcIKaGMql33x5MAjKQIZrk+3x2GbJ7TeraUCZWHoT+KSZpoC+JQFsUBlSTXUrBaGiF0j6zVTepPLg== + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -4492,11 +4500,11 @@ handlebars@^4.0.3: uglify-js "^3.1.4" handlebars@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" - integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== + version "4.1.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.1.tgz#6e4e41c18ebe7719ae4d38e5aca3d32fa3dd23d3" + integrity sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA== dependencies: - async "^2.5.0" + neo-async "^2.6.0" optimist "^0.6.1" source-map "^0.6.1" optionalDependencies: @@ -5737,6 +5745,14 @@ js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +js-yaml@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" + integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^3.7.0: version "3.12.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" @@ -5975,7 +5991,7 @@ left-pad@^1.3.0: resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== -lerna@^3.13.1: +lerna@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.13.1.tgz#feaff562176f304bd82329ca29ce46ab6c033463" integrity sha512-7kSz8LLozVsoUNTJzJzy+b8TnV9YdviR2Ee2PwGZSlVw3T1Rn7kOAPZjEi+3IWnOPC96zMPHVmjCmzQ4uubalw== @@ -6268,9 +6284,9 @@ lru-cache@^5.1.1: yallist "^3.0.2" macos-release@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.0.0.tgz#7dddf4caf79001a851eb4fba7fb6034f251276ab" - integrity sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.1.0.tgz#c87935891fbeb0dba7537913fc66f469fee9d662" + integrity sha512-8TCbwvN1mfNxbBv0yBtfyIFMo3m1QsNbKHv7PYIp/abRBKVQBXN7ecu3aeGGgT18VC/Tf397LBDGZF9KBGJFFw== make-dir@^1.0.0: version "1.3.0" @@ -6709,6 +6725,11 @@ neo-async@^2.5.0: version "2.5.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" +neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -8451,7 +8472,12 @@ selfsigned@^1.9.1: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" -"semver@2.x || 3.x || 4 || 5", semver@^5.5, semver@^5.5.1, semver@^5.6.0: +"semver@2.x || 3.x || 4 || 5", semver@^5.5.1: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^5.5, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -8641,17 +8667,17 @@ sockjs@0.3.19: uuid "^3.0.1" socks-proxy-agent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473" - integrity sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== dependencies: - agent-base "~4.2.0" - socks "~2.2.0" + agent-base "~4.2.1" + socks "~2.3.2" -socks@~2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.3.tgz#7399ce11e19b2a997153c983a9ccb6306721f2dc" - integrity sha512-+2r83WaRT3PXYoO/1z+RDEBE7Z2f9YcdQnJ0K/ncXXbV5gJ6wYfNAebYFYiiUjM6E4JyXnPY8cimwyvFYHVUUA== +socks@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" + integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ== dependencies: ip "^1.1.5" smart-buffer "4.0.2" @@ -8918,11 +8944,11 @@ strip-ansi@^4.0.0: ansi-regex "^3.0.0" strip-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - ansi-regex "^4.0.0" + ansi-regex "^4.1.0" strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" |