From 2cb3ecc182f10562a286206ac111f5663e478124 Mon Sep 17 00:00:00 2001 From: trantzas Date: Mon, 18 Dec 2023 17:18:04 +0000 Subject: [PATCH 01/23] test main documentation branch --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index c0a5595..a101f20 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,6 +1,6 @@ # Project information site_name: Openslice -site_description: Openslice - Open source OSS +site_description: Openslice - Open source OSS - main site_author: Openslice.io site_url: http://openslice.io -- GitLab From b2bfda920f869798858a799cc0917b6a4d5e1517 Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 19 Dec 2023 11:10:58 +0000 Subject: [PATCH 02/23] Setting up versioning --- mkdocs.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index a101f20..0666111 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,11 +2,11 @@ site_name: Openslice site_description: Openslice - Open source OSS - main site_author: Openslice.io -site_url: http://openslice.io +site_url: https://osl.etsi.org/ # Repository repo_name: openslice -repo_url: https://github.com/openslice +repo_url: https://labs.etsi.org/rep/osl edit_uri: "" docs_dir: doc @@ -47,6 +47,8 @@ extra: link: https://github.com/openslice - type: twitter link: https://twitter.com/OpensliceOSS + version: + provider: mike # Page tree nav: -- GitLab From 96baa6cc28ac6ee43d07b6db6c1235e912b57af3 Mon Sep 17 00:00:00 2001 From: Miguel Angel Reina Ortega Date: Tue, 19 Dec 2023 11:28:11 +0000 Subject: [PATCH 03/23] Fixing python version --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6c38ff2..fedf490 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ pages: stage: deploy - image: python:latest + image: python:3.9.18-slim-bullseye script: - pip install mkdocs-material - mkdocs build --site-dir public -- GitLab From 3400420298a8c251fc214d6414905f3c483ee5ed Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 19 Dec 2023 11:38:24 +0000 Subject: [PATCH 04/23] repo name changes --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 0666111..a105af6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,7 +5,7 @@ site_author: Openslice.io site_url: https://osl.etsi.org/ # Repository -repo_name: openslice +repo_name: OSL GitLab repo_url: https://labs.etsi.org/rep/osl edit_uri: "" docs_dir: doc -- GitLab From 95e76195e1bd8410fefda0e3fe645caffbcb5bec Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 19 Dec 2023 13:59:51 +0000 Subject: [PATCH 05/23] using mkdocs-material --- mkdocs.yml | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index a105af6..83d4d28 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -17,35 +17,52 @@ docs_dir: doc # remote_branch: gh-pages # Theme and overrides, i.e. language partial +# https://squidfunk.github.io/mkdocs-material/creating-your-site/ theme: - name: mkdocs + name: material # Don't include MkDocs' JavaScript - include_search_page: false - search_index_only: true + #include_search_page: false + #search_index_only: true # Default values, taken from mkdocs_theme.yml language: en - feature: - tabs: true +# feature: +# tabs: true + features: + - navigation.instant + - navigation.instant.progress + - navigation.tabs + - navigation.tabs.sticky + - navigation.top + - navigation.footer + - search + - search.highlight + palette: - primary: 'teal' - accent: 'light blue' + primary: 'blue' + accent: 'teal' + logo: 'images/openslice_logo.png' + icon: + repo: fontawesome/brands/gitlab + # Copyright copyright: "Copyright © 2019-2023 Openslice Project" # Options extra: - search: - languages: "en" +# search: +# languages: "en" social: - - type: globe - link: http://openslice.io - - type: github-alt - link: https://github.com/openslice - - type: twitter + - type: fontawesome/classic/globe + link: https://osl.etsi.org/ + - type: fontawesome/brands/gitlab + link: https://labs.etsi.org/rep/osl + - type: fontawesome/brands/linkedin + link: https://www.linkedin.com/company/openslice/ + - type: fontawesome/brands/x-twitter link: https://twitter.com/OpensliceOSS version: provider: mike -- GitLab From 6fcd71d0040260f54324755c5a2111eae3701a93 Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 19 Dec 2023 16:10:13 +0000 Subject: [PATCH 06/23] updated mkdocs.yml with correct social icon properties --- mkdocs.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 83d4d28..ce232da 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -56,13 +56,13 @@ extra: # search: # languages: "en" social: - - type: fontawesome/classic/globe + - icon: fontawesome/classic/globe link: https://osl.etsi.org/ - - type: fontawesome/brands/gitlab + - icon: fontawesome/brands/gitlab link: https://labs.etsi.org/rep/osl - - type: fontawesome/brands/linkedin + - icon: fontawesome/brands/linkedin link: https://www.linkedin.com/company/openslice/ - - type: fontawesome/brands/x-twitter + - icon: fontawesome/brands/x-twitter link: https://twitter.com/OpensliceOSS version: provider: mike -- GitLab From 3b16f934ac3548883af82285620e30f2ba71bd2d Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 19 Dec 2023 16:13:04 +0000 Subject: [PATCH 07/23] updated mkdocs.yml with correct social icon properties --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index ce232da..787ecab 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -56,7 +56,7 @@ extra: # search: # languages: "en" social: - - icon: fontawesome/classic/globe + - icon: fontawesome/solid/globe link: https://osl.etsi.org/ - icon: fontawesome/brands/gitlab link: https://labs.etsi.org/rep/osl -- GitLab From 82a61cb76522eb2871475eaaa3eea0e34186adfc Mon Sep 17 00:00:00 2001 From: trantzas Date: Wed, 20 Dec 2023 16:22:35 +0000 Subject: [PATCH 08/23] changed logo + site_name --- doc/images/logo_osl.png | Bin 0 -> 16566 bytes mkdocs.yml | 11 +++++------ 2 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 doc/images/logo_osl.png diff --git a/doc/images/logo_osl.png b/doc/images/logo_osl.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa5efc135209ce66cee07ea7a76dc0a4cff9244 GIT binary patch literal 16566 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 Date: Wed, 20 Dec 2023 16:28:06 +0000 Subject: [PATCH 09/23] changed logo + description --- doc/images/logo_osl.png | Bin 16566 -> 15556 bytes mkdocs.yml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/images/logo_osl.png b/doc/images/logo_osl.png index 2fa5efc135209ce66cee07ea7a76dc0a4cff9244..e6eb89a7da94edc6ea26dcb1972d9e101b0dffee 100644 GIT binary patch literal 15556 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 F`9GVZepdhh literal 16566 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 Date: Wed, 20 Dec 2023 16:28:56 +0000 Subject: [PATCH 10/23] changed theme color --- mkdocs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index b92a324..28705e9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -39,8 +39,8 @@ theme: - search.highlight palette: - primary: 'blue' - accent: 'teal' + primary: 'indigo' + accent: 'blue' logo: 'images/logo_osl.png' -- GitLab From 45a842bacd10de8b945a4bab53967dfee194d49a Mon Sep 17 00:00:00 2001 From: trantzas Date: Thu, 21 Dec 2023 09:35:37 +0000 Subject: [PATCH 11/23] updated links with ETSI gitlab repo --- doc/contributing/developing.md | 2 +- doc/deployment.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/contributing/developing.md b/doc/contributing/developing.md index 7e4523e..80fbc0d 100644 --- a/doc/contributing/developing.md +++ b/doc/contributing/developing.md @@ -7,7 +7,7 @@ Openslice uses various subsystems and depending on the module would you like to To get the latest development branch: ``` -wget https://raw.githubusercontent.com/openslice/org.etsi.osl.main/develop/compose/deploy.sh +wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/develop/compose/deploy.sh sudo ./deploy.sh develop [or replace develop with other branch name] ``` diff --git a/doc/deployment.md b/doc/deployment.md index ff6417c..09e6712 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -16,7 +16,7 @@ _NOTE:_ Since July 2023 Docker Compose V1 stopped receiving updates. Openslice 3 - Download environment preparation script ``` -wget https://raw.githubusercontent.com/openslice/org.etsi.osl.main/master/compose/deploy.sh +wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/main/compose/deploy.sh ``` 4 - Work with main/master branch: -- GitLab From ec4c65810a884398e2522f2f3c996c73cdc79964 Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Tue, 16 Jan 2024 18:11:30 +0200 Subject: [PATCH 12/23] Cosmetic changes to documentation page (primary color/logo/title) --- doc/images/logo_osl_square.png | Bin 0 -> 7391 bytes mkdocs.yml | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 doc/images/logo_osl_square.png diff --git a/doc/images/logo_osl_square.png b/doc/images/logo_osl_square.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f8684e95a987b15dacb02675bd3ac9ec7ed091 GIT binary patch literal 7391 zcmcI}cQ~8T`*)1mwSpQoBZyix+EA33K|+mMHQL&grdF*|qoS%-tVoR-5w$9Ijg}Cb zqIPMcs8KqMqUx7^zrXAK|GlpF{o`EEIiLIU+-E%JxzByyC&>b7be=_!1pok?ha2l# z0su5fYO!ZxpdyDceJ0cgO`xR_3{W$Aaf8~R_tZt`0sya5S^wNVM{P6TH?|K10QkWF z3Ju&+@;d-G4sPJ>3)oO2aV2qQ|hz&qS)EuSC)L+G&T^DPIu-dQu=$4xETl zMH7p+9k)u{Ub-?%pR}S84K*1(cp- z&lJCLy@CCy&TUc7^=`4@0~l>teBwpUby&qwk=pQ-P^K5ijxM29Z1mjtEGwc=J61t+ zmi%UV5>LR!8wWzNnSbUTX;7PdbKFySsWC7uUIyI^dwholwPAl zX5Ua8ZTcxPbTl4Eb= zJH<^aQ-*8ap5auv0XlaDj$uoYL)jS@vO$noop>9sj~BxZ$oDBz24+BX9b0uF(T1q_ zgj;%IQTX_@f`o$&3C!Q&PxQFZv%7NGrj_RD!UjTy&}uPtJO*ndnbS`F9-avB(kc+K zO}Tn1bbR>xBWSFEABJnQGZMa<(IBaqa_fW0_{~1W;>{zklrYi^eb|BSA>|?hE1QQm zt3S7QETbY!uus%n!26<}OCaDzhgzG(5wC{rwkkWi{QHUb+IT&8Q;G`QT9e=}358vW zItAY*%AgTh<$`juzDC!~V6}K{$?!--x@Ufn^r%P~fq`RPTU*Dsxx>9U!*eW4FO>=x zVA;6ojk3z#?;3z?I;s*jdql#T^lT~HV4!a9uXI0EgYh^W8+#q0Ake4?QXQ6i0(vY< zhd6b1WO1VVRH#5A>~~EW%$mqddb#gRTs!{c9o1?G2mCG%Lp5o>A}F-B_10+~i}|#| z`xyxVSU%4o;h?N6Rl32+&0~Cl%FvZZ-VQkVY&UMLxp;Z*v}`@g+QjwoMp|v}n>hI^ zaTs@)R?tX8cGQEB-=%PrkCRGpdf536`vK*sB42#ts_>QTzf07qcwHG$xDof(q5Qgo zpwpd>NzsucVwrfTn$%lGte00=kSBEM0wRf+6^1bR6=JcmWOA;D@wF(H3qSagub!^D z5H*i*Y*3x@8C0P&BLruT^zGS$~ONM1aFjJ#%#7xpI+{8WN3Pq8WJ&pshL-E(_!rG*RM z+=$4!qZ;RWVF_yxIlJ%)h7-BA5&59!qGnB~@{GO61q zg1fHHz=L-Stt@UY+zATEfRAvKpjpO%k|47cwz>>L;+V`PI0*9gc| z(2#qKS9nvYE~7^U1Rt(T#DT{x%{PxLxt>X7m0+P-DPpK~9XoDwW*WpxWosZFU(R`6 zoZ5c#iNE@io*F8=)m&qh4fA%$ufA`~HLManIVr77?$u@1lsC9>L*ASh6)v#g`iIGc z0^a(f;Zh(=*;B69ZDI!h$Ou-RY}H(&>{*r*o0$0?4rr)9i?AQ=-6%8j{KzQxJwwK# zMlrb+sueVuw?J>&-HHruwfSat+h%am$%W4fzPy3K8U-KZ2FWdw@@W%oF zz@20L2Bw3ZZm$Y`TdSL8+H!Gu)UGdhv(UWd&P|%^DHb`NItPIAsG!2_mP^eTW57y4 z&u{yP!61Mg3lJ5a`ya4Oi3{HcvQ#Fr{V(oQE(cb5<@!bdAeWQ`_1!i1{3;B{Ch6lE zh4d~G&H+sCNQ`2J<@81%fS58Fh0*yG@xC;GtM}7n;=yxq_WS2z${B(j|$hMR{Mk1RkkkI1%=Spb-# z3aIbc{fQg@C1`8{EMi|$s{bg=hKplqUxav5Y1OG#|qcTT6LzSm66_#vW~2S8{KzcYS~V<=02Pj1EZ? zspB&-WDHR4>9wwNb9d(z?iLx9kjgLV!(7;a|GH<2? zmlxMY8>DhC4d!kIL@PqBCPUlyNgII{SE@Kz;g{FfZLetg@I8gz_Odn{yZ6(WZ%{U8 z8)oVZA=r~7NBN`pzeJ+HMi@D=%FB*oulnfW>dw2{1rAPe*R%bQ8BL>}Hp_^M$J$Yx zDLOY$^|r$8mu+)z`i3p_s;3hVUa@tCK9)f8({`kXGFz1qroYJzjpq1k7htdkU(hQ0 zT|?^jUSnWQN_@?Yqz>QnRxq0@HgTBoDwy!8UK-E7F40%s+ElnhExnCTTKa8j@=`^3 zPx(^6)fCT~zKPdOR0ULe@68g}A__q)>aeiJEe10Ahza;d03$fdTYfF%!;9^EEh)HM zkVSR+LEYcEMriBMs$E6U;?3->^WSuHfsMUkC#SYEV{Z0RkIS9oAP$Pl$xky+D&u%% z>6+a&!a)%cCDXHNJWohY+)-)X8shumGMJ-gY!n|a-k7?zb62+uo$Sjy*BXf@uR;qD zEF-eoEr-*`c^LN@eZAy4PZa9W&e4TTOCs9HrM>A9-#7?MT*SC)enaTKqy;k&W- zR^Lo(o8D8F(M3_WeFz~&dv5x2066YwU|$iO;K6m=>|1wF({Dzw!PzRxX*C-6ZnJBD z{kW~y*X0&Yt=UQTYt>=G;11%A?Ova+`^ffE;x6?y-V^pN#onfEtGHjqfA-EogSS>> zPCwh$gAkQ_tM&aesroG6@)?)?GCf`)igHi7 zy7Do3?(Ko(012+_jW#~mnw0Ag0p8DQWn>pxAZn>2`uY)_1H&&|=bYq7_O*40WHr?k z_uRc}{56=}<>dab99evRt$Md`d?h~h4Qby^0?Abiw@dsR^?g9fdvk2BvEbpi5$Q~2 z;!_7l`SqgP```CDhV~Z2zSoIg%-J%PJIYN8oSBa|P|E(2nqIn5Y<9TFKf&hl@O*r2 zw11(b+)N`KB=XkjwZuD8qx09$JeaLcemJ&UFK@@4Z1L0%_ZbzFhz?xfe%qOwWHsl! z$=JZww$*9;jcI}sl{&%GI22^C(UZ(^+Yw%Uqhu-~+$z2Vj>y@3c_7vvyVJ&DN$%dC z(n=*n31)QvIxa`6^wgE!Bzo@5bsl%7{dVxJRF^F1{2Tt0v61b`=dDbQx)M+Cr}KKd zEbi?~%;a>{8(hkvt%@S?9L=aJYR^^E^Zj$s53OnZl88?s?S<2iWE4L}YC=?o9&UB4 z&y4jc{`iS#xAM!;?D20yUoXuUjNyQv)=hJrJ$T1Z?es*Tmq*L5WYO>&@hX1&!Q)U0 zdrM8u!x6_*Zky+m=#sy-XTs(qr8UiUpM#jzC{-N+PP&;D>;x5H&LBY3>V!!>p((5h zh6~n$*cJ#86kMu>LSQ`R>sBGe41dgR>O0;Z!L9bIP70>Ks%PuU5W+a)wI=VN;8kYpXc5m>ELx+tHb#4I z;a(mb3_U!pNpggg)zJzYIJqx~8lU(iF8kF~MU)+9xP@<`0+0W?f$Kh zy{Iy2wMw+r!>|7#rOCeEUoKMy1UwwL;<#BprYle(%V(o}n^1E$U6>;?WJPttavnHw z?W)G~z_Y$~aI~5~Y{8H7$g_1c8>^w7wnmtnG6udF%Gi8qT3Yhywtpatush?Bl?_hh zpvIg_w3*{16I(1)rhj-pXpyI2SAI&vrg!6WMJohz`e6LW=Te4`IncAZbC{1|vzgin z>!2?V_)2I3Rt1v&fk~~(H5y~ncfOb_gc0GjEe);{e80Kvamo4uJ`tGNU38=2I>AW@ z#MZ`YeqKCb{hIxOPB4mvgYlyIyVrpy#h26Uu%;rFpI*!#nsDeb@=fx{CjawX5tbJ9 z>m~MW7Fdv4yk^!{ma#+L&2twh!|Hs?vNCh)nS$2^-5txCxt-p3x8_%`z;F_W3L#~2 z3MY}4b8Ae}qJ)b#?Qt2l)vojd3|A?8xxt$}(zB!ebLEL|ZuaRmdB+K%SOVUaZOsa?2N)QR8*X4{71Xf6on;Z4o``AqD1B zagCQF3vK1Gev^Emls#hBwfn6<` z|9N!GK_Qv49p*pzN|kr`-u#Lsu6xq|rBd2D9R-*cz6}1d>Pmsmf~^^wDO2+DmXx2I zZAYj5rG{zYOPM=1SeAp*nRnID1bk*Dh2OpaWo10)S^F^CBcQq0i+P5!7v$_IYl!iz zgiLLPXFzK0EH8<-nS2n!2qNsdkr1*IDG+@s1|RHc!{jU-Hk zrlI0i!Pu>~AVaMD@`3H@&iiWVjM$(24u(|i2APy8!Ixwp=1M|=@7AGGhKwGnDV#gw zNuMKR1V1h)_xmNB`o%;0aKN?*k7ST3;d1HpLHVV-ze27Ks{fdd7^{t@{jN`>@Ca&} zGY7l2~073q?&~5vHt!K zxxE(oe};IyHkrRUb9v=cMN7z66Wq&Q$?e(V=XFpk~8EwwdqYubh6~d#t)pYKnTg z^u<2e0?YF1d7B%-5FRk+&TmX~YU9O!g%_wn)z!m{abN-6Y%8T#b61>_t@b3w1WR`c zJ0%C3REZVJ?Y;8pCkzvQg*&~F@HEf!lpCdb%?_2onrD`GuY%mN2s+p(rFf{p*3YVU z+7VM=GCWN~#tx(ha?f0ViSii}Ii7Igz3dCr(7i{BXMdaV63;+jW{Tf9(`Irp2_iYh zx31}XpBf){lEOY;D>OEFJS$>My#55ZuJ3#8nGYvN7ijd)_;az+Inkb{Rt*i!9eq*B zcTkTG=gh&YI;C+P>;F? z@vXkuH_q58*2Y3@vWa6CLmopf=)Z|DVIOsYhTl6?oZ}RATO>k1$j>D00|Iq$tSZ&f z*_;*i4yM!vT=f+-H^Hyw#t&#neTjjx-Y_Z3zSR-l=!i1O-BwJD(#0j%I}~NV*#CX- zw(zXmD3jX<(yw%znG?^&T`{f0aZkd&AR{O;GSU$D6!Xl1NiB*~O70w`DhBB?ANp*d zO_wM67o%dN6hx}F__ajampW=1RRT-*;mRmZd8tizZEBaRxQteQzaydBddk4p| zDQ-mjGWTjl6;;UE2~mBd^$3!xHV&;x23^C`WdAr0V8&skG{BJ#%a;Oke}4x z)RWX|9%uXulPQ)3H^~50|D#glWlz#kui~Sh*73z`J!w3=!#7~HV#rx)cs(G1lAThe z<>w_a6VaiZPOT5zPkCd0=-`x+lg*tpLC6>E97?iipa)lNpzO|486Epws!F~LH#y`0 zkE=eX^srRHy7dvek_44g^29=B)M)gDWAr&!xql+HZ2eYtP%KnDxwi0nv>^_&^^aF? zoV67+b6b^D+AUpnCfGyzt+5!g->_%582aHJBR?~Vd5(ndzJy7leMU=(?--x=kU?Vg zmAKKs0}1VtOewBs^i% zbXssXlNb_;p7P?hm)>Ki#K$ECywaU!?udhacJ0^rHw-zdTcCTQPFg%22k2-b<($!!qi+VjpF{DiQj~_quD5Y+R&N?^?wh>g{PikF+TE|!q zJPHbGp!S$grI}Q^c`AuGFrr{6OQ#U`mk>#ZtlxsT8DuF$RkV_<+wzHq#4JTxxXk{KAf2~D`x@|7XxIJj2m;ntOHm(l!XMu;vPFkHWhwQ0+ zVV z3A=*D8oDYSoU6&LN_=0&&Yy#|&Eth-$J6bUfT~9iPEB8xIGR`acbqJ4{@oqRUiooU z$PI}(hX$G@5l31ybCg_u_j+cECq25qTfHBuEv9{zSp}4%>U$z7V4|S#K6-zY2*3S= zYe?mh84}0H$|;@8m9z1=U_U~%Gl$1r*19b*ene_8nEJQH3jFYfiwD+^D0T0T{zeHP zVkfAx0y(F$-QdgP{!(s1=MBsA{oUe6j{hep!9Z7bG${Y6-*qH(R_7P6R3{-xsYA>r z7J?*Z4-$DO!SPa-ZaID4Q)-5y^RFWZI#hxN!|<;sanT?5RM)b%nwO)4Pp^t-2PakM zxYAJQt-3*9B-`ugYLKlVtYvQMz1Ko(s=H2TP155G@8RLi~Uqbm3np!u&(DR z@s*{@{jK785{L>KO8lnrBSHl8Jr?&o)z~8Hz1gBt^=*@vsCB2gGLr~)Sq6^(zn5zN gmsfOm8jr6>&}H*BDgU;jUP=Ps21xxHm}~6+0G*t^_W%F@ literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index 28705e9..a551771 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,6 +1,6 @@ # Project information -site_name: ETSI OSL SDG Documentation -site_description: This is ETSI OSL SDG Documentation page +site_name: ETSI SDG OSL Documentation +site_description: ETSI SDG OSL Documentation page site_author: OpenSlice by ETSI site_url: https://osl.etsi.org/ @@ -39,10 +39,10 @@ theme: - search.highlight palette: - primary: 'indigo' + primary: 'teal' accent: 'blue' - logo: 'images/logo_osl.png' + logo: 'images/logo_osl_square.png' icon: repo: fontawesome/brands/gitlab -- GitLab From f3601b896a5a6255b4e05e745255a5936d039b77 Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Fri, 19 Jan 2024 17:44:31 +0200 Subject: [PATCH 13/23] Cosmetic changes on the logo and primary color --- doc/images/logo_osl_square.png | Bin 7391 -> 64579 bytes doc/images/logo_osl_square_non_transp.png | Bin 0 -> 7391 bytes doc/images/openslice_logo.png.png | Bin 0 -> 16566 bytes ...nslice_logo.png => openslice_logo_old.png} | Bin mkdocs.yml | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/images/logo_osl_square_non_transp.png create mode 100644 doc/images/openslice_logo.png.png rename doc/images/{openslice_logo.png => openslice_logo_old.png} (100%) diff --git a/doc/images/logo_osl_square.png b/doc/images/logo_osl_square.png index a7f8684e95a987b15dacb02675bd3ac9ec7ed091..37cbc4ba60771e54c3ea2f18fa89a7e3af387360 100644 GIT binary patch literal 64579 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 z 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 E12f_TBme*a literal 7391 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 diff --git a/doc/images/logo_osl_square_non_transp.png b/doc/images/logo_osl_square_non_transp.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f8684e95a987b15dacb02675bd3ac9ec7ed091 GIT binary patch literal 7391 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 literal 0 HcmV?d00001 diff --git a/doc/images/openslice_logo.png.png b/doc/images/openslice_logo.png.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa5efc135209ce66cee07ea7a76dc0a4cff9244 GIT binary patch literal 16566 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 Date: Fri, 19 Jan 2024 19:41:58 +0200 Subject: [PATCH 14/23] Cosmetic changes to the logo and primary color --- doc/images/favicon.png | Bin 0 -> 822 bytes ...{openslice_logo.png.png => openslice_logo.png} | Bin mkdocs.yml | 5 +++-- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/images/favicon.png rename doc/images/{openslice_logo.png.png => openslice_logo.png} (100%) diff --git a/doc/images/favicon.png b/doc/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c71ab91aa15c554b3d9a228207938182cdefa00 GIT binary patch literal 822 zcmV-61Ihe}P)w@ob=?#e(&zPU*EeBGb2wZ zodf`kuBV=D7XYRJ#%$tQuA&0*0-$u#1TX^7tDx%?KvES*1^}g#2tW$pu&OsILpJfC z763{oeE=VF_DZL=yTvP9+WL8Ht~W@9BH&{8SgsV&{lixycf?GWsEx_ zA-}d>wY0AC0cZ|wIj-B&3feVTSO-1;rCTTmgyg(yt+Z%A;pC%D1Q%@L@LvE_m4>sw zR_JdNK&IEr3K0cFG$NuY5%GHMAJCr%4{1h32@y4S0jO(uY(+0QyF~Zw5|H)z3-({U z#8+j`IT3Bumb=_&RTU$oiHfeb1a-iH^ zBy#zTJf6eDBN-mhG)cw8NLVSJziaYAGx$shRC!(=$4rCLP z1%Rc`bt+m9tnM%(1s3k|USx|0bc}NEbOE+$&qpo%)XC{Y!MeuRo|j_P3==AdH|oV& zHeK=i7xoJD9jWoscZ!#a*~C&0($7O3Fg6kR@f`=w_8X1b<4&8CT{(B9@Q;a4?%k(v zZ{J}OJzMhotkd>#!QBCn8xN~K-Z}B!6@WnLJ8-$+zW`7W(yohJiGl#Ay0j}6ddv0e z=vc4%2UnMj{E!va)l(}4ng)r2biho9jp_p6FNq}Mtcv1RmH+?%07*qoM6N<$f(LVT AZ~y=R literal 0 HcmV?d00001 diff --git a/doc/images/openslice_logo.png.png b/doc/images/openslice_logo.png similarity index 100% rename from doc/images/openslice_logo.png.png rename to doc/images/openslice_logo.png diff --git a/mkdocs.yml b/mkdocs.yml index 57bbc5b..a7cc2e7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -39,10 +39,11 @@ theme: - search.highlight palette: - primary: 'cean' + primary: 'cyan' accent: 'blue' - logo: 'images/logo_osl_square.png' + logo: 'images/logo_osl.png' + favicon: images/favicon.png icon: repo: fontawesome/brands/gitlab -- GitLab From b7ec20d9aefac03ead8b422a5811681d79d67cf2 Mon Sep 17 00:00:00 2001 From: Dimitrios Giannopoulos Date: Tue, 23 Jan 2024 15:18:31 +0000 Subject: [PATCH 15/23] Fix/multi version --- .gitlab-ci.yml | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fedf490..20f28f1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,11 +1,31 @@ pages: stage: deploy image: python:3.9.18-slim-bullseye + variables: + PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" + PAGES_BRANCH: gl-pages + HTTPS_REMOTE: https://gitlab-ci-token:${ACCESS_TOKEN}@${CI_SERVER_HOST}/rep/${CI_PROJECT_PATH}.git + before_script: + - pip install -q mkdocs-material mike + - apt-get update -qq && apt-get -qq install -y git > /dev/null + - git config --global --replace-all user.name $GITLAB_USER_NAME + - git config --global --replace-all user.email $GITLAB_USER_EMAIL + - git fetch origin $PAGES_BRANCH && git checkout $PAGES_BRANCH || git checkout -b $PAGES_BRANCH origin/$PAGES_BRANCH || echo "Pages branch not deployed yet." + - git checkout $CI_COMMIT_SHA script: - - pip install mkdocs-material - - mkdocs build --site-dir public + - | + if [ -n "$CI_COMMIT_TAG" ]; then + mike deploy --deploy-prefix public -r $HTTPS_REMOTE -p -b $PAGES_BRANCH -u $CI_COMMIT_TAG latest + mike set-default --deploy-prefix public -r $HTTPS_REMOTE -p -b $PAGES_BRANCH latest + elif [ "$CI_COMMIT_REF_NAME" == "develop" ]; then + mike deploy --deploy-prefix public -r $HTTPS_REMOTE -p -b $PAGES_BRANCH -u $CI_COMMIT_BRANCH + fi + - git checkout $PAGES_BRANCH -- public/ artifacts: paths: - - public + - public/ rules: - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + - if: '$CI_COMMIT_TAG' + - if: '$CI_COMMIT_REF_NAME == "develop"' + when: always + - when: never \ No newline at end of file -- GitLab From 958b07fa23dfec7c08779ce9d4a8ac1b47ad68b9 Mon Sep 17 00:00:00 2001 From: Silvia Almagia Date: Thu, 25 Jan 2024 10:31:44 +0000 Subject: [PATCH 16/23] Add LICENSE --- LICENSE | 331 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..396a29e --- /dev/null +++ b/LICENSE @@ -0,0 +1,331 @@ +OSL documentation (c) by ETSI + +OSL documentation is licensed under a +Creative Commons Attribution 4.0 International License. + +You can fine the license below and at . + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + + -- GitLab From 1726b13e643aa915b56433eb3b056f57b707db9e Mon Sep 17 00:00:00 2001 From: Silvia Almagia Date: Thu, 25 Jan 2024 10:32:54 +0000 Subject: [PATCH 17/23] Delete README.md --- README.md | 92 ------------------------------------------------------- 1 file changed, 92 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 2992dde..0000000 --- a/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# documentation - - - -## Getting started - -To make it easy for you to get started with GitLab, here's a list of recommended next steps. - -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: - -``` -cd existing_repo -git remote add origin https://labs.etsi.org/rep/osl/documentation.git -git branch -M main -git push -uf origin main -``` - -## Integrate with your tools - -- [ ] [Set up project integrations](https://labs.etsi.org/rep/osl/documentation/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. -- GitLab From 8199fc2910cea88b34363c598c1eb8281578d4dc Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Thu, 25 Jan 2024 15:14:42 +0200 Subject: [PATCH 18/23] Changes on index page (latest/release0 documentation) --- doc/index.md | 20 ++++++++++---------- mkdocs.yml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/index.md b/doc/index.md index 3b68017..f74e48f 100644 --- a/doc/index.md +++ b/doc/index.md @@ -1,6 +1,6 @@ drawing -version: 2023-Q3 1.2.0-SNAPSHOT +version: 2023Q4 - Release 0 Openslice is a prototype open source, operations support system. It supports VNF/NSD onboarding to OpenSourceMANO (OSM) and NSD deployment management. It also supports TMFORUM OpenAPIs regarding Service Catalog Management, Ordering, Resource, etc. @@ -22,13 +22,13 @@ There are two portals offering UI friendly access to users: Service Specifications reside into Service Catalogs, grouped in Categories. Openslice offers a Service Orchestrator called [OSOM](./architecture/osom.md). OSOM instantiates Service Specifications by requesting Network Services from target MANOs/NFVOs. NFV artifacts reside into a VNF/NSD catalog and are onboarded to a target MANO/NFV Orchestrator. Service Specifications reference NSD from the VNF/NSD catalog. -Customers make Service Orders and Openslice instantiates the requested Service Specifications of the Service Order. Running Services instantiated by Openslice, reside in Openslice Service Inventory. The following picture displays how Service Specifications are related to Running Services and how Running Services relate with instantiated running Network Services. (See also [Service Inventory](./service_inventory.md) ) +Customers make Service Orders and Openslice instantiates the requested Service Specifications of the Service Order. Running Services instantiated by Openslice, reside in Openslice Service Inventory. The following picture displays how Service Specifications are related to Running Services and how Running Services relate with instantiated running Network Services. (See also [Service Inventory](./service_inventory.md)) [![Openslice Service Specification instantiation](./images/service_specification_instantiation.png)](./images/service_specification_instantiation.png) ## Service Lifecycle Rules -Openslice constains support for defining rules of services, affecting their behavior. See [LCm Rules](./lcm.md) +Openslice constains support for defining rules of services, affecting their behavior. See [LCM Rules](./lcm.md). ## Multidomain scenarios and federation @@ -36,9 +36,9 @@ Openslice can be used to exchange service specifications/catalogs and make servi [![Openslice Service Specification instantiation](./images/multi-domain-organizations.png)](./images/multi-domain-organizations.png) -An Identity federation is also possible since our authentication service is based on Keycloak (see [OAuth](./architecture/oauth.md) ) +An Identity federation is also possible since our authentication service is based on Keycloak (see [OAuth](./architecture/oauth.md)). -See more on [Consuming Services From External Partner Organizations](./architecture/consumingServicesFromExternalPartners.md) +See more on [Consuming Services From External Partner Organizations](./architecture/consumingServicesFromExternalPartners.md). ## Live Demo @@ -57,13 +57,13 @@ See more on [Consuming Services From External Partner Organizations](./architect ## Installing -See [Deployment/Installation](./deployment.md) +See [Deployment/Installation](./deployment.md). --- ## Hardware requirements -The complete environment consists of microservices deployed as docker containers. Portainer is also installed to monitor them at port 9000 +The complete environment consists of microservices deployed as docker containers. Portainer is also installed to monitor them at port 9000. If you would like to operate all APIs, OSOM, the Mysql Server, nginx, etc then you need at least: @@ -84,12 +84,12 @@ However you can try with a minimum installation on a VM on a laptop with: For a quick access check our swagger links: -* TMF APIs: -* API for VNF/NSD management: +* TMF APIs: +* API for VNF/NSD management: ## Source code -Get source code here: +Get source code here: ## Contributing diff --git a/mkdocs.yml b/mkdocs.yml index a7cc2e7..2236d6a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,7 +49,7 @@ theme: repo: fontawesome/brands/gitlab # Copyright -copyright: "Copyright © 2019-2023 Openslice Project" +copyright: "Copyright © 2019-2024 Openslice Project" # Options extra: -- GitLab From 1f017d0b4875a026322840a347684b31c5124876 Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Fri, 9 Feb 2024 19:16:45 +0200 Subject: [PATCH 19/23] Main documentation refreshing/housekeeping. It is focused on a smoother installation guide. --- doc/contributing/developing.md | 76 ++-- doc/deployment.md | 698 ++++++++++++++++++--------------- doc/index.md | 61 +-- 3 files changed, 453 insertions(+), 382 deletions(-) diff --git a/doc/contributing/developing.md b/doc/contributing/developing.md index 80fbc0d..72a79fc 100644 --- a/doc/contributing/developing.md +++ b/doc/contributing/developing.md @@ -1,84 +1,84 @@ # Developing -Openslice backend services are mainly implemented with Java 17 or above and Spring boot. +OpenSlice backend services are mainly implemented with Java 17 or above and Spring boot. -Openslice uses various subsystems and depending on the module would you like to work, other subsystems must be present (you can disable them though in the code, e.g. at application.yml file) +OpenSlice uses various subsystems and depending on the module would you like to work, other subsystems must be present (you can disable them though in the code, e.g. at docker-compose.yaml file). To get the latest development branch: -``` +```bash wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/develop/compose/deploy.sh -sudo ./deploy.sh develop [or replace develop with other branch name] +sudo ./deploy.sh develop #[or replace develop with other branch name] ``` -## Slack - -* Slack: https://openslice.slack.com - -## General subsystems +You may follow the [installation process](https://osl.etsi.org/documentation/develop/deployment/), as described at "develop" tagged documentation. -- Docker and Docker Compose should be installed in your development environment +To work on a specific subsystem e.g. org.etsi.osl.tmf.api, you must: -### Consul -consul service registry should be up and running. You can launch consul with docker: -`sudo docker run -d --name consul -p 8500:8500 -p 8600:8600 consul` +1a - Deploy only the core necessary subsystems through: +```bash +sudo docker compose --profile dev down;sudo docker compose --profile dev up -d --build +``` +> Note **--profile dev** that will only deploy the core dependency subsystems, instead of the whole OpenSlice. -### ActiveMQ -ActiveMQ is our messaging system. You can launch an instance of ActiveMQ: -`sudo docker run --name='activemq' -d -e 'ACTIVEMQ_NAME=amqp-srv1' -e 'ACTIVEMQ_REMOVE_DEFAULT_ACCOUNT=true' -e 'ACTIVEMQ_ADMIN_LOGIN=admin' -e 'ACTIVEMQ_ADMIN_PASSWORD=admin' -e 'ACTIVEMQ_WRITE_LOGIN=producer_login' -e 'ACTIVEMQ_WRITE_PASSWORD=producer_password' -e 'ACTIVEMQ_READ_LOGIN=consumer_login' -e 'ACTIVEMQ_READ_PASSWORD=consumer_password' -e 'ACTIVEMQ_JMX_LOGIN=jmx_login' -e 'ACTIVEMQ_JMX_PASSWORD=jmx_password' -e 'ACTIVEMQ_STATIC_TOPICS=topic1;topic2;topic3' -e 'ACTIVEMQ_STATIC_QUEUES=queue1;queue2;queue3' -e 'ACTIVEMQ_MIN_MEMORY=1024' -e 'ACTIVEMQ_MAX_MEMORY=4096' -e 'ACTIVEMQ_ENABLED_SCHEDULER=true' -v /home/ctranoris/testcompose/data/activemq:/data/activemq -v /var/log/activemq:/var/log/activemq -p 8161:8161 -p 61616:61616 -p 61613:61613 webcenter/activemq:5.14.3` +1b - Or alternatively, commend out the respective container from the docker-compose.yaml file, so as to deploy the whole OpenSlice, except the subsystem you want to work on, following the provided installation steps. -### MySQL server -We use mysql as a storage DB. Please make sure that you have it installed in your system. There are instructions on internet how to install it. Check also our docker-compose installation script +2 - Clone the respective repository, e.g. https://labs.etsi.org/rep/osl/code/org.etsi.osl.tmf.api/-/tree/develop +3 - Code :) -## Oauth server +## General requirements -Keycloak is used as the authentication server. +- Docker should be installed in your development environment +- Run the core subsystems (see above sections) -> Note: Please check the Post installation steps -> Keycloak at localhost, at [Deployment/Installation](../deployment.md), if you are developing in a local environment +## Slack -## VNF/NSD Catalog Management and NSD Deployment API service +Feel free to join OpenSlice [Slack](https://openslice.slack.com) for any development oriented questions -Clone the repository: https://github.com/openslice/org.etsi.osl.portal.api +## Examples on developing on specific subsystems -Check the application.yml file. Default port is 13080. Especially the datasource username/password, server port. +### VNF/NSD Catalog Management and NSD Deployment API service -make sure that the General subsystems are up and running as well as the OAuth server +Clone the repository: https://labs.etsi.org/rep/osl/code/org.etsi.osl.portal.api/-/tree/develop -run it with `mvn spring-boot:run` +Check the docker-compose.yml file. Default port is 13080. Check specifically the datasource username/password, server port. -You can check your consul server if it registered. +Make sure that the core subsystems are up and running. -### Swagger API -Swagger API of the service is at `http://localhost:13000/osapi/swagger-ui/`. You can try there various REST actions and authenticate via the OAuth server +Execute it with +```bash +mvn spring-boot:run +``` +For verification, Swagger API of the service is at `http://localhost:13000/osapi/swagger-ui/index.html`. -## VNF/NSD Catalog Management and NSD Deployment WEB UI service +There, you may try there various REST actions and authenticate via the OAuth server without the use of the UI. -The Web UI is written in AngularJS -Clone the repository: https://github.com/openslice/org.etsi.osl.portal.web +### VNF/NSD Catalog Management and NSD Deployment WEB UI service -by default the project org.etsi.osl.portal.api exposes the folder ../org.etsi.osl.portal.web/src/ in a folder testweb (Check class MvcConfig.java in org.etsi.osl.portal.api) for development. (In production nginx is used). Point your browser to `http://localhost:13000/osapi/testweb/index.html/` +The Web UI is written in AngularJS. +Clone the repository: https://labs.etsi.org/rep/osl/code/org.etsi.osl.portal.web/-/tree/develop ---- +By default the project org.etsi.osl.portal.api exposes the folder ../org.etsi.osl.portal.web/src/ in a folder testweb (Check class MvcConfig.java in org.etsi.osl.portal.api) for development. (In production nginx is used). Point your browser to `http://localhost:13000/osapi/testweb/index.html/` ## Version/release management -Check this nice article on how we develop and release versions +Check this nice article on how we develop and release versions. https://nvie.com/posts/a-successful-git-branching-model/ -We develop in the develop branch +We develop in the develop branch and follow a issue driven development model. --- ## Wishlist -Check also our wishlist of new features. You can add your own +Check also our wishlist of new features. You can add your own. -See [Wishlist](./wishlist.md) +See [Wishlist](./wishlist.md). diff --git a/doc/deployment.md b/doc/deployment.md index 09e6712..197d693 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -1,274 +1,512 @@ -# Preparing the environment +## Requirements -Note: See the Kubernetes section, if you would like to deploy Openslice in a Kubernetes cluster +### Hardware requirements: -
-1 - Backup your previous database if necessary: -``` +| **Minimum Hardware Requirements** | **Recomended Hardware Requirements** | +| --------------------------------- | ------------------------------------ | +| 4 CPU cores | 8 CPU cores | +| 8 GB RAM | 16 GB RAM | +| 20 GB storage | 40 GB storage | + +### Software Requirements: + +* Docker (Docker Compose installation) +* Kubernetes (Kubernetes installation - experimental) + + +## Preparing the environment + +> See the [Kubernetes section](##Kubernetes-installation), if you would like to deploy OpenSlice in a Kubernetes cluster. + + +### 1. Backup your previous database if necessary: +```bash sudo docker exec amysql /usr/bin/mysqldump -u root --password=letmein ostmfdb > backup_ostmfdb.sql ``` +### 2. Install docker - 2 - Install docker - -_NOTE:_ Since July 2023 Docker Compose V1 stopped receiving updates. Openslice fully reverted to Compose V2, which is integrated in the Docker installation. +> Since July 2023 Docker Compose V1 stopped receiving updates. OpenSlice fully reverted to Compose V2, which is integrated in the Docker installation. +### 3. Configure containers to properly resolve the DNS of your domain (optional) -3 - Download environment preparation script ``` -wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/main/compose/deploy.sh +sudo nano /etc/docker/daemon.json ``` -4 - Work with main/master branch: +and add: ``` -sudo ./deploy.sh +{ + "dns": ["8.8.8.8", "8.8.4.4"] +} ``` -Alternatively, work with develop or any other branch: +After editing daemon.json restart docker daemon for the changes to take place -``` -sudo ./deploy.sh develop [or replace develop with other branch name] +```bash +sudo systemctl restart docker ``` -5 - Create configuration specific docker compose file +## Downloading the project + +### 1. Create a new folder to download the project + +```bash +mkdir openslice ``` -cd org.etsi.osl.main/compose/ -sudo cp docker-compose.yaml.configure docker-compose.yaml +```bash +cd openslice ``` -6 - Configure containers to properly resolve the DNS of your domain +### 2. Download the deployment script -edit /etc/docker/daemon.json and add: +Download the deployment / environment preparation script +```bash +wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/main/compose/deploy.sh ``` -{ - "dns": ["8.8.8.8", "8.8.4.4"] -} +Make it executable +```bash +sudo chmod +x deploy.sh ``` -and restart docker daemon. +### 3. Run the deployment script -
+OpenSlice is a multi repo project. This script selects the same branch for all repositories of the project to pull from. -# Configure docker-compose services +After that it builds the respective jar files locally and installs all the npm packages needed for the UI. +If you run the script without selecting a branch the the main branch is going to be selected. -Edit your configuration specific docker-compose.yaml that is previously created: +We recommend: -
+* main branch for the most stable experience and +* develop branch for an experience with the latest features (for develop branch installation, it is strongly advisable that you may as well follow the [develop documentation](https://osl.etsi.org/documentation/develop/deployment/)) -## 1. mysql-portal container +```bash +sudo ./deploy.sh main #[or replace main with other branch name] +``` -In folder mysql-init edit the file 01-databases.sql. Edit the credentials that services connect to the database (if you wish) of portaluser (default is 12345) and keycloak (default is password). +> **We recommend running the deploy.sh script with root permissions! In other case, some directories may not be accessible by the project building tools and hinder the smooth installation.** -delete the exposed ports -## 2.keycloak container +## Configure docker-compose services -2.1 Edit the following if you changed mysql credentials +### 1. Create configuration specific Docker Compose file from the template + +```bash +cd org.etsi.osl.main/compose/ ``` -DB_DATABASE: keycloak -DB_USER: keycloak -DB_PASSWORD: password +```bash +sudo cp docker-compose.yaml.configure docker-compose.yaml ``` +### 2. Configure mysql-portal container *(optional)* -2.2 Change the keycloak admin password -``` -KEYCLOAK_PASSWORD: Pa55w0rd -``` +1. In folder `org.etsi.osl.main/compose/mysql-init` edit the file `01-databases.sql`. +2. In the `org.etsi.osl.main/compose/docker-compose.yaml` edit the credentials of the users that services use to connect to the databases, if you wish. + * portaluser (default is 12345) and + * keycloak (default is password) -## 3.osportalapi container (NFV services) +### 3. Configure keycloak container *(optional)* -Edit the following if you changed mysql and keycloak credentials and adjust properly the domain (if you are using a non-local domain, replace everywhere the http://keycloak:8080) +1. If you made changes to keycloak's mysql credentials: -``` -SPRING_APPLICATION_JSON: '{ - "spring.datasource.url": "jdbc:mysql://amysql/osdb?createDatabaseIfNotExist=true", - "spring.datasource.username":"root", - "spring.datasource.password":"letmein", - "spring-addons.issuers[0].uri": "http://portal.openslice.io/auth/realms/openslice", - "spring-addons.issuers[0].username-json-path":"$.preferred_username", - "spring-addons.issuers[0].claims[0].jsonPath":"$.realm_access.roles", - "spring-addons.issuers[0].claims[1].jsonPath":"$.resource_access.*.roles", - "spring.security.oauth2.resourceserver.jwt.issuer-uri": "http://portal.openslice.io/auth/realms/openslice", - "springdoc.oAuthFlow.authorizationUrl": "http://portal.openslice.io/auth/realms/openslice/protocol/openid-connect/auth", - "springdoc.oAuthFlow.tokenUrl": "http://portal.openslice.io/auth/realms/openslice/protocol/openid-connect/token", - "springdoc.oauth.client-id" : "osapiWebClientId", - "springdoc.oauth.clientsecret" : "secret", - "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", - "spring.activemq.user": "artemis", - "spring.activemq.password": "artemis", - "logging.level.org.springframework" : "INFO" + In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml`. + ```yaml + DB_DATABASE: keycloak + DB_USER: keycloak + DB_PASSWORD: password + ``` -``` +2. If you want to change the keycloak admin password: + In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` -## 4.bugzilla container + ```yaml + KEYCLOAK_PASSWORD: Pa55w0rd + ``` -If you would like to use the Bugzilla connector +### 4. Configure bugzilla container *(optional)* -``` +If you want to utilise the Bugzilla connector: + +In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` + ```yaml + SPRING_APPLICATION_JSON: '{ + "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", + "spring.activemq.user": "artemis", + "spring.activemq.password": "artemis", + "bugzillaurl":"", + "bugzillakey":"", + "main_operations_product":"" + }' + ``` +And add the provided Bugzilla installation information: +```yaml "bugzillaurl":"bugzillaurl.xx:443/bugzilla/", "bugzillakey":"exampleKeyeqNNwxBlgxZgMEIne0Oeq0Bz", -"main_operations_product":"Main Site Operations" //this is the default product to issue tickets +"main_operations_product":"Main Site Operations" // this is the default product to issue tickets ``` -Bugzilla under this product should have components: +Bugzilla should have the following components under the specified product: - NSD Deployment Request: Component used to schedule deployment req - Onboarding: Issues related to VNF/NSD Onboarding - Operations Support: Default component for operations support - Validation: Use to track validation processes of VNFs and NSDs - VPN Credentials/Access: Used for requesting VPN Credentials/Access +Also in the 'Main Site Operations' product, a version named 'unspecified' must be created. -Also in the 'Main Site Operations' product, please create a version named 'unspecified' +### 5. Configure osportalapi container (NFV services) *(conditional)* +Change the respective fields: -## 5.osscapi container (TMF-API service) +- If you made changes to mysql and keycloak credentials. +- If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR). -Edit the following if you changed mysql and keycloak credentials +> **If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}, as well as "spring.portal.main.domain" property.** -``` -"spring.datasource.username":"xx", -"spring.datasource.password":"xx", -"keycloak-admin-password": "Pa55w0rd", -Edit properly with your domain "swagger.authserver" : "http://localhost/auth/realms/openslice", +In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` + ```yaml + SPRING_APPLICATION_JSON: '{ + "spring.datasource.username":"root", + "spring.datasource.password":"letmein", + "spring-addons.issuers[0].uri": "http://keycloak:8080/auth/realms/openslice", + "spring.security.oauth2.resourceserver.jwt.issuer-uri": "http://keycloak:8080/auth/realms/openslice", + "springdoc.oAuthFlow.authorizationUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", + "springdoc.oAuthFlow.tokenUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", + "spring.portal.main.domain": "http://localhost", + "logging.level.org.springframework" : "INFO" + }' + ``` + +### 6. osscapi container (TMF API service) *(conditional)* + +Change the respective fields: + +- If you made changes to mysql and keycloak credentials. +- If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR). + +> **If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}.** +In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` +```yaml + SPRING_APPLICATION_JSON: '{ + "spring.datasource.username":"root", + "spring.datasource.password":"letmein", + "spring-addons.issuers[0].uri": "http://keycloak:8080/auth/realms/openslice", + "spring.security.oauth2.resourceserver.jwt.issuer-uri": "http://keycloak:8080/auth/realms/openslice", + "springdoc.oAuthFlow.authorizationUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", + "springdoc.oAuthFlow.tokenUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", + "logging.level.org.springframework" : "INFO" + }' ``` -Delete the exposed ports in other services like activemq +## Configure nginx -
+In folder `org.etsi.osl.main/compose/nginx` create a configuration specific `nginx.conf` file. -# Configure nginx +```bash +cd org.etsi.osl.main/compose/nginx/ ``` -cd nginx +```bash sudo cp nginx.conf.default nginx.conf ``` -Edit server_name +If needed, in the nginx.conf file, edit the server_name for an non-local deployment. + -
-# Configure Web UI +## Configure Web UI +In folder `org.etsi.osl.portal.web/src/js/` create a configuration specific `config.js` file. +```bash +cd org.etsi.osl.portal.web/src/js ``` -cd org.etsi.osl.portal.web/src/js/ -cp config.js.default config.js +```bash +sudo cp config.js.default config.js ``` +Edit the `config.js` file with the information of your domain -Edit config.js with your domain - -``` -TITLE: "Openslice demo", - WIKI: "http://localhost", - BUGZILLA: "https://localhost/bugzilla/", - STATUS: "http://status.localhost/", - APIURL: "http://localhost", - WEBURL: "http://localhost", - APIOAUTHURL: "http://localhost/auth/realms/openslice", - APITMFURL: "http://localhost/tmf-api/serviceCatalogManagement/v4" +```yaml +{ + TITLE: "OpenSlice by ETSI", + WIKI: "https://openslice.readthedocs.io/en/stable/", + BUGZILLA: "ROOTURL/bugzilla/", + STATUS: "ROOTURL/status/", + APIURL: "http://localost:13000", + WEBURL: "ROOTURL/nfvportal", + APIOAUTHURL: "ROOTURL/auth/realms/openslice", + APITMFURL: "ROOTURL/tmf-api/serviceCatalogManagement/v4" +} ``` -
- -# Configure TMF Web UI +## Configure TMF Web UI -There are 3 files available for configuration: +In the folder `org.etsi.osl.tmf.web/src/assets/config` there are 3 files available for configuration: * config.prod.json (Basic information + API configuration) * theming.scss (CSS color palette theming) * config.theming.json (HTML configuration - Logo, Favicon, Footer) -The first 2 files above (i.e. config.prod.json, theming.scss) are essential for the successful deployment of Openslice, thus created automatically during the initial deployment at **org.etsi.osl.tmf.web/src/assets/config** directory as a copy of the default ones from the remote repository. +The first 2 files above (i.e. config.prod.json, theming.scss) are essential for the successful deployment of OpenSlice, thus created automatically during the initial deployment at `org.etsi.osl.tmf.web/src/assets/config` directory as a copy of the default ones from the remote repository. -
- -Ensure that you check the **config.prod.json** file and readjust to your deployment if needed. +Ensure that you check the `config.prod.json` file and readjust to your deployment if needed. -``` +```bash +# Starting from the root project directory cd org.etsi.osl.tmf.web/src/assets/config ``` -and edit config.prod.json +```bash +sudo cp config.theming.default.json config.theming.json +``` + +E.g. Edit "TITLE" or "WIKI" property with your domain title +```yaml +{ + TITLE: "OpenSlice by ETSI", + WIKI: "https://osl.etsi.org/documentation/latest/deployment/", +} +``` -E.g. Edit "TITLE" or "WIKI" property with your domain title +> The {BASEURL} placeholder in the file automatically detects the Origin (Protocol://Domain:Port) of the deployment and applies it to every respective property. E.g. If you are attempting a local deployment of Openslice, then {BASEURL} is automatically translated to "http://localhost". Similarly, you may use {BASEURL} to translate to a public deployment configuration, e.g. "https://portal.openslice.io". +If further customization, apart from the default provided, is needed for branding (Logo, Footer) then config.theming.json needs to be created in io.openslice.tmf.web/src/assets/config directory, as follows: + +```bash +# Starting from the root project directory +cd org.etsi.osl.tmf.web/src/assets/config ``` -TITLE: 'Openslice', -WIKI: 'https://openslice.io', +```bash +sudo cp config.theming.default.json config.theming.json ``` -_NOTE:_ The {BASEURL} placeholder in the file automatically detects the Origin (Protocol://Domain:Port) of the deployment and applies it to every respective property. E.g. If you are attempting a local deployment of Openslice, then {BASEURL} is automatically translated to "http://localhost". Similarly, you may use {BASEURL} to translate to a public deployment configuration, e.g. "https://portal.openslice.io". +> ***IMPORTANT NOTE:*** +If you want to apply changes to the JSON configuration files without the need to rebuild the +application, you have to apply the changes at the `org.etsi.osl.tmf.web/dist/io-openslice-portal-web/assets/config` +directory. Although, it is mandatory to also apply these changes to the `org.etsi.osl.tmf.web/src/assets/config` +for persistancy, as after any future rebuild of OpenSlice the `/dist` directory is being overwritten along with its +contents. The OpenSlice team strongly recommends to always apply your changes to the TMF web UI configuration files +at `org.etsi.osl.tmf.web/src/assets/config` and rebuild the application. -
+## Deploy OpenSlice via Docker Compose -If further customization, apart from the default provided, is needed for branding (Logo, Footer) then **config.theming.json** needs to be created in **org.etsi.osl.tmf.web/src/assets/config** directory, as follows: +After configuring the services, and editing the docker compose file accordingly, the docker compose instantiation command can be performed. +```bash +# Starting from the root project directory +cd org.etsi.osl.main/compose/ ``` -cd org.etsi.osl.tmf.web/src/assets/config -sudo cp config.theming.default.json config.theming.json +```bash +sudo docker compose --profile prod down;sudo docker compose --profile prod up -d --build ``` -
+> Depending on your machine, this process might take time. if for any reason the deployment fails during first time, please rerun the above before any further measures. -> **_IMPORTANT NOTE:_** If you want to apply changes to the JSON configuration files without the need to rebuild the application, you have to apply the changes at the **org.etsi.osl.tmf.web/dist/io-openslice-portal-web/assets/config** directory. Although, it is mandatory to also apply these changes to the **org.etsi.osl.tmf.web/src/assets/config** for persistancy, as after any future rebuild of Openslice the **/dist** directory is being ovewritten along with its contents. The Openslice team strongly recommends to always apply your changes to the TMF web UI configuration files at **org.etsi.osl.tmf.web/src/assets/config** and rebuild the application. -
+## Validating deployments and container monitoring + +You can monitor containers' status with portainer at port 9000 (http://your-ip:9000). +Initially, you may monitor the local machine at portainer. -# Deploying docker compose +Please check that all containers are in running state. +## Post installation steps +After the successful deployment of OpenSlice, to ensure the E2E user experience, **this section is mandatory**. It contains crucial configuration in regard of authentication and user creation. -Go to compose directory and issue: -``` -sudo docker compose --profile prod down;sudo docker compose --profile prod up -d --build -``` +### Configure Keycloak server -Note: Depending on your machine, this process might take time. +The Keycloack server is managing authentication and running on a container at port 8080. It is also proxied to your host via nginx under http://localhost/auth. +- Navigate to http://domain.com/auth/ or https://domain.com/auth/, (http://ipaddress:8080/auth/ or https://ipaddress:8443/auth/ which are directly accessible without proxy) -
+- Navigate to Administration Console +- Login with the credentials from section [Configure keycloak container](#Configure-keycloak-container). Default values are: + - user: admin and + - password: KEYCLOAK_PASSWORD -# Validating deployments and container monitoring +> if you are running in HTTP you will get a message: HTTPS required. -You can monitor containers status with portainer at port 9000 (http://your-ip:9000) +To resolve this issue when running in HTTP: -Initially, you may monitor the local machine at portainer. +- Select the master realm from top left corner +- Go to login Tab and select "Require SSL": None +- Repeat for realm Openslice + + +> If you are running in HTTPS, then "Require SSL" can be left unchanged to external requests. + +#### 1. Configure redirects + +Navigate to realm Openslice > client > osapiWebClientId and change the Root URL to your domain. + +Also, insert your domain, e.g. http://example.org/*, at: +* Valid Redirect URIs +* Web Origins + +#### 2. Configure email + +Keycloak allows new users to register. Subsequently, this will also allow new users to register to the OpenSlice portal. + +On Tab Login > check User registration, Verify email, Forgot password etc. + +Also, enter the details on Realm > Email > Enable Authentication. + +#### 3. Add an OpenSlice admin user + +This step is mandatory so as to access the OpenSlice Web UI. To add an OpenSlice admin user you must: +- Navigate to manage/users and add an OpenSlice admin user, e.g. username=admin. +- Set a password +- Navigate to Role Mappings and add ADMIN and MENTOR to Assigned Roles. + +> That user is different from the Keycloak admin user. It is required to login and browse the OpenSlice Web UI. The Roles ADMIN and MENTOR guarantee full access through the Openslice UI, thus such a user is always required. + +### Keycloak at localhost + +> **This is an important step if you run Keycloak on localhost!** + +1 - Edit your Hosts File, adding the line below + +```127.0.0.1 keycloak``` + +Hosts File Location: + + - In Linux/Unix, the file's location is at /etc/hosts + + - In Windows, its location is at c:\Windows\System32\Drivers\etc\hosts + +2 - Replace http://localhost/auth/ with http://keycloak:8080/auth/ in your Keycloak config for AngularJS and Angular (see examples below). + + +Explanation: + + Nginx uses the http://keycloak:8080 URL, which is accessible via the internal docker system's network. + The Front-end (TS/Angular) shall also use the http://keycloak:8080. + This way, you will not get the invalid token error, as the API is acquiring the token from http://keycloak:8080 (internally) and the Front-end is getting verified by an issuer at the same URL, as well. + + + +- For the Angular configuration (TMF portal UI), navigate to org.etsi.osl.tmf.web/src/assets/config and edit config.prod.json + ```bash + # Starting from the root project directory + cd org.etsi.osl.tmf.web/src/assets/config + ``` + ```bash + nano config.prod.json + ``` + + After editing it should look like the example bellow: + ```yaml + { + "TITLE": "OpenSlice by ETSI", + "PORTALVERSION":"2023-Q3 1.2.0-SNAPSHOT", + "WIKI": "https://openslice.readthedocs.io/en/stable/", + "BUGZILLA": "{BASEURL}/bugzilla/", + "STATUS": "http://status.localhost/", + "WEBURL": "{BASEURL}", + "PORTAL_REPO_APIURL": "{BASEURL}/osapi", + "ASSURANCE_SERVICE_MGMT_APIURL": "{BASEURL}/oas-api", + "APITMFURL": "{BASEURL}/tmf-api", + "OAUTH_CONFIG" : { + "issuer": "http://keycloak:8080/auth/realms/openslice", + "loginUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", + "tokenEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", + "userinfoEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/userinfo", + "redirectUri": "{BASEURL}/redirect", + "logoutUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/logout", + "postLogoutRedirectUri": "{BASEURL}", + + "responseType": "code", + "oidc": false, + "clientId": "osapiWebClientId", + "dummyClientSecret": "secret", + + "requireHttps": false, + "useHttpBasicAuth": true, + "clearHashAfterLogin": false, + + "showDebugInformation": true + } + } + ``` + + > Note the difference in changing {BASEURL} -> http://keycloak:8080 + + > If you want the changes to take place immediately without rebuilding the project, then repeat the process for org.etsi.osl.tmf.web/dist/org.etsi.osl.tmf.web/assets/config/config.prod.json + +- For the AngularJS configuration (NVF portal UI), navigate to org.etsi.osl.portal.web/src/js and edit config.js + ```bash + # Starting from the root project directory + cd org.etsi.osl.portal.web/src/js + ``` + ```bash + nano config.js + ``` + after editing it should look like the example bellow: + + ```js + var appConfig = angular.module('portalwebapp.config',[]); + + + appConfig.factory('APIEndPointService', function() { + return { + TITLE: "OpenSlice by ETSI", + WIKI: "https://openslice.readthedocs.io/en/stable/", + BUGZILLA: "ROOTURL/bugzilla/", + STATUS: "ROOTURL/status/", + APIURL: "http://localost:13000", + WEBURL: "ROOTURL/nfvportal", + APIOAUTHURL: "ROOTURL/auth/realms/openslice", + APITMFURL: "ROOTURL/tmf-api/serviceCatalogManagement/v4" + }; + }); + ``` + > Note the difference in "APIOAUTHURL" property + + +### NFV Orchestrator Configuration + +After successfully deploying and configuring OpenSlice, you may configure its environment (e.g. the NFVO) that will facilitate the deployment of NFV artifacts. + +See [NFV Orchestrator Configuration](./nfvoconfig.md). -Please check that all containers are in running state.
-# Kubernetes installation +## Kubernetes installation + +Openslice can be installed in a Kubernetes cluster. +**This is a work in progress, and should be used for stable deployments!**. -Openslice can be installed in a Kubernetes cluster. (This is a work in progress) +Please reference "develop" tagged documentation for any latest progress. The related scripts are inside the kubernetes folder. Follow these steps along the lines. You need to configure the ingress properly depending on how you want to expose Openslice. -1) Create an openslice namespace +1 - Create an openslice namespace -``` +```bash kubectl create namespace openslice ``` -2) Apply or create an ingress. Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource. +2 - Apply or create an ingress. Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource. An Ingress may be configured to give Services externally-reachable URLs, load balance traffic, terminate SSL / TLS, and offer name-based virtual hosting. An Ingress controller is responsible for fulfilling the Ingress, usually with a load balancer, though it may also configure your edge router or additional frontends to help handle the traffic. You must have an Ingress controller to satisfy an Ingress. You may need to deploy an Ingress controller such as ingress-nginx. You can also adapt it to connect to public cloud load balancers depending on your needs. -The following will expose an ingress resource from one of your a k8s nodes on port 80 +The following will expose an ingress resource from one of your a k8s nodes on port 80. -``` +```bash kubectl apply -f openslice-ingress.yaml ``` @@ -276,7 +514,7 @@ The following will expose an ingress resource from one of your a k8s nodes on po Finding the ingress IP: -``` +```bash kubectl describe -f openslice-ingress.yaml @@ -304,16 +542,16 @@ Events: From the above example, our exposed ingress is at Address: 10.10.10.35 -3) We need to configure the expose address and deploy openslice (IP or URL e.g. http://myopenslice.xxx) +3 - We need to configure the expose address and deploy openslice (IP or URL e.g. http://myopenslice.xxx) -``` +```bash ./k8sdeploy.sh 10.10.10.35 ``` -4) Check the status of Openslice in the cluster. Should be similar to the following: +4 - Check the status of Openslice in the cluster. Should be similar to the following: -``` +```bash kubectl get pods --namespace=openslice -o wide @@ -330,8 +568,8 @@ osportalapi-5fff744db8-5g4zs 1/1 Running 0 103s 192.168.4 osscapi-6d68b54d97-jn8tz 0/1 Running 0 102s 192.168.12.104 kc-3 portalweb-8469d57df4-94tfj 1/1 Running 0 101s 192.168.48.44 kc-nfs tmfweb-868f7bb9c5-x4lfh 1/1 Running 0 102s 192.168.48.43 kc-nfs - - +``` +```bash kubectl get deployments --namespace=openslice -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR @@ -346,8 +584,8 @@ osportalapi 1/1 1 1 2m9s openslice-portalapi osscapi 1/1 1 1 2m8s openslice-scapi openslice/org.etsi.osl.tmf.api:latest org.etsi.osl.service=osscapi portalweb 1/1 1 1 2m7s openslice-portalweb openslice/org.etsi.osl.portal.web:latest org.etsi.osl.service=portalweb tmfweb 1/1 1 1 2m8s openslice-tmfweb openslice/org.etsi.osl.tmf.web:latest org.etsi.osl.service=tmfweb - - +``` +```bash kubectl get services --namespace=openslice -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR @@ -364,178 +602,4 @@ osscapi ClusterIP 10.108.6.161 13082/TCP portalweb ClusterIP 10.97.126.98 80/TCP 2m15s org.etsi.osl.service=portalweb tmfweb ClusterIP 10.98.56.82 80/TCP 2m15s org.etsi.osl.service=tmfweb -``` - -
- -# Post installation steps - -
- -## Configure Keycloak server - -Keycloack server is managing authentication and running on a container at port 8080. It is proxied to your host via nginx under http://localhost/auth. - -* Go to http://domain.com/auth/ or https://domain.com/auth/ , (http://ipaddress:8080/auth/ or https://ipaddress:8443/auth/ are direct with no proxy) - -* Navigate to Administration Console - - -> NOTE: if you are running in HTTP you will get a message: HTTPS required - -Go to https://ipaddress:8443/auth/ - -Login with the credentials from section 2.2 - -user admin and your KEYCLOAK_PASSWORD - -Select the master realm from top left corner, go to login Tab and select "Require SSL": None - -Do the same for realm Openslice - -> NOTE: If you are running in HTTPS, then leave Require SSL to external requests - -
- -### Configure redirects - -Go to realm Openslice, client, osapiWebClientId and change Root URL to your domain. - -Also, insert your domain, e.g. http://example.org/*, at: -* Valid Redirect URIs -* Web Origins - -
- -### Configure email in Keycloak - -Keycloak also allows new users to register. - -On Tab Login -> check User registration, Verify email, Forgot password etc. - -Also, enter the details on Realm -> Email -> Enable Authentication - -
- -### Add an Openslice admin user - -Go to manage/users and add an Openslice admin user, e.g. username=admin. Set a password and go also to Role Mappings and add to Assigned Roles ADMIN and MENTOR. - -> Note: That user is different from the Keycloak admin user. It is used to login and browse the OpenSlice Web UI. The Roles ADMIN and MENTOR guarantee full access through the Openslice UI, thus such a user is always required. - -
- -## Keycloak at localhost - -> **This is an important step if you run Keycloak on localhost** - -1 - Edit your hosts file, adding the line below - -```127.0.0.1 keycloak``` - -2 - Replace http://localhost/auth/ with http://keycloak:8080/auth/ in your Keycloak config for TypeScript/Angular (see examples below). - - -Hosts File Location: - - - In Linux/Unix, the file's location is at /etc/hosts - - - In Windows, its location is at c:\Windows\System32\Drivers\etc\hosts - -Explanation: - - Nginx uses the http://keycloak:8080 URL, which is accessible via the internal docker system's network. - The Front-end (TS/Angular) shall also use the http://keycloak:8080. - This way, you will not get the invalid token error, as the API is getting the token from http://keycloak:8080 (internally) and the Front-end is getting verified with the same URL, as well. - - - -Nginx serves the Front-end from the project org.etsi.osl.tmf.web. - - - - -If you would like to use the Front-end to test your backend, then: - -1. config.prod.json (org.etsi.osl.tmf.web project) should look similar to the following example: - -``` -{ - "TITLE": "Openslice demo", - "PORTALVERSION":"1.1.0-SNAPSHOT", - "WIKI": "http://wiki.localhost", - "BUGZILLA": "{BASEURL}/bugzilla/", - "STATUS": "http://status.localhost/", - "WEBURL": "{BASEURL}", - "PORTAL_REPO_APIURL": "{BASEURL}/osapi", - "ASSURANCE_SERVICE_MGMT_APIURL": "{BASEURL}/oas-api", - "APITMFURL": "http://localhost:13082/tmf-api", - "OAUTH_CONFIG" : { - "issuer": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", - "loginUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", - "tokenEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", - "redirectUri": "{BASEURL}/redirect", - "logoutUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/logout", - "postLogoutRedirectUri": "{BASEURL}/services/services_marketplace", - - "responseType": "code", - "oidc": false, - "clientId": "osapiWebClientId", - "dummyClientSecret": "secret", - - "requireHttps": false, - "useHttpBasicAuth": true, - "clearHashAfterLogin": false, - - "showDebugInformation": true - } -} -``` -> Note the difference in changing {BASEURL} -> http://keycloak:8080 - -2. config.js (org.etsi.osl.portal.web) should look similar to the following example: - -``` -var appConfig = angular.module('portalwebapp.config',[]); - - -appConfig.factory('APIEndPointService', function() { - return { - TITLE: "Openslice", - WIKI: "ROOTURL", - BUGZILLA: "ROOTURL/bugzilla/", - STATUS: "ROOTURL/status/", - APIURL: "http://localhost:13000", - WEBURL: "ROOTURL/nfvportal", - APIOAUTHURL: "http://keycloak:8080/auth/realms/openslice", - APITMFURL: "http://localhost:13082/tmf-api/serviceCatalogManagement/v4" - - }; -}); -``` -> Note the difference in "APIOAUTHURL" property - -
- -## NFV Portal Landing page - -You may configure the landing page for the NFV Portal at - -``` -org.etsi.osl.portal.web/src/openslicehome/index.html -``` - -
- -## NFV Orchestrator Configuration - -See [NFV Orchestrator Configuration](./nfvoconfig.md). - -
- -## Important Note - -There is a case where the first time the services fail to start due to failed mysql connections. Please just issue again: - -`sudo docker compose --profile prod down;sudo docker compose --profile prod up -d --build` - +``` \ No newline at end of file diff --git a/doc/index.md b/doc/index.md index f74e48f..e8c0cbc 100644 --- a/doc/index.md +++ b/doc/index.md @@ -2,15 +2,15 @@ version: 2023Q4 - Release 0 -Openslice is a prototype open source, operations support system. It supports VNF/NSD onboarding to OpenSourceMANO (OSM) and NSD deployment management. It also supports TMFORUM OpenAPIs regarding Service Catalog Management, Ordering, Resource, etc. +The ETSI Software Development Group for OpenSlice (SDG OSL) is developing an open source service based Operations Support System (OSS) to deliver Network Slice as a Service (NSaaS) following specifications from major SDOs including ETSI, TM Forum and GSMA. See more details [here](https://osl.etsi.org/about/). ## Usage -Openslice allows Vertical Customers to browse the available offered service specifications and also allows NFV developers to onboard and manage VNF and Network Service artifacts. -The following figure displays the usage of Openslice. +OpenSlice allows Vertical Customers to browse the available offered service specifications and also allows NFV developers to onboard and manage VNF and Network Service artifacts. It also supports TMFORUM OpenAPIs regarding Service Catalog Management, Ordering, Resource, etc. +The following figure displays the usage of OpenSlice. -[![Openslice usage](./images/index_intro_architecture.png)](./images/index_intro_architecture.png) +[![OpenSlice usage](./images/index_intro_architecture.png)](./images/index_intro_architecture.png) There are two portals offering UI friendly access to users: @@ -18,23 +18,23 @@ There are two portals offering UI friendly access to users: * The Services portal allows users to access services and service providers to design services. * The NFV portal allows users to self-manage NFV artifacts and onboard them to a target MANO/NFV Orchestrator. -3rd party applications can use Openslice through TMForum Open APIs. +3rd party applications can use OpenSlice through TMForum Open APIs. -Service Specifications reside into Service Catalogs, grouped in Categories. Openslice offers a Service Orchestrator called [OSOM](./architecture/osom.md). OSOM instantiates Service Specifications by requesting Network Services from target MANOs/NFVOs. NFV artifacts reside into a VNF/NSD catalog and are onboarded to a target MANO/NFV Orchestrator. Service Specifications reference NSD from the VNF/NSD catalog. +Service Specifications reside into Service Catalogs, grouped in Categories. OpenSlice offers a Service Orchestrator called [OSOM](./architecture/osom.md). OSOM instantiates Service Specifications by requesting Network Services from target MANOs/NFVOs. NFV artifacts reside into a VNF/NSD catalog and are onboarded to a target MANO/NFV Orchestrator. Service Specifications reference NSD from the VNF/NSD catalog. -Customers make Service Orders and Openslice instantiates the requested Service Specifications of the Service Order. Running Services instantiated by Openslice, reside in Openslice Service Inventory. The following picture displays how Service Specifications are related to Running Services and how Running Services relate with instantiated running Network Services. (See also [Service Inventory](./service_inventory.md)) +Customers make Service Orders and OpenSlice instantiates the requested Service Specifications of the Service Order. Running Services instantiated by OpenSlice, reside in OpenSlice Service Inventory. The following picture displays how Service Specifications are related to Running Services and how Running Services relate with instantiated running Network Services. (See also [Service Inventory](./service_inventory.md)) -[![Openslice Service Specification instantiation](./images/service_specification_instantiation.png)](./images/service_specification_instantiation.png) +[![OpenSlice Service Specification instantiation](./images/service_specification_instantiation.png)](./images/service_specification_instantiation.png) ## Service Lifecycle Rules -Openslice constains support for defining rules of services, affecting their behavior. See [LCM Rules](./lcm.md). +OpenSlice constains support for defining rules of services, affecting their behavior. See [LCM Rules](./lcm.md). ## Multidomain scenarios and federation -Openslice can be used to exchange service specifications/catalogs and make service orders between Organizations as the following figure displays. +OpenSlice can be used to exchange service specifications/catalogs and make service orders between Organizations as the following figure displays. -[![Openslice Service Specification instantiation](./images/multi-domain-organizations.png)](./images/multi-domain-organizations.png) +[![OpenSlice Service Specification instantiation](./images/multi-domain-organizations.png)](./images/multi-domain-organizations.png) An Identity federation is also possible since our authentication service is based on Keycloak (see [OAuth](./architecture/oauth.md)). @@ -43,9 +43,9 @@ See more on [Consuming Services From External Partner Organizations](./architect ## Live Demo -* Openslice demo: -* Openslice Service Catalogs and ordering: -* Openslice NFV Services onboarding: +* OpenSlice demo: +* OpenSlice Service Catalogs and ordering: +* OpenSlice NFV Services onboarding: > username=admin, password=openslice
or
username=admin, password=changeme @@ -67,13 +67,16 @@ The complete environment consists of microservices deployed as docker containers If you would like to operate all APIs, OSOM, the Mysql Server, nginx, etc then you need at least: -- 4 cores -- 8GB RAM -- 20GB HD space +| **Minimum Hardware Requirements** | **Recomended Hardware Requirements** | +| --------------------------------- | ------------------------------------ | +| 4 CPU cores | 8 CPU cores | +| 8 GB RAM | 16 GB RAM | +| 20 GB storage | 40 GB storage | + (NOTE: Bugzilla or ELK are not included and we assume they run elsewhere) -However you can try with a minimum installation on a VM on a laptop with: +However, you may try the front facing services of OpenSlice with a minimum installation on a VM on a laptop with: - 2 cores - 4GB of RAM @@ -82,32 +85,36 @@ However you can try with a minimum installation on a VM on a laptop with: ## Supported APIs -For a quick access check our swagger links: +Quick overview of the supported APIs through our Swagger links: -* TMF APIs: -* API for VNF/NSD management: +* [TMF APIs](http://portal.openslice.io/tmf-api/swagger-ui/index.html) +* [API for VNF/NSD management](http://portal.openslice.io/osapi/swagger-ui/index.html) ## Source code -Get source code here: +OpenSlice source code is available at [OSL GitLab repository](https://labs.etsi.org/rep/osl/code). ## Contributing -[Contributing](./contributing/developing.md) +You may contribute following the guidelines at [Contributing page](./contributing/developing.md). ## Social Media -* Twitter: -* Slack: https://openslice.slack.com +* [Twitter](https://twitter.com/OpensliceOSS) +* [Slack](https://openslice.slack.com) ## History -* The NFV portal part of Openslice was initially developed in H2020 European project 5GinFIRE (https://5ginfire.eu) by University of Patras, Greece -* Openslice services, APIs and current version are actively maintained by University of Patras, Greece in H2020 European project 5G-VINNI (https://5g-vinni.eu/) +* The NFV portal part of OpenSlice was initially developed in H2020 European Research project [5GinFIRE](https://5ginfire.eu) by University of Patras, Greece +* OpenSlice core services, APIs was further developed and maintained in H2020 European project [5G-VINNI](https://5g-vinni.eu/) by University of Patras, Greece +* OpenSlice has been a part off OSM's OSS/BSS ecosystem [![Part of OSM Ecosystem](./images/osm_ecosystem_ossbss.png)](https://osm.etsi.org/wikipub/index.php/OSS_BSS) +## Ecosystem + +Discover the current OpenSlice ecosystem [here](https://osl.etsi.org/ecosystem/). ## Citation -- GitLab From 168923df8883bfb23c4912faea0eeb157c76a1ae Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Fri, 9 Feb 2024 19:37:47 +0200 Subject: [PATCH 20/23] Changed indentation in text to display properly --- doc/deployment.md | 127 ++++++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 60 deletions(-) diff --git a/doc/deployment.md b/doc/deployment.md index 197d693..ab57213 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -104,47 +104,51 @@ sudo cp docker-compose.yaml.configure docker-compose.yaml 1. In folder `org.etsi.osl.main/compose/mysql-init` edit the file `01-databases.sql`. 2. In the `org.etsi.osl.main/compose/docker-compose.yaml` edit the credentials of the users that services use to connect to the databases, if you wish. - * portaluser (default is 12345) and - * keycloak (default is password) + * portaluser (default is 12345) and + * keycloak (default is password) ### 3. Configure keycloak container *(optional)* 1. If you made changes to keycloak's mysql credentials: - In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml`. + In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml`. - ```yaml - DB_DATABASE: keycloak - DB_USER: keycloak - DB_PASSWORD: password - ``` + ``` + DB_DATABASE: keycloak + DB_USER: keycloak + DB_PASSWORD: password + ``` 2. If you want to change the keycloak admin password: - In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` + In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` - ```yaml - KEYCLOAK_PASSWORD: Pa55w0rd - ``` + + ``` + KEYCLOAK_PASSWORD: Pa55w0rd + ``` ### 4. Configure bugzilla container *(optional)* If you want to utilise the Bugzilla connector: In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` - ```yaml - SPRING_APPLICATION_JSON: '{ - "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", - "spring.activemq.user": "artemis", - "spring.activemq.password": "artemis", - "bugzillaurl":"", - "bugzillakey":"", - "main_operations_product":"" - }' - ``` + +``` +SPRING_APPLICATION_JSON: '{ + "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", + "spring.activemq.user": "artemis", + "spring.activemq.password": "artemis", + "bugzillaurl":"", + "bugzillakey":"", + "main_operations_product":"" +}' +``` + And add the provided Bugzilla installation information: -```yaml + +``` "bugzillaurl":"bugzillaurl.xx:443/bugzilla/", "bugzillakey":"exampleKeyeqNNwxBlgxZgMEIne0Oeq0Bz", "main_operations_product":"Main Site Operations" // this is the default product to issue tickets @@ -166,20 +170,21 @@ Change the respective fields: - If you made changes to mysql and keycloak credentials. - If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR). -> **If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}, as well as "spring.portal.main.domain" property.** +> ***If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}, as well as "spring.portal.main.domain" property.*** In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` - ```yaml - SPRING_APPLICATION_JSON: '{ - "spring.datasource.username":"root", - "spring.datasource.password":"letmein", - "spring-addons.issuers[0].uri": "http://keycloak:8080/auth/realms/openslice", - "spring.security.oauth2.resourceserver.jwt.issuer-uri": "http://keycloak:8080/auth/realms/openslice", - "springdoc.oAuthFlow.authorizationUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", - "springdoc.oAuthFlow.tokenUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", - "spring.portal.main.domain": "http://localhost", - "logging.level.org.springframework" : "INFO" - }' + +``` +SPRING_APPLICATION_JSON: '{ + "spring.datasource.username":"root", + "spring.datasource.password":"letmein", + "spring-addons.issuers[0].uri": "http://keycloak:8080/auth/realms/openslice", + "spring.security.oauth2.resourceserver.jwt.issuer-uri": "http://keycloak:8080/auth/realms/openslice", + "springdoc.oAuthFlow.authorizationUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", + "springdoc.oAuthFlow.tokenUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", + "spring.portal.main.domain": "http://localhost", + "logging.level.org.springframework" : "INFO" +}' ``` ### 6. osscapi container (TMF API service) *(conditional)* @@ -192,16 +197,17 @@ Change the respective fields: > **If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}.** In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` -```yaml - SPRING_APPLICATION_JSON: '{ - "spring.datasource.username":"root", - "spring.datasource.password":"letmein", - "spring-addons.issuers[0].uri": "http://keycloak:8080/auth/realms/openslice", - "spring.security.oauth2.resourceserver.jwt.issuer-uri": "http://keycloak:8080/auth/realms/openslice", - "springdoc.oAuthFlow.authorizationUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", - "springdoc.oAuthFlow.tokenUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", - "logging.level.org.springframework" : "INFO" - }' + +``` +SPRING_APPLICATION_JSON: '{ + "spring.datasource.username":"root", + "spring.datasource.password":"letmein", + "spring-addons.issuers[0].uri": "http://keycloak:8080/auth/realms/openslice", + "spring.security.oauth2.resourceserver.jwt.issuer-uri": "http://keycloak:8080/auth/realms/openslice", + "springdoc.oAuthFlow.authorizationUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", + "springdoc.oAuthFlow.tokenUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", + "logging.level.org.springframework" : "INFO" +}' ``` ## Configure nginx @@ -232,7 +238,7 @@ sudo cp config.js.default config.js Edit the `config.js` file with the information of your domain -```yaml +``` { TITLE: "OpenSlice by ETSI", WIKI: "https://openslice.readthedocs.io/en/stable/", @@ -267,7 +273,7 @@ sudo cp config.theming.default.json config.theming.json ``` E.g. Edit "TITLE" or "WIKI" property with your domain title -```yaml +``` { TITLE: "OpenSlice by ETSI", WIKI: "https://osl.etsi.org/documentation/latest/deployment/", @@ -287,12 +293,7 @@ sudo cp config.theming.default.json config.theming.json ``` > ***IMPORTANT NOTE:*** -If you want to apply changes to the JSON configuration files without the need to rebuild the -application, you have to apply the changes at the `org.etsi.osl.tmf.web/dist/io-openslice-portal-web/assets/config` -directory. Although, it is mandatory to also apply these changes to the `org.etsi.osl.tmf.web/src/assets/config` -for persistancy, as after any future rebuild of OpenSlice the `/dist` directory is being overwritten along with its -contents. The OpenSlice team strongly recommends to always apply your changes to the TMF web UI configuration files -at `org.etsi.osl.tmf.web/src/assets/config` and rebuild the application. +If you want to apply changes to the JSON configuration files without the need to rebuild the application, you have to apply the changes at the `org.etsi.osl.tmf.web/dist/io-openslice-portal-web/assets/config` directory. Although, it is mandatory to also apply these changes to the `org.etsi.osl.tmf.web/src/assets/config` for persistancy, as after any future rebuild of OpenSlice the `/dist` directory is being overwritten along with its contents. The OpenSlice team strongly recommends to always apply your changes to the TMF web UI configuration files at `org.etsi.osl.tmf.web/src/assets/config` and rebuild the application. ## Deploy OpenSlice via Docker Compose @@ -331,8 +332,8 @@ The Keycloack server is managing authentication and running on a container at po - Navigate to Administration Console - Login with the credentials from section [Configure keycloak container](#Configure-keycloak-container). Default values are: - - user: admin and - - password: KEYCLOAK_PASSWORD + - user: admin and + - password: KEYCLOAK_PASSWORD > if you are running in HTTP you will get a message: HTTPS required. @@ -387,24 +388,27 @@ Hosts File Location: 2 - Replace http://localhost/auth/ with http://keycloak:8080/auth/ in your Keycloak config for AngularJS and Angular (see examples below). -Explanation: +> Explanation - Nginx uses the http://keycloak:8080 URL, which is accessible via the internal docker system's network. - The Front-end (TS/Angular) shall also use the http://keycloak:8080. - This way, you will not get the invalid token error, as the API is acquiring the token from http://keycloak:8080 (internally) and the Front-end is getting verified by an issuer at the same URL, as well. +Nginx uses the http://keycloak:8080 URL, which is accessible via the internal docker system's network. +The Front-end (TS/Angular) shall also use the http://keycloak:8080. +This way, you will not get the invalid token error, as the API is acquiring the token from http://keycloak:8080 (internally) and the Front-end is getting verified by an issuer at the same URL, as well. - For the Angular configuration (TMF portal UI), navigate to org.etsi.osl.tmf.web/src/assets/config and edit config.prod.json + ```bash # Starting from the root project directory cd org.etsi.osl.tmf.web/src/assets/config ``` + ```bash nano config.prod.json ``` After editing it should look like the example bellow: + ```yaml { "TITLE": "OpenSlice by ETSI", @@ -444,16 +448,19 @@ Explanation: > If you want the changes to take place immediately without rebuilding the project, then repeat the process for org.etsi.osl.tmf.web/dist/org.etsi.osl.tmf.web/assets/config/config.prod.json - For the AngularJS configuration (NVF portal UI), navigate to org.etsi.osl.portal.web/src/js and edit config.js + ```bash # Starting from the root project directory cd org.etsi.osl.portal.web/src/js ``` + ```bash nano config.js ``` + after editing it should look like the example bellow: - ```js + ``` var appConfig = angular.module('portalwebapp.config',[]); -- GitLab From 3c7be169b90018f797f780d6be7d5fff4209cc78 Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Fri, 9 Feb 2024 19:48:03 +0200 Subject: [PATCH 21/23] Changed indentation in text to display properly --- doc/deployment.md | 186 ++++++++++++++++++++++++---------------------- 1 file changed, 96 insertions(+), 90 deletions(-) diff --git a/doc/deployment.md b/doc/deployment.md index ab57213..921fde3 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -114,17 +114,16 @@ sudo cp docker-compose.yaml.configure docker-compose.yaml In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml`. - ``` - DB_DATABASE: keycloak - DB_USER: keycloak - DB_PASSWORD: password - ``` + ``` + DB_DATABASE: keycloak + DB_USER: keycloak + DB_PASSWORD: password + ``` 2. If you want to change the keycloak admin password: In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` - ``` KEYCLOAK_PASSWORD: Pa55w0rd ``` @@ -185,7 +184,7 @@ SPRING_APPLICATION_JSON: '{ "spring.portal.main.domain": "http://localhost", "logging.level.org.springframework" : "INFO" }' - ``` +``` ### 6. osscapi container (TMF API service) *(conditional)* @@ -218,6 +217,7 @@ In folder `org.etsi.osl.main/compose/nginx` create a configuration specific `ngi ```bash cd org.etsi.osl.main/compose/nginx/ ``` + ```bash sudo cp nginx.conf.default nginx.conf ``` @@ -229,25 +229,28 @@ If needed, in the nginx.conf file, edit the server_name for an non-local deploym ## Configure Web UI In folder `org.etsi.osl.portal.web/src/js/` create a configuration specific `config.js` file. + ```bash cd org.etsi.osl.portal.web/src/js ``` + ```bash sudo cp config.js.default config.js ``` + Edit the `config.js` file with the information of your domain ``` { - TITLE: "OpenSlice by ETSI", - WIKI: "https://openslice.readthedocs.io/en/stable/", - BUGZILLA: "ROOTURL/bugzilla/", - STATUS: "ROOTURL/status/", - APIURL: "http://localost:13000", - WEBURL: "ROOTURL/nfvportal", - APIOAUTHURL: "ROOTURL/auth/realms/openslice", - APITMFURL: "ROOTURL/tmf-api/serviceCatalogManagement/v4" + TITLE: "OpenSlice by ETSI", + WIKI: "https://openslice.readthedocs.io/en/stable/", + BUGZILLA: "ROOTURL/bugzilla/", + STATUS: "ROOTURL/status/", + APIURL: "http://localost:13000", + WEBURL: "ROOTURL/nfvportal", + APIOAUTHURL: "ROOTURL/auth/realms/openslice", + APITMFURL: "ROOTURL/tmf-api/serviceCatalogManagement/v4" } ``` @@ -275,8 +278,8 @@ sudo cp config.theming.default.json config.theming.json E.g. Edit "TITLE" or "WIKI" property with your domain title ``` { - TITLE: "OpenSlice by ETSI", - WIKI: "https://osl.etsi.org/documentation/latest/deployment/", + TITLE: "OpenSlice by ETSI", + WIKI: "https://osl.etsi.org/documentation/latest/deployment/", } ``` @@ -288,6 +291,7 @@ If further customization, apart from the default provided, is needed for brandin # Starting from the root project directory cd org.etsi.osl.tmf.web/src/assets/config ``` + ```bash sudo cp config.theming.default.json config.theming.json ``` @@ -303,6 +307,7 @@ After configuring the services, and editing the docker compose file accordingly, # Starting from the root project directory cd org.etsi.osl.main/compose/ ``` + ```bash sudo docker compose --profile prod down;sudo docker compose --profile prod up -d --build ``` @@ -396,88 +401,89 @@ This way, you will not get the invalid token error, as the API is acquiring the -- For the Angular configuration (TMF portal UI), navigate to org.etsi.osl.tmf.web/src/assets/config and edit config.prod.json - - ```bash - # Starting from the root project directory - cd org.etsi.osl.tmf.web/src/assets/config - ``` - - ```bash - nano config.prod.json - ``` - - After editing it should look like the example bellow: - - ```yaml - { - "TITLE": "OpenSlice by ETSI", - "PORTALVERSION":"2023-Q3 1.2.0-SNAPSHOT", - "WIKI": "https://openslice.readthedocs.io/en/stable/", - "BUGZILLA": "{BASEURL}/bugzilla/", - "STATUS": "http://status.localhost/", - "WEBURL": "{BASEURL}", - "PORTAL_REPO_APIURL": "{BASEURL}/osapi", - "ASSURANCE_SERVICE_MGMT_APIURL": "{BASEURL}/oas-api", - "APITMFURL": "{BASEURL}/tmf-api", - "OAUTH_CONFIG" : { - "issuer": "http://keycloak:8080/auth/realms/openslice", - "loginUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", - "tokenEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", - "userinfoEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/userinfo", - "redirectUri": "{BASEURL}/redirect", - "logoutUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/logout", - "postLogoutRedirectUri": "{BASEURL}", +2.1 - For the Angular configuration (TMF portal UI), navigate to org.etsi.osl.tmf.web/src/assets/config and edit config.prod.json + +```bash +# Starting from the root project directory +cd org.etsi.osl.tmf.web/src/assets/config +``` + +```bash +nano config.prod.json +``` + +After editing it should look like the example bellow: + +```yaml +{ + "TITLE": "OpenSlice by ETSI", + "PORTALVERSION":"2023-Q3 1.2.0-SNAPSHOT", + "WIKI": "https://openslice.readthedocs.io/en/stable/", + "BUGZILLA": "{BASEURL}/bugzilla/", + "STATUS": "http://status.localhost/", + "WEBURL": "{BASEURL}", + "PORTAL_REPO_APIURL": "{BASEURL}/osapi", + "ASSURANCE_SERVICE_MGMT_APIURL": "{BASEURL}/oas-api", + "APITMFURL": "{BASEURL}/tmf-api", + "OAUTH_CONFIG" : { + "issuer": "http://keycloak:8080/auth/realms/openslice", + "loginUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth", + "tokenEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token", + "userinfoEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/userinfo", + "redirectUri": "{BASEURL}/redirect", + "logoutUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/logout", + "postLogoutRedirectUri": "{BASEURL}", - "responseType": "code", - "oidc": false, - "clientId": "osapiWebClientId", - "dummyClientSecret": "secret", + "responseType": "code", + "oidc": false, + "clientId": "osapiWebClientId", + "dummyClientSecret": "secret", - "requireHttps": false, - "useHttpBasicAuth": true, - "clearHashAfterLogin": false, + "requireHttps": false, + "useHttpBasicAuth": true, + clearHashAfterLogin": false, - "showDebugInformation": true - } - } - ``` + "showDebugInformation": true + } +} +``` - > Note the difference in changing {BASEURL} -> http://keycloak:8080 +> Note the difference in changing {BASEURL} -> http://keycloak:8080 - > If you want the changes to take place immediately without rebuilding the project, then repeat the process for org.etsi.osl.tmf.web/dist/org.etsi.osl.tmf.web/assets/config/config.prod.json +> If you want the changes to take place immediately without rebuilding the project, then repeat the process for org.etsi.osl.tmf.web/dist/org.etsi.osl.tmf.web/assets/config/config.prod.json -- For the AngularJS configuration (NVF portal UI), navigate to org.etsi.osl.portal.web/src/js and edit config.js +2.2 - For the AngularJS configuration (NVF portal UI), navigate to org.etsi.osl.portal.web/src/js and edit config.js - ```bash - # Starting from the root project directory - cd org.etsi.osl.portal.web/src/js - ``` +```bash +# Starting from the root project directory +cd org.etsi.osl.portal.web/src/js +``` - ```bash - nano config.js - ``` +```bash +nano config.js +``` - after editing it should look like the example bellow: - - ``` - var appConfig = angular.module('portalwebapp.config',[]); - - - appConfig.factory('APIEndPointService', function() { - return { - TITLE: "OpenSlice by ETSI", - WIKI: "https://openslice.readthedocs.io/en/stable/", - BUGZILLA: "ROOTURL/bugzilla/", - STATUS: "ROOTURL/status/", - APIURL: "http://localost:13000", - WEBURL: "ROOTURL/nfvportal", - APIOAUTHURL: "ROOTURL/auth/realms/openslice", - APITMFURL: "ROOTURL/tmf-api/serviceCatalogManagement/v4" - }; - }); - ``` - > Note the difference in "APIOAUTHURL" property +after editing it should look like the example bellow: + +``` +var appConfig = angular.module('portalwebapp.config',[]); + + +appConfig.factory('APIEndPointService', function() { + return { + TITLE: "OpenSlice by ETSI", + WIKI: "https://openslice.readthedocs.io/en/stable/", + BUGZILLA: "ROOTURL/bugzilla/", + STATUS: "ROOTURL/status/", + APIURL: "http://localost:13000", + WEBURL: "ROOTURL/nfvportal", + APIOAUTHURL: "ROOTURL/auth/realms/openslice", + APITMFURL: "ROOTURL/tmf-api/serviceCatalogManagement/v4" + }; +}); +``` + +> Note the difference in "APIOAUTHURL" property ### NFV Orchestrator Configuration -- GitLab From efcdf960f0298a0ac5b0fca7a86dd007f58fee8a Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Fri, 9 Feb 2024 20:09:46 +0200 Subject: [PATCH 22/23] Changed indentation in text to display properly --- doc/deployment.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/deployment.md b/doc/deployment.md index 921fde3..3f88e32 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -114,19 +114,19 @@ sudo cp docker-compose.yaml.configure docker-compose.yaml In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml`. - ``` - DB_DATABASE: keycloak - DB_USER: keycloak - DB_PASSWORD: password - ``` +``` +DB_DATABASE: keycloak +DB_USER: keycloak +DB_PASSWORD: password +``` 2. If you want to change the keycloak admin password: In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` - ``` - KEYCLOAK_PASSWORD: Pa55w0rd - ``` +``` +KEYCLOAK_PASSWORD: Pa55w0rd +``` ### 4. Configure bugzilla container *(optional)* @@ -154,11 +154,11 @@ And add the provided Bugzilla installation information: ``` Bugzilla should have the following components under the specified product: -- NSD Deployment Request: Component used to schedule deployment req -- Onboarding: Issues related to VNF/NSD Onboarding -- Operations Support: Default component for operations support -- Validation: Use to track validation processes of VNFs and NSDs -- VPN Credentials/Access: Used for requesting VPN Credentials/Access +* NSD Deployment Request: Component used to schedule deployment req +* Onboarding: Issues related to VNF/NSD Onboarding +* Operations Support: Default component for operations support +* Validation: Use to track validation processes of VNFs and NSDs +* VPN Credentials/Access: Used for requesting VPN Credentials/Access Also in the 'Main Site Operations' product, a version named 'unspecified' must be created. -- GitLab From 304ee566645a0b99f3fbcbd4f9dae057ccfe2d6e Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Fri, 9 Feb 2024 20:34:20 +0200 Subject: [PATCH 23/23] minor typos --- doc/contributing/developing.md | 6 +++--- doc/deployment.md | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/contributing/developing.md b/doc/contributing/developing.md index 72a79fc..e8939ee 100644 --- a/doc/contributing/developing.md +++ b/doc/contributing/developing.md @@ -30,14 +30,14 @@ sudo docker compose --profile dev down;sudo docker compose --profile dev up -d - ## General requirements - Docker should be installed in your development environment -- Run the core subsystems (see above sections) +- Run the core subsystems (see above section) ## Slack -Feel free to join OpenSlice [Slack](https://openslice.slack.com) for any development oriented questions +Feel free to join OpenSlice [Slack](https://openslice.slack.com) for any development oriented questions. -## Examples on developing on specific subsystems +## Examples of developing on specific subsystems ### VNF/NSD Catalog Management and NSD Deployment API service diff --git a/doc/deployment.md b/doc/deployment.md index 3f88e32..48aa495 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -17,7 +17,7 @@ ## Preparing the environment -> See the [Kubernetes section](##Kubernetes-installation), if you would like to deploy OpenSlice in a Kubernetes cluster. +> See the [Kubernetes section](#Kubernetes-installation), if you would like to deploy OpenSlice in a Kubernetes cluster. ### 1. Backup your previous database if necessary: @@ -154,6 +154,7 @@ And add the provided Bugzilla installation information: ``` Bugzilla should have the following components under the specified product: + * NSD Deployment Request: Component used to schedule deployment req * Onboarding: Issues related to VNF/NSD Onboarding * Operations Support: Default component for operations support @@ -336,7 +337,7 @@ The Keycloack server is managing authentication and running on a container at po - Navigate to Administration Console -- Login with the credentials from section [Configure keycloak container](#Configure-keycloak-container). Default values are: +- Login with the credentials from section [Configure keycloak container](#3-configure-keycloak-container-optional). Default values are: - user: admin and - password: KEYCLOAK_PASSWORD -- GitLab