From c95e8dfe17f9ebf48ece6450c7bab40d7546ee0d Mon Sep 17 00:00:00 2001 From: sebdet Date: Tue, 25 Jun 2019 11:06:06 +0200 Subject: [PATCH] Frontend initial draft New frontend initial draft in React with docker image in nginx Issue-ID: CLAMP-413 Change-Id: Ie5826d79aa3db23f863e8fd217189ba41534abe9 Signed-off-by: sebdet --- .gitignore | 2 + pom.xml | 36 ++++++++++--- src/main/docker/Dockerfile | 34 ------------ src/main/docker/backend/Dockerfile | 57 +++++++++++++++++++++ .../clamp-files.xml => backend/backend-files.xml} | 17 +----- src/main/docker/frontend/Dockerfile | 52 +++++++++++++++++++ src/main/docker/frontend/frontend-files.xml | 43 ++++++++++++++++ .../kibana/{Dockerfile.kibana => Dockerfile} | 0 .../logstash/{Dockerfile.logstash => Dockerfile} | 16 ++++-- src/main/resources/boot-message.txt | 19 +++---- ui-react/nginx/nginx.conf | 17 ++++++ ui-react/package.json | 27 ++++++++++ ui-react/public/index.html | 18 +++++++ ui-react/public/manifest.json | 15 ++++++ ui-react/public/onap.ico | Bin 0 -> 18046 bytes ui-react/src/images/logo_onap_2017.png | Bin 0 -> 21360 bytes ui-react/src/index.css | 50 ++++++++++++++++++ ui-react/src/index.js | 46 +++++++++++++++++ 18 files changed, 379 insertions(+), 70 deletions(-) delete mode 100644 src/main/docker/Dockerfile create mode 100644 src/main/docker/backend/Dockerfile rename src/main/docker/{assembly/clamp-files.xml => backend/backend-files.xml} (80%) create mode 100644 src/main/docker/frontend/Dockerfile create mode 100644 src/main/docker/frontend/frontend-files.xml rename src/main/docker/kibana/{Dockerfile.kibana => Dockerfile} (100%) rename src/main/docker/logstash/{Dockerfile.logstash => Dockerfile} (64%) create mode 100644 ui-react/nginx/nginx.conf create mode 100644 ui-react/package.json create mode 100644 ui-react/public/index.html create mode 100644 ui-react/public/manifest.json create mode 100644 ui-react/public/onap.ico create mode 100644 ui-react/src/images/logo_onap_2017.png create mode 100644 ui-react/src/index.css create mode 100644 ui-react/src/index.js diff --git a/.gitignore b/.gitignore index f70506ad0..ed38c1320 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ target .buildpath .idea *.iml +ui-react/node_modules +ui-react/build **/logs/ **/.evosuite/ **/debug-logs/ diff --git a/pom.xml b/pom.xml index ec1033b05..79cf2a982 100644 --- a/pom.xml +++ b/pom.xml @@ -1025,8 +1025,8 @@ - onap/clamp - onap-clamp + onap/clamp-backend + onap-clamp-backend true @@ -1039,10 +1039,32 @@ - Dockerfile + backend/Dockerfile - assembly/clamp-files.xml - onap-clamp + backend/backend-files.xml + onap-clamp-backend + + + + + onap/clamp-frontend + onap-clamp-frontend + + true + + + true + + latest + ${project.docker.latesttagtimestamp.version} + ${project.docker.latesttag.version} + + + frontend/Dockerfile + + frontend/frontend-files.xml + onap-clamp-frontend @@ -1059,7 +1081,7 @@ ${project.docker.latesttagtimestamp.version} ${project.docker.latesttag.version} - logstash/Dockerfile.logstash + logstash/Dockerfile @@ -1075,7 +1097,7 @@ ${project.docker.latesttagtimestamp.version} ${project.docker.latesttag.version} - kibana/Dockerfile.kibana + kibana/Dockerfile diff --git a/src/main/docker/Dockerfile b/src/main/docker/Dockerfile deleted file mode 100644 index c47d6229e..000000000 --- a/src/main/docker/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM openjdk:8u191-jdk-alpine3.9 - -MAINTAINER "The Onap Team" -LABEL Description="This immage contains alpine, openjdk 11 and clamp" - -ARG http_proxy -ARG https_proxy -ENV HTTP_PROXY=$http_proxy -ENV HTTPS_PROXY=$https_proxy -ENV http_proxy=$HTTP_PROXY -ENV https_proxy=$HTTPS_PROXY - -RUN addgroup onap && adduser -D -G onap clamp -VOLUME /opt/clamp/config -RUN mkdir /var/log/onap -RUN chmod a+rwx /var/log/onap - -COPY onap-clamp/clamp.jar /opt/clamp/app.jar -RUN chmod 700 /opt/clamp/app.jar - -RUN chown -R clamp:onap /opt/clamp - -RUN apk add fontconfig -RUN apk add ttf-dejavu - -RUN ln -s /usr/lib/libfontconfig.so.1 /usr/lib/libfontconfig.so && \ - ln -s /lib/libuuid.so.1 /usr/lib/libuuid.so.1 && \ - ln -s /lib/libc.musl-x86_64.so.1 /usr/lib/libc.musl-x86_64.so.1 - -ENV LD_LIBRARY_PATH /usr/lib - -USER clamp -WORKDIR /opt/clamp/ -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Xms256m", "-Xmx1g", "-jar" ,"./app.jar"] diff --git a/src/main/docker/backend/Dockerfile b/src/main/docker/backend/Dockerfile new file mode 100644 index 000000000..9e5c8d8b1 --- /dev/null +++ b/src/main/docker/backend/Dockerfile @@ -0,0 +1,57 @@ +### +# ============LICENSE_START======================================================= +# ONAP CLAMP +# ================================================================================ +# Copyright (C) 2018 AT&T 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============================================ +# =================================================================== +# +### + +FROM openjdk:8u191-jdk-alpine3.9 + +MAINTAINER "The Onap Team" +LABEL Description="This immage contains alpine, openjdk 11 and clamp" + +ARG http_proxy +ARG https_proxy +ENV HTTP_PROXY=$http_proxy +ENV HTTPS_PROXY=$https_proxy +ENV http_proxy=$HTTP_PROXY +ENV https_proxy=$HTTPS_PROXY + +RUN addgroup onap && adduser -D -G onap clamp +VOLUME /opt/clamp/config +RUN mkdir /var/log/onap +RUN chmod a+rwx /var/log/onap + +COPY onap-clamp-backend/clamp.jar /opt/clamp/app.jar +RUN chmod 700 /opt/clamp/app.jar + +RUN chown -R clamp:onap /opt/clamp + +RUN apk add fontconfig +RUN apk add ttf-dejavu + +RUN ln -s /usr/lib/libfontconfig.so.1 /usr/lib/libfontconfig.so && \ + ln -s /lib/libuuid.so.1 /usr/lib/libuuid.so.1 && \ + ln -s /lib/libc.musl-x86_64.so.1 /usr/lib/libc.musl-x86_64.so.1 + +ENV LD_LIBRARY_PATH /usr/lib + +USER clamp +WORKDIR /opt/clamp/ +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Xms256m", "-Xmx1g", "-jar" ,"./app.jar"] diff --git a/src/main/docker/assembly/clamp-files.xml b/src/main/docker/backend/backend-files.xml similarity index 80% rename from src/main/docker/assembly/clamp-files.xml rename to src/main/docker/backend/backend-files.xml index e4e9875c5..7a9c6f530 100644 --- a/src/main/docker/assembly/clamp-files.xml +++ b/src/main/docker/backend/backend-files.xml @@ -1,6 +1,6 @@ @@ -39,20 +38,6 @@ ${project.build.directory} / - - - >etc/config/** - - ${project.build.directory} - / - - - - etc/keystore/** - - ${project.build.directory} - / - diff --git a/src/main/docker/frontend/Dockerfile b/src/main/docker/frontend/Dockerfile new file mode 100644 index 000000000..8c755b039 --- /dev/null +++ b/src/main/docker/frontend/Dockerfile @@ -0,0 +1,52 @@ +### +# ============LICENSE_START======================================================= +# ONAP CLAMP +# ================================================================================ +# Copyright (C) 2019 AT&T 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============================================ +# =================================================================== +# +### + +# build environment +FROM node:12.4-alpine as build +WORKDIR /app +#ENV PATH /app/node_modules/.bin:$PATH +COPY onap-clamp-frontend/ /app/ +RUN npm install --silent +RUN npm run build + +FROM nginx:1.17.0-alpine + +MAINTAINER "The Onap Team" +LABEL Description="This image contains Clamp frontend" + +ARG http_proxy +ARG https_proxy +ENV HTTP_PROXY=$http_proxy +ENV HTTPS_PROXY=$https_proxy +ENV http_proxy=$HTTP_PROXY +ENV https_proxy=$HTTPS_PROXY + +RUN addgroup onap && adduser -D -G onap clamp +RUN mkdir /var/log/onap +RUN chmod a+rwx /var/log/onap + +COPY --from=build /app/build /usr/share/nginx/html +RUN rm /etc/nginx/conf.d/default.conf +COPY onap-clamp-frontend/nginx/nginx.conf /etc/nginx/conf.d +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/src/main/docker/frontend/frontend-files.xml b/src/main/docker/frontend/frontend-files.xml new file mode 100644 index 000000000..2610e828e --- /dev/null +++ b/src/main/docker/frontend/frontend-files.xml @@ -0,0 +1,43 @@ + + + + clamp-files + + + tar.gz + + false + + + + + + node_modules + + ${project.basedir}/ui-react + / + + + + diff --git a/src/main/docker/kibana/Dockerfile.kibana b/src/main/docker/kibana/Dockerfile similarity index 100% rename from src/main/docker/kibana/Dockerfile.kibana rename to src/main/docker/kibana/Dockerfile diff --git a/src/main/docker/logstash/Dockerfile.logstash b/src/main/docker/logstash/Dockerfile similarity index 64% rename from src/main/docker/logstash/Dockerfile.logstash rename to src/main/docker/logstash/Dockerfile index f3075099c..73988dc79 100644 --- a/src/main/docker/logstash/Dockerfile.logstash +++ b/src/main/docker/logstash/Dockerfile @@ -1,17 +1,25 @@ -# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved. -# +### +# ============LICENSE_START======================================================= +# ONAP CLAMP +# ================================================================================ +# Copyright (C) 2018 AT&T 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============================================ +# =================================================================== +# +### FROM docker.elastic.co/logstash/logstash-oss:6.6.2 MAINTAINER "The Onap Team" diff --git a/src/main/resources/boot-message.txt b/src/main/resources/boot-message.txt index 92e4ab029..46b0a6faa 100644 --- a/src/main/resources/boot-message.txt +++ b/src/main/resources/boot-message.txt @@ -1,14 +1,15 @@ - _____ _ _ __ ____ ____ __ __ ____ __ ____ _ _ -( _ )( \( ) /__\ ( _ \ ( _ \( )( )( _ \( ) (_ _)( \( ) - )(_)( ) ( /(__)\ )___/ )(_) ))(__)( ) _ < )(__ _)(_ ) ( -(_____)(_)\_)(__)(__)(__) (____/(______)(____/(____)(____)(_)\_) - ___ __ __ __ __ ____ - / __)( ) /__\ ( \/ )( _ \ - ( (__ )(__ /(__)\ ) ( )___/ - \___)(____)(__)(__)(_/\/\_)(__) - + ▐ ▄ ▄▄▄· ▄▄▄· ▄▄▄ .▄▄▌ ▄▄▄· ▄▄▌ ▄▄▄▄▄ +▪ •█▌▐█▐█ ▀█ ▐█ ▄█ ▀▄.▀·██• ▐█ ▀█ ██• •██ ▪ + ▄█▀▄ ▐█▐▐▌▄█▀▀█ ██▀· ▐▀▀▪▄██▪ ▄█▀▀█ ██▪ ▐█.▪ ▄█▀▄ +▐█▌.▐▌██▐█▌▐█ ▪▐▌▐█▪·• ▐█▄▄▌▐█▌▐▌ ▐█ ▪▐▌▐█▌▐▌▐█▌·▐█▌.▐▌ + ▀█▄▀▪▀▀ █▪ ▀ ▀ .▀ ▀▀▀ .▀▀▀ ▀ ▀ .▀▀▀ ▀▀▀ ▀█▄▀▪ + ▄▄· ▄▄▌ ▄▄▄· • ▌ ▄ ·. ▄▄▄· + ▐█ ▌▪██• ▐█ ▀█ ·██ ▐███▪▐█ ▄█ + ██ ▄▄██▪ ▄█▀▀█ ▐█ ▌▐▌▐█· ██▀· + ▐███▌▐█▌▐▌▐█ ▪▐▌██ ██▌▐█▌▐█▪·• + ·▀▀▀ .▀▀▀ ▀ ▀ ▀▀ █▪▀▀▀.▀ :: Starting :: \ No newline at end of file diff --git a/ui-react/nginx/nginx.conf b/ui-react/nginx/nginx.conf new file mode 100644 index 000000000..758a646e5 --- /dev/null +++ b/ui-react/nginx/nginx.conf @@ -0,0 +1,17 @@ +server { + + listen 80; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + error_page 500 502 503 504 /50x.html; + + location = /50x.html { + root /usr/share/nginx/html; + } + +} \ No newline at end of file diff --git a/ui-react/package.json b/ui-react/package.json new file mode 100644 index 000000000..c8197d1e6 --- /dev/null +++ b/ui-react/package.json @@ -0,0 +1,27 @@ +{ + "name": "clamp-ui", + "version": "0.0.1", + "description": "ONAP Clamp Designer UI", + "main": "index.js", + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + }, + "author": "ONAP Clamp Team", + "license": "Apache-2.0", + "dependencies": { + "json-editor": "^0.7.28", + "react": "~16.8.0", + "react-dom": "~16.8.0", + "react-scripts": "~3.0.1", + "onap-ui-react":"0.1.1" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 11", + "not op_mini all" + ] +} diff --git a/ui-react/public/index.html b/ui-react/public/index.html new file mode 100644 index 000000000..85267426d --- /dev/null +++ b/ui-react/public/index.html @@ -0,0 +1,18 @@ + + + + + + + + + + +Clamp Designer UI + + + +
+ + diff --git a/ui-react/public/manifest.json b/ui-react/public/manifest.json new file mode 100644 index 000000000..8210c4ee5 --- /dev/null +++ b/ui-react/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Clamp Designer UI", + "name": "Clamp Designer UI", + "icons": [ + { + "src": "onap.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/ui-react/public/onap.ico b/ui-react/public/onap.ico new file mode 100644 index 0000000000000000000000000000000000000000..85e168ae291dcb3544a5eebe11c3746f4e887d48 GIT binary patch literal 18046 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 I%G?wGe=EX2F8}}l literal 0 HcmV?d00001 diff --git a/ui-react/src/index.css b/ui-react/src/index.css new file mode 100644 index 000000000..86e0f9e4b --- /dev/null +++ b/ui-react/src/index.css @@ -0,0 +1,50 @@ +.nav { + margin-left: 2px; + margin-right: 2px; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.rowC { + display: flex; + flex-direction:row; +} +.logo { + font-family: 'Trebuchet MS', cursive; + font-size: 20px; + font-weight: 500; + text-align: center; +} +.image_style { + display: inline-block; + float: left; +} +.dummy { + float: right; + padding-right: 50px; +} +.user_name { + display: block; + float: left; + font-family: 'Trebuchet MS', cursive; + font-size: 15px; + font-weight: 500; + height: 50px; + text-align: right; +} + +.ClampHeader { + margin-left: 2px; + margin-right: 2px; +} + +.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } \ No newline at end of file diff --git a/ui-react/src/index.js b/ui-react/src/index.js new file mode 100644 index 000000000..fed8c0f41 --- /dev/null +++ b/ui-react/src/index.js @@ -0,0 +1,46 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; + +class UserBar extends React.Component { + render () { + const user = this.props.user; + return ( +
Hello:{user} +
+ ); + } +} + +class ClampLogo extends React.Component { + render() { + return ( +
+ +
+    + CLAMP +
+
+ ); + } +} + +class ClampHeader extends React.Component { + render() { + return ( +
+ +
+ +
+ ); + } +} + +ReactDOM.render( + , + document.getElementById('root') +) -- 2.16.6