From a6e80f8aa919871df280c387446a4a92de0f0c69 Mon Sep 17 00:00:00 2001 From: Janis Streib <janis.streib@kit.edu> Date: Mon, 16 Dec 2024 18:07:33 +0100 Subject: [PATCH] CLEANUP: re-addded file lost due to repo split --- .gitlab-ci.yml | 173 +++++++++++++++++++++++++++++++++++++++++++++++ DEPLOYMENT.md | 36 ++++++++++ LICENSE | 21 ++++++ build_swagger.py | 48 +++++++++++++ logo.png | Bin 0 -> 8530 bytes the_netvs.svg | 74 ++++++++++++++++++++ 6 files changed, 352 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 DEPLOYMENT.md create mode 100644 LICENSE create mode 100644 build_swagger.py create mode 100644 logo.png create mode 100644 the_netvs.svg diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..81cc57d42 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,173 @@ +default: + image: debian-bookworm:latest + tags: + - netvs +cache: + key: + files: + - package-lock.json + paths: + - .npm_ci/ +before_script: + ## dependencies + - apt-get update -y + - command -v curl || apt-get -y install curl + - command -v git || apt-get -y install git + - apt-get -y install apt-transport-https gnupg2 + - test -e /etc/apt/sources.list.d/nodesource.list || curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - + - test -e /etc/apt/sources.list.d/nodesource.list || echo 'deb https://deb.nodesource.com/node_16.x bookworm main' > /etc/apt/sources.list.d/nodesource.list + - "echo -e 'Package: *\nPin: origin deb.nodesource.com\nPin-Priority: 900' > /etc/apt/preferences.d/nodesource_pin" + - if [ $CI_JOB_STAGE != "deploy" ]; then command -v npm || (apt-get update -y && apt-get install -y nodejs); fi + - if [ $CI_JOB_STAGE != "deploy" ]; then command -v pip3 || (apt-get update -y && apt-get install -y python3-pip); fi + - if [ $CI_JOB_STAGE != "deploy" ]; then (apt-get update -y && apt-get install -y python3-venv && python3 -m venv /venv && source /venv/bin/activate); fi + - if [[ $CI_JOB_STAGE != "deploy" ]]; then if [[ $CI_COMMIT_BRANCH == "devel" ]]; then /venv/bin/pip3 install git+https://gitlab.kit.edu/scc-net/netvs/api-generator.git@devel#egg=net-api-generator; else /venv/bin/pip3 install git+https://gitlab.kit.edu/scc-net/netvs/api-generator.git@main#egg=net-api-generator; fi; fi + - echo "${CI_COMMIT_SHORT_SHA},Job ID ${CI_JOB_ID}@${CI_RUNNER_DESCRIPTION}" + - sed "s&__LOCAL_BUILD__&${CI_COMMIT_SHORT_SHA},Job ID ${CI_JOB_ID}@${CI_RUNNER_DESCRIPTION}&g" netvs.config.js.example > netvs.config.js + - sed -i "s&__JOB_ID__&${CI_JOB_ID}&g" netvs.config.js + - sed -i "s&__COMMIT_SHORT_SHA__&${CI_COMMIT_SHORT_SHA}&g" netvs.config.js + - sed -i "s&__JOB_ID__&${CI_JOB_ID}&g" public/version.json + - sed -i "s&__COMMIT_SHORT_SHA__&${CI_COMMIT_SHORT_SHA}&g" public/version.json + - if [[ $CI_JOB_STAGE != "deploy" ]]; then npm ci --cache .npm_ci --prefer-offline; fi + - export NETDB_VERSION="4.1" +stages: + - build + - lint + - deploy + - e2e + +frontend-build: + stage: build + script: + - python3 build_swagger.py + - /venv/bin/net-api-generator es-webpack + - npm run build + artifacts: + expire_in: 7 days + paths: + - dist/ + - src/api-services.gen/ + needs: [] + interruptible: true +frontend-lint: + stage: lint + script: + - npm run lint-ci + allow_failure: false + needs: [] + interruptible: true + +frontend-audit: + stage: lint + script: + - npm audit --audit-level high + allow_failure: true + needs: [] + interruptible: true + +deploy_lab: + stage: deploy + script: + - 'command -v ssh-agent || ( apt-get install openssh-client -y )' + - eval $(ssh-agent -s) + - echo "${SSH_PRIVATE_KEY}" | base64 -d | tr -d '\r' | ssh-add - + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts + - chmod 644 ~/.ssh/known_hosts + - ssh www-netvs@netvs-lab.scc.kit.edu "${CI_PIPELINE_ID}" + environment: + name: lab + url: https://netvs-lab.scc.kit.edu + only: + - lab + needs: ["frontend-build"] + +deploy_devel: + stage: deploy + script: + - 'command -v ssh-agent || ( apt-get install openssh-client -y )' + - eval $(ssh-agent -s) + - echo "${SSH_PRIVATE_KEY}" | base64 -d | tr -d '\r' | ssh-add - + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts + - chmod 644 ~/.ssh/known_hosts + - ssh www-netvs@netvs-devel.scc.kit.edu "${CI_PIPELINE_ID}" + environment: + name: devel + url: https://netvs-devel.scc.kit.edu + only: + - devel + needs: ["frontend-build"] + interruptible: false +Odeploy_test: + stage: deploy + script: + - 'command -v ssh-agent || ( apt-get install openssh-client -y )' + - eval $(ssh-agent -s) + - echo "$SSH_PRIVATE_KEY" | base64 -d | tr -d '\r' | ssh-add - + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts + - chmod 644 ~/.ssh/known_hosts + - ssh www-netvs@netvs-test.scc.kit.edu "${CI_PIPELINE_ID}" + environment: + name: test + url: https://netvs-test.scc.kit.edu + only: + - prod + needs: ["frontend-build"] + interruptible: false + +deploy_prod: + stage: deploy + script: + - 'command -v ssh-agent || ( apt-get install openssh-client -y )' + - eval $(ssh-agent -s) + - echo "$SSH_PRIVATE_KEY" | base64 -d | tr -d '\r' | ssh-add - + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts + - chmod 644 ~/.ssh/known_hosts + - ssh www-netvs@netvs.scc.kit.edu "${CI_PIPELINE_ID}" + environment: + name: prod + url: https://netvs.scc.kit.edu + only: + - prod + needs: ["frontend-build"] + interruptible: false + +e2e_chrome: + stage: e2e + script: + - curl -s https://dl.google.com/linux/linux_signing_key.pub | apt-key add - + - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/chrome.list + - apt-get -y update && apt-get -y install google-chrome-stable + - npm run serve 2> /dev/null & + - sleep 45 && npx nightwatch --env chrome tests/specs + needs: ["frontend-build"] + allow_failure: true + artifacts: + when: always + paths: + - tests_output/ + - screens/ + reports: + junit: tests_output/**/*.xml + interruptible: true +#e2e_firefox: +# stage: e2e +# script: +# - apt-get -y update && apt-get -y install firefox-esr +# - cd frontend/ +# - npm run serve 2> /dev/null & +# - sleep 45 && npx nightwatch --env firefox tests/specs +# needs: ["frontend-build"] +# artifacts: +# when: always +# paths: +# - frontend/tests_output/ +# - frontend/screens/ +# reports: +# junit: frontend/tests_output/**/*.xml diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 000000000..9314bb423 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,36 @@ +# NETVS Deployment + +Instances: +- [Prod](https://netvs.scc.kit.edu) +- [Test](https://netvs-test.scc.kit.edu) +- [Devel](https://netvs-devel.scc.kit.edu) +- [Devel-Oldrelease](https://netvs-devel-oldrelease.scc.kit.edu) +- [Lab](https://netvs-lab.scc.kit.edu) + +```mermaid +flowchart LR + NETDB_PROD[(Prod)] + NETDB_TEST[(Test)] + NETDB_DEVEL[(Devel)] + Oldrel_inst[Oldrelease] + Test_inst[fa:fa-vial Test] + Lab_inst[fa:fa-vials Lab] + Prod_inst[Prod] + Devel_inst[fa:fa-dumpster-fire Devel] + Devel{{`devel`}} + Lab{{`lab`}} + Main{{`main`}} + + Devel-->D{Feature working\n&&\nNETVS Target API\nsupported by\nNETDB Prod} + Devel <--> Lab + D -->|Yes| Main + D -->|No| Devel + + Lab -.->|deploys to| Lab_inst + Devel -.->|deploys to| Devel_inst + Main -.->|deploys to| Prod_inst & Oldrel_inst & Test_inst + + Lab_inst & Devel_inst & Oldrel_inst -.->|uses| NETDB_DEVEL + Prod_inst -.->|uses| NETDB_PROD + Test_inst -.->|uses| NETDB_TEST +``` diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..18b74de1a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 KIT | Scientific Computing Center - Abteilung Netze + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/build_swagger.py b/build_swagger.py new file mode 100644 index 000000000..d60780a19 --- /dev/null +++ b/build_swagger.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +from typing import Optional + +import requests +import os, subprocess, sys + +default_endpoint = os.environ.get('CI_COMMIT_BRANCH', 'test') +api_generator = os.environ.get('API_GENERATOR', '/venv/bin/net-api-generator') + +if default_endpoint == 'devel': + api_endpoint = os.environ.get('NETDB_DEVEL_ENDPOINT') +else: + api_endpoint = os.environ.get('NETDB_ENDPOINT') + +endpoint_protocol = os.environ.get('NETDB_ENDPOINT_PROTOCOL', 'https') + +os.environ['NETDB_ENDPOINT'] = api_endpoint + +data = requests.get('{}://{}'.format(endpoint_protocol, api_endpoint)).json()[0] + +highest_api_version = None + + +def exec_command_into_file(command: list[str], file: Optional[str], env: dict[str, str | None]): + p = subprocess.Popen(command, env=env, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, err = p.communicate() + p.wait() + if file is not None: + with open(file, 'w') as f: + f.write(stdout.decode('utf-8')) + if len(err.decode('utf-8')) > 0: + print(err.decode('utf-8'), file=sys.stderr) + sys.exit(1) + + +for api_version in data: + version_string = "{}.{}".format(api_version['major'], api_version['minor']) + if highest_api_version is None or highest_api_version < version_string: + highest_api_version = version_string + e = dict(os.environ) + e['NETDB_VERSION'] = version_string + print('Generating API for version {}'.format(version_string)) + exec_command_into_file([api_generator, 'openapi', '--default_endpoint='+default_endpoint], 'public/api_{}.yml'.format(version_string.replace('.', '_')), e) + +e = dict(os.environ) +e['NETDB_VERSION'] = highest_api_version +print('Generating TA schema for version {}'.format(highest_api_version)) +exec_command_into_file([api_generator, 'ta-schema'], 'public/netdb_{}_ta.yml'.format(highest_api_version.replace('.', '_')), e) diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b08f3b3b90fe9bfc7d46e8d6923df8afe13eae4 GIT binary patch literal 8530 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 F{{g5Br<DKz literal 0 HcmV?d00001 diff --git a/the_netvs.svg b/the_netvs.svg new file mode 100644 index 000000000..9ba884d45 --- /dev/null +++ b/the_netvs.svg @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="146.21mm" + height="146.21mm" + version="1.1" + viewBox="0 0 146.21 146.21" + id="svg9" + sodipodi:docname="the_netvs.svg" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs9"> + <rect + x="413.32136" + y="374.21474" + width="66.099282" + height="140.30408" + id="rect10" /> + <rect + x="66.999895" + y="140.90735" + width="429.04921" + height="74.836658" + id="rect9" /> + </defs> + <sodipodi:namedview + id="namedview9" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="0.6831284" + inkscape:cx="141.9938" + inkscape:cy="289.1111" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg9" /> + <rect + width="146.21" + height="146.21" + fill="#ffff00" + stroke-linejoin="round" + stroke-width="3.2112" + id="rect1" + inkscape:export-filename="../the_hpc.png" + inkscape:export-xdpi="34.744545" + inkscape:export-ydpi="34.744545" /> + <text + xml:space="preserve" + transform="scale(0.26458333)" + id="text9" + style="font-size:53.3333px;white-space:pre;shape-inside:url(#rect9);display:inline;fill:none;stroke:#000000;stroke-width:1.88976;stroke-linecap:square;stroke-linejoin:round;paint-order:stroke markers fill" /> + <text + xml:space="preserve" + transform="scale(0.26458333)" + id="text10" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:53.3333px;font-family:Arial;-inkscape-font-specification:'Arial Bold';white-space:pre;shape-inside:url(#rect10);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:square;stroke-linejoin:round;paint-order:stroke markers fill" /> + <path + style="fill:#000000;stroke-width:0.211765" + d="m 134.23391,85.376249 c -2.58463,-0.149132 -4.1526,-0.860467 -5.23249,-2.373797 -0.64799,-0.908082 -0.98949,-1.887459 -1.12051,-3.213522 l -0.0291,-0.294154 h 2.03239 2.03239 l 0.0645,0.415164 c 0.1708,1.09863 0.81171,1.870214 1.82352,2.195331 0.39031,0.125419 0.58847,0.150988 1.35372,0.174701 0.7603,0.02358 0.98056,0.01033 1.45013,-0.08707 0.92719,-0.192324 1.48004,-0.552745 1.78917,-1.166422 0.36632,-0.727209 0.34802,-1.737071 -0.0417,-2.302636 -0.41634,-0.604161 -1.04529,-0.873142 -3.11353,-1.331547 -2.16898,-0.480739 -3.31162,-0.820183 -4.21185,-1.251235 -1.45489,-0.696629 -2.3943,-1.817766 -2.68274,-3.201716 -0.14196,-0.681164 -0.15315,-1.844514 -0.0242,-2.514923 0.42522,-2.2103 2.08917,-3.68574 4.66433,-4.135922 0.80386,-0.14053 3.20386,-0.140489 3.9073,6.4e-5 2.27569,0.454705 3.79629,1.496435 4.59644,3.148948 0.30723,0.634491 0.46877,1.247849 0.51279,1.947018 l 0.0344,0.546286 h -2.05354 -2.05354 l -9.1e-4,-0.21011 c -0.001,-0.305819 -0.14609,-0.872527 -0.3011,-1.177691 -0.45904,-0.903749 -1.21166,-1.268339 -2.61159,-1.265135 -1.44942,0.0032 -2.10276,0.313311 -2.51566,1.193616 -0.1293,0.275685 -0.14573,0.38021 -0.14572,0.927043 2e-5,0.732661 0.11766,1.06642 0.50012,1.418963 0.55989,0.516084 1.25559,0.767588 3.1978,1.15604 1.53517,0.307044 3.06692,0.75018 3.86756,1.118893 0.61773,0.284478 1.16231,0.673299 1.60653,1.147047 0.87774,0.936086 1.22142,1.906288 1.22142,3.448114 0,1.54041 -0.51591,2.840321 -1.53396,3.865052 -1.09377,1.100933 -2.53526,1.642583 -4.85058,1.822636 -0.81115,0.06308 -1.05353,0.06319 -2.13193,9.1e-4 z M 8.8402409,77.534296 V 69.914847 L 6.16484,69.900282 3.4894393,69.885718 3.4746021,68.190829 3.4597649,66.495943 h 7.3686821 7.368678 v 1.708894 1.708895 h -2.661392 -2.661392 v 7.61999 7.619991 H 10.857284 8.8402269 Z M 20.830522,75.824855 v -9.328884 h 2.04507 2.04507 v 3.754401 3.754397 l 3.403784,-0.01443 3.40378,-0.01443 0.01438,-3.739961 0.01438,-3.739955 h 2.016661 2.016657 v 9.328885 9.328884 h -2.017053 -2.017057 v -3.838008 -3.838009 h -3.417788 -3.417793 v 3.838009 3.838008 h -2.04507 -2.045071 z m 18.937915,0 v -9.328884 h 5.490876 5.490875 v 1.568823 1.56882 h -3.445806 -3.4458 v 2.269189 2.269189 h 3.4458 3.445806 v 1.568819 1.568824 h -3.445806 -3.4458 v 2.353229 2.353233 h 4.258227 4.258229 v 1.568824 1.568819 H 46.07174 39.768437 Z m 21.179094,0 v -9.328884 h 2.151261 2.151261 l 3.443425,5.9251 c 3.341732,5.750113 3.448637,5.925625 3.619761,5.942665 l 0.176335,0.01757 v -5.942674 -5.942659 h 1.961026 1.961031 v 9.329549 9.329549 l -2.137015,-0.01465 -2.137016,-0.0147 -3.451914,-5.911092 C 65.296985,73.411776 65.230441,73.30321 65.05168,73.285974 l -0.182097,-0.01757 v 5.94266 5.942664 h -1.961026 -1.961026 z m 19.442179,0 v -9.328884 h 5.490876 5.490876 v 1.568396 1.568395 l -3.45981,0.01443 -3.459815,0.01443 v 2.241176 2.241171 l 3.459815,0.01443 3.45981,0.01443 v 1.567964 1.567968 l -3.45981,0.01443 -3.459815,0.01443 v 2.32522 2.325216 l 4.244225,0.01438 4.244224,0.01438 v 1.568469 1.568469 H 86.665 80.38971 Z m 18.993952,1.708894 v -7.619986 h -2.661394 -2.661396 v -1.708898 -1.708894 h 7.368678 7.36868 l -0.0148,1.694889 -0.0148,1.694886 -2.64739,0.01456 -2.64738,0.01456 v 7.61944 7.619444 h -2.04508 -2.045068 z m 16.611198,7.549956 c -0.35294,-0.950618 -6.02166,-18.27558 -6.02166,-18.403626 v -0.184108 h 2.05979 2.05979 l 1.08307,3.627903 c 0.59569,1.995342 1.52557,5.109173 2.06642,6.91962 l 0.98334,3.291722 0.17405,-6.3e-5 0.17405,-6.4e-5 1.08389,-3.627835 c 0.59614,-1.995306 1.52672,-5.10911 2.06795,-6.919557 l 0.98406,-3.291726 h 2.06421 2.06421 l 0.003,0.154079 c 0.002,0.08475 -1.36623,4.282637 -3.0396,9.328648 l -3.0425,9.174569 -2.36899,2.09e-4 c -1.84416,1.87e-4 -2.37476,-0.01525 -2.395,-0.06979 z M 82.367539,64.766788 c -0.829444,-0.2866 -1.302063,-0.969929 -1.303538,-1.884709 -9.1e-4,-0.699464 0.166022,-1.134079 0.596851,-1.551886 0.804595,-0.780278 2.370274,-0.707817 3.06657,0.141922 0.362706,0.442635 0.452826,0.717807 0.452594,1.381949 -2.14e-4,0.748931 -0.11721,1.039819 -0.596401,1.483465 -0.256633,0.237602 -0.412333,0.331056 -0.699114,0.419635 -0.468923,0.144834 -1.113809,0.148925 -1.516962,0.0096 z m 5.88977,0.0053 c -0.888152,-0.316615 -1.359383,-1.07093 -1.300835,-2.08228 0.04595,-0.793896 0.452621,-1.402252 1.158561,-1.73316 0.277847,-0.13024 0.384088,-0.147542 0.903194,-0.147095 0.528919,4.55e-4 0.623645,0.01677 0.938352,0.161624 0.416784,0.191838 0.748241,0.52984 0.957659,0.976568 0.131742,0.28103 0.149064,0.386329 0.149064,0.906283 0,0.519457 -0.01739,0.625391 -0.148559,0.905174 -0.185232,0.395106 -0.542363,0.749312 -0.944018,0.936279 -0.414013,0.192724 -1.279189,0.231405 -1.713418,0.07661 z" + id="path1" /> +</svg> -- GitLab