From 1ff3946221439ca8abc2ce4bf83300e723469778 Mon Sep 17 00:00:00 2001 From: prasadtalasila Date: Mon, 11 Nov 2024 12:44:23 +0100 Subject: [PATCH] docs for 79febcab commit --- DTaaS-version0.6.pdf | Bin 14395245 -> 14395321 bytes client/test-results/.last-run.json | 4 + version0.6/admin/client/auth.html | 2865 ++++++++++++++++ version0.6/admin/client/client-oauth-id.png | Bin 0 -> 106307 bytes version0.6/admin/client/client-oauth-name.png | Bin 0 -> 77789 bytes .../admin/client/client-oauth-scopes.png | Bin 0 -> 97868 bytes version0.6/admin/client/config.html | 3044 +++++++++++++++++ version0.6/developer/client/client.html | 2768 +++++++++++++++ version0.6/developer/system/architecture.html | 12 +- .../developer/system/current-status.html | 2 +- version0.6/search/search_index.json | 2 +- version0.6/sitemap.xml.gz | Bin 127 -> 127 bytes 12 files changed, 8689 insertions(+), 8 deletions(-) create mode 100644 client/test-results/.last-run.json create mode 100644 version0.6/admin/client/auth.html create mode 100644 version0.6/admin/client/client-oauth-id.png create mode 100644 version0.6/admin/client/client-oauth-name.png create mode 100644 version0.6/admin/client/client-oauth-scopes.png create mode 100644 version0.6/admin/client/config.html create mode 100644 version0.6/developer/client/client.html diff --git a/DTaaS-version0.6.pdf b/DTaaS-version0.6.pdf index 781b253d69014e40501036a5f3348e393988f415..b7d5c150eb3e6d0072c7217a64338e1bc8fb4f9d 100644 GIT binary patch delta 229844 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

&Te+zI%$72nvGRm1~k-ow< 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 + + + + + + + + + + + + + + + + + + + + + Client - Digital Twin as a Service (DTaaS) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

OAuth for React Client

+

To enable user authorization on DTaaS React client website, you will use +the OAuth authorization protocol, specifically the PKCE authorization flow. +Here are the steps to get started:

+

1. Choose Your GitLab Server:

+ +

2. Determine Your Website's Hostname:

+
    +
  • Before setting up OAuth on GitLab, decide on the hostname for your website. + It's recommended to use a self-hosted GitLab instance, which you will use in + other parts of the DTaaS application.
  • +
+

3. Define Callback and Logout URLs:

+
    +
  • For the PKCE authorization flow to function correctly, you need two URLs: + a callback URL and a logout URL.
  • +
  • The callback URL informs the OAuth provider of the page where + signed-in users should be redirected. It's different from the landing + homepage of the DTaaS application.
  • +
  • The logout URL is where users will be directed after logging out.
  • +
+

4. OAuth Application Creation:

+
    +
  • During the creation of the OAuth application on GitLab, you need to specify + the scope. Choose openid, profile, read_user, read_repository, and api scopes.
  • +
+

Creation of Client OAuth Application

+

5. Application ID:

+
    +
  • After successfully creating the OAuth application, GitLab generates + an application ID. This is a long string of HEX values that you will need for + your configuration files.
  • +
+

Scopes for Client OAuth Application

+

6. Required Information from OAuth Application:

+
    +
  • You will need the following information from the OAuth application + registered on GitLab:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GitLab Variable NameVariable Name in Client env.jsDefault Value
OAuth ProviderREACT_APP_AUTH_AUTHORITYhttps://gitlab.foo.com/
Application IDREACT_APP_CLIENT_ID
Callback URLREACT_APP_REDIRECT_URIhttps://foo.com/Library
ScopesREACT_APP_GITLAB_SCOPESopenid, profile, read_user, read_repository, api
+

Summary for Client OAuth Application

+

7. Create User Accounts:

+

Create user accounts in gitlab for all the usernames chosen during +installation. The trial installation script comes with two default +usernames - user1 and user2. For all other installation scenarios, +accounts with specific usernames need to be created on gitlab.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/version0.6/admin/client/client-oauth-id.png b/version0.6/admin/client/client-oauth-id.png new file mode 100644 index 0000000000000000000000000000000000000000..a509b60c767a2c659c0e12962219f987e5179854 GIT binary patch literal 106307 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 literal 0 HcmV?d00001 diff --git a/version0.6/admin/client/client-oauth-name.png b/version0.6/admin/client/client-oauth-name.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9ed2698ce2799f50764452a4a34ae3e5d63b39 GIT binary patch literal 77789 zcmc$_cTkhx^Dl1aEvUQ|5k-oHj(~`OfB{kI(n;tbA}yf^p@*iZNLPCAEeQcBA+!(` z5v4^Sp@b@(gn*EQ652)l&gb`=`Of|4-tWxKOeW{qJm);SXLrxpeVu(G4fHh5vU0N? zIdbHzmgZxlBS%hX9XWEW`JYn<6b|sOv4fwZP$P|pM=E-F77s2?IH~HY9ywAK&$eTC z^5FXP3r%zAks}wp|9p>*JM#Mvz@D)^Rn%$G5_)qY5<7e;9{F{Jc&-aY0i+;C_uC?8n$_f)(o? zr?Q8wa1#vHR8vz!O-&z;?%_Um@aQ8)>OY+v+W*_M`uR`7A??WJKN9@;oOvbiw{c4K z!rw;twbO@lUjPz-i|F~?RFAidHMS#i8P#= z#!_!+j|=Z`vq55eaIv&~OCP)Opv%6?HZmx&KtctJN>xs;Y+X;HbyWFe$az)^W#C^~ z|5*RJgYm0E$C;D-zbLfKPAh}QXT$)~65|TLc(zIhj{jj{)1%Y;{mc+pH~Y4=c>M76 za>2aIm)8L#_xL@TDfDwXBrv$^mYPyds6GTgwL)K~@h`+<1W8k{o5 zD`&S2`kyU%?xHqdKhIXkUg=E@eM2mKONOV~5MR))tn~(EBX9p8uMQ|G6TD4ZafZhiCUc~G*E~_qreJR49P#GHC_-t4Cr=|M zz{L6{yEDn7GwB&V1=U}g^!|ky;NJU$qQuj}$w_r#ufX0T{{sB>lf~Tix8%+0T;Bka zxFGcH@HvOy&}G=YgsniK~?7(H6)DAx%`^pYvUqx071LO5uJ&b8i`D#X)+7r4}1Jk^S>E5yeDq`K3p@b)LoFaO+ubm6=I7 zL3{SP;|t?iH`P2lg%_yvD7s2vsqHohS!X6|G72s)`s%V<6wi2-EZKhF9{uxXVzuwW z@L_R0T2;N^M?|d{=OxE&zdATEq$vAb5zD%)9Fs7vccU#^mo*p(c0&efgYdGjZ4|IzL7#c2OckL$f#SYu*}(2 zTa<`(Tr`&nZFh2994hA`Aa$>{H#VNxG`c!^Otbw`?7;CsrPN>Is6Uzs+fRXB6i_Hw z%#9=VMQ1>M{%mK=gkw#9eZn*SUm;IFZcYi3GvZ)>4B!5w(Y+B&*esZ3?qDNHQ}50f zi7d`&xorlQBuL`a*mozWjW@omKGNsx6eV|^+P&@7D95km!OC&j=&@Ss!taM*`loolhc2hFpJyCFPxiDl(1M_lheIeV1mj}e&ma} zeom`>`r_3lYg@otGw6~VLXM#$GW%OBmixAW{raX#yu2wYe!Ajb$J_@plm^K_Z{J9E zA*s7T-hd}w;pv~k&i71yjl9C`HC@Qvq^MTFuJ&hI*3u=?nI7AWo+ zX>XXCRE7v-h#|_ZtlQutUGx{fv3!Hf_8JhuBkH=H0+7y1DazZCmLwT?D5XAK#kYq- z-W|1gBMXO@eG=fc*{WLRmBTmeuLr?DZ-kbd)QCb(=jC$`!RzD9TzHo({_FxrCUJ8- zC$)URcvbk5)&YdU-G^#AL{Mc!4uNCPdTvKC@NJ2^WC`-rM7dC^`GhGExIs6e;!MHo z)%1*uza%_>`@TRR!uj+Y&RXF{@p07+6>qd;bapA;=1PfhPLP^Md?xk$?H}&eabX?B zT$xv-28xAHc4}SzAD$*kA7zz%Hpeb8X{C3{$)sXByAffL1WgaN5F>lX_$n|*?iHU5 zbu$1{a{?zxB%$5&h@W)Fv5)|}h7EAF{mS)3Er!pV(J!W91nHrYi9Epx#IxfD7ce&c?^e_yVL#}E zZd-7Xxn73xtj~NAf7g9}N-94SS&*Le(LI?bzl8{?6$G-n1>4z-T@x%8yRbor?R6!lXInH$_wHC)@-`_R=N-61!v2mfiQ%uHlz%t;bwSLuIO*X)%wSFYx!y2} z5~XV5LRJma4K-j1^!Z}3h*0lI(sm%!sfp4&3gl3pl;5(5IPOO9?PLj*2<&IRjWtkK zLw|?R?lYT=m7VPMlchc`i{fH4{s{Q5`4pUZB_JvaUw>bm$2}(fSpUpILB_8t5`BJy zdzG%kE#1ELYO)A7Mlr5Gfqb0IjR1W!P5!XN`A@77I%Vwc!v0&A2ZayZvSdv`#c|N8 ziXEemhAIHSjGPbhO2tq&l-|uEGvAoxNz&nhy_7Hnw{_d=-4+_)fa8(r4DwRV-NQl}gKz@dAzUZ7m)49n{B+ zF(O7+YrB(&RgO}{GM23{J+JhlW4uJFG=}g9n^E@g^GypC*ei8_R}*RCu94-E`5)ss zvM-^)mT>XRfS_UpR!MJ|!^)`Ewf7vAN}&UARMW}92#9X3!z}Z!#n?2~v>fy68a$?AYnzpNBr?H? zGN=H0SCpi9|GtSnfXbwU0OEoF?v|DWKGs@?wDp<6%t$hR@bbWWc7mhf7yp=zW^!C@ z)U<^}TIRSCnHXKZoD5mhy zgw|IlWdo5j6FvLWAzA#Mu)|G-y^nD`iiM5g=os zJ>Jqs!U>!Pzl{{g?gSU)rSna)Ze6ZaKNBlW!_h{5#$2KlWrXMcQ&0uS!bwi=AOOj7 zsd{xzW8g`zu#B&Gz0p~x3BJ8@%G86z^O4%`FyOCg7g;O-30VU_HZRWm$8nk<>(HDZ z-3!L|?HYXfVtePzZOJr;NbQwh0-*j0o)WGWv+{dRLZa&i%?ZaJntaEzN(ySHe76q! zs+ptoh^_pxRP^)QlZ&g@jgQGFUtJlmR4v40x)c+3 z-@fgsl;R3Z@V5>(*#r3jTA{-VKex&vPg^%s8NFS+z)@hUnbn3Sj0 zRP|LT7^CIp!Up!}uXECuuJ|IrEDGnku9U7$@2wdk3oDrPif2ZR)`cv}`Gy?27Pi3# zH&aTri#>kk^;8JmGuO$IdjfFB*&aW2rk{Wok_g=^Qv(r;!xF@(y^<_{topa@ht@ec zkW2=P4>bECYWtTxV1Fi&iJKoEtZxfN_AxffLS>pv zfW;&Ev2pbtNj`1l$YiF;^w(QhNXqI^p+2R!YQ&_z->oq}!~PWRqN{iGGTFpPqeP*9 zZK$x7P974}Mg*ajacxBYcl;DYXff$AFJT1_aN+AP6%$0DNyHXSh`I{udZnHZA>;@A zlOmQe#M=#gv27B(y642S3pVt@FTKFhxlcd#t&KY~L|ky7X7vso76qExlVWUW`4Y3XxY3%(^w*(-~? zA!yFP=N0PM=Y7mp$86CNwaU=d_h2U1O~YR{t&F|1K$E9gvlk7c(4wwrV?NC9rVt-UO}&DeQxRhlT07kT>1W}9X0SM_;r*c_qD1a z+H)qiwSw*E%=yU&c@Mvo4=yJ%nW`1Fm_)t%o?IprrrYac%^QH{v^ITh6*_Tbs+9?1vKs`{>^M;wW4 zYdCZ4FzNk0ks5LBbhS}+um_`zr}7Ga^Q5!a-I+z{jL^on%roS?srCDR*gP^hag)8< zZL+d|^|aAKXmQCuhg2@1|K!fyZikfrsciaxC@KHXFyGWh>fBTy?1!oI5vz}f_VSlw zu3H%+e_Q|4kidVQ{(p%q8~_>XzeC5PIFYr!-HN=5-e&W?j)yozSm>t!4uLJk;DnDH zqdY?nQhq@&YQ*?2MzI66xr?a+zc)LY;6B#$@3p_w1}~cvTIE7=ptFC`j<8WhsaFCZ zegVRN-4Nh;aKl0o=i!{pa8@2UjP8&8cf{jA;(b$d!iU@F+lErz0Maw(VO^o^ac$t? zYR;(fy0M%a#0qO;beHgr8>2aYQ54A&T+iPNNJ|^`m+t2`K<7q`?~n-%;fg+BkNCf0 z(Z)`42~-^uxT(T4+1_XuxqrXw{Fy3n{Oi}R?}1ZpSvOii=evxJ`X<1mMIQn;mL2x* z2pc8&2jP6(0p*EeWfy>AW!@j2o+M4|QL>cbLy4lSl2&Hd_eqZrIe6i2{X#Y2M`B3t zXagIe-t!TozAp3Ty{T^2q9A&&NZXQ19wg8TCFf=_Jh6E_q);e6v!YwrXz8@x%kyY& z-IX511+f06y!lq4O)g*Qsohg$_M$NE!wKU`V?#`XkR|UpuN_SN^GnyN%=%aAr$HxK zYzr3q_db>~Z>om|0dzC>;|#)=F_ir4@e7gHH;|zl7GhpOSfTyfwi;B0!&&%*>paOR zP?gbZcA&2GlbTlLah92PU5bi|1W=Zk@tlm<@JvqLR76=P3~t~359f;~XN-C?vWc`c z5$lAHmRIBN2{meg9=eu4>z?;7aH4XsgAy;pT3+|B-%U*t;Ee}dZ^u)&?x#A)?tAXZ zt@|fj>3m2E)a!uBwq)turU?m@vO8ho%IjKVH>!E2TT(LX?!&eZIs0DBhG^*4;E(HD zrz+8>bnuQ>1**(EuvZk;jD3~}HrYykA4?tW_W7CqOW-%P++`ycm#T#wB^_3RV)tF( z=LCvL#>X!53_l(m>oaobW1iCb$^0>~u%WxUc=T0RG_d>^qY)MC;-n%R$5{U9z$*s9 z=ZbrGb(z(F?rv-{PQuTrynG{$aI0Jfn~d5-j*XTC)@V{~>(naDkG~QxYt0^nhg{Nq z4GP|_E1_sJL|e2cB%;y%&Tbk9nr?{gP`au1mVd-fOQBqCVmB`UmN3)BSySFgf_svm zbVs8~Etg%SoTBqCQnP6&p$)Sgp0@9~2@P~Er5$=gm)z9QkiwirC+G>~-wP2g)h!;biWr9#<$h0p$CdlWGqKAvi zC(MC8#YPk5BULUWUZ7qNRf7lTx`Y2sM~u;g7HJzQKb837i1GcYkoi@522aW^TdK1u zSOHBPvyqLqV5fs>vLqW@v|j72m=zM&5z%!G=6<7IiSA?*Yc-Vfqo*Ime4X?96pOLF z5m_<{MF{_ztKPc1)vWC7rXSuvC@wcIBYM6>jIOGqMclB~!UoriuP(mLK@svo1Uc88 zmoJoclB_-OPQ}HE7N9dm zJT_XLG_9-j@_I30YEB&3TL{*Sxg<$K)y$3*NmV|04fdtve^b+kv?I_Ri#dne(&Q`F z1VV*z|7s;JIHugP>GP_`tab?DhUaNidED;uz$5li1Z9M1IQ-t2RKt`CRv~i)*DQP- zBM2Bav1i?;oubg0oN*+v3VfW*^~T2Yl=%rE#_z&zd12#wdT=RvTw*0f zVx&0fy-v|hmTLB;L%*4v{qje~+0DT~`&dTCMETMLW@2^H4STvYK}FZC`NZ3c#>GNZ zBBe()aPxBum@^pxfQAm<&=5?y*Oq&CpJ$|CIJ9fv)&_npm}&V#G5dM9lTUAzkxFck zz6Vyt!glwb4((Do(dK04ezo6?&#w00i^ZPB?-y!wn$~a4ZyGvDoX6GOT&x{l`rx*NwGo!eCZ_oeTlJ0nniy!`{XJf}yLLF1^V-(; zAde~=&ZWwvuN-SzptNIx!~!>;Hzj-nHX57}x8K-+_aec?+q{*hdo~;3FJ*1B=JwZ0 z3-%@RL6}jbM#TNH2)=q9KRROep9jxNU*!KQ`m6px%l^JCCDvp<4e%+qftmTC#{5DXiUWtMQ&5dz93WT>n^$w?X$M-Ws>lwDV#B=&B z38$j&fn&4?>E{$IEbzwR8-1?QsTdXV!S}@pqg#6fMNfq)?*wIDMsmmmdH21P;1ZxH z5hM}$Wx(tmA}RX)Iro0DfBT?|(R#&T^}@|{it7e>(r~d4Awg|<=&EGD!y1%?yQQrP z->!ATIt3aPI603FEn09m>3>IVW|N#Z08`bWt$J<9v;r|R`w(}H^y;WH+Qb}mXYy11 zYBP_c7M%9+W)H>Su7-)hmIHxZPICks+Q>rdaP!>dLwWcm%P=GL2fm>5`TFOmxbX^V zuTrh+qF1{U5g{8l8A<$FveAw8{{8d%pRKw(v#u;8ypff)gBdG&UGNw>l<4R-Qm@L= z^H%(ZiMBFdAp;uHkMBGuR%~|D$HP|dWOwsP9h>r9aZ?Dj@$yMEb;MI}LfndNNv?2r zZwA%Ldw4b(#S~I(uzypxtWXlIoorfl%qi*Lnum!YHYocaPQYsiu#o8;anI(lxx9yB zvZijxskah&kI!dY;6N044T{MxO*N~m@@b_@&R+EBVdckPDlPMSCuL%1zH7FVH4 zCQlr~H(ZEhv_+$DrJm3}3JYgi*WH#t}{_xdfu`2(Fpn4l)NL~*7heo*9I2kT5?8%;F zf-vblFS6RXm>30c@hLiAHu>cZZ)Ht)3^DabWYNWwC%Al@8|4cx3i7Gs7ZH|Hlhc<5 zKPXjPi@fP?=Rs>2Iv39v>d#uskv|;POtM~C%c}#S;I)E14y>ATP)zpk$RS4@OBK6+ ze>A8%^acAF(WNwb+N4_E!>CP6dDnAXT+mYw=rZP}s%2^XVA+Z(x!$t$hG=`L67&9P zF+*)Zs>|YkhW{sF^YeL;29G?xV7e-dwI}vrlo($@k##7!e?z%SHUzaV4(30Kpi2LxWhoude8>X> z32mKA|9{%qs{?~-N4Z=&q>SN)e{%<~*@Bw4fSp{-voN7E&6N7SSBwDU$#p@*B|C){uVk3i&L{PD^@WT!FJQ%97s%@hWhb@T0V4X-UT$TGe-Xwhtq z#d-+W{Kq;n7UE7E3ht>2%Lr%ChFYS$5`T-^q5fblZ2HD^g78&|Ow)Vep!ajK3 z1DeSpb2qpc7WTE;7N=`v&%Q5TT#{84v8MrwCECZIt5UH?cjPQtM)mB(Cm!lO4A(Pq z?MLK9iOU;t^$QmY{)PQsC||U2JLqZBi>(|-o%&$MTKN-%Z|<89wTyngBG#P)Xx}SO zu>LHlYk(ZWj@+Kx4~a=42V`?M*3lREGpa}V z_Tv9R1Y|1j`XC&4=uv@5`|=wa&rX{*akUU*(i7>6kGl7gcX5ZKOm=P!3;%d2MVu$c zquZp7Oypy>)MqCsMenWEwG9mjY+uJ7qW=W*BqIz7eQ|Zjy zR$@>4L46zEFE;-Btui0k-1vqRu3JoVs$sN}PJ0B* zx_R!0;@w@&vwjD8ApD*Oy@Npktt2}GedB)?bR$qob-++B?Wna~ESVCrASsgd? z7n_T$>HWU>Xz}h$jfD*5>DjEBH#xR@DHXnFlmz*+;9M+c2UlPTOFh>8Cr_jrjq-!uOr4!)Po*QCKUIP1daG9tY=!Ckrj52u2nEw!$e^bx_0_c^I9GpuUuCwH zuh3E}OuHYhbDd_R@BBQysG1J2B{x(xQ6Ibk*38Q4rU5iMQ}*FkY)32KR!kJT6X$Qv zE1bHiG*Mcb!-pshH1Up60up2g?o#?O6#xktOIh-wA?f|o_`q4+CJ|HJI1?)0cD;>l zj@Ed&Z6WdH2XODo(e^<8c>_F%y=WSg;Y$XDN>jBK%W`$`hN4D-YF z1GXdFM-B^n>R)90sU{FPLNS?vm#=pd8_<+rO);c85eN3n`KdR!dcYH>k|bu#mQCeE zpBZQ24PccEKX#YKLN+Jtk?x1!c{X%}WFM}rS%wNg2GaOzM}UHbbX}(Flz3yYi<(+G zgSfbsrVML}utMrsD{HCny*QUkf`SAQsV4sZXQLDo2!1bm4oU>ySC=R&#pP4AH1$1L(%xxD&tSi1=IyeFb(B>GCxn=sK8*$(@ zVe@&)Hv8C;na4zg^3Rz;QZW{*3D2y(LB)O@sRd9ON^c13J<14IKg$ajNe|-BP*9yu z_#T5iN*wJXt7{IAJYKw1#J>_asI|FeYMN)H*%_xD{oyjO$;ySV$_nkPk#<_JY6+K#JGxgH zZ}}(_mb^;dy_~7?rqd}{dRG_yf$`qGGPlJ@;B%Csm@9je_-J07<-g(s-_3K zqz$+W>mgIA=!h|iKJmeciq8k-0`~DOWvAmXdpv}gbj$u%=ha{>NZWQ5|O!H}Mt zkzt-Bz*NF22x7-01h*y!1NVh7J$6@ZC36q9%uWw{mez{ZUE{MvlsyUQRl7^^qa#g2 zk?lgkg%iH+0|mp-yD+^NBVM5X{mhmmxK$f+CCO}8E;t*Il`W$$*!bcrw@<$D5wZx(0(fYT} z3uxuQf7J9TonnL_W98#9qs~nwJ4ssomj#{oKJt-6_Wy~^y=Pu%(_lHs*nEKOC%sNG zs#F?bF6GIV;;@^~Fd>R5A!Q*OXL~6)r}2y5jXWl=$wIN)a&|A@`cUC4bPO;GpCxoiRn z2odp2v8ku&>RLnU`o{4 zE>1V4Qe($xtirT4?|Iv;%awjMfxyBLD^yx7>C{oN!4<)=%pc)CdZCt8_7IGG6VG6s z8uYG*v0P3M8GgPVQjjosjFM7Jk(IkGQs&5pndu)`L(YH106- zlQgIh9@zirue%pu7#NXzu!Slh!2;)igyL+=#LU7PMpLDTmOp#&=2$EE{I7=Qu*o~% zjV^iSaz1xDi@g_f1RTz2iwGv>`M)6PY3VB1vpYx@jIm|xOz*=Xvp25zIU2m?ro(iM zTdtO8xQnwP6wC@$Zd2B@Gwt`b#|JaB`?lGCltnFH-K}HFij+)drR2P;3*4Ibpm!08 zGgvTEtTA3uAlqBVHmLK(YR1<$KJZhcsa){ zH=$sKm@s8-<%>Crn6E~}iCu3ybLx^&)rB`fr!)?t@16HNp=KI9;?*a_?~8Tqs6e!; zST1HhKf5I#x~FC2`Xp-$XZ$q3KAh1a(qGNE0UB9xR6e`=qPeDdNW2y6-eIgu?Y zDCiPySB-1lk#l~ir|XfN|5j-H z|0R{Ym_V(S?|0|3Bj;u@hj&kgM*pXF8G7}Q^#3#gj-d%@dMWOu#qj}3>c3uuMS1M? zL|AESnPmN#*z8}g|4WK558raEhHob2KeA6~vH z)dSsAP;3dxTG>n7xrI-mp?T)!t1>3;%mkcUHx1dEubd8e(ZZ7&qJZ+RL22NTvATxO zMpbHc_rvWMzli023N@XC{s9{5b~?G}KZ;If)a;dW*OnLQP#5`(2Ar2@xz1mfPFkc| z8KaO~b+`vD!z#KSxK&gg7d21aAuAEIcTZbpaM{QRz796)P>|T?=`GoU)M}iM61(tR z-x8IpoKftflxTu54xZf>qfLGtJE_R7HIRU^6mqTv(fbV+)ngL9|B>y-d9`Z)kXJYx-ZJ{o1@h0kNkEF7z0PJt#ol##wIHFv)DfA4T=x0F;fahAVc2JgQs1P zAv}BeEt#_VSB)r0hvZl5^eiPbEIFk@DgV8fT5{b*{`sc;f|ywa=sZNB3vVxr3z!ek zTQ_yzY}Cshq4+QFa%|m5l#JeJ1Fn32ZSDAM5yVQO0&FLMmyK!C^E00ylaPNA3sxjLoaBKPz(&gP& z?lI=OW$t@syWGPZYec>7^xNjfre8_ZDW}NtGv~$_Kf4u$kzL_bs1W1}fvD&hKd)lD z^>V2V^22FmF*CUxSmx+=He}8myFNhUUU#-d$35v|=8pGY#Vys$Cl@r1BUw(37dJJj zlZ?M_K--rx4Lv9|4bqKYVG~K(#5&uqmh{>YzwWnaom%GeA~7q_1C~M5Pdk{GJCCKb zHHT1Fzb|YjD52{9^u&_Yij?gj917#bV?(Fv?{5rJoBuIBPjd}*`E_G`GqkIUm;tWH zhTduLP#N4q&$sM*woC@K1CS~`mHw)~o{8C9vk{+1VT9|Iii?rH+OwVTazI-qQZx=P zhKVD4`X;+IA*@n>^}MU}^-B9ky@8XgAtg~w$f41eXYn3f#_={|g(EJY?-Eo?nzQMyV06#{^0+zL z(}j3C0(^)Hs78e>j}9dMaJ((6)sC9j)P7J$xmz#HZQL1Oy_d&t< z?nct?@xm8Xw@+Fub~>~;z1QVy>RdDHepuqro^2bDWth_G>zavG>96a@(KJ%F=RQXe zkQPUI(^U*ZpT7$$awb+wDDoO=jadRgFT;_wPb+tmuWB^P%oM_WJm!C|;*7h0U&*fR zTNa;y)?3FhNLR9E_q>$IAU5OxY!!=7^rSd|nX9^JpUc71y74&;)r)<^5H zPve(t+uvF&Lh zRJ(1eLxWqHy>ffK_(V|gXX6wHC0)7pkI|Ot9YJ+V>n`7@US1{FCH8r@hkGh(z2=ic z?}d&}Wvw=@T(Z*AhFr>gxt^NR+Rylg424gkO+}siJQVu^ zKkltqG#R<=aL0zOu%KelQ8C63UTUHnU>_TkFrBstS$16Cl_hiRHd2$OA3L`pSqB#2 zb#RqM`5In!08zKc!e5jmOXUcbgU0I(BTXKtCR1KyE>o83n$HC7=y8eH`mzJOH0glW3gGm-}P#=bQ;9Hw*lEERblq8YW-vQwrv{sUTSu4J6D_|UFCY=Vs0I< zeZaM! z;%42^I8Ow)auCQ@-QAudPmY5ii)SMsN=@tHWp5_RQy|2nsUXwJb`RtJTYbKs{s2bE zM+~`CqHF9C?yi<~u)`22?#4kqO~rQ5cs>xtO@;#Mq4^U%_9M?5(*wSBVw# zYeSI@e#A7DTBgr$k84#@#v0nZr!D;u@Lg+lh40g?-9Eu%&bmEhGe%o3Gz%B7)Sc_F z9lS@MYj5$)8re6g-c}e(cox@?ud=AABZGy-*xxHzd~mku*B#iY(wKSHPGwy_<%iH{ z%Xa4^=+G|y`}y@9Uxjzh!#1U+v(KBnLYAq4_IZx`^*^dS`r;tDv)GcrQKCk-PKHlu zc`uiKXrTnqV<6g(z!-|?RcS8&5dDR?+XnM)ljd)?Yq2TJ+G=R|hDJ2GMLAk>{cFmn z*n-y%$qk=EuSWDTy*`NJyZf~3K=B{_NAZGIxr#hATZkhNyA9m)h!NVzwp>AjVzvz`y{SJwHoToW8+1P zu!UatU_@)lfV75-lIw(g9+IUuSVw>3Sxzd2WF zhg5n6)A=JHP8(Ljm=B^9#yIVkA0WXVOo3s{4m(N(sAsLD;k;XbRt$83%1Y#p_lPku zD|ca`NfismdK!D9WyZ6aq~HXeUOKxvBqT@+y{x3^H$k$_CRvpji_g0(S92f;b#HH! zpUfI6Xo&U&Z;YP+wuHQ2ZbBnT1ON2(BtvS!x1u%#o_sOnkEI>$FFbhK_a>{Ey&w4kEt=|h- z9L9sy?>>Yhh*HcE7m5{e{np zFxoRh%4!>xe}6p1AeXP}K0-r#Y?epZ7&Ptew-f$v>WI4G)PeTyn9wA!!_b zieb|0xx>A@=$;bLk~?(QHrkiV1a*t4@ZFGaWug+bN~~4}$^54A%aCJo zd#akGP;k9i1Trx593s8`%Tj0c+#K0+>{rI1B#Sf)2asBl<(i7M!QrvJq$(v7ln13W zQxRjhyLNp}$tl1#2vOcRz7eM2VK%#KM73=&fL`J;F&SwTyW;G&VTHQgZuA&te5#)u zxBQb|<(A2l#R2k2UzY71o``i>Fij0XU`PV8<{?QkDj4_Z0XSli9H&$P+I9p2@8A1A zYT+n>!>bO+GFx$Rh@n||%HDR?qC{0_Nr=^jQbNsna~`CEC}rd#*0EHQdixr6)Z$to ze6Ghje>xRyKrI*mjRai4>WxUbA)EMRTv`yx2(F?0Hs~D0#VP<@VNLj;a;2keW3L(? zY@TwmCU1#W9V9m>ih)+=Qs~=5_|>h_7di2r_h%zg!@ftO@kKtn@E2$qT2V4(L4`5B zb6jj}T?k#MxpcG=Wy>k_6P>R^-3!b}24JlT5>svm608%(te5I)P;3p~b{44hG$DB}I zoYg@gWvxmoGU$sU3SeRu3-dN$+@?HOlUaF^&L{mWC+;Goz>@Fs%;=yX`@#l)is(U= z?TzMx<@JqBCs$~^f^9RVzYU^NT+Xz)S;7lSN3IY#{A`huyxij6^FdIaWdlv*H?J&p z>YZksGaIA9BWwiSxikV$^9g7b$qnAHvY;0Y^jMc-xro0PIMxUS@C?@q;@Jx9z>;a` z20Wft5WbBb2`E>b8)?*Oimv^M@*Bt1si8+8-hz zzmemDuZ`Qy>fVymz_W7Ib)75Suh8x`QMmzBx+L`iqSDxEb$be!=LkiA%ze|(XIQ1EJcY#C_o3lzo(4C8;O2RZe?oDPb5^i*xrxyJb3ikGEs%Dke06*0my5 zfNhqt+FWuSyGIcOuxaT*8Jr=J8k|{iE4?U|Eu|B+j*Iy7Vgn&O+y@_aNz4iLsi@ve z9O`vOhgi{_nJv?h6={%p6l*fraEucuRs8gNK{5B$*=_;=MqVcXW!Xf0CiH0E9ToDdxAk=#$dstQfiF); zUozqQ{rZbrFpCmDzSNssNG94GC8I)X)ij5@(Bc=SNB}^`Q{+($0!EoTD2l1#@B+md ziI;VLs_WS*-@)b=f-h+jTc}D)SJs|x+whu{A!I9E_I=P{Vm5xboPcHNv8TkP+eRtf zgq@pegteX#LdS>r9((%oRWNz#ruf~7Y5dFOILfA$XnC4K%2)&NgHP}d+$h6Xp>z6K zz=zue^fD2G zehS=MX`Mnr8?EII7N_e7SpVVMlu?&r4a(BT%*Ulb)T^h4=FdXLBnUW=ZFpLePR0K7v7pJ(FHt90O(%eMI&T`4v z9RLgU=hB-wMXUTo1u6fMji{*#6^4V5umb>ilnC>;o`4~IU;0bPv-d3v-j>ZnR5Z2g z)il_O47!H}5+(CCXQAj(d_jhbd3_Di0)r6T_Rgtk?s|)x#s7%6S23N>EqCy4WR-3ImMO z!&{jl76C?WBsz$_N$4dmfC~VNd}g9&z1+}4;|W!hZgPCmGqaS|nVps`J?AWedTaVv zVI6g>mC(G;!M*{;C#5>iE^CDk)iCHh{O8`Fta zlzbJzN82Me)S`zU>9s{$WIODlzSbtbQZVaC{wWyQjt-@II}){{EheofiV&E_oXNm1r* zc;9m9&ho}eXm2Bj5HH;3DyN~E&nU9xN*e`a`1%=V%}DV03m}Tpuq$Sx1H4&eFAW2@ z@7(dz?uB)!@&h%xn+ME4>aj4K&4F!Jq37_QLw+P=#~U&-zC)8w5)1Mbwz8G;togXs zbvSLhg7GI1W}C&1$~C#X)5X9ha9OQel+Et*s6DHi&eh*MmyN!AKE!7)4YeA17|Y#cKm_M7`Ru zhp19DOM2X{_Sw_MpCmWz9X?#j{m1BhHesAsp?T=*PJX;i$fL^oVC4))7DXDd;T{OP zY3#f6-9C4Xv6HT^CozcNg-4Z5JgJyReqx>lVn4aKnKz8%p~?GRSnH4#{ISNn1e&H# z(#A0$@q5!*qvCIft3te^HT`@Zg(ZUBk0!{;E=Qx$Y=h+IFFO#n?G%jUJeeE#(IAl1 z9ydF!uwYi}+pZ&s99Y-ZkS3NdX|$&*h)_7ef!UVFDTtDW(IURlm3n?nsQKAS$LB8* zw*8~3rF?xYPmbs2+>u~&us~>}GPOfPdQ@#3TUXYcI@d4%pl%7X4fCgNrShj}cT>b} z_+SQZVNBmwtFwV}OWwouTh=;GRqixh5bOgy6A$%E2@Is-ngnvR%6r#v#RR z5MYABW3OAK?N;tdaO2?_!&)KSTDlP4qBI+{fBEHgR^6rsbmt2*)m>~KbQ@D*h4_~e z|1MoQEe*CTlzj1DoR+v1jVGs6P-xg?V_spbbgyy7D8Tw*aA%$C_STuiHmF8+&lsUP zP+CK`7mC*3uY#dyqXCx%q~H86>fSS|skQ6(-s)DivW0Cyw^Wr50wM&Ygd);=2_2$z zLX$2D5F4@uDbhPghmb@{=m8ZG=~6=I5s{Vv5lBJ_gcI<7p7V_HoHNFK&WHCM=j+NE zE9+|On%95M`I~Qj%mb@|#e%g+4N=YBbnoGnuUQa#+%C54GLQXj%Z_Meq`PA{IG^#e zrBrI%H_t|6l^iIv@XaZLF)YKmNkKqiqxYFExHk$jmxJ!FkL2u4*`JdFy?F#vHY_+f zlaTD((*JZr{x?lB@~b`0)sP=R4QICfxw3^0?yMUW<+E z&3>OE-H&fqCC5uRTysyv^Q6JyYX5+8nogL`-FC-d3>M}itGA?OZ)v>D-mhnSngbpe zcL+tVdw|uik{zqS?fceJz=Nv1@UT^daC{^q&Ac=3c6tEV^{c*PuW6*{xLGK0)Pef( zBF1-&eUE~i+iSnk0dN|2>uSS%%DpQpxc(LF*wyo*8^PlT&~2&iDR>c+9c%hh4Qv6M zp~DkMx+Iz6qCV%|CjWs1kZNx{A5-8{N$>sh&V)Q~h!;V9%lN*36Xy@^Jgh-WU%PNx zBx>m;)&(vE(XUkS@wHywNS}rCs19P|Hyz9W3D3b@eqiLa!XDN++8A=SWZimxpEW=1 zkzLzL-94`Q&6%#)h5SaXU2)Yx^|GWsA15LFN%4`Il|%(-&+y0s1BS8KilC z9@#$n>+!}|9*(NrXCmM1>aVQ+wX5N*Q+y< zQ`rt)pRLIxcjZW>LYF@%p+;TRVRb+88=M>8S)rTV^3>gD8X=C8t~*~LhP2tpt-e$b z6t`|B2M_-{e`nmSztF+@xe-p>j?IoNr^L!Vy(XNjqn+W9X=APw>-t*W$18%^-N``c`U*>s z_N76Q9Jmv;Yh2eh-&)Ioug=kYx6lz9`44YXZS{PqyrGM9R3=x!b9yUldxTl=E0OPa zrPIlb*R$ay4!-<8r3^czIj{a1JCitHn1NJwcAS-CxUI%IxxA-MQ9{SC|MBny1{~d| z+F3Yl=U!&JBrHWcrMID@s`#z;g?JxC`7y<0Og(jfS}H_k54xSxKK)0obw2wrjY;}GJ?+Z?fU@#{X|gjj@iU0Dm)!&dNoddhVf`U?J^$ z`W29p05L0-1M}*8{-;|GOSa(>^7N5K5wgE_gz}>@>sWxi^@=cHiH|MBYhv1({z1Z? znhkb?lQc?~qW4>vlN3CtZe!1CBj(45MOUMq{PuuwMt9MEdmG0HN58npgQau*N^XZwB@0nmWi#P!{)f&z zPlM$zCeCMHAk-)=21a0&mzMUqzkF8_>NNcW`I)uJU$0m7&^|Chvz*EU1mV1HFcuuH z&?ni(7Dt=zF5Wq3VZCO=Df>eKySG;hg+7u3i29q6;GD>_@!58;7O@~4t4jUMp3B4u zj|UDI-@hx95$PUCn&*cejdSJ0B3SVkf%V1*->fERTi1kQz2aKnZuvJG1_rOcQg}g> zM^&B_Ztz%m0hla3*WBtOB>aQxchXr8I=7d*TJKuFJd?*_ zzN;r@bsaR7cI)R3>nohyX83j%=(JaPfUf7@ zVtTdj;C+ zUQ^$3xT&u4iobxzeEk9K-N;G=iL!JH&!}}gv<0o5$;h?|v z`u@|cA6zTmYn6lZB;3DHp#<=mcItEucN+R3$`#bCR??R({A037(Q;R{?E-8 z`#qDg2$`+rhiloc*A5H4*Rsj|yVYtOn2-ZO2>B*bc4;oj&~Gd^be6c=R8~feg3@dj zc1WWHVGeQ|VZH%U=JhgA^w+emn8J)95>itn^y`Eq)fNz-+Ooe-OIcmodVkFsCCF;& zH?opM#oa`dhm@QXw8$Zzb*pAF`n9$dUB1^K5+No!`gdOhP#y(BW$0*-nd%| z$mBd>A)kpAcSjedy}t)tA^RudDRll=dWNP~ym&#lEAE}}!u|d4egOX>3k?2!U8K%5 z)9g46s;FubavjHuPS!ZZ)+kKvq?9=ipkc_%oj!JN30J*?7t5&8g}t0BFS$5HKd!cn z^N-zc`IGEeR^oW|M~VYN7QXfNmgBWmi;9QAQF*g(&&SF`rm9a?PSmOIZJDvrJlnu6 z2Vzr^DjhBx)6&~p+tgh?CGMxplpxOn3~T?c=!bdR>>6oXM`PD7+Lmeg`NTSt=U*R7 zfGYYx++<=&DW8@ALbZ|$j;Pdm<&3MBJ5yR>X`YXC@suiz4*)N3q$UeBOz zvT0zf%h?K=`9F z@>RYoMSe4$7c;29EP zd8dD(aW9eIGc$6+xUK|7a@6Sq^ig^zI-QeFOm$|Uh_D*R_dgmK> z@2&)2sORkRg}q?+6QH%>p-_pUzTZDX7E)9J8!i4q2LlJK@U0+2M^40(@_?T2z+=<;vkKpI zs18l@m*&{Ro@cp*@OIxJ7>i6IXM88!lY_h7bSSeK4k@-XH>b!n9{A?n=ixxOTcLsb z%=G6;dDV#}eHg*uz|v2}kJexP0QYE0eux#noY9Skrqj>82A3{U`=yu1+(B`Wh0Biu zQa>l;p!(?vna*MLDlk73TNx0bpsC3rvs4eX1q`N0)FLOQS@ycffqq&8n~_?izK!o< zWIEnphz^#-cRTgt`is&x)c_C(N{}Vp!;<2e>NnYg$gN9%e}*_cOxl0IqtEX~D$s8G zLF06-Rni`4)%dZm!jfv)!Uj@CpDw+1pt5O)G^9<=%?4PHoeD7=iB>Jnw}byJZDTiZ z**unpD!p3&1em4h^lU7n#(iNXi%(_fMZdd6m8Ko8+TCCIPXTTd3PU4i%e3O=R?Rz| zmP?YB(j=*Tg)jPWl(~X9e4-b(+x6wZKeK)J&1Y11t2-@7GrxO>rP+WCkDNiC#3`yv^s9wa!Ollr}l>^58)EK^nGN6Z4606a< zOP~F{l1H8gWNy5X3R7I%Z^oY+9ZGHYTKvRE?NmmfvG+Uemb!F%gKu3o;}BC^3P_nd z*+L~Lt+`Z>r<#OG*1^1s>`!&X`uIgP@!%!W8YMJ>%oJ! zZInazYa}hZqjDmWcG`{Cws3jZ_8zSUbZv%6W)^J2CsTT17YN%`Lzf(Jml9Np5)N@b zNrwtcGvZH1z^6G-7t6*Vv$T;)92T8*zxlhmBU=BQSQ)2ayhrE$Zk7yP>OcYZ)RJ4Y z%+cy4q~EdupPu`3iE5)R1}a&M*t!r~6|);6h7gjo0K5tI)Au(rj1hbj&w<4T@p8wSwb{jdhpXJL1D!_stnlRR?&Kvf}F2$hSdYa0BZ2ZI4fYm5b}TybS7 zhG!Q2j5Wp#`%*L5Wg@&^ZY5hDUlnMc(>>)CG{|Gf@lc|NaNrbB5j4kdi}lXDvX4>g zHA=y!Vq)Dy*iqs3a-s2y8N18|lp6ZqsGQi6oEcKS3AA1A@*?SF*MP8EdgcS$Gr(W20H(?N}NH@5gbQqZTD53W}aC1T8#K z!nNJEv|9fy3glJ!x#VzcAee-4n}JB!H0qJ+*Udi)y5edG*QrQ9NfXIy11xP@GfnIX zB5w0;J`_gIt%Wb?+zb95^1xBbleS)_BYDw%VnZqc`-8MQl9#3~M0cYMTxQaPv;;o{lFyzx5J%PzT_nwseETH)wcC<#iCMtiG9alg{np02B9&O_KmjE!-s|hn|+N6U|-o zE#0Wi>)dJ7a><7BzCAScfV^n$H-MDx796F}P7rOngP*<|v8+t?m8vxbN62^N)L!wT zGDgHEs`A%Y!fYnRvHDjI?7Y&e?vNY{PjyaJn$G!L8&GAWoQ7`=x06!x7o;>MYQiL> ztd{urrMg`6Haj-rq)x=NK5l2&*I1Q_*O~E=f?H_vYz$_=$)d~xa`mi_4Mx{1?baPv zkKFi_wYOYSQ@Ozk!O08KRu8YtpwO_O6cBn z{DcT!&j;$(h6w7y`9O8s02ufLE-(kY-`AqAR}tyzxwW}q>%G~lD34P7yTXfZIXugu z(o?3CziTF|y%cWDnDNrIK$m_!Kw#eAA}9(m?%*eLyDcMUQ3wb52GpHar>9N%c_f4A zCKeT&Vw5jucrGN$C8VzTvc=E~>Ynqwbd=m`X&z=(wPtdEs!Zrwq+?42m@E8ei#I*= zPx|)s++pzaq(JUw;&?xiPp_ixHM_^n+%@jq77%ZB z^8!ec{698cKTeF5@*V@%Rkh!<#`W%p10F7#rTiUgUuJd^bh}C?e)e(Azv5qj6bpH@ zib_C3-^j+m9}l0JEP3%`!>R^}b2EM1*6;rL*lP9eD2{~jkFDzd3uuZ0a;NC5VlI1F zs>2==-D4yyBz9Y%g);8hP`Tx{$9em(X_zcCSQDUV`pPXkVDnOR_#k^nf~#9g{^oPl zu$|@;mTw2$D+PuJRqM3w1ffXFH)pMHjP@VhxW%CYF|=nKS<1KDSfo zVT^tQw&7&-eosr)z^RFi+~ciKv z8(@;Quk`W&w*FI9$~b%NyzCSS9_ijm&jSc{7T?I<)7nG#N=}E)y<XzDp(*Pl zms{{o#zdS`tDMoE4*E51_3*l2$WzPJ+bnh!0iJ%II_WcaB5K*}5%aq3C>V`CSF1W? z!vbae0M)PbeuxzPhJRj>OXCKYhX0GA;zT zxOHDeKe9|>319wPJ6?aGvb>&eYl*J#1>_dk{GK~C*ovtz-D;vebZi*RulW}0xEGe& zgWpWg-bxT;?{Z}a48Yb&oCn)Zs9BX;)rG zK~Zw+4LEG+Fzh-%VK<3+cF7M|okV$W%2=)FOdvf2L-bsU?vLY8EbZH#yuI-a+$n;G z@edF4l=cUEPwq0AHjfFl7q9DTC;ounv~Vqy1btuBh3>9cQD|S#l#MC$@=7{m~m-F$A7zBvm`5Hfc@^3)S}5oZ1+X`;*#Z#;Fd^#Y8#`pz8eFXc`arHXHh z7Edlz<}KKn8hdWX04D9;)!4cK`5Bk04w{%j0_hpBrk9m=ihPGP=X0*cdyG_3W10jk zT)oE37alRVU&H19Um;)p_Y7wLAsZ&U#<*5){?n_+UBU_q6VhzIqQ}u&H+7tRKEC1a z3KCMV(Tvp+DOWq;5cK9i@c8#9d;_seG~U_;akY!rY|Kte-cb8jQucc5*(7U#j^w%P zivPN@)cQw~bwr}Iq4%#S^Z?TFg`}^ae&M8koc=e!Qvdzk|4)eA|1(hj-vE0br%fN$ z78Zq;o0TxL(7zGIvABM(p$y<=K{oZx$Cnr6&_b)T!?l^sq|FZ3S>Em?jM;d`#e9zbq z%GGC}%-j$!fXAvM4ASgOP$?gXC$o6;(bQnX({78gZgfN5KX>k-_Wpvo9h9cBe6I^6 z`q{b}_k!tlF5g`YbMESM8ILEw4s4&@=fL{3%oDDHp_YDa)R_5^=3rJqK|xW)$=w-7 z1fAzZk}U>O-0vLmv7@8Td*WP|a-{x5B_9|DLbvX}oZsr#gDD=(hxez{FM=!255LRP z>{qL-e;uaX-V96>56he7Zu%U~&p~8zJ7s%J`hPqF`M>YoYj?Er{MM4Nq6f2O*cNR_ zVJqjPBFa~!X#(@p=Hs4VcqpD$!_9SN8KSsDMDtZ&>Vuc-wu ze^@U*>~tT$4vwkZU3)%?)l-K}$BCa`3>1ltDkkC#+

fhJ?rcf{w6*d6s}rCg@(Xm3 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 literal 0 HcmV?d00001 diff --git a/version0.6/admin/client/client-oauth-scopes.png b/version0.6/admin/client/client-oauth-scopes.png new file mode 100644 index 0000000000000000000000000000000000000000..8c879da36a2c2296eeda7351fb0cab4bd089b13c GIT binary patch literal 97868 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 + + + + + + + + + + + + + + + + + + + + + Client - Digital Twin as a Service (DTaaS) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Configure Client Website

+

This page describes various configuration options for react website.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
if (typeof window !== 'undefined') {
+  window.env = {
+    REACT_APP_ENVIRONMENT: "prod | dev | local | test",
+    REACT_APP_URL: "URL for the gateway",
+    REACT_APP_URL_BASENAME: "Base URL for the client website"(optional, can be null),
+    REACT_APP_URL_DTLINK: "Endpoint for the Digital Twin",
+    REACT_APP_URL_LIBLINK: "Endpoint for the Library Assets",
+    REACT_APP_WORKBENCHLINK_VNCDESKTOP: "Endpoint for the VNC Desktop link",
+    REACT_APP_WORKBENCHLINK_VSCODE: "Endpoint for the VS Code link",
+    REACT_APP_WORKBENCHLINK_JUPYTERLAB: "Endpoint for the Jupyter Lab link",
+    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK:
+      "Endpoint for the Jupyter Notebook link",
+    REACT_APP_WORKBENCHLINK_DT_PREVIEW: "Endpoint for the Digital Twins page preview",
+    REACT_APP_CLIENT_ID: 'AppID genereated by the gitlab OAuth provider',
+    REACT_APP_AUTH_AUTHORITY: 'URL of the private gitlab instance',
+    REACT_APP_REDIRECT_URI: 'URL of the homepage for the logged in users of the website',
+    REACT_APP_LOGOUT_REDIRECT_URI: 'URL of the homepage for the anonymous users of the website',
+    REACT_APP_GITLAB_SCOPES: 'OAuth scopes. These should match with the scopes set in gitlab OAuth provider',
+  };
+};
+
+// Example values with no base URL. Trailing and ending slashes are optional.
+if (typeof window !== 'undefined') {
+  window.env = {
+    REACT_APP_ENVIRONMENT: 'prod',
+    REACT_APP_URL: 'https://foo.com/',
+    REACT_APP_URL_BASENAME: '',
+    REACT_APP_URL_DTLINK: '/lab',
+    REACT_APP_URL_LIBLINK: '',
+    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',
+    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',
+    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',
+    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',
+    REACT_APP_WORKBENCHLINK_DT_PREVIEW: '/preview/digitaltwins',
+    REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',
+    REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/',
+    REACT_APP_REDIRECT_URI: 'https://foo.com/Library',
+    REACT_APP_LOGOUT_REDIRECT_URI: 'https://foo.com/',
+    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',
+  };
+};
+
+
+// Example values with "bar" as basename URL.
+//Trailing and ending slashes are optional.
+if (typeof window !== 'undefined') {
+  window.env = {
+    REACT_APP_ENVIRONMENT: "dev",
+    REACT_APP_URL: 'http://localhost:4000/',
+    REACT_APP_URL_BASENAME: 'bar',
+    REACT_APP_URL_DTLINK: '/lab',
+    REACT_APP_URL_LIBLINK: '',
+    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',
+    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',
+    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',
+    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',
+    REACT_APP_WORKBENCHLINK_DT_PREVIEW: '/preview/digitaltwins',
+    REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',
+    REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/',
+    REACT_APP_REDIRECT_URI: 'http://localhost:4000/bar/Library',
+    REACT_APP_LOGOUT_REDIRECT_URI: 'http://localhost:4000/bar',
+    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',
+  };
+};
+
+

Multiple DTaaS applications

+ + +
+

Warning

+

This is not a regular installation scenario and is only +recommended for experts. +This installation setup requires significant modifications +to the docker compose files.

+
+ + +

The DTaaS is a regular web application. It is possible to host multiple DTaaS +applications on the same server. The only requirement is to have a distinct URLs. +You can have three DTaaS applications running at the following URLs.

+
1
+2
+3
https://foo.com/au
+https://foo.com/acme
+https://foo.com/bar
+
+

All of these instances can use the same gitlab instance for authorization.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DTaaS application URLGitlab Instance URLCallback URLLogout URLApplication ID
https://foo.com/auhttps://foo.gitlab.comhttps://foo.com/au/Libraryhttps://foo.com/auautogenerated by gitlab
https://foo.com/acmehttps://foo.gitlab.comhttps://foo.com/au/Libraryhttps://foo.com/auautogenerated by gitlab
https://foo.com/barhttps://foo.gitlab.comhttps://foo.com/au/Libraryhttps://foo.com/auautogenerated by gitlab
+

If you are hosting multiple DTaaS instances on the same server, +do not install DTaaS with a null basename on the same server. +Even though it works well, the setup is confusing to setup +and may lead to maintenance issues.

+

If you choose to host your DTaaS application with a basename (say bar), then the +URLs in env.js change to:

+
1
+2
+3
+4
DTaaS application URL: https://foo.com/bar
+Gitlab instance URL: https://gitlab.foo.com
+Callback URL: https://foo.com/bar/Library
+Logout URL: https://foo.com/bar
+
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/version0.6/developer/client/client.html b/version0.6/developer/client/client.html new file mode 100644 index 000000000..01b197353 --- /dev/null +++ b/version0.6/developer/client/client.html @@ -0,0 +1,2768 @@ + + + + + + + + + + + + + + + + + + + React Website - Digital Twin as a Service (DTaaS) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

React Website

+

The Website +is how the end-users interact with the software platform. The website is +being developed as a React single page web application.

+

A dependency graph for the entire codebase of the react application is:

+

Dependency Graphs

+

The figures are the dependency graphs generated from the code.

+

src directory

+

src dependency graph

+

test directory

+

test dependency graph

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/version0.6/developer/system/architecture.html b/version0.6/developer/system/architecture.html index 8cf3dd930..d1715a8f3 100644 --- a/version0.6/developer/system/architecture.html +++ b/version0.6/developer/system/architecture.html @@ -2866,8 +2866,8 @@

System Components

If you are interested, please take a look at the C4 architectural diagram.

-

A mapping of the architectural components to related pages in -the documentation is available in the table.

+

A mapping of the architectural components to the implementation +components is available in the table.

@@ -2878,15 +2878,15 @@

System Components

- + - + - + @@ -2906,7 +2906,7 @@

System Components

- + diff --git a/version0.6/developer/system/current-status.html b/version0.6/developer/system/current-status.html index 33056ae8c..c32dae914 100644 --- a/version0.6/developer/system/current-status.html +++ b/version0.6/developer/system/current-status.html @@ -2855,7 +2855,7 @@

🧑‍💻library microservice which +There is also a library microservice which in the long-run will replace the file server.

Users can run DTs in their workspaces and also permit remote access to other users. There is already shared access to internal and diff --git a/version0.6/search/search_index.json b/version0.6/search/search_index.json index 6e2cb10a1..0cd65f4b7 100644 --- a/version0.6/search/search_index.json +++ b/version0.6/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"What is DTaaS?","text":"

The Digital Twin as a Service (DTaaS) software platform is useful to Build, Use and Share digital twins (DTs).

Build: DTs are built on DTaaS using reusable DT assets available on the platform.

Use: Run your DTs on DTaaS.

Share: Share ready-to-use DTs with other users. It is also possible to share the services offered by one DT with other users.

There is an overview of DTaaS available in the form of slides, video, and feature walkthrough.

"},{"location":"index.html#license","title":"License","text":"

This software is owned by The INTO-CPS Association and is available under the INTO-CPS License.

DTaaS software platform uses third-party open-source software. These software components have their own licenses.

"},{"location":"FAQ.html","title":"Frequently Asked Questions","text":""},{"location":"FAQ.html#abreviations","title":"Abreviations","text":"Term Full Form DT Digital Twin DTaaS Digital Twin as a Service PT Physical Twin"},{"location":"FAQ.html#general-questions","title":"General Questions","text":"What is DTaaS?

DTaaS is software platform on which you can create and run digital twins. Please see the features page to get a sense of the things you can do in DaaS.

What is the scope and current capabilities of DTaaS?
  1. DTaaS is a web based interface to allow you to invoke various tools related to work you want to perform with one or more DTs.
  2. DTaaS permits users to run DTs in their private workspaces. These user workspaces are based on Ubuntu 20.04 Operating system.
  3. DTaaS can help you create reusable DT assets only if DT asset authoring tools can work in Ubuntu 20.04 xfce desktop environment.
  4. DTs are just executables, as far as DTaaS is concerned. Users are not constrained to work with DTs in a certain way. The DTaaS suggests creation of DTs from reusable assets and provides a suggestive structure for DTs. The examples provide more insight into DTaaS way of working with DTs. But this suggested workflow is not binding on the users.
  5. DTs can be run as services with REST API from within user workspace which can help with service-level DT composition.
What can not be done inside DTaaS?
  1. DTaaS as such won't help you to install DTs that you get from elsewhere.
  2. The current user interface of DTaaS web application is heavily reliant on the use of Jupyter lab and notebook. The Digital Twins page has Create / Execute / Analyze sections but all point to Jupyter lab. Web interface. The functionality of these pages is still under development.
  3. DTaaS does not yet have DevOps like automation capabilities.
Is there any fundamental difference between commercial solutions like Ansys Twin Builder and DTaaS?

Commercial DT platforms like Ansys Twin Builder provide tight integration between models, simulation and sensors. This leads to fewer choices in DT design and implementation. In addition, there is a limitation of vendor lockin. On the other hand, DTaas lets users separate DT into reusable assets and combine these assets in a flexible way.

Do you provide licensed software like Matlab?

Proprietary and commercially licensed software is not available by default on the software platform. But users have private workspaces which are based on Linux-based xfce Desktop environment. Users can install proprietary and commercially licensed software in their workspaces. Please see a screencast of using Matlab Simulink within the DTaaS software. The licensed software installed by one user is not available to another user.

"},{"location":"FAQ.html#digital-twin-assets","title":"Digital Twin Assets","text":"Can DTaaS be used to create new DT assets?

The core feature of DTaaS software is to help users create DTs from assets already available in the library. However, it is possible for users to take advantage of services available in their workspace to install asset authoring tools in their own workspace. These authoring tools can then be used to create and publish new assets. User workspaces are private and are not shared with other users. Thus any licensed software tools installed in their workspace is only available to them.

"},{"location":"FAQ.html#digital-twin-models","title":"Digital Twin Models","text":"Can DTaaS create new DT models?

DTaaS is not a model creation tool. You can put model creation tool inside DTaaS and create new models. The DTaaS itself does not create digital twin models but it can help users create digital twin models. You can run Linux desktop / terminal tools inside the DTaaS. So you can create models inside DTaaS and run them using tools that can run in Linux. The Windows only tools can not run in DTaaS.

How can DTaaS help to design geometric model? Does it support 3D modeling and simulation?

Well, DTaaS by itself does not produce any models. DTaaS only provides a platform and an ecosystem of services to facilitate digital twins to be run as services. Since each user has a Linux OS at their disposal, they can also run digital twins that have graphical interface. In summary, DTaaS is neither a modeling nor simulation tool. If you need these kinds of tools, you need to bring them onto the platform. For example, if you need Matlab for your work, you need to bring he licensed Matlab software.

Can DTaaS support only the information models (or behavioral models) or some other kind of models?

The DTaaS as such is agnostic to the kind of models you use. DTaaS can run all kinds of models. This includes behavioral and data models. As long as you have models and the matching solvers that can run in Linux OS, you are good to go in DTaaS. In some cases, models and solvers (tools) are bundled together to form monolithic DTs. The DTaaS does not limit you from running such DTs as well. DTaaS does not provide dedicated solvers. But if you can install a solver in your workspace, then you don't need the platform to provide one.

Does it support XML-based representation and ontology representation?

Currently No. We are looking for users needing this capability. If you have concrete requirements and an example, we can discuss a way of realizing it in DTaaS.

"},{"location":"FAQ.html#communication-between-physical-twin-and-digital-twin","title":"Communication Between Physical Twin and Digital Twin","text":"How can DTaaS control the physical entity? Which technologies it uses for controlling the physical world?

At a very abstract level, there is a communication from physical entity to digital entity and back to physical entity. How this communication should happen is decided by the person designing the digital entity. The DTaaS can provide communication services that can help you do this communication with relative ease. You can use InfluxDB, RabbitMQ and Mosquitto services hosted on DTaaS for two communication between digital and physical entities.

How would you measure a physical entity like shape, size, weight, structure, chemical attributes etc. using DTaaS? Any specific technology used in this case?

The real measurements are done at physical twin which are then communicated to the digital twin. Any digital twin platform like DTaaS can only facilitate this communication of these measurements from physical twin. The DTaaS provides InfluxDB, RabbitMQ and Mosquitto services for this purpose. These three are probably most widely used services for digital twin communication. Having said that, DTaaS allows you to utilize other communication technologies and services hosted elsewhere on the Internet.

How can real-time data differ from static data and what is the procedure to identify dynamic data? Is there any UI or specific tool used here?

DTaaS can not understand the static or dynamic nature of data. It can facilitate storing names, units and any other text description of interesting quantities (weight of batter, voltage output etc). It can also store the data being sent by the physical twin. The distinction between static and dynamic data needs to be made by the user. Only metadata of the data can reveal such more information about the nature of data. A tool can probably help in very specific cases, but you need metadata. If there is a human being making this distinction, then the need for metadata goes down but does not completely go away. In some of the DT platforms supported by manufacturers, there is a tight integration between data and model. In this case, the tool itself is taking care of the metadata. The DTaaS is a generic platform which can support execution of digital twins. If a tool can be executed on a Linux desktop / commandline, the tool can be supported within DTaaS. The tool (ex. Matlab) itself can take care of the metadata requirements.

"},{"location":"FAQ.html#data-management","title":"Data Management","text":"Can DTaaS collect data directly from sensors?

Yes via platform services.

Does DTaaS support data collection from different sources like hardware, software and network? Is there any user interface or any tracking instruments used for data collection?

The DTaaS provids InfluxDB, RabbitMQ, MQTT and MongoDB services. Both the physical twin and digital twin can utilize these protocols for communication. The IoT (time-series) data can be collected using InfluxDB and MQTT broker services. There is a user interface for InfluxDB which can be used to analyze the data collected. Users can also manually upload their data files into DTaaS.

Is DTaaS able to transmit data to cloud in real time?

Yes via platform services.

Which transmission protocol does DTaaS allow?

InfluxDB, RabbitMQ, MQTT and anything else that can be used from Cloud service providers.

Does DTaaS support multisource information and combined multi sensor input data? Can it provide analysis and decision-supporting inferences?

You can store information from multiple sources. The existing InfluxDB services hosted on DTaaS already has a dedicated Influx / Flux query language for doing sensor fusion, analysis and inferences.

Which kinds of visualization technologies DTaaS can support (e.g. graphical, geometry, image, VR/AR representation)?

Graphical, geometric and images. If you need specific licensed software for the visualization, you will have to bring the license for it. DTaaS does not support AR/VR.

"},{"location":"FAQ.html#platform-native-services-on-dtaas-platform","title":"Platform Native Services on DTaaS Platform","text":"Is DTaaS able to detect the anomalies about-to-fail components and prescribe solutions?

This is the job of a digital twin. If you have a ready to use digital twin that does the job, DTaaS allows others to use your solution.

"},{"location":"FAQ.html#comparison-with-other-dt-platforms","title":"Comparison with other DT Platforms","text":"All the DT platforms seem to provide different features. Is there a comparison chart?

Here is a qualitative comparison of different DT integration platforms:

Legend: high performance (H), mid performance (M) and low performance (L)

DT Platforms License DT Development Process Connectivity Security Processing power, performance and Scalability Data Storage Visualization Modeling and Simulation Microsoft Azure DT Commercial Cloud H H H M H H H AWS IOT Greengrass Open source commercial H H H M H H H Eclipse Ditto Open source M H M H H L L Asset Administration Shell Open source H H L H M L M PTC Thingworx Commercial H H H H H M M GE Predix Commercial M H H M L M L AU's DTaaS Open source H H L L M M M

Adopted by Tanusree Roy from Table 4 and 5 of the following paper.

Ref: Naseri, F., Gil, S., Barbu, C., Cetkin, E., Yarimca, G., Jensen, A. C., ... & Gomes, C. (2023). Digital twin of electric vehicle battery systems: Comprehensive review of the use cases, requirements, and platforms. Renewable and Sustainable Energy Reviews, 179, 113280.

All the comparisons between DT platforms seems so confusing. Why?

The fundamental confusion comes from the fact that different DT platforms (Azure DT, GE Predix) provide different kind of DT capabilities. You can run all kinds of models natively in GE Predix. In fact you can run models even next to (on) PTs using GE Predix. But you cannot natively do that in Azure DT service. You have to do the leg work of integrating with other Azure services or third-party services to get the kind of capabilities that GE Predix natively provides in one interface. The takeaway is that we pick horses for the courses.

"},{"location":"FAQ.html#gdpr-concerns","title":"GDPR Concerns","text":"Does your platform adhere to GDPR compliance standards? If so, how?

The DTaaS software platform does not store any personal information of users. It only stores username to identify users and these usernames do not contain enough information to deduce the true identify of users.

Which security measures are deployed? How is data encrypted (if exists)?

The default installation requires a HTTPS terminating reverse proxy server from user to the DTaaS software installation. The administrators of DTaaS software can also install HTTPS certificates into the application. The codebase can generate HTTPS application and the users also have the option of installing their own certificates obtained from certification agencies such as LetsEncrypt.

What security measures does your cloud provider offer?

The current installation of DTaaS software runs on Aarhus University servers. The university network offers firewall access control to servers so that only permitted user groups have access to the network and physical access to the server.

How is user access controlled and authenticated?

There is a two-level authorization mechanism in place in each default installation of DTaaS. The first-level is HTTP basic authorization over secure HTTPS connection. The second-level is the OAuth PKCE authorization flow for each user. The OAuth authorization is provider by a Gitlab instance. The DTaaS does not store the account and authorization information of users.

Does you platform manage personal data? How is data classified and tagged based on the sensitivity? Who has access to the critical data?

The platform does not store personal data of users.

How are identities and roles managed within the platform?

There are two roles for users on the platform. One is the administrator and the other one is user. The user roles are managed by the administrator.

"},{"location":"LICENSE.html","title":"License","text":"

--- Start of Definition of INTO-CPS Association Public License ---

/*

  • This file is part of the INTO-CPS Association.

  • Copyright (c) 2017-CurrentYear, INTO-CPS Association (ICA),

  • c/o Peter Gorm Larsen, Aarhus University, Department of Engineering,
  • Finlandsgade 22, 8200 Aarhus N, Denmark.

  • All rights reserved.

  • THIS PROGRAM IS PROVIDED UNDER THE TERMS OF GPL VERSION 3 LICENSE OR

  • THIS INTO-CPS ASSOCIATION PUBLIC LICENSE (ICAPL) VERSION 1.0.
  • ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
  • RECIPIENT'S ACCEPTANCE OF THE INTO-CPS ASSOCIATION PUBLIC LICENSE OR
  • THE GPL VERSION 3, ACCORDING TO RECIPIENTS CHOICE.

  • The INTO-CPS tool suite software and the INTO-CPS Association

  • Public License (ICAPL) are obtained from the INTO-CPS Association, either
  • from the above address, from the URLs: http://www.into-cps.org or
  • in the INTO-CPS tool suite distribution.
  • GNU version 3 is obtained from:
  • http://www.gnu.org/copyleft/gpl.html.

  • This program is distributed WITHOUT ANY WARRANTY; without

  • even the implied warranty of MERCHANTABILITY or FITNESS
  • FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
  • IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF
  • THE INTO-CPS ASSOCIATION PUBLIC LICENSE.

  • See the full ICAPL conditions for more details.

*/

--- End of INTO-CPS Association Public License Header ---

The ICAPL is a public license for the INTO-CPS tool suite with three modes/alternatives (GPL, ICA-Internal-EPL, ICA-External-EPL) for use and redistribution, in source and/or binary/object-code form:

  • GPL. Any party (member or non-member of the INTO-CPS Association) may use and redistribute INTO-CPS tool suite under GPL version 3.

  • Silver Level members of the INTO-CPS Association may also use and redistribute the INTO-CPS tool suite under ICA-Internal-EPL conditions.

  • Gold Level members of the INTO-CPS Association may also use and redistribute The INTO-CPS tool suite under ICA-Internal-EPL or ICA-External-EPL conditions.

Definitions of the INTO-CPS Association Public license modes:

  • GPL = GPL version 3.

  • ICA-Internal-EPL = These INTO-CPA Association Public license conditions together with Internally restricted EPL, i.e., EPL version 1.0 with the Additional Condition that use and redistribution by a member of the INTO-CPS Association is only allowed within the INTO-CPS Association member's own organization (i.e., its own legal entity), or for a member of the INTO-CPS Association paying a membership fee corresponding to the size of the organization including all its affiliates, use and redistribution is allowed within/between its affiliates.

  • ICA-External-EPL = These INTO-CPA Association Public license conditions together with Externally restricted EPL, i.e., EPL version 1.0 with the Additional Condition that use and redistribution by a member of the INTO-CPS Association, or by a Licensed Third Party Distributor having a redistribution agreement with that member, to parties external to the INTO-CPS Association member\u2019s own organization (i.e., its own legal entity) is only allowed in binary/object-code form, except the case of redistribution to other members the INTO-CPS Association to which source is also allowed to be distributed.

[This has the consequence that an external party who wishes to use the INTO-CPS Association in source form together with its own proprietary software in all cases must be a member of the INTO-CPS Association].

In all cases of usage and redistribution by recipients, the following conditions also apply:

a) Redistributions of source code must retain the above copyright notice, all definitions, and conditions. It is sufficient if the ICAPL Header is present in each source file, if the full ICAPL is available in a prominent and easily located place in the redistribution.

b) Redistributions in binary/object-code form must reproduce the above copyright notice, all definitions, and conditions. It is sufficient if the ICAPL Header and the location in the redistribution of the full ICAPL are present in the documentation and/or other materials provided with the redistribution, if the full ICAPL is available in a prominent and easily located place in the redistribution.

c) A recipient must clearly indicate its chosen usage mode of ICAPL, in accompanying documentation and in a text file ICA-USAGE-MODE.txt, provided with the distribution.

d) Contributor(s) making a Contribution to the INTO-CPS Association thereby also makes a Transfer of Contribution Copyright. In return, upon the effective date of the transfer, ICA grants the Contributor(s) a Contribution License of the Contribution. ICA has the right to accept or refuse Contributions.

Definitions:

\"Subsidiary license conditions\" means:

The additional license conditions depending on the by the recipient chosen mode of ICAPL, defined by GPL version 3.0 for GPL, and by EPL for ICA-Internal-EPL and ICA-External-EPL.

\"ICAPL\" means:

INTO-CPS Association Public License version 1.0, i.e., the license defined here (the text between \"--- Start of Definition of INTO-CPS Association Public License ---\" and \"--- End of Definition of INTO-CPS Association Public License ---\", or later versions thereof.

\"ICAPL Header\" means:

INTO-CPS Association Public License Header version 1.2, i.e., the text between \"--- Start of Definition of INTO-CPS Association Public License ---\" and \"--- End of INTO-CPS Association Public License Header ---, or later versions thereof.

\"Contribution\" means:

a) in the case of the initial Contributor, the initial code and documentation distributed under ICAPL, and

b) in the case of each subsequent Contributor: i) changes to the INTO-CPS tool suite, and ii) additions to the INTO-CPS tool suite;

where such changes and/or additions to the INTO-CPS tool suite originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the INTO-CPS tool suite by such Contributor itself or anyone acting on such Contributor's behalf.

For Contributors licensing the INTO-CPS tool suite under ICA-Internal-EPL or ICA-External-EPL conditions, the following conditions also hold:

Contributions do not include additions to the distributed Program which: (i) are separate modules of software distributed in conjunction with the INTO-CPS tool suite under their own license agreement, (ii) are separate modules which are not derivative works of the INTO-CPS tool suite, and (iii) are separate modules of software distributed in conjunction with the INTO-CPS tool suite under their own license agreement where these separate modules are merged with (weaved together with) modules of The INTO-CPS tool suite to form new modules that are distributed as object code or source code under their own license agreement, as allowed under the Additional Condition of internal distribution according to ICA-Internal-EPL and/or Additional Condition for external distribution according to ICA-External-EPL.

\"Transfer of Contribution Copyright\" means that the Contributors of a Contribution transfer the ownership and the copyright of the Contribution to the INTO-CPS Association, the INTO-CPS Association Copyright owner, for inclusion in the INTO-CPS tool suite. The transfer takes place upon the effective date when the Contribution is made available on the INTO-CPS Association web site under ICAPL, by such Contributors themselves or anyone acting on such Contributors' behalf. The transfer is free of charge. If the Contributors or the INTO-CPS Association so wish, an optional Copyright transfer agreement can be signed between the INTO-CPS Association and the Contributors.

\"Contribution License\" means a license from the INTO-CPS Association to the Contributors of the Contribution, effective on the date of the Transfer of Contribution Copyright, where the INTO-CPS Association grants the Contributors a non-exclusive, world-wide, transferable, free of charge, perpetual license, including sublicensing rights, to use, have used, modify, have modified, reproduce and or have reproduced the contributed material, for business and other purposes, including but not limited to evaluation, development, testing, integration and merging with other software and distribution. The warranty and liability disclaimers of ICAPL apply to this license.

\"Contributor\" means any person or entity that distributes (part of) the INTO-CPS tool chain.

\"The Program\" means the Contributions distributed in accordance with ICAPL.

\"The INTO-CPS tool chain\" means the Contributions distributed in accordance with ICAPL.

\"Recipient\" means anyone who receives the INTO-CPS tool chain under ICAPL, including all Contributors.

\"Licensed Third Party Distributor\" means a reseller/distributor having signed a redistribution/resale agreement in accordance with ICAPL and the INTO-CPS Association Bylaws, with a Gold Level organizational member which is not an Affiliate of the reseller/distributor, for distributing a product containing part(s) of the INTO-CPS tool suite. The Licensed Third Party Distributor shall only be allowed further redistribution to other resellers if the Gold Level member is granting such a right to it in the redistribution/resale agreement between the Gold Level member and the Licensed Third Party Distributor.

\"Affiliate\" shall mean any legal entity, directly or indirectly, through one or more intermediaries, controlling or controlled by or under common control with any other legal entity, as the case may be. For purposes of this definition, the term \"control\" (including the terms \"controlling,\" \"controlled by\" and \"under common control with\") means the possession, direct or indirect, of the power to direct or cause the direction of the management and policies of a legal entity, whether through the ownership of voting securities, by contract or otherwise.

NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF ICAPL, THE INTO-CPS ASSOCIATION IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the INTO-CPS tool suite and assumes all risks associated with its exercise of rights under ICAPL , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF ICAPL, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE INTO-CPS TOOL SUITE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

A Contributor licensing the INTO-CPS tool suite under ICA-Internal-EPL or ICA-External-EPL may choose to distribute (parts of) the INTO-CPS tool suite in object code form under its own license agreement, provided that:

a) it complies with the terms and conditions of ICAPL; or for the case of redistribution of the INTO-CPS tool suite together with proprietary code it is a dual license where the INTO-CPS tool suite parts are distributed under ICAPL compatible conditions and the proprietary code is distributed under proprietary license conditions; and

b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from ICAPL are offered by that Contributor alone and not by any other party; and iv) states from where the source code for the INTO-CPS tool suite is available, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the INTO-CPS tool suite is made available in source code form:

a) it must be made available under ICAPL; and

b) a copy of ICAPL must be included with each copy of the INTO-CPS tool suite.

c) a copy of the subsidiary license associated with the selected mode of ICAPL must be included with each copy of the INTO-CPS tool suite.

Contributors may not remove or alter any copyright notices contained within The INTO-CPS tool suite.

If there is a conflict between ICAPL and the subsidiary license conditions, ICAPL has priority.

This Agreement is governed by the laws of Denmark. The place of jurisdiction for all disagreements related to this Agreement, is Aarhus, Denmark.

The EPL 1.0 license definition has been obtained from: http://www.eclipse.org/legal/epl-v10.html. It is also reproduced in the INTO-CPS distribution.

The GPL Version 3 license definition has been obtained from http://www.gnu.org/copyleft/gpl.html. It is also reproduced in the INTO-CPS distribution.

--- End of Definition of INTO-CPS Association Public License ---

"},{"location":"PUBLISH.html","title":"Project Documentation","text":"

This file contains instructions for creation, compilation and publication of project documentation.

The documentation system is based on Material for Mkdocs. The documentation is generated based on the configuration files:

  • mkdocs.yml: used for generating online documentation which is hosted on the web
  • mkdocs-github.yml: used for generating documentation in github actions

Install Mkdocs using the following command.

pip install -r docs/requirements.txt\n
"},{"location":"PUBLISH.html#fix-linting-errors","title":"Fix Linting Errors","text":"

This project uses markdownlint linter tool for identifying the formatting issues in markdown files. Run

mdl docs\n

from top-directory of the project and fix any identified issues. This needs to be done before committing changes to the documentation.

"},{"location":"PUBLISH.html#create-documentation","title":"Create documentation","text":"

The document generation pipeline can generate both html and pdf versions of documentation.

The generation of pdf version of documentation is controlled via a shell variable.

export MKDOCS_ENABLE_PDF_EXPORT=0 #disables generation of pdf document\nexport MKDOCS_ENABLE_PDF_EXPORT=1 #enables generation of pdf document\n

The mkdocs utility allows for live editing of documentation on the developer computer.

You can add, and edit the markdown files in docs/ directory to update the documentation. There is a facility to check the status of your documentation by using:

mkdocs serve --config-file mkdocs.yml\n
"},{"location":"PUBLISH.html#publish-documentation","title":"Publish documentation","text":"

You can compile and place the html version of documentation on the webpage-docs branch of the codebase.

export MKDOCS_ENABLE_PDF_EXPORT=1 #enable generation of pdf document\nsource script/docs.sh [version]\n

The command takes an optional version parameter. This version parameter is needed for making a release. Otherwise, the documentation gets published with the latest version tag. This command makes a new commit on webpage-docs branch. You need to push the branch to upstream.

git push webpage-docs\n

The github pages system serves the project documentation from this branch.

"},{"location":"bugs.html","title":"Few issues in the Software","text":"

If you find a bug, please open an issue

"},{"location":"bugs.html#third-party-software","title":"Third-Party Software","text":"

The explanation given below corresponds to the bugs you may face from third party software included in DTaaS. Known issues are listed below.

"},{"location":"bugs.html#ml-workspace","title":"ML Workspace","text":"
  • the docker container might down a bit after two weeks. The only known solution is to restart the docker container. You don't need to restart the complete DTaaS platform, restart of the docker container of ml-workspace is sufficient.
  • the terminal tool doesn't seem to have the ability to refresh itself. If there is an issue, the only solution is to close and reopen the terminal from \"open tools\" drop down of notebook
  • terminal app does not show at all after some time: terminal always comes if it is open from drop-down menu of Jupyter Notebook, but not as a direct link.
"},{"location":"bugs.html#gitlab","title":"Gitlab","text":"
  • The gilab oauth authorization service does not have a way to sign out of a third-party application. Even if you sign out of DTaaS, the gitlab still shows user as signed in. The next time you click on the sign in button on the DTaaS page, user is not shown the login page. Instead user is directly taken to the Library page. So close the brower window after you are done. Another way to overcome this limitation is to open your gitlab instance (https://gitlab.foo.com) and signout from there. Thus user needs to sign out of two places, namely DTaaS and gitlab, in order to completely exit the DTaaS application.
"},{"location":"thanks.html","title":"Contributors","text":"

code contributors

"},{"location":"thanks.html#users","title":"Users","text":"

Cl\u00e1udio \u00c2ngelo Gon\u00e7alves Gomes, Dmitri Tcherniak, Elif Ecem Bas, Farshid Naseri, Giuseppe Abbiati, Hannes Iven, Hao Feng, Henrik Ejersbo, Lars Vosteen, Lei Zhao, Mirgita Frasheri, Morten Haahr Kristensen, Neena Goveas, Tanusree Roy, Santiago Gil Arboleda, Swarup Mahato, Valdemar Tang

"},{"location":"thanks.html#example-contributors","title":"Example Contributors","text":"Example Name Contributors Mass Spring Damper Prasad Talasila Water Tank Fault Injection Henrik Ejersbo and Mirgita Frasheri Water Tank Model Swap Henrik Ejersbo and Mirgita Frasheri Desktop Robotti with RabbitMQ Mirgita Frasheri Water Treatment Plant and OPC-UA Lucia Royo and Alejandro Labarias Three Water Tanks with DT Manager Framework Santiago Gil Arboleda Flex-Cell with Two Industrial Robots Santiago Gil Arboleda Incubator Morten Haahr Kristensen Firefighters in Emergency Environments Lars Vosteen and Hannes Iven Mass Spring Damper with NuRV Runtime Monitor Alberto Bonizzi Incubator with NuRV Runtime Monitor Alberto Bonizzi and Morten Haahr Kristensen Incubator with NuRV Runtime Monitor Service Valdemar Tang Water Tank Fault Injection with NuRV Runtime Monitor Alberto Bonizzi Incubator Co-Simulation with NuRV Runtime Monitor FMU Morten Haahr Kristensen Incubator with NuRV Runtime Monitor FMU as Service Valdemar Tang and Morten Haahr Kristensen Incubator with NuRV Runtime Monitor as Service Morten Haahr Kristensen and Valdemar Tang"},{"location":"thanks.html#documentation","title":"Documentation","text":"
  1. Talasila, P., Gomes, C., Mikkelsen, P. H., Arboleda, S. G., Kamburjan, E., & Larsen, P. G. (2023). Digital Twin as a Service (DTaaS): A Platform for Digital Twin Developers and Users arXiv preprint arXiv:2305.07244.
  2. Astitva Sehgal for developer and example documentation.
  3. Tanusree Roy and Farshid Naseri for asking interesting questions that ended up in FAQs.
"},{"location":"third-party.html","title":"Third Party Software","text":"

The DTaaS software platform uses many third-party software. These software components have their own licenses.

"},{"location":"third-party.html#user-installations","title":"User Installations","text":"

The list of software included with DTaaS installation scripts are:

Software Package Usage License docker v24.0 mandatory Apache 2.0 ml-workspace-minimal v0.13 mandatory Apache 2.0 nodejs v20.10 mandatory Custom - Modified MIT npm v10.2 mandatory Artistic License 2.0 serve mandatory MIT Tr\u00e6fik v2.10 mandatory MIT yarn v1.22 mandatory BSD 2-Clause eclipse-mosquitto v2 optional Eclipse Public License-2.0 gitlab-ce v16.4 optional MIT Grafana v10.1 optional GNU Affero General Public (AGPL) License v3.0 InfluxDB v2.7 optional Apache2, MIT Mongodb v7.0 optional AGPL License and Server Side Public License (SSPL) v1 Tabbitmq v3-management optional Mozilla Public License Telegraf v1.28 optional MIT"},{"location":"third-party.html#development-environments","title":"Development Environments","text":"

Inaddition to all the software included in user installations, the DTaaS development environments may use the following additional software packages.

Software Package Usage License Material for mkdocs mandatory MIT Docker-compose v2.20 optional Apache 2.0 Jupyter Lab optional 3-Clause BSD Microk8s v1.27 optional Apache 2.0 Openssl optional Custom License"},{"location":"third-party.html#package-dependencies","title":"Package Dependencies","text":"

There are specific software packages included in the development of client, library microservice and runner microservice. These packages can be seen in the package.json file of the matching directories.

The plugins of material for mkdocs might have their own licenses. The list of plugins used are in requirements.txt file.

"},{"location":"admin/cli.html","title":"DTaaS Command Line Interface","text":"

This is a command line tool for the INTO-CPS-Association Digital Twins as a Service.

"},{"location":"admin/cli.html#prerequisite","title":"Prerequisite","text":"

The DTaaS application with base users and essential containers should be up and running before using the CLI.

"},{"location":"admin/cli.html#installation","title":"Installation","text":"

Simply install using:

We recommend installing this in a virutal environment.

Steps to install:

  • Change the working folder:
cd <DTaaS-directory>/cli\n
  • We recommend installing this in a virtual environment. Create and activate a virtual environment.

  • To install, simply:

pip install dtaas\n
"},{"location":"admin/cli.html#usage","title":"Usage","text":""},{"location":"admin/cli.html#setup","title":"Setup","text":"

The base DTaaS system should be up and running before adding/deleting users with the CLI.

Additionally, Setup the dtaas.toml file in the cli directory:

  • Set common.server-dns to domain name of your server. If you want to bring up the server locally, please set this to \"localhost\".

  • Set the path to the full system path of the DTaaS directory.

[common]\n# absolute path to the DTaaS application directory\nserver-dns = \"localhost\"\npath = \"/home/Desktop/DTaaS\"\n
"},{"location":"admin/cli.html#select-template","title":"Select Template","text":"

The cli uses YAML templates provided in this directory to create new user workspaces. The templates are:

  1. user.local.yml: localhost installation
  2. User.server.yml: multi-user web application application over HTTP
  3. user.server.secure.yml: multi-user web application application over HTTPS

Please note that the cli is not capable of detecting the difference between HTTP and HTTPS modes of web application. Thus if you are serving web application over HTTPS, please do one extra step.

cp user.server.secure.yml user.server.yml\n

This will change the user template from insecure to secure.

"},{"location":"admin/cli.html#add-users","title":"Add users","text":"

To add new users using the CLI, fill in the users.add list in dtaas.toml with the Gitlab instance usernames of the users to be added

[users]\n# matching user info must present in this config file\nadd = [\"username1\",\"username2\", \"username3\"]\n

Make sure you are in the cli directory.

Then simply:

dtaas admin user add\n

The command checks for the existence of files/<username> directory. If it does not exist, a new directory with correct file structure is created. The directory, if it exists, must be owned by the user executing dtaas command on the host operating system. If the files do not have the expected ownership rights, the command fails.

"},{"location":"admin/cli.html#caveats","title":"Caveats","text":"

This brings up the containers, without the AuthMS authentication.

  • Currently the email fields for each user in dtaas.toml are not in use, and are not necessary to fill in. These emails must be configured manually for each user in the deploy/docker/conf.server files and the traefik-forward-auth container must be restarted. This is done as follows:

  • Go to the docker directory

cd <DTaaS>/deploy/docker\n
  • Add three lines to the conf.server file
rule.onlyu3.action=auth\nrule.onlyu3.rule=PathPrefix(`/user3`)\nrule.onlyu3.whitelist = user3@emailservice.com\n
  • Run the command for these changes to take effect:
docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n

The new users are now added to the DTaaS instance, with authorization enabled.

"},{"location":"admin/cli.html#delete-users","title":"Delete users","text":"
  • To delete existing users, fill in the users.delete list in dtaas.toml with the Gitlab instance usernames of the users to be deleted.
[users]\n# matching user info must present in this config file\ndelete = [\"username1\",\"username2\", \"username3\"]\n
  • Make sure you are in the cli directory.

Then simply:

dtaas admin user delete\n
  • Remember to remove the rules for deleted users in conf.server.
"},{"location":"admin/cli.html#additional-points-to-remember","title":"Additional Points to Remember","text":"
  • The user add CLI will add and start a container for a new user. It can also start a container for an existing user if that container was somehow stopped. It shows a Running status for existing user containers that are already up and running, it doesn't restart them.

  • user add and user delete CLIs return an error if the add and delete lists in dtaas.toml are empty, respectively.

  • '.' is a special character. Currently, usernames which have '.'s in them cannot be added properly through the CLI. This is an active issue that will be resolved in future releases.

"},{"location":"admin/host.html","title":"Install DTaaS on a Production Server","text":"

The installation instructions provided in this README are ideal for hosting the DTaaS as web application for multiple users.

"},{"location":"admin/host.html#design","title":"Design","text":"

An illustration of the docker containers used and the authorization setup is shown here.

In the new application configuration, there are two OAuth2 applications.

"},{"location":"admin/host.html#requirements","title":"Requirements","text":"

The installation requirements to run this docker version of the DTaaS are:

"},{"location":"admin/host.html#docker-with-compose-plugin","title":"Docker with Compose Plugin","text":"

It is mandatory to have Docker installed on your computer. We highly recommend using Docker Desktop.

"},{"location":"admin/host.html#domain-name","title":"Domain name","text":"

The DTaaS software is a web application and is preferably hosted on a server with a domain name like foo.com. It is also possible to use an IP address in place of domain name.

"},{"location":"admin/host.html#tls-https-certificate-optional","title":"TLS / HTTPS Certificate (Optional)","text":"

It is possible to add HTTPS option to the DTaaS software installation. Creation of the required TLS certificates is possible through certbot.

"},{"location":"admin/host.html#oauth-provider","title":"OAuth Provider","text":"

Gitlab Instance - The DTaaS uses Gitlab OAuth2.0 authorization for user authorization. You can either have an on-premise instance of gitlab, or use gitlab.com itself.

"},{"location":"admin/host.html#user-accounts","title":"User Accounts","text":"

Create user accounts in a linked gitlab instance for all the users.

The default docker compose file contains two - user1 and user2. These names need to be changed to suitable usernames.

"},{"location":"admin/host.html#oauth2-application-registration","title":"OAuth2 Application Registration","text":"

The multi-user installation setup requires dedicated authorization setup for both frontend website and backend services. Both these authorization requirements are satisfied using OAuth2 protocol.

  • The frontend website is a React single page application (SPA).
  • The details of Oauth2 app for the frontend website are in client docs.
  • The Oauth2 authorization for backend services is managed by Traefik forward-auth. The details of this authorization setup are in server docs.

It is possible to use https://gitlab.com or a local installation of Gitlab can be used for this purpose. Based on your selection of gitlab instance, it is necessary to register these two OAuth2 applications and link them to your intended DTaaS installation.

Please see gitlab oauth provider documentation for further help with creating these two OAuth applications.

"},{"location":"admin/host.html#download-release-package","title":"Download Release Package","text":"

The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

Tip

  1. The filepaths shown here follow Linux OS. The installation procedures also work with Windows OS.
  2. The description below refers to filenames. All the file paths mentioned below are relatively to the top-level DTaaS directory.
"},{"location":"admin/host.html#configuration","title":"Configuration","text":"

Three following configuration files need to be updated.

"},{"location":"admin/host.html#docker-compose","title":"Docker Compose","text":"

The docker compose configuration is in deploy/docker/.env.server. it is a sample file. It contains environment variables that are used by the docker compose files. It can be updated to suit your local installation scenario. It contains the following environment variables.

Edit all the fields according to your specific case.

URL Path Example Value Explanation DTAAS_DIR '/Users/username/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. SERVER_DNS foo.com The server DNS, if you are deploying with a dedicated server. Remember not use http(s) at the beginning of the DNS string OAUTH_URL gitlab.foo.com The URL of your Gitlab instance. It can be gitlab.com if you are planning to use it for authorization. OAUTH_CLIENT_ID 'xx' The ID of your server OAuth application OAUTH_CLIENT_SECRET 'xx' The Secret of your server OAuth application OAUTH_SECRET 'random-secret-string' Any private random string. This is a password you choose for local installation. username1 'user1' The gitlab instance username of a user of DTaaS username2 'user2' The gitlab instance username of a user of DTaaS

Tip

Important points to note:

  1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
  2. The client configuration file is located at deploy/config/client/env.js.
  3. The Server DNS can also be an IP address. However, for proper working it is neccessary to use the same convention (IP/DNS) in the client configuration file as well.
"},{"location":"admin/host.html#website-client","title":"Website Client","text":"

The frontend React website requires configuration which is specified in the client configuration file (deploy/config/client/env.js).

Further explanation on the client configuration is available in client config.

Tip

There is a default OAuth application registered on https://gitlab.com for client. The corresponding OAuth application details are:

REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',\nREACT_APP_AUTH_AUTHORITY: 'https://gitlab.com/',\n

This can be used for test purposes. Please use your own OAuth application for secure production deployments.

"},{"location":"admin/host.html#create-user-workspace","title":"Create User Workspace","text":"

The existing filesystem for installation is setup for files/user1. A new filesystem directory needs to be created for the selected user.

Please execute the following commands from the top-level directory of the DTaaS project.

cp -R files/user1 files/username\n

where username is one of the selected usernames. This command needs to be repeated for all the selected users.

"},{"location":"admin/host.html#configure-authorization-rules-for-backend-authorization","title":"Configure Authorization Rules for Backend Authorization","text":"

The Traefik forward-auth microservices requires configuration rules to manage authorization for different URL paths. The deploy/docker/conf.server file can be used to configure the authorization for user workspaces.

rule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user1`)\nrule.onlyu1.whitelist = user1@localhost\n\nrule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user2`)\nrule.onlyu1.whitelist = user2@localhost\n

Please change the usernames and email addresses to the matching user accounts on the OAuth provider (either https://gitlab.foo.com or https://gitlab.com).

"},{"location":"admin/host.html#caveat","title":"Caveat","text":"

The usernames in the deploy/docker/.env.server file need to match those in the deploy/docker/conf.server file.

Traefik routes are controlled by the deploy/docker/.env.server file. Authorization on these routes is controlled by the deploy/docker/conf.server file. If a route is not specified in deploy/docker/conf.server file but an authorisation is requested by traefik for this unknown route, the default behavior of traefik forward-auth kicks in. This default behavior is to enable endpoint being available to any signed in user.

If there are extra routes in deploy/docker/conf.server file but these are not in deploy/docker/.env.server file, such routes are not served by traefik; it will give 404 server response.

"},{"location":"admin/host.html#access-rights-over-files","title":"Access Rights Over Files","text":"

Warning

The default setting in docker compose file exposes all user files at http://foo.com/lib/files. All files of all the users are readable-writable by all logged in users. The compose.server.yml / compose.server.secure.yml file needs to be updated to expose another directory like common assets directory.

If you wish to reduce this scope to only common assets, please change,

  libms:\n    image: intocps/libms:latest\n    restart: unless-stopped\n    volumes:\n      - ${DTAAS_DIR}/deploy/config/lib.env:/dtaas/libms/.env\n      - ${DTAAS_DIR}/files/common:/dtaas/libms/files\n

The change in the last line. The ${DTAAS_DIR}/files got replaced by ${DTAAS_DIR}/files/common. With this change, only common files are readable-writable by all logged in users.

"},{"location":"admin/host.html#add-tls-certificates-optional","title":"Add TLS Certificates (Optional)","text":"

The application can be served on HTTPS connection for which TLS certificates are needed. The certificates need to be issued for foo.com or *.foo.com. The names of the certificates must be fullchain.pem and privkey.pem. Copy these two certificate files into:

  • certs/foo.com/fullchain.pem
  • certs/foo.com/privkey.pem

Traefik will run with self-issued certificates if the above two certificates are either not found or found invalid.

Remember to update dynamic/tls.yml with correct path matching your DNS name. For example, if your DNS name is www.foo.com, then copy the TLS certificates of www.foo.com to certs/ directory and update dynamic/tls.yml as follows.

tls:\n  certificates:\n    - certFile: /etc/traefik-certs/www.foo.com/fullchain.pem\n      keyFile: /etc/traefik-certs/www.foo.com/privkey.pem\n      stores:\n        - default\n
"},{"location":"admin/host.html#run","title":"Run","text":""},{"location":"admin/host.html#over-http","title":"Over HTTP","text":"

This docker compose file serves application over HTTP.

The commands to start and stop the appliation are:

docker compose -f compose.server.yml --env-file .env.server up -d\ndocker compose -f compose.server.yml --env-file .env.server down\n

To restart only a specific container, for example `client``

docker compose -f compose.server.yml --env-file .env.server up -d --force-recreate client\n
"},{"location":"admin/host.html#over-https","title":"Over HTTPS","text":"

This docker compose file serves application over HTTP.

The commands to start and stop the appliation are:

docker compose -f compose.server.secure.yml --env-file .env.server up -d\ndocker compose -f compose.server.secure.yml --env-file .env.server down\n

To restart only a specific container, for example `client``

docker compose -f compose.server.secure.yml --env-file .env.server up -d --force-recreate client\n
"},{"location":"admin/host.html#use","title":"Use","text":"

The application will be accessible at: from web browser. Sign in using your account linked to either gitlab.com or your local gitlab instance.

All the functionality of DTaaS should be available to your users through the single page client now.

You may have to click Sign in to Gitlab on the Client page and authorize access to the shown application.

"},{"location":"admin/host.html#adding-a-new-user","title":"Adding a new user","text":"

Please see the add new user to add new users.

"},{"location":"admin/host.html#references","title":"References","text":"

Image sources: Traefik logo, ml-workspace, reactjs, gitlab

"},{"location":"admin/localhost-secure.html","title":"Install DTaaS on localhost with Gitlab Integration","text":"

This installation is ideal for single users intending to use DTaaS on their own computers.

The installation instructions provided in this README are ideal for running the DTaaS on localhost served over HTTPS connection. The intention is to integrate Gitlab into DTaaS so that both are running on localhost.

If you do not need gitlab running on localhost, please use the simpler localhost setup.

"},{"location":"admin/localhost-secure.html#design","title":"Design","text":"

An illustration of the docker containers used and the authorization setup is shown here.

"},{"location":"admin/localhost-secure.html#requirements","title":"Requirements","text":"

The installation requirements to run this docker version of the DTaaS are:

  • docker desktop / docker CLI with compose plugin
  • mkcert
"},{"location":"admin/localhost-secure.html#download-release-package","title":"Download Release Package","text":"

The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

file pathnames

  1. The filepaths shown here follow POSIX convention. The installation procedures also work with Windows paths.
  2. The description below refers to filenames. All the file paths mentioned below are relatively to the top-level DTaaS directory.
"},{"location":"admin/localhost-secure.html#configure-and-run","title":"Configure and Run","text":""},{"location":"admin/localhost-secure.html#create-user-workspace","title":"Create User Workspace","text":"

The existing filesystem for installation is setup for user1. A new filesystem directory needs to be created for the selected user.

Please execute the following commands from the top-level directory of the DTaaS project.

cp -R files/user1 files/username\n

where username is the selected username to be created (in next steps) on Gitlab running at https://localhost/gitlab.

"},{"location":"admin/localhost-secure.html#obtain-tls-https-certificate","title":"Obtain TLS / HTTPS Certificate","text":"

Use mkcert to generate TLS certificates using this guide. The certificates need to be generated for localhost.

The names of the certificates must be fullchain.pem and privkey.pem. The fullchain.pem corresponds to public certificate and the privkey.pem corresponds to private key.

"},{"location":"admin/localhost-secure.html#add-tls-certificates-to-traefik","title":"Add TLS Certificates to Traefik","text":"

Copy the two certificate files into:

  • deploy/docker/certs/localhost/fullchain.pem
  • deploy/docker/certs/localhost/privkey.pem

Traefik will run with self-issued certificates if the above two certificates are either not found or found invalid.

"},{"location":"admin/localhost-secure.html#configure-docker-compose","title":"Configure Docker Compose","text":"

The docker compose configuration is in deploy/docker/.env.local; it is a sample file. It contains environment variables that are used by the docker compose files. It can be updated to suit your local installation scenario. It contains the following environment variables.

Edit all the fields according to your specific case.

URL Path Example Value Explanation DTAAS_DIR '/home/Desktop/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. username1 'user1' Your gitlab username

Important points to note:

  1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
  2. The client configuration file is located at deploy/config/client/env.local.js. Edit the URLs in this file by replacing http with https. Beyond this, it is not necessary to modify this file.
"},{"location":"admin/localhost-secure.html#start-dtaas-to-integrate-gitlab","title":"Start DTaaS to Integrate Gitlab","text":"

Start the appliation with

docker compose -f compose.local.secure.yml --env-file .env.local up -d\n
"},{"location":"admin/localhost-secure.html#start-gitlab","title":"Start Gitlab","text":"

Use the instructions provided in gitlab integration to bring up Gitlab on localhost and the Gitlab service will be available at https://localhost/gitlab

"},{"location":"admin/localhost-secure.html#register-oauth2-application","title":"Register OAuth2 Application","text":"

The frontend website requires OAuth2 application registration on the integrated Gitlab. The details of Oauth2 app for the frontend website are in client docs.

The default OAuth client application provided in env.local.js works. However, if you intend to run an integrated gitlab instance, then this application needs to be created on gitlab running at https://localhost/gitlab.

Remember to use https://localhost/Library as the Callback URL (REACT_APP_REDIRECT_URI).

Please see gitlab oauth provider documentation for further help with creating this OAuth application.

"},{"location":"admin/localhost-secure.html#update-client-website-configuration","title":"Update Client Website Configuration","text":"

Replace the contents of deploy/config/client/env.local.js with the following.

if (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: 'local',\n    REACT_APP_URL: 'https://localhost/',\n    REACT_APP_URL_BASENAME: '',\n    REACT_APP_URL_DTLINK: '/lab',\n    REACT_APP_URL_LIBLINK: '',\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',\n    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',\n\n    REACT_APP_CLIENT_ID: 'xxxxxx',\n    REACT_APP_AUTH_AUTHORITY: 'https://localhost/gitlab/',\n    REACT_APP_REDIRECT_URI: 'https://localhost/Library',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'https://localhost/',\n    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',\n  };\n};\n

And then update OAuth2 client application ID (REACT_APP_CLIENT_ID) with that of the newly registered OAuth2 application.

"},{"location":"admin/localhost-secure.html#restart-dtaas-client-website","title":"Restart DTaaS Client Website","text":"

To update the client website configuration, run

docker compose -f compose.local.secure.yml --env-file .env.local up -d --force-recreate client\n
"},{"location":"admin/localhost-secure.html#use","title":"Use","text":"

The application will be accessible at: https://localhost from web browser. Sign in using your https://localhost/gitlab account.

All the functionality of DTaaS should be available to you through the single page client now.

"},{"location":"admin/localhost-secure.html#limitations","title":"Limitations","text":"

The library microservice is not included in the localhost installation scenario.

"},{"location":"admin/localhost-secure.html#docker-help","title":"Docker Help","text":"

The commands to start and stop the appliation are:

docker compose -f compose.local.secure.yml --env-file .env.local up -d\ndocker compose -f compose.local.secure.yml --env-file .env.local down\n

To restart only a specific container, for example client

docker compose -f compose.local.secure.yml --env-file .env.local up -d --force-recreate client\n
"},{"location":"admin/localhost-secure.html#references","title":"References","text":"

Image sources: Traefik logo, ml-workspace, reactjs, gitlab

"},{"location":"admin/localhost.html","title":"Install DTaaS on localhost","text":"

The installation instructions provided in this README are ideal for running the DTaaS on both localhost. This installation is ideal for single users intending to use DTaaS on their own computers.

"},{"location":"admin/localhost.html#design","title":"Design","text":"

An illustration of the docker containers used and the authorization setup is shown here.

"},{"location":"admin/localhost.html#requirements","title":"Requirements","text":"

The installation requirements to run this docker version of the DTaaS are:

  • docker desktop / docker CLI with compose plugin
  • User account on gitlab.com

Tip

The frontend website requires authorization. The default authorization configuration works for gitlab.com. If you desire to use locally hosted gitlab instance, please see the client docs.

"},{"location":"admin/localhost.html#download-release-package","title":"Download Release Package","text":"

The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

Tip

  1. The filepaths shown here follow POSIX convention. The installation procedures also work with Windows paths.
  2. The description below refers to filenames. All the file paths mentioned below are relatively to the top-level DTaaS directory.
"},{"location":"admin/localhost.html#configuration","title":"Configuration","text":""},{"location":"admin/localhost.html#docker-compose","title":"Docker Compose","text":"

The docker compose configuration is in deploy/docker/.env.local; it is a sample file. It contains environment variables that are used by the docker compose files. It can be updated to suit your local installation scenario. It contains the following environment variables.

Edit all the fields according to your specific case.

URL Path Example Value Explanation DTAAS_DIR '/home/Desktop/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. username1 'user1' Your gitlab username

Tip

Important points to note:

  1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
  2. The client configuration file is located at deploy/config/client/env.local.js. If you are following the guide to use HTTPS on localhost, edit the URLs in this file by replacing http with https. Beyond this, it is not necessary to modify this file.
"},{"location":"admin/localhost.html#create-user-workspace","title":"Create User Workspace","text":"

The existing filesystem for installation is setup for user1. A new filesystem directory needs to be created for the selected user.

Please execute the following commands from the top-level directory of the DTaaS project.

cp -R files/user1 files/username\n

where username is the selected username registered on https://gitlab.com.

"},{"location":"admin/localhost.html#run","title":"Run","text":"

The commands to start and stop the appliation are:

docker compose -f compose.local.yml --env-file .env.local up -d\ndocker compose -f compose.local.yml --env-file .env.local down\n

To restart only a specific container, for example `client``

docker compose -f compose.local.yml --env-file .env.local up -d --force-recreate client\n
"},{"location":"admin/localhost.html#use","title":"Use","text":"

The application will be accessible at: http://localhost from web browser. Sign in using your https://gitlab.com account.

All the functionality of DTaaS should be available to you through the single page client now.

"},{"location":"admin/localhost.html#limitations","title":"Limitations","text":"

The library microservice is not included in the localhost installation scenario.

"},{"location":"admin/localhost.html#references","title":"References","text":"

Image sources: Traefik logo, ml-workspace, reactjs, gitlab

"},{"location":"admin/overview.html","title":"Overview","text":""},{"location":"admin/overview.html#install","title":"Install","text":"

The goal is to install and administer the DTaaS application for users.

The DTaaS can be installed in different ways. Each version serves a different purpose.

Easy Setup on Localhost

The localhost installation is easy for first time users. Please give it a try.

Otherwise, use the installation setup that fits your needs.

Installation Setup Purpose localhost Install DTaaS on your computer for a single user; does not need a web server. This setup does not require domain name. secure localhost Install DTaaS on your computer for a single user over HTTPS with integrated gitlab installation; does not need a web server. This setup does not require domain name. Server Install DTaaS on server for multiple users. Please check the requirements. It is also possible to host the application over HTTPS with integrated gitlab installation One vagrant machine Install DTaaS on a virtual machine; can be used for single or multiple users. Two vagrant machines Install DTaaS on two virtual machines; can be used for single or multiple users. The core DTaaS application is installed on the first virtual machine and all the services (RabbitMQ, MQTT, InfluxDB, Grafana and MongoDB) are installed on second virtual machine. Independent Packages Can be used independently; do not need full installation of DTaaS.

The installation steps is a good place to start the installation process.

"},{"location":"admin/overview.html#administer","title":"Administer","text":"

There is a CLI to add and delete users of a running application.

"},{"location":"admin/packages.html","title":"Independent Packages","text":"

The DTaaS development team publishes reusable packages which are then put together to form the complete DTaaS application.

The packages are published on github, npmjs, and docker hub repositories.

The packages on github are published more frequently but are not user tested. The packages on npmjs and docker hub are published at least once per release. The regular users are encouraged to use the packages from npm and docker hub.

A brief explanation of the packages is given below.

Package Name Description Documentation for Availability dtaas-web React web application Not useful as standalone package docker hub and github libms Library microservice npm package npmjs and github container image docker hub and github runner REST API wrapper for multiple scripts/programs npm package npmjs and github ml-workspace-minimal (fork of ml-workspace) User workspace not available docker hub. Please note that this package is highly experimental and only v0.15.0-b2 is usable now."},{"location":"admin/requirements.html","title":"Requirements","text":"

Tip

These optional requirements are not needed for localhost installation. They are only required for installation of the DTaaS on a production web server.

There are two optional requirements for installing the DTaaS.

"},{"location":"admin/requirements.html#oauth-provider","title":"OAuth Provider","text":"

The DTaaS software is uses OAuth for user authorization. It is possible to use either gitlab.com or your own OAuth service provider.

"},{"location":"admin/requirements.html#domain-name","title":"Domain name","text":"

The DTaaS software is a web application and is preferably hosted on a server with a domain name like foo.com. However, it is possible to install the software on your computer and use access it at localhost.

"},{"location":"admin/services.html","title":"Third-party Services","text":"

The DTaaS software platform uses third-party software services to provide enhanced value to users.

InfluxDB, Grafana, RabbitMQ and Mosquitto are default services integrated into the DTaaS software platform.

"},{"location":"admin/services.html#pre-requisites","title":"Pre-requisites","text":"

All these services run on raw TCP/UDP ports. Thus a direct network access to these services is required for both the DTs running inside the DTaaS software and the PT located outside the DTaaS software.

There are two possible choices here:

  • Configure Traefik gateway to permit TCP/UDP traffic
  • Bypass Traefik altogether

Unless you are an informed user of Traefik, we recommend bypassing traefik and provide raw TCP/UDP access to these services from the Internet.

The InfluxDB service requires a dedicated hostname. The management interface of RabbitMQ service requires a dedicated hostname as well.

Grafana service can run well behind Traefik gateway. The default Traefik configuration makes permits access to Grafana at URL: http(s): foo.com/vis.

"},{"location":"admin/services.html#configure-and-install","title":"Configure and Install","text":"

The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

The next step in installation is to specify the config of the services. There are two configuration files. The services.yml contains most of configuration settings. The mqtt-default.conf file contains the MQTT listening port. Update these two config files before proceeding with the installation of the services.

Now continue with the installation of services.

yarn install\nnode services.js\n
"},{"location":"admin/services.html#use","title":"Use","text":"

After the installation is complete, you can see the following services active at the following ports / URLs.

service external url Influx services.foo.com Grafana services.foo.com:3000 RabbitMQ Broker services.foo.com:5672 RabbitMQ Broker Management Website services.foo.com:15672 MQTT Broker services.foo.com:1883 MongoDB database services.foo.com:27017

The firewall and network access settings of corporate / cloud network need to be configured to allow external access to the services. Otherwise the users of DTaaS will not be able to utilize these services from their user workspaces.

"},{"location":"admin/steps.html","title":"Installation Steps","text":""},{"location":"admin/steps.html#complete-dtaas-application","title":"Complete DTaaS Application","text":"

DTaaS application is available in two flavors. One is localhost which is suitable for single-user, local usage. Another is production server which is suitable for multi-user setup.

In both cases, the installation is a three step process.

"},{"location":"admin/steps.html#setup-authorization","title":"Setup Authorization","text":"

DTaaS provides security using OAuth authorization for both react client frontend and backend services.

There is a default frontend authorization application setup for all localhost and backend authorization is not required for localhost installation.

The production server installation requires both react client frontend and backend services applications.

"},{"location":"admin/steps.html#configure-components","title":"Configure Components","text":"

DTaaS is available as docker compose application. There are four docker compose files

  1. compose.local.yml for localhost installation served over HTTP connection.
  2. compose.local.secure.yml for secure localhost installation served over HTTPS connection.
  3. compose.server.yml for production server installation served over HTTP connection.
  4. compose.server.secure.yml for production server installation served over HTTPS connection.

These four compose files require environment configuration files. The explanation of this configuration file is available directly on the installation pages.

In addition, react client frontend requires configuration which is explained on this page.

"},{"location":"admin/steps.html#install","title":"Install","text":"

Follow installation instructions given on either localhost or production server pages.

"},{"location":"admin/steps.html#independent-packages","title":"Independent Packages","text":"

Each release of DTaaS also comes with release of three reusable packages. These packages have dedicated documentation.

"},{"location":"admin/client/auth.html","title":"OAuth for React Client","text":"

To enable user authorization on DTaaS React client website, you will use the OAuth authorization protocol, specifically the PKCE authorization flow. Here are the steps to get started:

1. Choose Your GitLab Server:

  • You need to set up OAuth authorization on a GitLab server. The commercial gitlab.com is not suitable for multi-user authorization (DTaaS requires this), so you'll need an on-premise GitLab instance.
  • You can use GitLab Omnibus Docker for this purpose.
  • Configure the OAuth application as an instance-wide authorization type.

2. Determine Your Website's Hostname:

  • Before setting up OAuth on GitLab, decide on the hostname for your website. It's recommended to use a self-hosted GitLab instance, which you will use in other parts of the DTaaS application.

3. Define Callback and Logout URLs:

  • For the PKCE authorization flow to function correctly, you need two URLs: a callback URL and a logout URL.
  • The callback URL informs the OAuth provider of the page where signed-in users should be redirected. It's different from the landing homepage of the DTaaS application.
  • The logout URL is where users will be directed after logging out.

4. OAuth Application Creation:

  • During the creation of the OAuth application on GitLab, you need to specify the scope. Choose openid, profile, read_user, read_repository, and api scopes.

5. Application ID:

  • After successfully creating the OAuth application, GitLab generates an application ID. This is a long string of HEX values that you will need for your configuration files.

6. Required Information from OAuth Application:

  • You will need the following information from the OAuth application registered on GitLab:
GitLab Variable Name Variable Name in Client env.js Default Value OAuth Provider REACT_APP_AUTH_AUTHORITY https://gitlab.foo.com/ Application ID REACT_APP_CLIENT_ID Callback URL REACT_APP_REDIRECT_URI https://foo.com/Library Scopes REACT_APP_GITLAB_SCOPES openid, profile, read_user, read_repository, api

7. Create User Accounts:

Create user accounts in gitlab for all the usernames chosen during installation. The trial installation script comes with two default usernames - user1 and user2. For all other installation scenarios, accounts with specific usernames need to be created on gitlab.

"},{"location":"admin/client/config.html","title":"Configure Client Website","text":"

This page describes various configuration options for react website.

if (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: \"prod | dev | local | test\",\n    REACT_APP_URL: \"URL for the gateway\",\n    REACT_APP_URL_BASENAME: \"Base URL for the client website\"(optional, can be null),\n    REACT_APP_URL_DTLINK: \"Endpoint for the Digital Twin\",\n    REACT_APP_URL_LIBLINK: \"Endpoint for the Library Assets\",\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: \"Endpoint for the VNC Desktop link\",\n    REACT_APP_WORKBENCHLINK_VSCODE: \"Endpoint for the VS Code link\",\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: \"Endpoint for the Jupyter Lab link\",\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK:\n      \"Endpoint for the Jupyter Notebook link\",\n    REACT_APP_WORKBENCHLINK_DT_PREVIEW: \"Endpoint for the Digital Twins page preview\",\n    REACT_APP_CLIENT_ID: 'AppID genereated by the gitlab OAuth provider',\n    REACT_APP_AUTH_AUTHORITY: 'URL of the private gitlab instance',\n    REACT_APP_REDIRECT_URI: 'URL of the homepage for the logged in users of the website',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'URL of the homepage for the anonymous users of the website',\n    REACT_APP_GITLAB_SCOPES: 'OAuth scopes. These should match with the scopes set in gitlab OAuth provider',\n  };\n};\n\n// Example values with no base URL. Trailing and ending slashes are optional.\nif (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: 'prod',\n    REACT_APP_URL: 'https://foo.com/',\n    REACT_APP_URL_BASENAME: '',\n    REACT_APP_URL_DTLINK: '/lab',\n    REACT_APP_URL_LIBLINK: '',\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',\n    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',\n    REACT_APP_WORKBENCHLINK_DT_PREVIEW: '/preview/digitaltwins',\n    REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',\n    REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/',\n    REACT_APP_REDIRECT_URI: 'https://foo.com/Library',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'https://foo.com/',\n    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',\n  };\n};\n\n\n// Example values with \"bar\" as basename URL.\n//Trailing and ending slashes are optional.\nif (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: \"dev\",\n    REACT_APP_URL: 'http://localhost:4000/',\n    REACT_APP_URL_BASENAME: 'bar',\n    REACT_APP_URL_DTLINK: '/lab',\n    REACT_APP_URL_LIBLINK: '',\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',\n    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',\n    REACT_APP_WORKBENCHLINK_DT_PREVIEW: '/preview/digitaltwins',\n    REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',\n    REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/',\n    REACT_APP_REDIRECT_URI: 'http://localhost:4000/bar/Library',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'http://localhost:4000/bar',\n    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',\n  };\n};\n
"},{"location":"admin/client/config.html#multiple-dtaas-applications","title":"Multiple DTaaS applications","text":"

Warning

This is not a regular installation scenario and is only recommended for experts. This installation setup requires significant modifications to the docker compose files.

The DTaaS is a regular web application. It is possible to host multiple DTaaS applications on the same server. The only requirement is to have a distinct URLs. You can have three DTaaS applications running at the following URLs.

https://foo.com/au\nhttps://foo.com/acme\nhttps://foo.com/bar\n

All of these instances can use the same gitlab instance for authorization.

DTaaS application URL Gitlab Instance URL Callback URL Logout URL Application ID https://foo.com/au https://foo.gitlab.com https://foo.com/au/Library https://foo.com/au autogenerated by gitlab https://foo.com/acme https://foo.gitlab.com https://foo.com/au/Library https://foo.com/au autogenerated by gitlab https://foo.com/bar https://foo.gitlab.com https://foo.com/au/Library https://foo.com/au autogenerated by gitlab

If you are hosting multiple DTaaS instances on the same server, do not install DTaaS with a null basename on the same server. Even though it works well, the setup is confusing to setup and may lead to maintenance issues.

If you choose to host your DTaaS application with a basename (say bar), then the URLs in env.js change to:

DTaaS application URL: https://foo.com/bar\nGitlab instance URL: https://gitlab.foo.com\nCallback URL: https://foo.com/bar/Library\nLogout URL: https://foo.com/bar\n
"},{"location":"admin/gitlab/index.html","title":"Install Gitlab","text":"

This guide helps with installation of a dedicated Gitlab service. This Gitlab installation can be used as OAuth2 authorization provider to the DTaaS software. In addition, it is also possible to use the integrated Gitlab for enabling the digital twin DevOps experimental features of the DTaaS.

There are two possible ways you can install Gitlab:

  • At dedicated domain name (ex: gitlab.foo.com)
  • At a URL path on existing WWW server (ex: foo.com/gitlab)

    This guide illustrates the installation of Gitlab at: foo.com/gitlab. But the instructions can be adapted to install Gitlab at a dedicated domain name."},{"location":"admin/gitlab/index.html#download-release-package","title":"Download Release Package","text":"

    The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

    "},{"location":"admin/gitlab/index.html#configure-and-install","title":"Configure and Install","text":"
    cd DTaaS/deploy/services/gitlab\n

    This directory contains files needed to set up the docker container containing the local GitLab instance.

    1. ./data, ./config, ./logs are the directories that will contain data for the GitLab instance
    2. compose.gitlab.yml and .env are the Docker compose and environment files to manage the containerized instance of gitlab

    If the DTaaS application and gitlab are to be hosted at https://foo.com, then the client config file (deploy/config/client/env.js) needs to use the https://foo.com/gitlab as REACT_APP_AUTH_AUTHORITY. In addition, this hosting at https://foo.com also requires changes to config file (.env.server).

    If the DTaaS application and gitlab are to be hosted at https://localhost, then the client config file (deploy/config/client/env.local.js) needs to use the https://localhost/gitlab as REACT_APP_AUTH_AUTHORITY. If the application and the integrated gitlab are to be hosted at https://localhost/gitlab, then .env.server need not be modified.

    Edit the .env file available in this directory to contain the following variables:

    Variable Example Value Explanation GITLAB_HOME '/home/Desktop/DTaaS/deploy/services/gitlab' Full path to the DTaaS gitlab directory. This is an absolute path with no trailing slash. SERVER_DNS either foo.com or localhost The server DNS, if you are deploying with a dedicated server. Remember not use http(s) at the beginning of the DNS string.

    NOTE: The DTaaS client uses the react-oidc-context node package, which incorrectly causes redirects to use the HTTPS URL scheme. This is a known issue with the package, and forces us to use HTTPS for the DTaaS server. If you are hosting the DTaaS locally, your GitLab instance should be available at https://localhost/gitlab. If you are hosting the DTaaS at https://foo.com, then you Gitlab instance should be available at https://foo.com/gitlab.

    "},{"location":"admin/gitlab/index.html#run","title":"Run","text":"

    NOTE: The GitLab instance operates with the dtaas-frontend network, which requires the DTaaS server to be running before you start it. You may refer to secure installation scenarios (../overview.md) for the same.

    The commands to start and stop the instance are:

    # (cd deploy/services/gitlab)\ndocker compose -f compose.gitlab.yml up -d\ndocker compose -f compose.gitlab.yml down\n

    Each time you start the container, it may take a few minutes. You can monitor the progress with watch docker ps and check if the gitlab container is healthy.

    "},{"location":"admin/gitlab/index.html#post-install-configuration","title":"Post-install Configuration","text":"

    Gitlab also requires post-installation configuration.

    Information

    This configuration needs to be done from within the running container.

    docker exec -it gitlab bash\n

    The configuration file to change is /etc/gitlab/gitlab.rb. The variables to change are:

    external_url 'http(s)://foo.com/gitlab'\nnginx['listen_port'] = 80\nnginx['enable'] = true\n\nnginx['listen_https'] = false\nnginx['redirect_http_to_https'] = false\nletsencrypt['enable'] = false\n

    The external_url mentioned about indicates hosting of gitlab at https://foo.com/gitlab. If the gitlab needs to be available at https://localhost/gitlab, then the external_url should be https://localhost/gitlab.

    Save the changes and reconfigure gitlab by running:

    # inside the gitlab docker container\ngitlab-ctl reconfigure\nexit\n

    The administrator username for GitLab is: root. The password for this user account will be available in: /etc/gitlab/initial_root_password. Be sure to save this password somewhere, as this file will be deleted after 24 hours from the first time you start the local instance.

    After running the container, your local GitLab instance will be available at external_url specified in gitlab.rb, i.e., either at https://foo.com/gitlab or at https://localhost/gitlab.

    "},{"location":"admin/gitlab/index.html#create-users","title":"Create Users","text":"

    The newly installed gitlab only contains root user. More users need to be created for use with DTaaS. Please see the Gitlab docs for further help.

    "},{"location":"admin/gitlab/index.html#pending-tasks","title":"Pending Tasks","text":"

    This README helps with installation of Gitlab along side DTaaS application. But the OAuth2 integration between Gitlab and DTaaS will still be still pending. Follow the integration guide and runner setup to setup the Gitlab integration.

    "},{"location":"admin/gitlab/integration.html","title":"GitLab Integration Guide","text":"

    This guide helps with integration of a local GitLab instance with a DTaaS server installation, and integrating the OAuth Authorization feature with the DTaaS installation.

    After following this guide, the GitLab instance will be integrated as OAuth provider for both DTaaS client application and Traefik Forward Auth backend authorization.

    Note

    The DTaaS client uses the react-oidc-context node package, which incorrectly causes authorization redirects to use the HTTPS URL scheme. This is a known issue with the package, and forces us to use HTTPS for the DTaaS server. This means your server should be set up to use either https://localhost or https://foo.com. This guide will henceforth use foo.com to represent either localhost or a custom domain.

    "},{"location":"admin/gitlab/integration.html#integration-steps","title":"Integration Steps","text":""},{"location":"admin/gitlab/integration.html#1-set-up-the-dtaas-server-over-https","title":"1. Set up the DTaaS server over HTTPS","text":"

    Follow the existing guides to set up the DTaaS web application over HTTPS connection on either localhost (https://localhost) or a custom domain (https://foo.com).

    Note

    You may ignore steps related to configuring OAuth application tokens at https://gitlab.com. We will be using the initial installation to host the local GitLab instance, on which we will later create the OAuth application tokens.

    "},{"location":"admin/gitlab/integration.html#2-set-up-the-gitlab-instance","title":"2. Set up the GitLab Instance","text":"

    Follow the guide to set up a GitLab instance.

    After this step, and once you run gitlab-ctl reconfigure, you will have a functioning GitLab instance (at either https://localhost/gitlab or https://foo.com/gitlab). Login credentials of the root user.

    "},{"location":"admin/gitlab/integration.html#3-create-oauth-tokens-in-gitlab","title":"3. Create OAuth Tokens in GitLab","text":"

    Follow these guides to create OAuth Application Tokens for - backend and client. Please note that backend is not required for https://localhost installation.

    After this step you will have credentials for the application tokens titled \"DTaaS Server Authorization\" and \"DTaaS Client Authorization\", which we will use in the next step.

    "},{"location":"admin/gitlab/integration.html#4-use-valid-oauth-application-tokens","title":"4. Use Valid Oauth Application Tokens","text":"

    We can now use the OAuth tokens generated on the GitLab instance to enable authorization.

    If the DTaaS application is hosted at https://localhost, then configure the following files:

    1. DTaaS Client Authorization token in deploy/config/client/env.local.js.
    2. deploy/docker/.env.local Add localpath and username.

    If the DTaaS application is hosted at https://foo.com, then configure the following files:

    1. DTaaS Client Authorization token in deploy/config/client/env.js.
    2. deploy/docker/.env.server - Add localpath and username, OAuth client ID and client secret from the DTaaS Server Authorization token
    "},{"location":"admin/gitlab/integration.html#restart-services","title":"Restart Services","text":""},{"location":"admin/gitlab/integration.html#localhost-installation","title":"Localhost Installation","text":"

    The updated OAuth application configuration needs to be loaded into the client website service.

    cd deploy/docker\ndocker compose -f compose.local.yml --env-file .env.local up -d --force-recreate client\n
    "},{"location":"admin/gitlab/integration.html#production-server-installation","title":"Production Server Installation","text":"

    The updated OAuth application configuration needs to be loaded into the client website and the forward-auth services.

    The production server can be installed with either http or https option. If it is installed with http option, run the following commands.

    cd deploy/docker\ndocker compose -f compose.server.yml --env-file .env.server up -d --force-recreate client\ndocker compose -f compose.server.yml --env-file .env.server up -d --force-recreate traefik-forward-auth\n

    If the production server is installed with https option, run the following commands.

    cd deploy/docker\ndocker compose -f compose.server.secure.yml --env-file .env.server up -d --force-recreate client\ndocker compose -f compose.server.secure.yml --env-file .env.server up -d --force-recreate traefik-forward-auth\n
    "},{"location":"admin/gitlab/integration.html#post-setup-usage","title":"Post Setup Usage","text":"

    If you have set up everything correctly:

    1. You will have a functioning path-prefixed GitLab instance available at https://foo.com/gitlab that you may use in a similar manner to https://gitlab.com.
    2. Data, configuration settings and logs pertaining to the GitLab installation will be available on the DTaaS server within the directory: deploy/services/gitlab.
    3. Traefik Forward Auth will use the path-prefixed GitLab instance for authorization on the multi-user installation scenario i.e. foo.com (but not on localhost).
    "},{"location":"admin/gitlab/runner.html","title":"Gitlab Runner Integration","text":"

    To properly use the Digital Twins Preview Page, you need to configure at least one project runner in your GitLab profile. The first step is to configure the CI/CD pipeline in gitlab project. The second step is to install the runner and integrate it with the selected gitlab project.

    "},{"location":"admin/gitlab/runner.html#configure-gitlab-project","title":"Configure Gitlab Project","text":"

    Follow the steps below:

    1. Navigate to the DTaaS group and select the project named after your GitLab username.
    2. In the project menu, go to Settings and select CI/CD.
    3. Expand the Runners section and click on New project runner. Follow the configuration instructions carefully:
    4. Add linux as a tag during configuration.
    5. Click on Create runner. A runner authentication token is generated. This token will be used later for registering a runner.
    "},{"location":"admin/gitlab/runner.html#runner","title":"Runner","text":""},{"location":"admin/gitlab/runner.html#install-runner","title":"Install Runner","text":"

    A detailed guide on installation of gitlab runners on Linux OS is available on gitlab website. Remember to use linux as tag for the runner.

    "},{"location":"admin/gitlab/runner.html#register-runner","title":"Register Runner","text":"

    Please see this gitlab guide on registering a runner.

    Remember to choose docker as executor and ruby:2.7 as the default docker image.

    $sudo gitlab-runner register  --url https://gitlab.foo.com \\\n  --token xxxxx\n

    Or, you can also register the runner in non-interactive mode by running

    $sudo gitlab-runner register \\\n  --non-interactive \\\n  --url \"https://gitlab.foo.com/\" \\\n  --token \"xxxx\" \\\n  --executor \"docker\" \\\n  --docker-image ruby:2.7 \\\n  --description \"docker-runner\"\n
    "},{"location":"admin/gitlab/runner.html#start-runner","title":"Start Runner","text":"

    You can manually verify that the runner is available to pick up jobs by running the following command:

    $sudo gitlab-runner run\n

    It can also be used to reactivate offline runners during subsequent sessions.

    "},{"location":"admin/gitlab/runner.html#pipeline-trigger-token","title":"Pipeline Trigger Token","text":"

    You also need to create a pipeline trigger token. This token is required to trigger pipelines by using the API. You can create this token in your GitLab project's CI/CD settings under the Pipeline trigger tokens section.

    "},{"location":"admin/guides/add_service.html","title":"Add other services","text":"

    Pre-requisite

    You should read the documentation about the already available services

    This guide will show you how to add more services. In the following example we will be adding MongoDB as a service, but these steps could be modified to install other services as well.

    Adding other services requires more RAM and CPU power. Please make sure the host machine meets the hardware requirements for running all the services.

    1. Add the configuration:

    Select configuration parameters for the MongoDB service.

    Configuration Variable Name Description username the username of the root user in the MongoDB password the password of the root user in the MongoDB port the mapped port on the host machine (default is 27017) datapath path on host machine to mount the data from the MongoDB container

    Open the file /deploy/services/services.yml and add the configuration for MongoDB:

    services:\n    rabbitmq:\n        username: \"dtaas\"\n        password: \"dtaas\"\n        vhost: \"/\"\n        ports:\n            main: 5672\n            management: 15672\n    ...\n    mongodb:\n        username: <username>\n        password: <password>\n        port: <port>\n        datapath: <datapath>\n    ...\n

    2. Add the script:

    The next step is to add the script that sets up the MongoDB container with the configuraiton.

    Create new file named /deploy/services/mongodb.js and add the following code:

    #!/usr/bin/node\n/* Install the optional platform services for DTaaS */\nimport { $ } from \"execa\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport yaml from \"js-yaml\";\n\nconst $$ = $({ stdio: \"inherit\" });\nconst log = console.log;\nlet config;\n\ntry {\n  log(chalk.blue(\"Load services configuration\"));\n  config = await yaml.load(fs.readFileSync(\"services.yml\", \"utf8\"));\n  log(\n    chalk.green(\n      \"configuration loading is successful and config is a valid yaml file\"\n    )\n  );\n} catch (e) {\n  log(chalk.red(\"configuration is invalid. Please rectify services.yml file\"));\n  process.exit(1);\n}\n\nlog(chalk.blue(\"Start MongoDB server\"));\nconst mongodbConfig = config.services.mongodb;\n\ntry {\n  log(\n    chalk.green(\n      \"Attempt to delete any existing MongoDB server docker container\"\n    )\n  );\n  await $$`docker stop mongodb`;\n  await $$`docker rm mongodb`;\n} catch (e) {}\n\nlog(chalk.green(\"Start new Mongodb server docker container\"));\nawait $$`docker run -d -p ${mongodbConfig.port}:27017 \\\n  --name mongodb \\\n  -v ${mongodbConfig.datapath}:/data/db \\\n  -e MONGO_INITDB_ROOT_USERNAME=${mongodbConfig.username} \\\n  -e MONGO_INITDB_ROOT_PASSWORD=${mongodbConfig.password} \\\n  --restart always \\\n  mongo:7.0.3`;\nlog(chalk.green(\"MongoDB server docker container started successfully\"));\n

    3. Run the script:

    Go to the directory /deploy/services/ and run services script with the following commands:

    yarn install\nnode mongodb.js\n

    The MongoDB should now be available on services.foo.com:<port>.

    "},{"location":"admin/guides/add_user.html","title":"Add User","text":"

    This page provides steps to adding a user from a DTaaS installation. The username alice is used here to illustrate the steps involved in removing a user account.

    Please do the following:

    1. Add user to Gitlab instance:

    Add a new account for the new user on the Gitlab instance. Note the username and email of the new account.

    2. Create User Workspace:

    Use the DTaaS CLI to bring up the workspaces for new users. This brings up the containers, without the backend authorization.

    3. Add backend authorization for the user:

    • Go to the docker directory
    cd <DTaaS>/docker\n
    • Add three lines to the conf.server file
    rule.onlyu3.action=auth\nrule.onlyu3.rule=PathPrefix(`/alice`)\nrule.onlyu3.whitelist = alice@foo.com\n

    4. Restart the docker container responsible for backend authorization.

    docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n

    5. The new users are now added to the DTaaS instance, with authorization enabled.

    "},{"location":"admin/guides/common_workspace_readonly.html","title":"Make Common Assets Read Only","text":""},{"location":"admin/guides/common_workspace_readonly.html#why","title":"Why","text":"

    In some cases you might want to restrict the access rights of some users to the common assets. In order to make the common area read only, you have to change the install script section performing the creation of user workspaces.

    Note

    These step needs to be performed before installation of the application.

    "},{"location":"admin/guides/common_workspace_readonly.html#how","title":"How","text":"

    To make the common assets read-only for a user, the following changes need to be made to the compose.server.yml file.

      ...\n  user1:\n    ....\n    volumes:\n      - ${DTAAS_DIR}/files/common:/workspace/common:ro\n    ....\n\n  user2:\n    ....\n    volumes:\n      - ${DTAAS_DIR}/files/common:/workspace/common:ro\n    ....\n

    Please note the :ro at the end of the line. This suffix makes the common assets read only.

    If you want to have the same kind of read only restriction for new users as well, please make a similar change in cli/users.server.yml.

    "},{"location":"admin/guides/link_service.html","title":"Link services to local ports","text":"

    Requirements

    • User needs to have an account on server2.
    • SSH server must be running on server2

    To link a port from the service machine (server2) to the local port on the user workspace. You can use ssh local port forwarding technique.

    1. Step:

    Go to the user workspace, on which you want to map from localhost to the services machine

    • e.g. foo.com/user1

    2. Step:

    Open a terminal in your user workspace.

    3. Step:

    Run the following command to map a port:

    ssh -fNT -L <local_port>:<destination>:<destination_port> <user>@<services.server.com>\n

    Here's an example mapping the RabbitMQ broker service available at 5672 of services.foo.com to localhost port 5672.

    ssh -fNT -L 5672:localhost:5672 vagrant@services.foo.com\n

    Now the programs in user workspace can treat the RabbitMQ broker service as a local service running within user workspace.

    "},{"location":"admin/guides/localhost_portainer.html","title":"Install DTaaS on localhost (GUI)","text":"

    The installation instructions provided in this README are ideal for running the DTaaS on localhost via a Graphical User Interface (GUI). This installation is ideal for single users intending to use DTaaS on their own computers.

    "},{"location":"admin/guides/localhost_portainer.html#design","title":"Design","text":"

    An illustration of the docker containers used and the authorization setup is shown here.

    "},{"location":"admin/guides/localhost_portainer.html#requirements","title":"Requirements","text":"

    The installation requirements to run this docker version of the DTaaS are:

    • docker desktop / docker CLI with compose plugin
    • User account on gitlab.com

    Tip

    The frontend website requires authorization. The default authorization configuration works for gitlab.com. If you desire to use locally hosted gitlab instance, please see the client docs.

    "},{"location":"admin/guides/localhost_portainer.html#download-release-package","title":"Download Release Package","text":"

    The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

    cd DTaaS/deploy/services/gitlab\n

    In this guide we will assume the contents of the zip file have been extracted to the directory: /home/DTaaS.

    Tip

    The path given here is for Linux OS. It can be Windows compatible as well, for example: C:\\\\DTaaS. Make sure to use this path and format in place of /home/DTaaS in this guide.

    "},{"location":"admin/guides/localhost_portainer.html#starting-portainer","title":"Starting Portainer","text":"

    The GUI used to run the application and docker containers will be provided by Portainer Community Edition. It is itself a Docker container that will create a website at https://localhost:9443, which will present a graphical interface for starting and stopping the application.

    You may follow the official documentation for setting up a Portainer CE Server . Alternatively, open a terminal on your system (Terminal on Linux / MacOS, Powershell on Windows, etc) and copy the following commands into it:

    docker volume create portainer_data\ndocker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.21.4\n

    This will start the Portainer server on your system, which will host its dashboard at https://localhost:9443. Follow the Initial Setup Guide to set up an administrator account for Portainer on your system.

    Portainer should now be set up on your system, and you can access the dashboard:

    Tip

    The next time you wish to start the Portainer server, run docker start portainer.

    "},{"location":"admin/guides/localhost_portainer.html#configuration","title":"Configuration","text":""},{"location":"admin/guides/localhost_portainer.html#create-user-workspace","title":"Create User Workspace","text":"

    The existing filesystem for installation is setup for user1. A new filesystem directory needs to be created for the selected user.

    You may use your file explorer or an equivalent application to duplicate the files/user1 directory and rename it as files/username where username is the selected username registered on https://gitlab.com.

    ALternatively, you may execute the following commands from the top-level directory of the DTaaS project.

    cp -R files/user1 files/username\n
    "},{"location":"admin/guides/localhost_portainer.html#creating-the-portainer-stack","title":"Creating the Portainer Stack","text":"

    Portainer Stacks are equivalent to using docker compose commands to manage containers.

    1. Navigate to the Stacks tab on the side panel, and click on the Add Stack button.
    2. Name the Stack anything descriptive, for example: dtaas-localhost.
    3. Select the Upload build method.
    4. Upload the compose file located at deploy/docker/compose.local.yml.
    5. Select the option to load variables from a .env file, and upload the file deploy/docker/.env.local.

    Tip

    Sometimes the .env.local file does not show up in the file explorer. You may fix this by selecting the option to show All Files rather than those with the extension .env.

    The .env.local file contains environment variables that are used by the compose file. Portainer allows you to modify them as shown in the screenshot above, here is a summary:

    URL Path Example Value Explanation DTAAS_DIR '/home/Desktop/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. username1 'user1' Your gitlab username

    Tip

    Important points to note:

    1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
    2. The client configuration file is located at deploy/config/client/env.local.js. If you are following the guide to use HTTPS on localhost, edit the URLs in this file by replacing http with https.

    Once you have configured the environment variables, click on the button Deploy the stack.

    "},{"location":"admin/guides/localhost_portainer.html#use","title":"Use","text":"

    The application will be accessible at: http://localhost from web browser. Sign in using your https://gitlab.com account.

    All the functionality of DTaaS should be available to you through the single page client now.

    "},{"location":"admin/guides/localhost_portainer.html#limitations","title":"Limitations","text":"

    The library microservice is not included in the localhost installation scenario.

    "},{"location":"admin/guides/localhost_portainer.html#references","title":"References","text":"

    Image sources: Traefik logo, ml-workspace, reactjs, gitlab

    "},{"location":"admin/guides/remove_user.html","title":"Remove User","text":"

    This page provides steps to remove a user from a DTaaS installation. The username alice is used here to illustrate the steps involved in removing a user account.

    Please do the following:

    1. Remove an existing user with the DTaaS CLI.

    2. Remove backend authorization for the user:

    • Go to the docker directory
    cd <DTaaS>/docker\n
    • Remove these three lines from the conf.server file
    rule.onlyu3.action=auth\nrule.onlyu3.rule=PathPrefix(`/alice`)\nrule.onlyu3.whitelist = alice@foo.com\n
    • Run the command for these changes to take effect:
    docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n

    The extra users now have no backend authorization.

    3. Remove users to Gitlab instance (optional):

    Please see gitlab docs for more help.

    4. The user account is now deleted.

    "},{"location":"admin/guides/remove_user.html#caveat","title":"Caveat","text":"

    You cannot delete the two base users that the DTaaS software is installed with. You can only delete the extra users that have been added to the software.

    "},{"location":"admin/servers/auth.html","title":"OAuth for Traefik Gateway","text":"

    The traefik gateway is used to serve the DTaaS. All the services provided as part of the application are secured at the traefik gateway. The security is based on Traefik forward-auth.

    An illustration of the docker containers used and the authorization setup is shown here.

    The traefik forward-auth can use any OAuth2 provider, but within the DTaaS gitlab is used as authorization provider. You will use the OAuth the web / server application authorization flow.

    Here are the steps to get started:

    1. Choose GitLab Server:

    • You need to set up OAuth authorization on a GitLab server. The commercial gitlab.com is not suitable for multi-user authorization (DTaaS requires this), so you'll need an on-premise GitLab instance.
    • You can use GitLab Omnibus Docker for this purpose.
    • Configure the OAuth application as an instance-wide authorization type. Select option to generate client secret and also selection option for trusted application.

    2. Determine Website Hostname:

    Before setting up OAuth on GitLab, decide on the hostname for your website. It's recommended to use a self-hosted GitLab instance, which you will use in other parts of the DTaaS application.

    3. Determine Callback and Logout URLs:

    For the web / server authorization flow to function correctly, you need two URLs: a callback URL and a logout URL.

    • The callback URL informs the OAuth provider of the page where signed-in users should be redirected. It is the landing homepage of the DTaaS application. (either http://foo.com/_oauth/ or http://localhost/_oauth/)
    • The logout URL is the URL for signout of gitlab and clear authorization within traefik-forward auth. (either http://foo.com/_oauth/logout or http://localhost/_oauth/logout). The logout URL is to help users logout of traefik forward-auth. The logout URL should not be entered into Gitlab OAuth application setup.

    4. Create OAuth Application:

    Oauth application setup on GitLab can be located on Edit Profile -> Application https://gitlab.foo.com/-/profile/applications.

    During the creation of the OAuth application on GitLab, you need to specify the scope. Choose read_user scope.

    5. Copy Application Credentials:

    After successfully creating the OAuth application, GitLab generates an application ID and client secret.

    Both these values are long string of HEX values that you will need for your configuration files.

    6. Checklist: Required Information from OAuth Application:

    You will need the following information from the OAuth application registered on GitLab:

    GitLab Variable Name Variable Name in .env of docker compose file Default Value OAuth Provider OAUTH_URL https://gitlab.foo.com/ Application ID OAUTH_CLIENT_ID xx Application Secret OAUTH_CLIENT_SECRET xx Callback URL (to be directly entered in Gitlab OAuth registration) Forward-auth secret OAUTH_SECRET random-secret-string (password for forward-auth, can be changed to your preferred string) Scopes read_user"},{"location":"admin/servers/auth.html#development-environment","title":"Development Environment","text":"

    The development environment and server installation scenarios requires traefik forward-auth.

    "},{"location":"admin/servers/auth.html#configure-authorization-rules-for-traefik-forward-auth","title":"Configure Authorization Rules for Traefik Forward-Auth","text":"

    The Traefik forward-auth microservices requires configuration rules to manage authorization for different URL paths. The conf.server file can be used to configure the specific rules. There are broadly three kinds of URLs:

    "},{"location":"admin/servers/auth.html#public-path-without-authorization","title":"Public Path Without Authorization","text":"

    To setup a public page, an example is shown below.

    rule.noauth.action=allow\nrule.noauth.rule=Path(`/public`)\n

    Here, 'noauth' is the rule name, and should be changed to suit rule use. Rule names should be unique for each rule. The 'action' property is set to \"allow\" to make the resource public. The 'rule' property defines the path/route to reach the resource.

    "},{"location":"admin/servers/auth.html#common-to-all-users","title":"Common to All Users","text":"

    To setup a common page that requires Gitlab OAuth, but is available to all users of the Gitlab instance:

    rule.all.action=auth\nrule.all.rule=Path(`/common`)\n

    The 'action' property is set to \"auth\", to enable Gitlab OAuth before the resource can be accessed.

    "},{"location":"admin/servers/auth.html#selective-access","title":"Selective Access","text":"

    Selective Access refers to the scenario of allowing access to a URL path for a few users. To setup selective access to a page:

    rule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user1`)\nrule.onlyu1.whitelist = user1@localhost\n

    The 'whitelist' property of a rule defines a comma separated list of email IDs that are allowed to access the resource. While signing in users can sign in with either their username or email ID as usual, but the email ID corresponding to the account should be included in the whitelist.

    This restricts access of the resource, allowing only users mentioned in the whitelist.

    "},{"location":"admin/servers/auth.html#user-management","title":"User management","text":"

    DTaaS provides an easy way to add and remove additional users from your DTaaS instance.

    All such user management can be done via the DTaaS CLI

    "},{"location":"admin/servers/auth.html#limitation","title":"Limitation","text":"

    The rules in _conf._ file are not dynamically loaded into the traefik-forward-auth microservice. Any change in the conf file requires restart of traefik-forward-auth for the changes to take effect. All the existing user sessions get invalidated when the traefik-forward-auth* restarts.

    Use a simple command on the terminal.

    • For a local instance:
    docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n
    • For a server instance:
    docker compose -f compose.server.yml --env-file .env.server up -d --force-recreate traefik-forward-auth\n
    "},{"location":"admin/servers/lib/config.html","title":"Configure Library Microservice","text":"

    The microservices requires config specified in INI format. The template configuration file is:

    PORT='4001'\nMODE='local'\nLOCAL_PATH='/Users/<Username>/DTaaS/files'\nLOG_LEVEL='debug'\nAPOLLO_PATH='/lib' or ''\nGRAPHQL_PLAYGROUND='false' or 'true'\n

    The LOCAL_PATH variable is the absolute filepath to the location of the local directory which will be served to users by the Library microservice.

    Replace the default values the appropriate values for your setup.

    The config is saved .env file by convention. The libms looks for .env file in the working directory from which it is run. If you want to run libms without explicitly specifying the configuration file, run

    "},{"location":"admin/servers/lib/docker.html","title":"Host Library Microservice","text":"

    The lib microservice is a simplified file manager serving files over graphQL and HTTP API.

    It has two features:

    • provide a listing of directory contents.
    • transfer a file to user.

    This document provides instructions for running docker container to provide a stand alone library microservice.

    "},{"location":"admin/servers/lib/docker.html#setup-the-file-system","title":"Setup the File System","text":""},{"location":"admin/servers/lib/docker.html#outside-dtaas","title":"Outside DTaaS","text":"

    The package can be used independently of DTaaS. If this is your use case, you do not need any specific file structure. A valid file directory named files is sufficient and it should be placed in the directory from which the compose.lib.yml will be run.

    "},{"location":"admin/servers/lib/docker.html#inside-dtaas","title":"Inside DTaaS","text":"

    The users of DTaaS expect the following file system structure for their reusable assets.

    There is a skeleton file structure in DTaaS codebase. You can copy and create file system for your users. Remember to name the directory containing the file structure as files and place it in the directory from which the compose.lib.yml will be run.

    "},{"location":"admin/servers/lib/docker.html#use","title":"Use","text":"

    Use the docker compose file to start the service.

    # To bring up the container\ndocker compose -f compose.lib.yml up -d\n# To bring down the container\ndocker compose -f compose.lib.yml down\n
    "},{"location":"admin/servers/lib/docker.html#service-endpoints","title":"Service Endpoints","text":"

    The GraphQL URL: localhost:4001/lib

    The HTTP URL: localhost:4001/lib/files

    The service API documentation is available on user page.

    "},{"location":"admin/servers/lib/npm.html","title":"Host Library Microservice","text":"

    The lib microservice is a simplified file manager serving files over graphQL and HTTP API.

    It has two features:

    • provide a listing of directory contents.
    • upload and download files

    This document provides instructions for installing npm package of library microservice and running the same as a standalone service.

    "},{"location":"admin/servers/lib/npm.html#setup-the-file-system","title":"Setup the File System","text":""},{"location":"admin/servers/lib/npm.html#outside-dtaas","title":"Outside DTaaS","text":"

    The package can be used independently of DTaaS. If this is your use case, you do not need any specific file structure. Any valid file directory is sufficient.

    "},{"location":"admin/servers/lib/npm.html#inside-dtaas","title":"Inside DTaaS","text":"

    The users of DTaaS expect the following file system structure for their reusable assets.

    There is a skeleton file structure in DTaaS codebase. You can copy and create file system for your users.

    "},{"location":"admin/servers/lib/npm.html#install","title":"Install","text":"

    The npm package is available in Github packages registry and on npmjs. Prefer the package on npmjs over Github.

    Set the registry and install the package with the one of the two following commands

    "},{"location":"admin/servers/lib/npm.html#npmjs","title":"npmjs","text":"
    sudo npm install -g @into-cps-association/libms  # requires no login\n
    "},{"location":"admin/servers/lib/npm.html#github","title":"Github","text":"
    # requires login\nsudo npm config set @into-cps-association:registry https://npm.pkg.github.com\n

    The github package registry asks for username and password. The username is your Github username and the password is your Github personal access token. In order for the npm to download the package, your personal access token needs to have read:packages scope.

    "},{"location":"admin/servers/lib/npm.html#use","title":"Use","text":"

    Display help.

    libms -h\n

    Please see configuration for explanation of configuration conventions. To use .env as configuration file, run

    libms\n

    To run libms with a custom config file,

    libms -c FILE-PATH\nlibms --config FILE-PATH\n

    If the environment file is named something other than .env, for example as .env.libms, you can run

    libms -c \".env.libms\"\n

    You can press Ctl+C to halt the application. If you wish to run the microservice in the background, use

    nohup libms [-c FILE-PATH] & disown\n

    The lib microservice is now running and ready to serve files.

    This microservice can also serve files in a browser with files transferred over HTTP protocol.

    This option needs to be enabled with -H http.json flag. A sample http config provided here can be used.

    nohup libms [-H http.json] & disown\n

    The regular file upload and download options become available.

    "},{"location":"admin/servers/lib/npm.html#service-endpoints","title":"Service Endpoints","text":"

    The GraphQL URL: localhost:PORT/lib

    The HTTP URL: localhost:PORT/lib/files

    The service API documentation is available on user page.

    "},{"location":"admin/vagrant/base-box.html","title":"DTaaS Vagrant Box","text":"

    This README provides instructions on creating a custom Operating System virtual disk for running the DTaaS software. The virtual disk is managed by vagrant. The purpose is two fold:

    • Provide cross-platform installation of the DTaaS application. Any operating system supporting use of vagrant software utility can support installation of the DTaaS software.
    • Create a ready to use development environment for code contributors.

    There are two scripts in this directory:

    Script name Purpose Default user.sh user installation developer.sh developer installation

    If you are installing the DTaaS for developers, the default installation caters to your needs. You can skip the next step and continue with the creation of vagrant box.

    If you are a developer and would like additional software installed, you need to modify Vagrantfile. The existing Vagrantfile has two lines:

        config.vm.provision \"shell\", path: \"user.sh\"\n    #config.vm.provision \"shell\", path: \"developer.sh\"\n

    Uncomment the second line to have more software components installed. If you are not a developer, no changes are required to the Vagrantfile.

    This vagrant box installed for users will have the following items:

    1. docker v24.0
    2. nodejs v20.10
    3. yarn v1.22
    4. npm v10.2
    5. containers - ml-workspace-minimal v0.13, traefik v2.10, gitlab-ce v16.4, influxdb v2.7, grafana v10.1, rabbitmq v3-management, eclipse-mosquitto (mqtt) v2, mongodb v7.0

    This vagrant box installed for developers will have the following items additional items:

    • docker-compose v2.20
    • microk8s v1.27
    • jupyterlab
    • mkdocs
    • container - telegraf v1.28

    At the end of installation, the software stack created in vagrant box can be visualised as shown in the following figure.

    The upcoming instructions will help with the creation of base vagrant box.

    #create a key pair\nssh-keygen -b 4096 -t rsa -f vagrant -q -N \"\"\n\nvagrant up\n\n# let the provisioning be complete\n# replace the vagrant ssh key-pair with personal one\nvagrant ssh\n\n# install the oh-my-zsh\nsh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\"\n# install plugins: history, autosuggestions,\ngit clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions\n\n# inside ~/.zshrc, modify the following line\nplugins=(git zsh-autosuggestions history cp tmux)\n\n# to replace the default vagrant ssh key-pair with\n# the generated private key into authorized keys\ncp /vagrant/vagrant.pub /home/vagrant/.ssh/authorized_keys\n\n# exit vagrant guest machine and then\n# copy own private key to vagrant private key location\ncp vagrant .vagrant/machines/default/virtualbox/private_key\n\n# check\nvagrant ssh #should work\n\n# exit vagrant guest machine and then\nvagrant halt\n\nvagrant package --base dtaas \\\n--info \"info.json\" --output dtaas.vagrant\n\n# Add box to the vagrant cache in ~/.vagrant.d/boxes directory\nvagrant box add --name dtaas ./dtaas.vagrant\n\n# You can use this box in other vagrant boxes using\n#config.vm.box = \"dtaas\"\n
    "},{"location":"admin/vagrant/base-box.html#references","title":"References","text":"

    Image sources: Ubuntu logo

    "},{"location":"admin/vagrant/single-machine.html","title":"DTaaS on Single Vagrant Machine","text":"

    These are installation instructions for running DTaaS software inside one vagrant Virtual Machine. The setup requires a machine which can spare 16GB RAM, 8 vCPUs and 50GB Hard Disk space to the vagrant box.

    "},{"location":"admin/vagrant/single-machine.html#create-base-vagrant-box","title":"Create Base Vagrant Box","text":"

    Create dtaas Vagrant box. You would have created an SSH key pair - vagrant and vagrant.pub. The vagrant is the private SSH key and is needed for the next steps. Copy vagrant SSH private key into the current directory (deploy/vagrant/single-machine). This shall be useful for logging into the vagrant machines created for two-machine deployment.

    "},{"location":"admin/vagrant/single-machine.html#target-installation-setup","title":"Target Installation Setup","text":"

    The goal is to use the dtaas Vagrant box to install the DTaaS software on one single vagrant machine. A graphical illustration of a successful installation can be seen here.

    There are many unused software packages/docker containers within the dtaas base box. The used packages/docker containers are highlighed in blue color.

    Tip

    The illustration shows hosting of gitlab on the same vagrant machine with http(s)://gitlab.foo.com The gitlab setup is outside the scope this installation guide. Please refer to gitlab docker install for gitlab installation.

    "},{"location":"admin/vagrant/single-machine.html#configure-server-settings","title":"Configure Server Settings","text":"

    A dummy foo.com URL has been used for illustration. Please change this to your unique website URL.

    Please follow the next steps to make this installation work in your local environment.

    Update the Vagrantfile. Fields to update are:

    1. Hostname (node.vm.hostname = \"foo.com\")
    2. MAC address (:mac => \"xxxxxxxx\"). This change is required if you have a DHCP server assigning domain names based on MAC address. Otherwise, you can leave this field unchanged.
    3. Other adjustments are optional.
    "},{"location":"admin/vagrant/single-machine.html#installation-steps","title":"Installation Steps","text":"

    Execute the following commands from terminal

    vagrant up\nvagrant ssh\n

    Set a cronjob inside the vagrant virtual machine to remote the conflicting default route. Download the route script and run the following command.

    sudo bash route.sh\n

    Please follow the instructions of regular server installation setup to complete the installation.

    "},{"location":"admin/vagrant/single-machine.html#references","title":"References","text":"

    Image sources: Ubuntu logo, Traefik logo, ml-workspace, nodejs, reactjs, nestjs

    "},{"location":"admin/vagrant/two-machines.html","title":"DTaaS on Two Vagrant Machines","text":"

    These are installation instructions for running DTaaS application in two vagrant virtual machines (VMs). In this setup, all the user workspaces shall be run on server1 while all the platform services will be run on server2.

    The setup requires two server VMs with the following hardware configuration:

    server1: 16GB RAM, 8 x64 vCPUs and 50GB Hard Disk space

    server2: 6GB RAM, 3 x64 vCPUs and 50GB Hard Disk space

    Under the default configuration, two user workspaces are provisioned on server1. The default installation setup also installs InfluxDB, Grafana, RabbitMQ and MQTT services on server2. If you would like to install more services, you can create shell scripts to install the same on server2.

    "},{"location":"admin/vagrant/two-machines.html#create-base-vagrant-box","title":"Create Base Vagrant Box","text":"

    Create dtaas Vagrant box. You would have created an SSH key pair - vagrant and vagrant.pub. The vagrant is the private SSH key and is needed for the next steps. Copy vagrant SSH private key into the current directory (deploy/vagrant/two-machine). This shall be useful for logging into the vagrant machines created for two-machine deployment.

    "},{"location":"admin/vagrant/two-machines.html#target-installation-setup","title":"Target Installation Setup","text":"

    The goal is to use this dtaas vagrant box to install the DTaaS software on server1 and the default platform services on server2. Both the servers are vagrant machines.

    There are many unused software packages/docker containers within the dtaas base box. The used packages/docker containers are highlighed in blue and red color.

    A graphical illustration of a successful installation can be seen here.

    In this case, both the vagrant boxes are spawed on one server using two vagrant configuration files, namely boxes.json and Vagrantfile.

    Tip

    The illustration shows hosting of gitlab on the same vagrant machine with http(s)://gitlab.foo.com The gitlab setup is outside the scope this installation guide. Please refer to gitlab docker install for gitlab installation.

    "},{"location":"admin/vagrant/two-machines.html#configure-server-settings","title":"Configure Server Settings","text":"

    A dummy foo.com and services.foo.com URLs has been used for illustration. Please change these to your unique website URLs.

    The first step is to define the network identity of the two VMs. For that, you need server name, hostname and MAC address. The hostname is the network URL at which the server can be accessed on the web. Please follow these steps to make this work in your local environment.

    Update the boxes.json. There are entries one for each server. The fields to update are:

    1. name - name of server1 (\"name\" = \"dtaas-two\")
    2. hostname - hostname of server1 (\"name\" = \"foo.com\")
    3. MAC address (:mac => \"xxxxxxxx\"). This change is required if you have a DHCP server assigning domain names based on MAC address. Otherwise, you can leave this field unchanged.
    4. name - name of server2 (\"name\" = \"services\")
    5. hostname - hostname of server2 (\"name\" = \"services.foo.com\")
    6. MAC address (:mac => \"xxxxxxxx\"). This change is required if you have a DHCP server assigning domain names based on MAC address. Otherwise, you can leave this field unchanged.
    7. Other adjustments are optional.
    "},{"location":"admin/vagrant/two-machines.html#installation-steps","title":"Installation Steps","text":"

    The installation instructions are given separately for each vagrant machine.

    "},{"location":"admin/vagrant/two-machines.html#launch-dtaas-platform-default-services","title":"Launch DTaaS Platform Default Services","text":"

    Follow the installation guide for services to install the DTaaS platform services.

    After the services are up and running, you can see the following services active within server2 (services.foo.com).

    service external url InfluxDB database services.foo.com Grafana visualization service services.foo.com:3000 MQTT Broker services.foo.com:1883 RabbitMQ Broker services.foo.com:5672 RabbitMQ Broker management website services.foo.com:15672 MongoDB database services.foo.com:27017"},{"location":"admin/vagrant/two-machines.html#install-dtaas-application","title":"Install DTaaS Application","text":"

    Execute the following commands from terminal

    vagrant up\nvagrant ssh\n

    Set a cronjob inside the vagrant virtual machine to remote the conflicting default route. Download the route script and run the following command.

    sudo bash route.sh\n

    Please follow the instructions of regular server installation setup to complete the installation.

    "},{"location":"admin/vagrant/two-machines.html#references","title":"References","text":"

    Image sources: Ubuntu logo, Traefik logo, ml-workspace, nodejs, reactjs, nestjs

    "},{"location":"developer/index.html","title":"Developer Guide","text":"

    This guide is for DTaaS platform developers. It helps development team members get familiar with the DTaaS project software design, and development processes. Please see developer-specific Slides, Video, and Research paper.

    "},{"location":"developer/index.html#development-environment","title":"Development Environment","text":"

    Ideally, developers should work on Ubuntu/Linux Operating System.There is an ongoing effort to bring support for Windows Operating System. But, the development and software installation scripts are still heavily suited to Ubuntu/Linux

    Please use the steps given here to install the required software packages.

    "},{"location":"developer/index.html#ubuntulinux","title":"Ubuntu/Linux","text":"
    bash script/env.sh\nbash script/docker.sh\n

    The docker images are large and are likely to consume about 5GB of bandwidth and 15GB of space. You will have to download the docker images on a really good network.

    "},{"location":"developer/index.html#windows","title":"Windows","text":"

    Two powershell installation scripts, namely base.ps1 and env.ps1 are available to install the required software packages. But errors might crop up due to missing environment variables. The potential errors are:

    1. npm is not recognized......... in base.ps1.
    2. gem is not recognized......... in env.ps1

    If you encounter these errors, remember to include node and ruby installation locations in PATH environment variable (Settings --> search for \"system environment variables\" --> Advanced --> Environment Variables --> PATH).

    The base.ps1 and env.ps1 scripts can be run again after setting the correct PATH environment variable.

    "},{"location":"developer/index.html#pre-install-nodejs-and-ruby-software","title":"Pre-install Nodejs and Ruby Software","text":"

    Another way to solve the PATH environment problem is to install Nodejs and Ruby software packages before running the powershell scripts.

    1. Install the latest stable version of NodeJS from the official NodeJS website.
    2. Install Ruby from official Ruby website and follow all the defaults during the installation.
    "},{"location":"developer/index.html#run-scripts","title":"Run Scripts","text":"

    Then, open powershell with administrative priviledges and run the following commands in the given order:

    powershell -F script/base.ps1\npowershell -F script/env.ps1\npowershell -F script/docker.ps1\n

    The docker images are large and are likely to consume about 5GB of bandwidth and 15GB of space. You will have to download the docker images on a really good network.

    "},{"location":"developer/index.html#development-workflow","title":"Development Workflow","text":"

    To manage collaboration by multiple developers on the software, a development workflow is in place. Each developer should follow these steps:

    1. Fork of the main repository into your github account.
    2. Setup Code Climate and Codecov for your fork. The codecov does not require secret token for public repositories.
    3. Install git-hooks for the project.
    4. Use Fork, Branch, PR workflow.
    5. Work in your fork and open a PR from your working branch to your feature/distributed-demo branch. The PR will run all the github actions, code climate and codecov checks.
    6. Resolve all the issues identified in the previous step.
    7. If you have access to the integration server, try your working branch on the integration server.
    8. Once changes are verified, a PR should be made to the feature/distributed-demo branch of the upstream DTaaS repository.
    9. The PR will be merged after checks by either the project administrators or the maintainers.

    Remember that every PR should be meaningful and satisfies a well-defined user story or improve the code quality.

    "},{"location":"developer/index.html#code-quality","title":"Code Quality","text":"

    The project code qualities are measured based on:

    • Linting issues identified by Code Climate
    • Test coverage report collected by Codecov
    • Successful github actions
    "},{"location":"developer/index.html#code-climate","title":"Code Climate","text":"

    Code Climate performs static analysis, linting and style checks. Quality checks are performed by codeclimate are to ensure the best possible quality of code to add to our project.

    While any new issues introduced in your code would be shown in the PR page itself, to address any specific issue, you can visit the issues or code section of the codeclimate page.

    It is highly recommended that any code you add does not introduce new quality issues. If they are introduced, they should be fixed immediately using the appropriate suggestions from Code Climate, or in worst case, adding a ignore flag (To be used with caution).

    "},{"location":"developer/index.html#codecov","title":"Codecov","text":"

    Codecov keeps track of the test coverage for the entire project. For information about testing and workflow related to that, please see the testing page.

    "},{"location":"developer/index.html#github-actions","title":"Github Actions","text":"

    The project has multiple github actions defined. All PRs and direct code commits must have successful status on github actions.

    "},{"location":"developer/github-actions.html","title":"Secrets for Github Action","text":"

    The Github actions require the following secrets to be obtained from docker hub:

    Secret Name Explanation DOCKERHUB_SCOPE Username or organization name on docker hub DOCKERHUB_USERNAME Username on docker hub DOCKERHUB_TOKEN API token to publish images to docker hub, with Read, Write and Delete permissions NPM_TOKEN Token to publish npm packages to the default npm registry.

    Remember to add these secrets to Github Secrets Setting of your fork.

    "},{"location":"developer/npm-packages.html","title":"Publish NPM packages","text":"

    The DTaaS software is developed as a monorepo with multiple npm packages.

    "},{"location":"developer/npm-packages.html#default-npm-registry","title":"Default npm registry","text":"

    The default registry for npm packages is npmjs. The freely-accessible public packages are published to the npmjs registry. The publication step is manual for the runner.

    npm login --registry=\"https://registry.npmjs.org\"\ncat ~/.npmrc  #shows the auth token for the registry\n//registry.npmjs.org/:_authToken=xxxxxxxxxx\nyarn publish --registry=\"https://registry.npmjs.org\" \\\n  --no-git-tag-version --access public\n

    At least one version of runner package is published to this registry for each release of DTaaS.

    The publication step for library microservice is automated via github actions.

    "},{"location":"developer/npm-packages.html#github-npm-registry","title":"Github npm registry","text":"

    The Github actions of the project publish packages. The only limitation is that the users need an access token from Github.

    "},{"location":"developer/npm-packages.html#private-registry","title":"Private Registry","text":""},{"location":"developer/npm-packages.html#setup-private-npm-registry","title":"Setup private npm registry","text":"

    Since publishing to npmjs is irrevocable and public, developers are encouraged to setup their own private npm registry for local development. A private npm registry will help with local publish and unpublish steps.

    We recommend using verdaccio for this task. The following commands help you create a working private npm registry for development.

    docker run -d --name verdaccio -p 4873:4873 verdaccio/verdaccio\nnpm adduser --registry http://localhost:4873 #create a user on the verdaccio registry\nnpm set registry http://localhost:4873/\nyarn config set registry \"http://localhost:4873\"\nyarn login --registry \"http://localhost:4873\" #login with the credentials for yarn utility\nnpm login #login with the credentials for npm utility\n

    You can open http://localhost:4873 in your browser, login with the user credentials to see the packages published.

    "},{"location":"developer/npm-packages.html#publish-to-private-npm-registry","title":"Publish to private npm registry","text":"

    To publish a package to your local registry, do:

    yarn install\nyarn build #the dist/ directory is needed for publishing step\nyarn publish --no-git-tag-version #increments version in package.json, publishes to registry\nyarn publish #increments version in package.json, publishes to registry and adds a git tag\n

    The package version in package.json gets updated as well. You can open http://localhost:4873 in your browser, login with the user credentials to see the packages published. Please see verdaccio docs for more information.

    If there is a need to unpublish a package, ex: @dtaas/runner@0.0.2, do:

    npm unpublish  --registry http://localhost:4873/ @dtaas/runner@0.0.2\n

    To install / uninstall this utility for all users, do:

    sudo npm install  --registry http://localhost:4873 -g @dtaas/runner\nsudo npm list -g # should list @dtaas/runner in the packages\nsudo npm remove --global @dtaas/runner\n
    "},{"location":"developer/npm-packages.html#use-the-packages","title":"Use the packages","text":"

    The packages available in private npm registry can be used like the regular npm packages installed from npmjs.

    For example, to use @dtaas/runner@0.0.2 package, do:

    sudo npm install  --registry http://localhost:4873 -g @dtaas/runner\nrunner # launch the digital twin runner\n
    "},{"location":"developer/client/client.html","title":"React Website","text":"

    The Website is how the end-users interact with the software platform. The website is being developed as a React single page web application.

    A dependency graph for the entire codebase of the react application is:

    "},{"location":"developer/client/client.html#dependency-graphs","title":"Dependency Graphs","text":"

    The figures are the dependency graphs generated from the code.

    "},{"location":"developer/client/client.html#src-directory","title":"src directory","text":""},{"location":"developer/client/client.html#test-directory","title":"test directory","text":""},{"location":"developer/docker/docker.html","title":"Docker workflow for DTaaS","text":"

    This readme will explain the building and use of different docker files for use in development and installation of the DTaaS software.

    NOTE: A local docker installation with compose plugin is a pre-requisite for using docker workflows.

    "},{"location":"developer/docker/docker.html#folder-structure","title":"Folder Structure","text":"

    There are two dockerfiles for building the containers:

    • client.dockerfile: Dockerfile for building the client application container.
    • libms.dockerfile: Dockerfile for building the library microservice container from source code.
    • libms.npm.dockerfile: Dockerfile for building the library microservice container from published npm package at npmjs.com. This Dockerfile is only used during publishing. It is used neither in the development builds nor in Github actions.

    There is a specific compose file for development:

    The compose.dev.yml: file is the docker compose file for development environment.

    "},{"location":"developer/docker/docker.html#build-and-publish-docker-images","title":"Build and Publish Docker Images","text":"

    The github workflows publish docker images of client website and libms to github and docker hub.

    "},{"location":"developer/docker/docker.html#developers","title":"Developers","text":"

    Use of docker images is handy for developers as well. It is suggested that developers build the required images locally on their computer and use them for development purposes. The images can be built using

    docker compose -f compose.dev.yml build\n
    "},{"location":"developer/docker/docker.html#running-docker-containers","title":"Running Docker Containers","text":"

    Follow these steps to use the application with docker.

    The DTaaS application requires multiple configuration files. The list of configuration files to be modified are given for each scenario.

    "},{"location":"developer/docker/docker.html#development-environment","title":"Development Environment","text":"

    This scenario is for software developers.

    The configuration files to be updated are:

    1. docker/.env : please see docker installation docs for help with updating this config file
    2. docker/conf.dev : please see docker installation docs for help with updating this config file
    3. client/config/local.js please see client config for help with updating this config file
    4. servers/lib/config/.env.default please see lib config for help with updating this config file

    The docker commands need to be executed from this directory (docker). The relevant docker commands are:

    docker compose -f compose.dev.yml up -d #start the application\ndocker compose -f compose.dev.yml down  #terminate the application\n
    "},{"location":"developer/docker/docker.html#access-the-application","title":"Access the Application","text":"

    You should access the application through the PORT mapped to the Traefik container. e.g. localhost

    "},{"location":"developer/oauth/AUTHMS.html","title":"Auth Microservice","text":"

    This document details the workflow and implementation of the DTaaS Auth Microservice. Please go through the System Design and the summary of the OAuth2.0 technology to be able to understand the content here better.

    "},{"location":"developer/oauth/AUTHMS.html#workflow","title":"Workflow","text":""},{"location":"developer/oauth/AUTHMS.html#user-identity-using-oauth20","title":"User Identity using OAuth2.0","text":"

    We define some constants that will help with the following discussion:

    • CLIENT ID: The OAuth2 Client ID of the Auth MS
    • CLIENT SECRET: The OAuth2 Client Secret of Auth MS
    • REDIRECT URI: The URI where the user is redirected to after the user has approved sharing of information with the client.
    • STATE: A random string used as an identifier for the specific \"GET authcode\" request (Figure 3.3)
    • AUTHCODE: The one-use-only Authorization code returned by the OAuth2 provider (GitLab instance) in response to \"GET authcode\" after user approval.

    Additionally, let's say DTaaS uses a dedicated gitlab instance hosted at the URL https://gitlab.foo.com (instead of https://foo.com)

    A successful OAuth2 workflow (Figure 3.3) has the following steps:

    • The user requests a resource, say GET/BackendMS
    • The Auth MS intercepts this request, and starts the OAuth2 process.
    • The Auth MS sends a authorization request to the Gitlab instance.

    This is written in shorthand as GET/authcode. The actual request (a user redirect) looks like:

    https ://gitlab.foo.com/oauth/\nauthorize?\nresponse_type=code&\nclient_id=OAUTH_CLIENT_ID&\nredirect_uri=REDIRECT_URI&\nscope=read_user&state = STATE\n

    Here the gitlab.foo.com/oauth/authorize is the specific endpoint of the Gitlab instance that handles authorisation code requests.

    The query parameters in the request include the expected response type, which is fixed as \u201dcode\u201d, meaning that we expect an Authorization code. Other query parameters are the client id, the redirect uri, the scope which is set to read user for our purpose, and the state (the random string to identify the specific request).

    • The OAuth2 provider redirects the user to the login page. Here the user logs into their protected account with their username/email ID and password.

    • The OAuth2 provider then asks the user to approve/deny sharing the requested information with the Auth MS. The user should approve this for successful authentication.

    • After approval, the user is redirected by the GitLab instance to the REDIRECT URI. This URI has the following form:

    REDIRECT_URI?code=AUTHCODE&state=STATE\n

    The REDIRECT URI is as defined previously, during the OAuth2 Client initialisation, i.e. the same as the one provided in the \u201dGET authcode\u201d request by the Auth MS. The query parameters are provided by the Gitlab instance. These include the AUTHCODE which is the authoriation code that the Auth MS had requested, and the STATE which is the same random string in the \u201dGET authcode\u201d request.

    • The Auth MS retrieves these query parameters. It verifies that the STATE is the same as the random string it provided during the \"GET authcode\" request. This confirms that the AUTHCODE it has received is in response to the specific request it had made.

    • The Auth MS uses this one-use-only AUTHCODE to exchange it for a general access token. This access token wouldn\u2019t be one-use-only, although it would expire after a specified duration of time. To perform this exchange, the Auth MS makes another request to the GitLab instance. This request is written in shorthand as GET/access_token in the sequence diagram. The true form of the request is:

    POST https://gitlab.foo.com/oauth/token,\nparameters = 'client_id=OAUTH_CLIENT_ID&\nclient_secret=OAUTH_CLIENT_SECRET&\ncode=AUTHCODE&\ngrant_type=authorization_code&\nredirect_uri=REDIRECT_URI'\n

    The request to get a token by exchanging an authorization code, is actually a POST request (for most OAuth2 providers). The https://gitlab.foo.com/oauth/token API endpoint handles the token exchange requests. The parameters sent with the POST request are the client ID, the client secret, the AUTHCODE and the redirect uri. The grant type parameter is always set to the string \u201dauthorization code\u201d, which conveys that we will be exchanging an authentication code for an access token.

    • The Gitlab instance exchanges a valid AUTHCODE for an Access Token. This is sent as a response to the Auth MS. An example response is of the following form:
    {\n  \"access_token\": \"d8aed28aa506f9dd350e54\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 7200,\n  \"refresh_token\":\"825f3bffb2544b976633a1\",\n  \"created_at\": 1607635748\n}\n

    The access token field provides the string that can be used as an access token in the headers of requests tryng to access user information. The token type field is usually \u201dbearer\u201d, the expires in field specifies the time in seconds for which the access token will be valid, and the

    created at field is the Epoch timestamp at which the token was created. The refresh token field has a string that can be used to refresh the access token, increasing it\u2019s lifetime. However we do not make use of the refresh token field. If an access token expires, the Auth MS simply asks for a new one. TOKEN is the access token string returned in the response.

    • The Auth MS has finally obtained an access token that it can use to retrieve the user\u2019s information. Note that if the Auth MS already had an existing valid access token for information about this user, the steps above wouldn\u2019t be necessary, and thus wouldn\u2019t be performed by the Auth MS. The steps till now in the sequence diagram are simply to get a valid access token for the user information.

    • The Auth MS makes a final request to the Gitlab instance, shorthanded as GET user_details in the sequence diagram. The actual request is of the form:

    GET https ://gitlab.foo.com/api/v4/user\n\"Authorization\": Bearer <TOKEN>\n

    Here, https://gitlab.foo.com/api/v4/user is the API endpoint that responds with user information. An authorization header is required on the request, with a valid access token. The required header is added here, and TOKEN is the access token that the Auth MS holds.

    • The Gitlab instance verifies the access token, and if it is valid, responds with the required user information. This includes username, email ID, etc. An example response looks like:
    {\n  \"id\": 8,\n  \"username\": \"UserX\",\n  \"name\": \"XX\",\n  \"state\": \"active\",\n  \"web_url\": \"http://gitlab.foo.com/UserX\",\n  \"created_at\":\"2023-12-03 T10:47:21.970 Z\",\n  \"bio\": \"\",\n  \"location\": \"\",\n  \"public_email\": null,\n  \"skype\": \"\",\n  \"linkedin\": \"\",\n  \"twitter\": \"\",\n  \"organization\": \"\",\n  \"job_title\": \"\",\n  \"work_information\": null,\n  \"followers\": 0,\n  \"following\": 0,\n  \"is_followed \": false,\n  \"local_time\": null,\n  \"last_sign_in_at\": \"2023-12-13 T12:46:21.223 Z\",\n  \"confirmed_at\": \"2023-12-03 T10:47:21.542 Z \",\n  \"last_activity_on\": \"2023-12-13\",\n  \"email\": \"UserX@localhost\",\n  \"projects_limit\": 100000,\n}\n

    The important fields from this response are the \u201demail\u201d, \u201dusername\u201d keys. These keys are unique to a user, and thus provide an identity to the user.

    • The Auth MS retrieves the values of candidate key fields like \u201demail\u201d, \u201dusername\u201d from the response. Thus, the Auth MS now knows the identity of the user.
    "},{"location":"developer/oauth/AUTHMS.html#checking-user-permissions-authorization","title":"Checking User permissions - Authorization","text":"

    An important feature of the Auth MS is to implement access policies for DTaaS resources. We may have requirements that certain resources and/or microservices in DTaaS should only be accessible to certain users. For example, we may want that /BackendMS/user1 should only be accessible to the user who has username user1. Another example may be that we may want /BackendMS/group3 to only be available to users who have an email ID in the domain @gmail.com. The Auth MS should be able to impose these restrictions and make certain services selectively available to certain users. There are two steps to doing this:

    • Firstly, the user\u2019s identity should be known and trusted. The Auth MS should know the identity of a user and believe that the user is who they claim to be. This has been achieved in the previous section

    • Secondly, this identity should be analysed against certain rules or against a database of allowed users, to determine whether this user should be allowed to access the requested resource.

    The second step requires, for every service, either a set of rules that define which users should be allowed access to the service, or a database of user identities that are allowed to access the service. This database and/or set of rules should use the user identities, in our case the email ID or username, to decide whether the user should be allowed or not. This means that the rules should be built based on the kind of username/ email ID the user has, say maybe using some RegEx. In the case of a database, the database should have the user identity as a key. For any service, we can simply look up if the key exists in the database or not and allow/deny the user access based on that.

    In the sequence diagram, the Auth MS has a self-request marked as \u201dChecks user permissions\u201d after receiving the user identity from the Gitlab instance. This is when the Auth MS compares the identity of the user to the rules and/or database it has for the requested service. Based on this, if the given identity has access to the requested resource, the Auth MS responds with a 200 OK. This finally marks a succcessful authentication, and the user can now access the requested resource. Note: Again, the Auth MS and user do not communicate directly. All requests/responses of the Auth MS are with the Traefik gateway, not the User directly. Infact, the Auth MS is the external server used by the ForwardAuth middleware of the specific route, and communicates with this middleware. If the authentication is successful, The gateway forwards the request to the specific resource when the 200 OK is recieved, else it drops the request and returns the error code to the user.

    "},{"location":"developer/oauth/AUTHMS.html#implementation","title":"Implementation","text":""},{"location":"developer/oauth/AUTHMS.html#traefik-forward-auth","title":"Traefik-forward-auth","text":"

    The implementation approach is setting up and configuring the open source thomseddon/traefik-forward-auth for our specific use case. This would work as our Auth microservice.

    The traefik-forward-auth software is available as a docker.io image. This works as a docker container. Thus there are no dependency management issues. Additionally, it can be added as a middleware server to traefik routers. Thus, it needs atleast Traefik to work along with it properly. It also needs active services that it will be controlling access to. Traefik, the traefikforward-auth service and any services are thus, treated as a stack of docker containers. The main setup needed for this system is configuring the compose.yml file.

    There are three main steps of configuring the Auth MS properly.

    • The traefik-forward-auth service needs to be configured carefully. Firstly, we set the environment variables for our specific case. Since, we are using Gitlab, we use the generic-oauth provider configuration. Some important variables that are required are the OAuth2 Client ID, Client Secret, Scope. The API endpoints for getting an AUTHCODE, exchanging the code for an access token and getting user information are also necessary

    Additionally, it is necessary to create a router that handles the REDIRECT URI path. This router should have a middleware which is set to traefik-forward-auth itself. This is so that after approval, when the user is taken to REDIRECT URI, this can be handled by the gateway and passed to the Auth service for token exchange. We add the ForwardAuth middleware here, which is a necessary part of our design as discussed before. We also add a load balancer for the service. We also need to add a conf file as a volume, for selective authorization rules (discussed later). This is according to the suggested configuration. Thus, we add the following to our docker services:

    traefik\u2212forward\u2212auth:\nimage: thomseddon/traefik\u2212forward\u2212auth:latest\nvolumes:\n  - <filepath>/conf:/conf\nenvironment:\n  - DEFAULT_PROVIDER = generic - oauth\n  - PROVIDERS_GENERIC_OAUTH_AUTH_URL=https://gitlab.foo.com/oauth/authorize\n  - PROVIDERS_GENERIC_OAUTH_TOKEN_URL=https://gitlab.foo.com/oauth/token\n  - PROVIDERS_GENERIC_OAUTH_USER_URL=https://gitlab.foo.com/api/v4/user\n  - PROVIDERS_GENERIC_OAUTH_CLIENT_ID=OAUTH_CLIENT_ID\n  - PROVIDERS_GENERIC_OAUTH_CLIENT_SECRET=OAUTH_CLIENT_SECRET\n  - PROVIDERS_GENERIC_OAUTH_SCOPE = read_user\n  - SECRET = a - random - string\n  # INSECURE_COOKIE is required if\n  # not using a https entrypoint\n  - INSECURE_COOKIE = true\nlabels:\n  - \"traefik.enable=true\"\n  - \"traefik.http.routers.redirect.entryPoints=web\"\n  - \"traefik.http.routers.redirect.rule=PathPrefix(/_oauth)\"\n  - \"traefik.http.routers.redirect.middlewares=traefik-forward-auth\"\n  - \"traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181\"\n  - \"traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User\"\n  - \"traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181\"\n
    • The traefik-forward-auth service should be added to the backend services as a middleware.

    To do this, the docker-compose configurations of the services need to be updated by adding the following lines:

        - \"traefik.http.routers.<service-router>.rule=Path(/<path>)\"\n    - \"traefik.http.routers.<service-router>.middlewares=traefik-forward-auth\"\n

    This creates a router that maps to the required route, and adds the auth middleware to the required route.

    • Finally, we need to set user permissions on user identities by creating rules in the conf file. Each rule has a name (an identifier for the rule), and an associated route for which the rule will be invoked. The rule also has an action property, which can be either \u201dauth\u201d or \u201dallow\u201d. If action is set to \u201dallow\u201d, any requests on this route are allowed to bypass even the OAuth2 identification. If the action is set to \u201dauth\u201d, requests on this route will require User identity OAuth2 and the system will follow the sequence diagram. For rules with action=\u201dauth\u201d, the user information is retrieved. The identity we use for a user is the user\u2019s email ID. For \u201dauth\u201d rules, we can configure two types of User restrictions/permissions on this identity:

    • Whitelist - This would be a list of user identities (email IDs in our case) that are allowed to access the corresponding route.

    • Domain - This would be a domain (example: gmail.com), and only email IDs (user identities) of that domain (example: johndoe@gmail.com) would be allowed access to the corresponding route.

    Configuring any of these two properties of an \u201dauth\u201d rule allows us to selectively permit access to certain users for certain resources. Not configuring any of these properties for an \u201dauth\u201d rule means that the OAuth2 process is carried out and the user identity is retrieved, but all known user identities (i.e. all users that successfully complete the OAuth) are allowed to access the resource.

    DTaaS currently uses only the whitelist type of rules.

    These rules can be used in 3 different ways described below. The exact format of lines to be added to the conf file are also shown.

    • No Auth - Serves the Path(\u2018/public\u2018) route. A rule with action=\u201dallow\u201d should be imposed on this.
    rule.noauth.action=allow\nrule.noauth.rule=Path(`/public`)\n
    • User specific: Serves the Path(\u2018/user1\u2018) route. A rule that only allows \u201duser1@localhost\u201d identity should be imposed on this
    rule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user1`)\nrule.onlyu1.whitelist=user1@localhost\n
    • Common Auth - Serves the Path(\u2018/common\u2018) route. A rule that requires OAuth, i.e. with action=\u201dallow\u201d, but allows all valid and known user identities should be imposed on this.
    rule.all.action = auth\nrule.all.rule = Path(`/common`)\n
    "},{"location":"developer/oauth/DESIGN.html","title":"System Design of DTaaS Authorization Microservice","text":"

    DTaaS requires backend authorization to protect its backend services and user workspaces. This document details the system design of the DTaaS Auth Microservice which is responsible for the same.

    "},{"location":"developer/oauth/DESIGN.html#requirements","title":"Requirements","text":"

    For our purpose, we require the Auth MS to be able to handle only requests of the general form \u201dIs User X allowed to access /BackendMS/example?\u201d.

    If the user\u2019s identity is correctly verified though the GitLab OAuth2 provider AND this user is allowed to access the requested microservice/action, then the Auth MS should respond with a 200 (OK) code and let the request pass through the gateway to the required microservice/server.

    If the user\u2019s identity verification through GitLab OAuth2 fails OR this user is not permitted to access the request resource, then the Auth MS should respond with a 40X (NOT OK) code, and restrict the request from going forward.

    "},{"location":"developer/oauth/DESIGN.html#forward-auth-middleware-in-traefik","title":"Forward Auth Middleware in Traefik","text":"

    Traefik allows middlewares to be set for the routes configured into it. These middlewares intercept the route path requests, and perform analysis/modifications before sending the requests ahead to the services. Traefik has a ForwardAuth middleware that delegates authentication to an external service. If the external authentication server responds to the middleware with a 2XX response codes, the middleware acts as a proxy, letting the request pass through to the desired service. However, if the external server responds with any other response code, the request is dropped, and the response code returned by the external auth server is returned to the user

    (source: Treafik documentation)

    Thus, an Auth Microservice can be integrated into the existing gateway and DTaaS system structure easily by adding it as the external authentication server for ForwardAuth middlewares. These middlewares can be added on whichever routes/requests require authentication. For our specific purpose, this will be added to all routes since we impose atleast identity verification of users for any request through the gateway

    "},{"location":"developer/oauth/DESIGN.html#auth-ms-design","title":"Auth MS Design","text":"

    The integrated Auth MS should thus work as described in the sequence diagram.

    • Any request made by the user is made on the React website, i.e. the frontend of the DTaaS software.

    • This request then goes through the Traefik gateway. Here it should be interrupted by the respective ForwardAuth middleware.

    • The middleware asks the Auth MS if this request for the given user should be allowed.

    • The Auth MS, i.e. the Auth server verifies the identity of the user using OAuth2 with GitLab, and checks if this user should be allowed to make this request.

    • If the user is verified and allowed to make the request, the Auth server responds with a 200 OK to Traefik Gateway (more specifically to the middleware in Traefik)

    • Traefik then forwards this request to the respective service. A response by the service, if any, will be passed through the chain back to the user.

    • However, If the user is not verified or not allowed to make this request, the Auth server responds with a 40x to Traefik gateway.

    • Traefik will then drop the request and respond to the Client informing that the request was forbidden. It will also pass the Auth servers response code

    "},{"location":"developer/oauth/OAUTH2.0.html","title":"OAuth 2.0 Summary","text":"

    The Auth MS works on the OAuth 2.0 RFC. This document provides a brief summary of the working of the OAtuh 2.0 technology.

    "},{"location":"developer/oauth/OAUTH2.0.html#entities","title":"Entities","text":"

    OAuth2, as used for user identity verification, has 3 main entities:

    • The User: This is the entity whose identity we are trying to verify/know. In our case, this is the same as the user of the DTaaS software.
    • The Client: This is the entity that wishes to know/verify the identity of a user. In our case, this is the Auth MS (initialised with a Gitlab application). This shouldn\u2019t be confused with the frontend website of DTaaS (referred to as Client in the previous section).
    • The OAuth2 Identity Provider: This is the entity that allows the client to know the identity of the user. In our case, this is GitLab. Most commonly, users have an existing, protected account with this entity. The account is registered using a unique key, like an email ID or username and is usually password protected so that only that specific user can login using that account. After the user has logged in, they will be asked to approve sharing their profile information with the client. If they approve, the client will have access to the user\u2019s email id, username, and other profile information. This information can be used to know/verify the identity of the user.

    Note: In general, it is possible for the Authorization server (which asks user for approval) and the Resource (User Identity) provider to be 2 different servers. However, in our case the Gitlab instance itself handles both the functions, through different API endpoints. The concepts remain the same. Thus, we only discuss the 3 main entities, the User, the OAuth2 Client and the Gitlab instance in our discussion.

    "},{"location":"developer/oauth/OAUTH2.0.html#the-oauth2-client","title":"The OAuth2 Client","text":"

    Many sites allow you to initialise an OAuth2 client. For our purposes, we will use Gitlab itself, by making an \u201dapplication\u201d in Gitlab. However, it is not necessary to initialise a client using the same website as the identity provider. These are separate things. Our OAuth2 client is initialized by creating and configuring a Gitlab instance-wide application. There are two main things in this configuration:

    • Redirect URI: It is the URI where the users are redirected to after they approve sharing information with the client.
    • Scopes: These are the types and levels of access that the client can have over the user\u2019s profile. For our purposes, we only require the read user scope, which allows us to access the user\u2019s profile information for knowing the identity.

    After the GitLab application is successfully created, we are provided a Client ID and Client Secret. This means our initialization is complete. This Client ID and Client Secret can be used in any application, essentially making that application the OAuth2 Client. This is why the Client secret should never be shared. We will use this Client ID and Client secret in our Auth MS, making it an OAuth2 Client application. It will now be able to follow the OAuth2 workflow to verify the identity of users.

    "},{"location":"developer/oauth/OAUTH2.0.html#oauth-20-workflows","title":"OAuth 2.0 Workflows","text":"

    Two major different OAuth2.0 flows are used in DTaaS.

    "},{"location":"developer/oauth/OAUTH2.0.html#oauth2-authorization-code-flow","title":"OAuth2 Authorization Code Flow","text":"

    This flow involves several steps and the exchange of an authorization code for an access tokens to ensure secure authorization. This flow is used for the DTaaS AuthMS, which is responsible for securing all backend DTaaS services

    The OAuth2 workflow is initiated by the Client (Auth MS) whenever it requires knowing the identity of the user. Briefly, the flow starts when the Auth MS sends an authorization request to Gitlab. The Auth MS tries to obtain an access token, using which it can gather user information. Once it has user information, it can know the identity of the user and check whether the user has permission to access the requested resource.

    The requests made by the Auth MS to the OAuth2 provider are abbreviated. A detailed explanation of the workflow for DTaaS specifically can be found in the AuthMS implementation docs

    "},{"location":"developer/oauth/OAUTH2.0.html#oauth2-pkce-proof-key-for-code-exchange-flow","title":"OAuth2 PKCE (Proof Key for Code Exchange) Flow","text":"

    This is an extension to the OAuth2 Authorization Code Flow designed to provide an additional layer of security, particularly for public clients that cannot securely store client secrets. PKCE mitigates certain attack vectors, like authorization code interception.

    The DTaaS client website login works based on the PKCE OAuth2.0 flow. More information about the details of this flow can be found here

    "},{"location":"developer/servers/lib/lib-ms.html","title":"Library Microservice","text":"

    The Library Microservices provides users with access to files in user workspaces via API. This microservice will interface with local file system and Gitlab to provide uniform Gitlab-compliant API access to files.

    Warning

    This microservice is still under heavy development. It is still not a good replacement for file server we are using now.

    "},{"location":"developer/servers/lib/lib-ms.html#architecture-and-design","title":"Architecture and Design","text":"

    The C4 level 2 diagram of this microservice is:

    The GraphQL API provided by the library microservice shall be compliant with the Gitlab GraphQL service.

    "},{"location":"developer/servers/lib/lib-ms.html#uml-diagrams","title":"UML Diagrams","text":""},{"location":"developer/servers/lib/lib-ms.html#class-diagram","title":"Class Diagram","text":"
    classDiagram\n    class FilesResolver {\n    -filesService: IFilesService\n    +listDirectory(path: string): Promise<Project>\n    +readFile(path: string): Promise<Project>\n    }\n\n    class FilesServiceFactory {\n    -configService: ConfigService\n    -localFilesService: LocalFilesService\n    +create(): IFilesService\n    }\n\n    class LocalFilesService {\n    -configService: ConfigService\n    -getFileStats(fullPath: string, file: string): Promise<Project>\n    +listDirectory(path: string): Promise<Project>\n    +readFile(path: string): Promise<Project>\n    }\n\n    class ConfigService {\n    +get(propertyPath: string): any\n    }\n\n    class IFilesService{\n    listDirectory(path: string): Promise<Project>\n    readFile(path: string): Promise<Project>\n    }\n\n    IFilesService <|-- FilesResolver: uses\n    IFilesService <|.. LocalFilesService: implements\n    IFilesService <|-- FilesServiceFactory: creates\n    ConfigService <|-- FilesServiceFactory: uses\n    ConfigService <|-- LocalFilesService: uses
    "},{"location":"developer/servers/lib/lib-ms.html#sequence-diagram","title":"Sequence Diagram","text":"
    sequenceDiagram\n    actor Client\n    actor Traefik\n\n    box LightGreen Library Microservice\n    participant FR as FilesResolver\n    participant FSF as FilesServiceFactory\n    participant CS as ConfigService\n    participant IFS as IFilesService\n    participant LFS as LocalFilesService\n    end\n\n    participant FS as Local File System DB\n\n    Client ->> Traefik : HTTP request\n    Traefik ->> FR : GraphQL query\n    activate FR\n\n    FR ->> FSF : create()\n    activate FSF\n\n    FSF ->> CS : getConfiguration(\"MODE\")\n    activate CS\n\n    CS -->> FSF : return configuration value\n    deactivate CS\n\n    alt MODE = Local\n    FSF ->> FR : return filesService (LFS)\n    deactivate FSF\n\n    FR ->> IFS : listDirectory(path) or readFile(path)\n    activate IFS\n\n    IFS ->> LFS : listDirectory(path) or readFile(path)\n    activate LFS\n\n    LFS ->> CS : getConfiguration(\"LOCAL_PATH\")\n    activate CS\n\n    CS -->> LFS : return local path\n    deactivate CS\n\n    LFS ->> FS : Access filesystem\n    alt Filesystem error\n        FS -->> LFS : Filesystem error\n        LFS ->> LFS : Throw new InternalServerErrorException\n        LFS -->> IFS : Error\n    else Successful file operation\n        FS -->> LFS : Return filesystem data\n        LFS ->> IFS : return Promise<Project>\n    end\n    deactivate LFS\n    activate IFS\n    end\n\n    alt Error thrown\n    IFS ->> FR : return Error\n    deactivate IFS\n    FR ->> Traefik : return Error\n    Traefik ->> Client : HTTP error response\n    else Successful operation\n    IFS ->> FR : return Promise<Project>\n    deactivate IFS\n    FR ->> Traefik : return Promise<Project>\n    Traefik ->> Client : HTTP response\n    end\n\n    deactivate FR\n
    "},{"location":"developer/servers/lib/lib-ms.html#dependency-graphs","title":"Dependency Graphs","text":"

    The figures are the dependency graphs generated from the code.

    "},{"location":"developer/servers/lib/lib-ms.html#src-directory","title":"src directory","text":""},{"location":"developer/servers/lib/lib-ms.html#test-directory","title":"test directory","text":""},{"location":"developer/system/architecture.html","title":"System Overview","text":""},{"location":"developer/system/architecture.html#user-requirements","title":"User Requirements","text":"

    The DTaaS software platform users expect a single platform to support the complete DT lifecycle. To be more precise, the platform users expect the following features:

    1. Author \u2013 create different assets of the DT on the platform itself. This step requires use of some software frameworks and tools whose sole purpose is to author DT assets.
    2. Consolidate \u2013 consolidate the list of available DT assets and authoring tools so that user can navigate the library of reusable assets. This functionality requires support for discovery of available assets.
    3. Configure \u2013 support selection and configuration of DTs. This functionality also requires support for validation of a given configuration.
    4. Execute \u2013 provision computing infrastructure on demand to support execution of a DT.
    5. Explore \u2013 interact with a DT and explore the results stored both inside and outside the platform. Exploration may lead to analytical insights.
    6. Save \u2013 save the state of a DT that\u2019s already in the execution phase. This functionality is required for on demand saving and re-spawning of DTs.
    7. Services \u2013 integrate DTs with on-platform or external services with which users can interact with.
    8. Share \u2013 share a DT with other users of their organisation.
    "},{"location":"developer/system/architecture.html#system-architecture","title":"System Architecture","text":"

    The figure shows the system architecture of the the DTaaS software platform.

    "},{"location":"developer/system/architecture.html#system-components","title":"System Components","text":"

    The users interact with the software platform using a webapp. The service router is a single point of entry for direct access to the platform services. The service router is responsible for controlling user access to the microservice components. The service mesh enables discovery of microservices, load balancing and authorization functionalities.

    In addition, there are microservices for catering to managing DT reusable assets, platform services, DT lifecycle manager, DT execution manager, accouting and security. The microservices are complementary and composable; they fulfil core requirements of the system.

    The microservices responsible for satisfying the user requirements are:

    1. The security microservice implements role-based access control (RBAC) in the platform.
    2. The accounting microservice is responsible for keeping track of the live status of platform, DT asset and infrastructure usage. Any licensing, usage restrictions need to be enforced by the accounting microservice. Accounting is a pre-requisite to commercialisation of the platform. Due to significant use of external infrastructure and resources via the platform, the accounting microservice needs to interface with accounting systems of the external services.
    3. User Workspaces are virtual environments in which users can perform lifecycle operations on DTs. These virtual environments are either docker containers or virtual machines which provide desktop interface to users.
    4. Reusable Assets are assets / parts from which DTs are created. Further explation is available on the assets page
    5. Services are dedicated services available to all the DTs and users of the DTaaS platform. Services build upon DTs and provide user interfaces to users.
    6. DT Execution Manager provides virtual and isolated execution environments for DTs. The execution manager is also responsible for dynamic resource provisioning of cloud resources.
    7. DT Lifecycle Manager manages the lifecycle operations on all DTs. It also directs DT Execution Manager to perform execute, save and terminate operations on DTs.

    If you are interested, please take a look at the C4 architectural diagram.

    A mapping of the architectural components to related pages in the documentation is available in the table.

    System Component Doc Page(s) Service Router Traefik Gateway Web Application React Webapplication Reusable Assets Library Microservice Digital Twins and DevOps Integrated Gitlab Services Third-party Services (MQTT, InfluxDB, RabbitMQ, Grafana and MongoDB) DT Lifecycle Not available yet Security Gitlab client OAuth and server OAuth Digital Twins as Services DT Runner Accounting Not available yet Execution Manager Not available yet"},{"location":"developer/system/architecture.html#references","title":"References","text":"

    Font sources: fileformat

    "},{"location":"developer/system/current-status.html","title":"Current Status","text":"

    The DTaaS software platform is currently under development. Crucial system components are in place with ongoing development work focusing on increased automation and feature enhancement. The figure below shows the current status of the development work.

    A C4 representation of the same diagram is also available.

    "},{"location":"developer/system/current-status.html#user-security","title":"User Security","text":"

    There is a two-level authorization mechanisms in place for the react website and the Traefik gateway.

    The react website component uses Gitlab for user authorization using OAuth protocol.

    "},{"location":"developer/system/current-status.html#gateway-authorization","title":"Gateway Authorization","text":"

    The Traefik gateway has OAuth2 web server authorization provided by Traefik-forward-auth microservice. This authorization protects all the microservices and workspaces running in the backend.

    "},{"location":"developer/system/current-status.html#user-workspaces","title":"User Workspaces","text":"

    All users have dedicated dockerized-workspaces. These docker-images are based on container images published by mltooling group.

    Thus DT experts can develop DTs from existing DT components and share them with other users. A file server has been setup to act as a DT asset repository. Each user gets space to store private DT assets and also gets access to shared DT assets. Users can synchronize their private DT assets with external git repositories. In addition, the asset repository transparently gets mapped to user workspaces within which users can perform DT lifecycle operations. There is also a library microservice which in the long-run will replace the file server.

    Users can run DTs in their workspaces and also permit remote access to other users. There is already shared access to internal and external services. With these two provisions, users can treat live DTs as service components in their own software systems.

    "},{"location":"developer/system/current-status.html#platform-services","title":"Platform Services","text":"

    There are four external services integrated with the DTaaS software platform. They are: InfluxDB, Grafana, RabbitMQ, MQTT, and MongoDB.

    These services can be used by DTs and PTs for communication, storing and visualization of data. There can also be monitoring services setup based on these services.

    "},{"location":"developer/system/current-status.html#development-priorities","title":"Development Priorities","text":"

    The development priorities for the DTaaS software development team are:

    • DevOps from React frontend website
    • Upgrade software stack of user workspaces
    • Increased automation of installation procedures
    • DT Runner (API Interface to DT)
    • DT Configuration DSL \u00edn the form of YAML schema

    Your contributions are highly welcome.

    "},{"location":"developer/system/current-status.html#references","title":"References","text":"

    Font sources: fileformat

    "},{"location":"developer/testing/intro.html","title":"Testing","text":""},{"location":"developer/testing/intro.html#common-questions-on-testing","title":"Common Questions on Testing","text":""},{"location":"developer/testing/intro.html#what-is-software-testing","title":"What is Software Testing","text":"

    Software testing is a procedure to investigate the quality of a software product in different scenarios. It can also be stated as the process of verifying and validating that a software program or application works as expected and meets the business and technical requirements that guided design and development.

    "},{"location":"developer/testing/intro.html#why-software-testing","title":"Why Software Testing","text":"

    Software testing is required to point out the defects and errors that were made during different development phases. Software testing also ensures that the product under test works as expected in all different cases \u2013 stronger the test suite, stronger is our confidence in the product that we have built. One important benefit of software testing is that it facilitates the developers to make incremental changes to source code and make sure that the current changes are not breaking the functionality of the previously existing code.

    "},{"location":"developer/testing/intro.html#what-is-tdd","title":"What is TDD","text":"

    TDD stands for Test Driven Development. It is a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) automated test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards. The goal of TDD can be viewed as specification and not validation. In other words, it\u2019s one way to think through your requirements or design before your write your functional code.

    "},{"location":"developer/testing/intro.html#what-is-bdd","title":"What is BDD","text":"

    BDD stands for \u201cBehaviour Driven Development\u201d. It is a software development process that emerged from TDD. It includes the practice of writing tests first, but focuses on tests which describe behavior, rather than tests which test a unit of implementation. This provides software development and management teams with shared tools and a shared process to collaborate on software development. BDD is largely facilitated through the use of a simple domain-specific language (DSL) using natural language constructs (e.g., English-like sentences) that can express the behavior and the expected outcomes. Mocha and Cucumber testing libraries are built around the concepts of BDD.

    "},{"location":"developer/testing/intro.html#testing-workflow","title":"Testing workflow","text":"

    (Ref: Ham Vocke, The Practical Test Pyramid)

    We follow a testing workflow in accordance with the test pyramid diagram given above, starting with isolated tests and moving towards complete integration for any new feature changes. The different types of tests (in the order that they should be performed) are explained below:

    "},{"location":"developer/testing/intro.html#unit-tests","title":"Unit Tests","text":"

    Unit testing is a level of software testing where individual units/ components of a software are tested. The objective of Unit Testing is to isolate a section of code and verify its correctness.

    Ideally, each test case is independent from the others. Substitutes such as method stubs, mock objects, and spies can be used to assist testing a module in isolation.

    "},{"location":"developer/testing/intro.html#benefits-of-unit-testing","title":"Benefits of Unit Testing","text":"
    • Unit testing increases confidence in changing/ maintaining code. If good unit tests are written and if they are run every time any code is changed, we will be able to promptly catch any defects introduced due to the change.
    • If codes are already made less interdependent to make unit testing possible, the unintended impact of changes to any code is less.
    • The cost, in terms of time, effort and money, of fixing a defect detected during unit testing is lesser in comparison to that of defects detected at higher levels.
    "},{"location":"developer/testing/intro.html#unit-tests-in-dtaas","title":"Unit Tests in DTaaS","text":"

    Each component DTaaS project uses unique technology stack. Thus the packages used for unit tests are different. Please check the test/ directory of a component to figure out the unit test packages used.

    "},{"location":"developer/testing/intro.html#integration-tests","title":"Integration tests","text":"

    Integration testing is the phase in software testing in which individual software modules are combined and tested as a group. In DTaaS, we use an integration server for software development as well as such tests.

    The existing integration tests are done at the component level. There are no integration tests between the components. This task has been postponed to future.

    "},{"location":"developer/testing/intro.html#end-to-end-tests","title":"End-to-End tests","text":"

    Testing any code changes through the end user interface of your software is essential to verify if your code has the desired effect for the user. End-to-End tests in DTaaS a functional setup.

    There are end-to-end tests in the DTaaS. This task has been postponed to future.

    "},{"location":"developer/testing/intro.html#feature-tests","title":"Feature Tests","text":"

    A Software feature can be defined as the changes made in the system to add new functionality or modify the existing functionality. Each feature is said to have a characteristics that is designed to be useful, intuitive and effective. It is important to test a new feature when it has been added. We also need to make sure that it does not break the functionality of already existing features. Hence feature tests prove to be useful.

    The DTaaS project does not have any feature tests yet. Cucumber shall be used in future to implement feature tests.

    "},{"location":"developer/testing/intro.html#references","title":"References","text":"
    1. Arthur Hicken, Shift left approach to software testing
    2. Justin Searls and Kevin Buchanan, Contributing Tests wiki.
    3. This wiki has good explanation of TDD and test doubles.
    "},{"location":"user/features.html","title":"Overview","text":""},{"location":"user/features.html#advantages","title":"Advantages","text":"

    The DTaaS software platform provides certain advantages to users:

    • Support for different kinds of Digital Twins
    • CFD, Simulink, co-simulation, FEM, ROM, ML etc.
    • Integrates with other Digital Twin frameworks
    • Facilitate availability of Digital Twin as a Service
    • Collaboration and reuse
    • Private workspaces for verification of reusable assets, trial run DTs
    • Cost effectiveness
    "},{"location":"user/features.html#software-features","title":"Software Features","text":"

    Each installation of DTaaS platform comes with the features highlighted in the following picture.

    All the users have dedicated workspaces. These workspaces are dockerized versions of Linux Desktops. The user desktops are isolated so the installations and customizations done in one user workspace do not effect the other user workspaces.

    Each user workspace comes with some development tools pre-installed. These tools are directly accessible from web browser. The following tools are available at present:

    Tool Advantage Jupyter Lab Provides flexible creation and use of digital twins and their components from web browser. All the native Jupyterlab usecases are supported here. Jupyter Notebook Useful for web-based management of their files (library assets) VS Code in the browser A popular IDE for software development. Users can develop their digital twin-related assets here. ungit An interactive git client. Users can work with git repositories from web browser

    In addition, users have access to xfce-based remote desktop via VNC client. The VNC client is available right in the web browser. The xfce supported desktop software can also be run in their workspace.

    The DTaaS software platform has some pre-installed services available. The currently available services are:

    Service Advantage InfluxDB Time-series database primarly for storing time-series data from physical twins. The digital twins can use an already existing data. Users can also create visualization dashboards for their digital twins. RabbitMQ Communication broker for communication between physical and digital twins Grafana Visualization dashboards for their digital twins. MQTT Lightweight data transfer broker for IoT devices / physical twins feeding data into digital twins. MongoDB NoSQL document database for storing metadata of data from physical twins

    In addition, the workspaces are connected to the Internet so all the Digital Twins running in the workspace can interact with both the internal and external services.

    The users can publish and reuse the digital twin assets available on the platform. In addition, users can run their digital twins and make these live digital twins available as services to their clients. The clients need not be users of the DTaaS software installation.

    "},{"location":"user/motivation.html","title":"DTaaS for Users","text":""},{"location":"user/motivation.html#user-guide","title":"User Guide","text":"

    This guide is for users of the DTaaS platform. Please make sure that you have access to a live installation of the DTaaS platform. The easiest is localhost installation scenario.

    Please see user-specific Slides and Video to get the conceptual framework behind composable digital twins in the DTaaS platform.

    "},{"location":"user/motivation.html#motivation","title":"Motivation","text":"

    How can DT software platforms enable users collaborate to:

    • Build digital twins (DTs)
    • Use DTs themselves
    • Share DTs with other users
    • Provide the existing DTs as Service to other users

    In addition, how can the DT software platforms:

    • Support DT lifecycle
    • Scale up rather than scale down (flexible convention over configuration)
    "},{"location":"user/motivation.html#existing-approaches","title":"Existing Approaches","text":"

    There are quite a few solutions proposed in the recent past to solve this problem. Some of them are:

    • Focus on data from Physical Twins (PTs) to perform analysis, diagnosis, planning etc\u2026
    • Share DT assets across the upstream, downstream etc\u2026.
    • Evaluate different models of PT
    • DevOps for Cyber Physical Systems (CPS)
    • Scale DT / execution of DT / ensemble of related DTs
    • Support for PT product lifecycle
    "},{"location":"user/motivation.html#our-approach","title":"Our Approach","text":"
    • Support for transition from existing workflows to DT frameworks
    • Create DTs from reusable assets
    • Enable users to share DT assets
    • Offer DTs as a Service
    • Integrate the DTs with external software systems
    • Separate configurations of independent DT components
    "},{"location":"user/digital-twins/create.html","title":"Create a Digital Twin","text":"

    The first step in digital twin creation is to use the available assets in your workspace. If you have assets / files in your computer that need to be available in the DTaaS workspace, then please follow the instructions provided in library assets.

    There are dependencies among the library assets. These dependencies are shown below.

    A digital twin can only be created by linking the assets in a meaningful way. This relationship can be expressed using a mathematical equation:

    where D denotes data, M denotes models, F denotes functions, T denotes tools, denotes DT configuration and is a symbolic notation for a digital twin itself. The expression denotes composition of DT from D,M,T and F assets. The indicates zero or one more instances of an asset and indicates one or more instances of an asset.

    The DT configuration specifies the relevant assets to use, the potential parameters to be set for these assets. If a DT needs to use RabbitMQ, InfluxDB like services supported by the platform, the DT configuration needs to have access credentials for these services.

    This kind of generic DT definition is based on the DT examples seen in the wild. You are at liberty to deviate from this definition of DT. The only requirement is the ability to run the DT from either commandline or desktop.

    Tip

    If you are stepping into the world of Digital Twins, you might not have distinct digital twin assets. You are likely to have one directory of everything in which you run your digital twin. In such a case we recommend that you upload this monolithic digital twin into digital_twin/your_digital_twin_name directory.

    "},{"location":"user/digital-twins/create.html#example","title":"Example","text":"

    The Examples repository contains a co-simulation setup for mass spring damper. This example illustrates the potential of using co-simulation for digital twins.

    The file system contents for this example are:

    workspace/\n  data/\n    mass-spring-damper\n        input/\n        output/\n\n  digital_twins/\n    mass-spring-damper/\n      cosim.json\n      time.json\n      lifecycle/\n        analyze\n        clean\n        evolve\n        execute\n        save\n        terminate\n      README.md\n\n  functions/\n  models/\n    MassSpringDamper1.fmu\n    MassSpringDamper2.fmu\n\n  tools/\n  common/\n    data/\n    functions/\n    models/\n    tools/\n        maestro-2.3.0-jar-with-dependencies.jar\n

    The workspace/data/mass-spring-damper/ contains input and output data for the mass-spring-damper digital twin.

    The two FMU models needed for this digital twin are in models/ directory.

    The co-simulation digital twin needs Maestro co-simulation orchestrator. Since this is a reusable asset for all the co-simulation based DTs, the tool has been placed in common/tools/ directory.

    The actual digital twin configuration is specified in digital twins/mass-spring-damper directory. The co-simulation configuration is specified in two json files, namely cosim.json and time.json. A small explanation of digital twin for its users can be placed in digital twins/mass-spring-damper/README.md.

    The launch program for this digital twin is in digital twins/mass-spring-damper/lifecycle/execute. This launch program runs the co-simulation digital twin. The co-simulation runs till completion and then ends. The programs in digital twins/mass-spring-damper/lifecycle are responsible for lifecycle management of this digital twin. The lifecycle page provides more explanation on these programs.

    Execution of a Digital Twin

    A frequent question arises on the run time characteristics of a digital twin. The natural intuition is to say that a digital twin must operate as long as its physical twin is in operation. If a digital twin runs for a finite time and then ends, can it be called a digital twin? The answer is a resounding YES. The Industry 4.0 usecases seen among SMEs have digital twins that run for a finite time. These digital twins are often run at the discretion of the user.

    You can run this digital twin by,

    1. Go to Workbench tools page of the DTaaS website and open VNC Desktop. This opens a new tab in your browser
    2. A page with VNC Desktop and a connect button comes up. Click on Connect. You are now connected to the Linux Desktop of your workspace.
    3. Open a Terminal (black rectangular icon in the top left region of your tab) and type the following commands.
    4. Download the example files by following the instructions given on examples overview.

    5. Go to the digital twin directory and run

    cd /workspace/examples/digital_twins/mass-spring-damper\nlifecycle/execute\n

    The last command executes the mass-spring-damper digital twin and stores the co-simulation output in data/mass-spring-damper/output.

    "},{"location":"user/digital-twins/devops.html","title":"Digital Twins and DevOps","text":"

    DevOps has been a well established software development practice. We are bringing out an experimental feature of integration DevOps in the DTaaS.

    Warning

    This feature is under documented. Please expect some instability in this release. However, we are working to mature the feature and improve the documentation.

    This feature requires specific installation setup.

    1. Integrated gitlab installation
    2. A valid gitlab repository for the logged in user. Please see an example repository. You can clone this repository and customize to your needs.
    3. A linked Gitlab Runner to the user gitlab repository.
    "},{"location":"user/digital-twins/devops.html#manage","title":"Manage","text":"

    The manage tab allows for different operations on a digital twin:

    • Checking the details (Details button)
    • Delete (Delete button)
    • Modify / Reconfigure (Reconfigure button)

    A digital twin placed in the DTaaS has a certain recommended structure. Please see the assets pag for an explanation and this example.

    The information page shown using the Details button, shows the README.md information stored inside the digital twin directory.

    A reconfigure button opens an editor and shows all the files corresponding to a digital twin. All of these files can be updated. These files correspond to three categories.

    • Description
    • Configuration
    • Lifecycle

    "},{"location":"user/digital-twins/devops.html#execute","title":"Execute","text":"

    The execute tabs shows the possibility of executing multiple digital twins. Once an execution of digital twin is complete, you can see the execution log as well.

    "},{"location":"user/digital-twins/lifecycle.html","title":"Digital Twin Lifecycle","text":"

    The physical products in the real world have product lifecycle. A simplified four-stage product life is illustrated here.

    A digital twin tracking the physical products (twins) need to track and evolve in conjunction with the corresponding physical twin.

    The possible activities undertaken in each lifecycle phases are illustrated in the figure.

    (Ref: Minerva, R, Lee, GM and Crespi, N (2020) Digital Twin in the IoT context: a survey on technical features, scenarios and architectural models. Proceedings of the IEEE, 108 (10). pp. 1785-1824. ISSN 0018-9219.)

    "},{"location":"user/digital-twins/lifecycle.html#lifecycle-phases","title":"Lifecycle Phases","text":"

    The four phase lifecycle has been extended to a lifecycle with eight phases. The new phase names and the typical activities undertaken in each phase are outlined in this section.

    A DT lifecycle consists of explore, create, execute, save, analyse, evolve and terminate phases.

    Phase Main Activities explore selection of suitable assets based on the user needs and checking their compatibility for the purposes of creating a DT. create specification of DT configuration. If DT already exists, there is no creation phase at the time of reuse. execute automated / manual execution of a DT based on its configuration. The DT configuration must checked before starting the execution phase. analyse checking the outputs of a DT and making a decision. The outputs can be text files, or visual dashboards. evolve reconfigure DT primarily based on analysis. save involves saving the state of DT to enable future recovery. terminate stop the execution of DT.

    A digital twin faithfully tracking the physical twin lifecycle will have to support all the phases. It is also possible for digital twin engineers to add more phases to digital they are developing. Thus it is important for the DTaaS software platform needs to accommodate needs of different DTs.

    A potential linear representation of the tasks undertaken in a digital twin lifecycle are shown here.

    Again this is only a one possible pathway. Users are at liberty to alter the sequence of steps.

    It is possible to map the lifecycle phases identified so far with the Build-Use-Share approach of the DTaaS software platform.

    Even though not mandatory, having a matching coding structure makes it easy to for users to create and manage their DTs within the DTaaS. It is recommended to have the following structure:

    workspace/\n  digital_twins/\n    digital-twin-1/\n      lifecycle/\n        analyze\n        clean\n        evolve\n        execute\n        save\n        terminate\n

    A dedicated program exists for each phase of DT lifecycle. Each program can be as simple as a script that launches other programs or sends messages to a live digital twin.

    The recommended way to implement lifecycle phases within DTaaS is to create scripts. These scripts can be as simple as shell scripts.

    "},{"location":"user/digital-twins/lifecycle.html#example-lifecycle-scripts","title":"Example Lifecycle Scripts","text":"

    Here are the example programs / scripts to manage three phases in the lifecycle of mass-spring-damper DT.

    lifecycle/execute
    #!/bin/bash\nmkdir -p /workspace/data/mass-spring-damper/output\n#cd ..\njava -jar /workspace/common/tools/maestro-2.3.0-jar-with-dependencies.jar \\\n    import -output /workspace/data/mass-spring-damper/output \\\n    --dump-intermediate sg1 cosim.json time.json -i -vi FMI2 \\\n    output-dir>debug.log 2>&1\n

    The execute phases uses the DT configuration, FMU models and Maestro tool to execute the digital twin. The script also stores the output of cosimulation in /workspace/data/mass-spring-damper/output.

    It is possible for a DT not to support a specific lifecycle phase. This intention can be specified with an empty script and a helpful message if deemed necessary.

    lifecycle/analyze
    #!/bin/bash\nprintf \"operation is not supported on this digital twin\"\n

    The lifecycle programs can call other programs in the code base. In the case of lifecycle/terminate program, it is calling another script to do the necessary job.

    lifecycle/terminate
    #!/bin/bash\nlifecycle/clean\n
    "},{"location":"user/examples/index.html","title":"DTaaS Examples","text":"

    There are some example digital twins created for the DTaaS software. You can peruse these examples and follow the steps given in this Examples section to experience features of the DTaaS software platform and understand best practices for managing digital twins within the platform. Please see these slides and video to get an overview of these examples.

    There are two demo vides available: CP-SENS project (slides and video) and Incubator (video). These two videos have been recorded using DTaaS v0.5.0.

    "},{"location":"user/examples/index.html#copy-examples","title":"Copy Examples","text":"

    The first step is to copy all the example code into your user workspace within the DTaaS. Use the given shell script to copy all the examples into /workspace/examples directory.

    wget https://raw.githubusercontent.com/INTO-CPS-Association/DTaaS-examples/main/getExamples.sh\nbash getExamples.sh\n
    "},{"location":"user/examples/index.html#example-list","title":"Example List","text":"

    The digital twins provided in examples vary in their complexity. It is best to use the examples in the following order.

    1. Mass Spring Damper
    2. Water Tank Fault Injection
    3. Water Tank Model Swap
    4. Desktop Robotti and RabbitMQ
    5. Water Treatment Plant and OPC-UA
    6. Three Water Tanks with DT Manager Framework
    7. Flex Cell with Two Industrial Robots
    8. Incubator
    9. Firefighters in Emergency Environments
    10. Mass Spring Damper with NuRV Runtime Monitor FMU
    11. Water Tank Fault Injection with NuRV Runtime Monitor FMU
    12. Incubator Co-Simulation with NuRV Runtime Monitor FMU
    13. Incubator with NuRV Runtime Monitor as Service
    14. Incubator with NuRV Runtime Monitor FMU as Service

    DTaaS examples

    "},{"location":"user/examples/drobotti-rmqfmu/index.html","title":"Desktop Robotti with RabbitMQ","text":""},{"location":"user/examples/drobotti-rmqfmu/index.html#overview","title":"Overview","text":"

    This example demonstrates bidirectional communication between a mock physical twin and a digital twin of a mobile robot (Desktop Robotti). The communication is enabled by RabbitMQ Broker.

    "},{"location":"user/examples/drobotti-rmqfmu/index.html#example-structure","title":"Example Structure","text":"

    The mock physical twin of mobile robot is created using two python scripts

    1. data/drobotti_rmqfmu/rmq-publisher.py
    2. data/drobotti_rmqfmu/consume.py

    The mock physical twin sends its physical location in (x,y) coordinates and expects a cartesian distance calculated from digital twin.

    The rmq-publisher.py reads the recorded (x,y) physical coordinates of mobile robot. The recorded values are stored in a data file. These (x,y) values are published to RabbitMQ Broker. The published (x,y) values are consumed by the digital twin.

    The consume.py subscribes to RabbitMQ Broker and waits for the calculated distance value from the digital twin.

    The digital twin consists of a FMI-based co-simulation, where Maestro is used as co-orchestration engine. In this case, the co-simulation is created by using two FMUs - RMQ FMU (rabbitmq-vhost.fmu) and distance FMU (distance-from-zero.fmu). The RMQ FMU receives the (x,y) coordinates from rmq-publisher.py and sends calculated distance value to consume.py. The RMQ FMU uses RabbitMQ broker for communication with the mock mobile robot, i.e., rmq-publisher.py and consume.py. The distance FMU is responsible for calculating the distance between (0,0) and (x,y). The RMQ FMU and distance FMU exchange values during co-simulation.

    "},{"location":"user/examples/drobotti-rmqfmu/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses two models, one tool, one data, and two scripts to create mock physical twin. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Models distance-from-zero.fmu Private No rmq-vhost.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes Data drobotti_playback_data.csv private No Mock PT rmq-publisher.py Private No consume.py Private No

    This DT has many configuration files. The coe.json and multimodel.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

    The RabbitMQ access credentials need to be provided in multimodel.json. The rabbitMQ-credentials.json provides RabbitMQ access credentials for mock PT python scripts. Please add your credentials in both these files.

    "},{"location":"user/examples/drobotti-rmqfmu/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool and pip packages for python scripts Execute Runs both DT and mock PT Clean Clears run logs and outputs"},{"location":"user/examples/drobotti-rmqfmu/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/drobotti_rmqfmu\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/drobotti-rmqfmu/index.html#create","title":"Create","text":"

    Installs Open Java Development Kit 17 in the workspace. Also install the required python pip packages for rmq-publisher.py and consume.py scripts.

    lifecycle/create\n
    "},{"location":"user/examples/drobotti-rmqfmu/index.html#execute","title":"Execute","text":"

    Run the python scripts to start mock physical twin. Also run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the two FMU models.

    lifecycle/execute\n
    "},{"location":"user/examples/drobotti-rmqfmu/index.html#examine-the-results","title":"Examine the results","text":"

    The results can be found in the /workspace/examples/digital_twins/drobotti_rmqfmu directory.

    Executing the DT will generate and launch a co-simulation (RMQFMU and distance FMU), and two python scripts. One to publish data that is read from a file. And one to consume what is sent by the distance FMU.

    In this examples the DT will run for 10 seconds, with a stepsize of 100ms. Thereafter it is possible to examine the logs produce in /workspace/examples/digital_twins/drobotti_rmqfmu/target. The outputs for each FMU, xpos and ypos for the RMQFMU, and the distance for the distance FMU are recorded in the outputs.csv file. Other logs can be examined for each FMU and the publisher scripts. Note that, the RMQFMU only sends data, if the current input is different to the previous one.

    "},{"location":"user/examples/drobotti-rmqfmu/index.html#terminate-phase","title":"Terminate phase","text":"

    Terminate to clean up the debug files and co-simulation output files.

    lifecycle/terminate\n
    "},{"location":"user/examples/drobotti-rmqfmu/index.html#references","title":"References","text":"

    The RabbitMQ FMU github repository contains complete documentation and source code of the rmq-vhost.fmu.

    More information about the case study is available in:

    Frasheri, Mirgita, et al. \"Addressing time discrepancy between digital\nand physical twins.\" Robotics and Autonomous Systems 161 (2023): 104347.\n
    "},{"location":"user/examples/flex-cell/index.html","title":"Flex Cell Digital Twin with Two Industrial Robots","text":""},{"location":"user/examples/flex-cell/index.html#overview","title":"Overview","text":"

    The flex-cell Digital Twin is a case study with two industrial robotic arms, a UR5e and a Kuka LBR iiwa 7, working in a cooperative setting on a manufacturing cell.

    The case study focuses on the robot positioning in the discrete cartesian space of the flex-cell working space. Therefore, it is possible to send (X,Y,Z) commands to both robots, which refer to the target hole and height they want should move to.

    The flex-cell case study is managed using the TwinManager (formerly DT Manager), which is packed as a jar library in the tools, and run from a java main file.

    The TwinManager uses Maestro as a slave for co-simulation, so it generates the output of the co-simulation and can interact with the real robots at the same time (with the proper configuration and setup). The mainfile can be changed according to the application scope, i.e., the /workspace/examples/tools/flex-cell/FlexCellDTaaS.java can be manipulated to get a different result.

    The /workspace/examples/models/flex-cell/ folder contains the .fmu files for the kinematic models of the robotic arms, the .urdf files for visualization (including the grippers), and the .aasx files for the schema representation with Asset Administration Shell.

    The case study also uses RabbitMQFMU to inject values into the co-simulation, therefore, there is the rabbitmqfmu in the models folder as well. Right now, RabbitMQFMU is only used for injecting values into the co-simulation, but not the other way around. The TwinManager is in charge of reading the values from the co-simulation output and the current state of the physical twins.

    "},{"location":"user/examples/flex-cell/index.html#example-structure","title":"Example Structure","text":"

    The example structure represents the components of the flex-cell DT implementation using the TwinManager architecture.

    The TwinManager orchestrates the flex-cell DT via the Flex-cell DT System, which is composed of 2 smaller Digital Twins, namely, the DT UR5e and the DT Kuka lbr iiwa 7. The TwinManager also provides the interface for the Physical Twins, namely, PT UR5e and PT Kuka lbr iiwa 7. Each Physical Twin and Digital Twin System has a particular endpoint (with a different specialization), which is initialized from configuration files and data model (twin schema).

    The current endpoints used in this implementation are:

    Digital or Physical Twin Endpoint Flex-cell DT System MaestroEndpoint DT UR5e FMIEndpoint DT Kuka lbr iiwa 7 FMIEndpoint PT UR5e MQTTEndpoint and RabbitMQEndpoint PT Kuka lbr iiwa 7 MQTTEndpoint and RabbitMQEndpoint

    The Flex-cell DT System uses another configuration to be integrated with the Maestro co-simulation engine.

    In the lower part, the Flex-cell System represents the composed physical twin, including the two robotic arms and controller and the Flex-cell Simulation is the mock-up representation for the real system, which is implemented by FMU blocks and their connections.

    "},{"location":"user/examples/flex-cell/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses seven models, five tools, six data files, two functions, and one script. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Model kukalbriiwa_model.fmu Private No kuka_irw_gripper_rg6.urdf Private No kuka.aasx Private No ur5e_model.fmu Private No ur5e_gripper_2fg7.urdf Private No ur5e.aasx Private No rmq-vhost.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes TwinManagerFramework-0.0.2.jar Private Yes urinterface (installed with pip) Private No kukalbrinterface Private No robots_flexcell Private No FlexCellDTaaS.java (main script) Private No Data publisher-flexcell-physical.py Private No ur5e_mqtt_publisher.py Private No connections.conf Private No outputs.csv Private No kukalbriiwa7_actual.csv Private No ur5e_actual.csv Private No Function plots.py Private No prepare.py Private No"},{"location":"user/examples/flex-cell/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

    The lifecycles that are covered include:

    1. Installation of dependencies in the create phase.
    2. Preparing the credentials for connections in the prepare phase.
    3. Execution of the experiment in the execution phase.
    4. Saving experiments in the save phase.
    5. Plotting the results of the co-simulation and the real data coming from the robots in the analyze phase.
    6. Terminating the background processes and cleaning up the outputs in the termination phase.
    Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool, Compiles source code of TwinManager to create a usable jar package (used as tool) Prepare Takes the RabbitMQ and MQTT credentials in connections.conf file and configures different assets of DT. Execute The TwinManager executes the flex-cell DT and produces output in data/flex-cell/output directory Save Save the experimental results Analyze Uses plotting functions to generate plots of co-simulation results Terminate Terminating the background processes Clean Cleans up the output data"},{"location":"user/examples/flex-cell/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/flex-cell\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    This example requires Java 11. The create script installs Java 11; however if you have already installed other Java versions, your default java might be pointing to another version. You can check and modify the default version using the following commands.

    java -version\nupdate-alternatives --config java\n

    Now, run the following scripts:

    "},{"location":"user/examples/flex-cell/index.html#create","title":"Create","text":"

    Installs Open Java Development Kit 11 and a python virtual environment with pip dependencies. Also builds the TwinManager tool (TwinManagerFramework-0.0.2.jar) from source code.

    lifecycle/create\n
    "},{"location":"user/examples/flex-cell/index.html#prepare","title":"Prepare","text":"

    Configure different assets of DT with these credentials. The functions/flex-cell/prepare.py script is used for this purpose. The only thing needed to set up the connection is to update the file /workspace/examples/data/flex-cell/input/connections.conf with the connection parameters for MQTT and RabbitMQ and then execute the prepare script.

    lifecycle/prepare\n

    The following files are updated with the configuration information:

    1. /workspace/examples/digital_twins/flex-cell/kuka_actual.conf
    2. /workspace/examples/digital_twins/flex-cell/ur5e_actual.conf
    3. /workspace/examples/data/flex-cell/input/publisher-flexcell-physical.py
    4. modelDescription.xml for the RabbitMQFMU require special credentials to connect to the RabbitMQ and the MQTT brokers.
    "},{"location":"user/examples/flex-cell/index.html#execute","title":"Execute","text":"

    Execute the flex-cell digital twin using TwinManager. TwinManager in-turn runs the co-simulation using Maestro. Generates the co-simulation output.csv file at /workspace/examples/data/flex-cell/output. The execution needs to be stopped with control + c since the TwinManager runs the application in a non-stopping loop.

    lifecycle/execute\n
    "},{"location":"user/examples/flex-cell/index.html#save","title":"Save","text":"

    Each execution of the DT is treated as a single run. The results of one execution are saved as time-stamped co-simulation output file in The TwinManager executes the flex-cell digital twin and produces output in data/flex-cell/output/saved_experiments directory.

    lifecycle/save\n

    The execute and save scripts can be executed in that order any number of times. A new file data/flex-cell/output/saved_experiments directory with each iteration.

    "},{"location":"user/examples/flex-cell/index.html#analyze","title":"Analyze","text":"

    There are dedicated plotting functions in functions/flex-cell/plots.py. This script plots the co-simulation results against the recorded values from the two robots.

    lifecycle/analyze\n
    "},{"location":"user/examples/flex-cell/index.html#terminate","title":"Terminate","text":"

    Stops the Maestro running in the background. Also stops any other jvm process started during execute phase.

    lifecycle/terminate\n
    "},{"location":"user/examples/flex-cell/index.html#clean","title":"Clean","text":"

    Removes the output generated during execute phase.

    lifecycle/clean\n
    "},{"location":"user/examples/flex-cell/index.html#examining-the-results","title":"Examining the results","text":"

    Executing this Digital Twin will generate a co-simulation output, but the results can also be monitored from updating the /workspace/examples/tools/flex-cell/FlexCellDTaaS.java with a specific set of getAttributeValue commands, such as shown in the code. That main file enables the online execution and comparison on Digital Twin and Physical Twin at the same time and at the same abstraction level.

    The output is generated to the /workspace/examples/data/flex-cell/output folder. In case a specific experiments is to be saved, the save lifecycle script stores the co-simulation results into the /workspace/examples/data/flex-cell/output/saved_experiments folder.

    In the default example, the co-simulation is run for 11 seconds in steps of 0.2 seconds. This can be modified for a longer period and different step size. The output stored in outputs.csv contains the joint position of both robotic arms and the current discrete (X,Y,Z) position of the TCP of the robot. Additional variables can be added, such as the discrete (X,Y,Z) position of the other joints.

    When connected to the real robots, the tools urinterface and kukalbrinterface log their data at a higher sampling rate.

    "},{"location":"user/examples/flex-cell/index.html#references","title":"References","text":"

    The RabbitMQ FMU github repository contains complete documentation and source code of the rmq-vhost.fmu.

    More information about the TwinManager (formerly DT Manager) and the case study is available in:

    1. D. Lehner, S. Gil, P. H. Mikkelsen, P. G. Larsen and M. Wimmer, \"An Architectural Extension for Digital Twin Platforms to Leverage Behavioral Models,\" 2023 IEEE 19th International Conference on Automation Science and Engineering (CASE), Auckland, New Zealand, 2023, pp. 1-8, doi: 10.1109/CASE56687.2023.10260417.
    2. S. Gil, P. H. Mikkelsen, D. Tola, C. Schou and P. G. Larsen, \"A Modeling Approach for Composed Digital Twins in Cooperative Systems,\" 2023 IEEE 28th International Conference on Emerging Technologies and Factory Automation (ETFA), Sinaia, Romania, 2023, pp. 1-8, doi: 10.1109/ETFA54631.2023.10275601.
    3. S. Gil, C. Schou, P. H. Mikkelsen, and P. G. Larsen, \u201cIntegrating Skills into Digital Twins in Cooperative Systems,\u201d in 2024 IEEE/SICE International Symposium on System Integration (SII), 2024, pp. 1124\u20131131, doi: 10.1109/SII58957.2024.10417610.
    "},{"location":"user/examples/incubator/index.html","title":"Incubator Digital Twin","text":""},{"location":"user/examples/incubator/index.html#overview","title":"Overview","text":"

    This is a case study of an Incubator with the purpose of understanding the steps and processes involved in developing a digital twin system. This incubator is an insulated container with the ability to keep a temperature and heat, but not cool. A picture of the incubator is given below.

    The overall purpose of the system is to reach a certain temperature within a box and keep the temperature regardless of content. An overview of the system can be seen below:

    The system consists of:

    • 1x styrofoam box in order to have an insulated container
    • 1x heat source to heat up the content within the Styrofoam box.
    • 1x fan to distribute the heating within the box
    • 2x temperature sensor to monitor the temperature within the box
    • 1x temperature Sensor to monitor the temperature outside the box
    • 1x controller to actuate the heat source and the fan and read sensory information from the temperature sensors, and communicate with the digital twin.

    The original repository for the example can be found: Original repository. This trimmed version of the codebase does not have the following:

    • docker support
    • tests
    • datasets

    The original repository contains the complete documentation of the example, including the full system architecture, instructions for running with a physical twin, and instructions for running a 3D visualization of the incubator.

    "},{"location":"user/examples/incubator/index.html#digital-twin-structure","title":"Digital Twin Structure","text":"

    This diagrams shows the main components and the interfaces they use to communicate. All components communicate via the RabbitMQ message exchange, and the data is stored in a time series database. The RabbitMQ and InfluxDB are platform services hosted by the DTaaS.

    The Incubator digital twin is a pre-packaged digital twin. It can be used as is or integrated with other digital twins.

    The mock physical twin is executed from incubator/mock_plant/real_time_model_solver.py script.

    "},{"location":"user/examples/incubator/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses a plethora of Python scripts to run the digital twin. By default it is configured to run with a mock physical twin. Furthermore, it depends on a RabbitMQ and an InfluxDB instances.

    There is one configuration file: simulation.conf. The RabbitMQ and InfluxDB configuration parameters need to be updated.

    "},{"location":"user/examples/incubator/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

    The lifecycles that are covered include:

    Lifecycle Phase Completed Tasks Create Potentially updates the system and installs Python dependencies Execute Executes the Incubator digital twin and produces output in the terminal and in incubator/log.log. Clean Removes the log file."},{"location":"user/examples/incubator/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/incubator\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/incubator/index.html#create","title":"Create","text":"

    Potentially updates the system and installs Python dependencies.

    lifecycle/create\n
    "},{"location":"user/examples/incubator/index.html#execute","title":"Execute","text":"

    Executes the Incubator digital twin with a mock physical twin. Pushes the results in the terminal, incubator/log.log, and in InfluxDB.

    lifecycle/execute\n
    "},{"location":"user/examples/incubator/index.html#clean","title":"Clean","text":"

    Removes the output log file.

    lifecycle/clean\n
    "},{"location":"user/examples/incubator/index.html#examining-the-results","title":"Examining the results","text":"

    After starting all services successfully, the controller service will start producing output that looks like the following:

    time           execution_interval  elapsed  heater_on  fan_on   room   box_air_temperature  state\n19/11 16:17:59  3.00                0.01     True       False   10.70  19.68                Heating\n19/11 16:18:02  3.00                0.03     True       True    10.70  19.57                Heating\n19/11 16:18:05  3.00                0.01     True       True    10.70  19.57                Heating\n19/11 16:18:08  3.00                0.01     True       True    10.69  19.47                Heating\n19/11 16:18:11  3.00                0.01     True       True    10.69  19.41                Heating\n

    An InfluxDB dashboard can be setup based on incubator/digital_twin/data_access/influxdbserver/dashboards/incubator_data.json. If the dashboard on the InfluxDB is setup properly, the following visualization can be seen:

    "},{"location":"user/examples/incubator/index.html#references","title":"References","text":"

    Forked from: Incubator repository with commit ID: 989ccf5909a684ad26a9c3ec16be2390667643aa

    To understand what a digital twin is, we recommend you read/watch one or more of the following resources:

    1. Feng, Hao, Cl\u00e1udio Gomes, Casper Thule, Kenneth Lausdahl, Alexandros Iosifidis, and Peter Gorm Larsen. \u201cIntroduction to Digital Twin Engineering.\u201d In 2021 Annual Modeling and Simulation Conference (ANNSIM), 1\u201312. Fairfax, VA, USA: IEEE, 2021. https://doi.org/10.23919/ANNSIM52504.2021.9552135.
    2. Video recording of presentation by Claudio Gomes
    "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html","title":"Incubator Digital Twin with NuRV FMU Monitoring Service","text":""},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#overview","title":"Overview","text":"

    This example demonstrates how an FMU can be used as a runtime monitoring service (in this example NuRV[1]) and connected with the Incubator digital twin to verify runtime behavior of the Incubator.

    "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#simulated-scenario","title":"Simulated scenario","text":"

    This example simulates a scenario where the lid of the Incubator is removed and later put back on. The Incubator is equipped with anomaly detection capabilities, which can detect anomalous behavior (i.e. the removal of the lid). When an anomaly is detected, the Incubator triggers an energy saving mode where the heater is turned off.

    From a monitoring perspective, we wish to verify that within 3 messages of an anomaly detection, the energy saving mode is turned on. To verify this behavior, we construct the property:

    .

    The monitor will output the unknown state as long as the property is satisfied and will transition to the false state once a violation is detected.

    The simulated scenario progresses as follows:

    • Initialization: The services are initialized and the Kalman filter in the Incubator is given 2 minutes to stabilize. Sometimes, the anomaly detection algorithm will detect an anomaly at startup even though the lid is still on. It will disappear after approx 15 seconds.
    • After 2 minutes: The lid is lifted and an anomaly is detected. The energy saver is turned on shortly after.
    • After another 30 seconds: The energy saver is manually disabled producing a false verdict.
    • After another 30 seconds: The lid is put back on and the anomaly detection is given time to detect that the lid is back on. The monitor is then reset producing an Unknown verdict again. The simulation then ends.
    "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#example-structure","title":"Example structure","text":"

    A diagram depicting the logical software structure of the example can be seen below.

    The execute script is responsible for starting the NuRV service and running the Python script that controls the scenario (execute.py).

    The execute.py script starts the Incubator services and runs the example scenario. Once the Incubator DT is started, a RabbitMQ client is created that subscribes to changes in the anomaly and energy_saving states of the DT, as well as the verdicts produced by the NuRV service. Each time an update is received, the full state and verdict is printed to the console.

    "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#digital-twin-configuration","title":"Digital Twin configuration","text":"

    Before running the example, please configure the simulation.conf file with your RabbitMQ credentials.

    The example uses the following assets:

    Asset Type Names of Assets Visibility Reuse in other Examples Tools common/tool/NuRV/NuRV Common Yes Other common/fmi2_headers Common Yes DT common/digital_twins/incubator Common Yes Specification safe-operation.smv Private No Script execute.py Private No

    The safe-operation.smv file contains the default monitored specification as described in the Simulated scenario section. These can be configured as desired.

    "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#lifecycle-phases","title":"Lifecycle phases","text":"

    The lifecycle phases for this example include:

    Lifecycle phase Completed tasks create Downloads the necessary tools and creates a virtual python environment with the necessary dependencies execute Runs a python script that starts up the necessary services as well as the Incubator simulation. Various status messages are printed to the console, including the monitored system states and monitor verdict.

    If required, change the execute permissions of lifecycle scripts you need to execute. This can be done using the following command.

    chmod +x lifecycle/{script}\n

    where {script} is the name of the script, e.g. create, execute etc.

    "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#running-the-example","title":"Running the example","text":"

    To run the example, first run the following command in a terminal:

    cd /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/\n

    Then, first execute the create script followed by the execute script using the following command:

    lifecycle/{script}\n

    The execute script will then start outputting system states and the monitor verdict approx every 3 seconds. The output is printed as follows.

    \"State: {anomaly state} & {energy_saving state}\"

    where \"anomaly\" indicates that an anomaly is detected and \"!anomaly\" indicates that an anomaly is not currently detected. The same format is used for the energy_saving state. NuRV verdicts are printed as follows

    \"Verdict from NuRV: {verdict}\".

    The monitor verdict can be false or unknown, where the latter indicates that the monitor does not yet have sufficient information to determine the satisfaction of the property. The monitor will never produce a true verdict as the entire trace must be verified to ensure satisfaction due to the G operator. Thus the unknown state can be viewed as a tentative true verdict.

    An example output trace is provided below:

    ....\nUsing LIFECYCLE_PATH: /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/lifecycle\nUsing INCUBATOR_PATH: /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/lifecycle/../../../common/digital_twins/incubator\nStarting NuRV FMU Monitor Service, see output at /tmp/nurv-fmu-service.log\nNuRVService.py PID: 13496\nStarting incubator\nConnected to rabbitmq server.\nRunning scenario with initial state: lid closed and energy saver on\nSetting energy saver mode: enable\nSetting G_box to: 0.5763498\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\n
    "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#references","title":"References","text":"
    1. Information on the NuRV monitor can be found on FBK website.
    "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html","title":"Incubator Digital Twin with NuRV monitoring service","text":""},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#overview","title":"Overview","text":"

    This example demonstrates how a runtime monitoring service (in this example NuRV[1]) can be connected with the Incubator digital twin to verify runtime behavior of the Incubator.

    "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#simulated-scenario","title":"Simulated scenario","text":"

    This example simulates a scenario where the lid of the Incubator is removed and later put back on. The Incubator is equipped with anomaly detection capabilities, which can detect anomalous behavior (i.e. the removal of the lid). When an anomaly is detected, the Incubator triggers an energy saving mode where the heater is turned off.

    From a monitoring perspective, we wish to verify that within 3 simulation steps of an anomaly detection, the energy saving mode is turned on. To verify this behavior, we construct the property: . Whenever a True or False verdict is produced by the monitor, it is reset, allowing for the detection of repeated satisfaction/violation detections of the property.

    The simulated scenario progresses as follows:

    • Initialization: The services are initialized and the Kalman filter in the Incubator is given 2 minutes to stabilize. Sometimes, the anomaly detection algorithm will detect an anomaly at startup even though the lid is still on. It will disappear after approx 15 seconds.
    • After 2 minutes: The lid is lifted and an anomaly is detected. The energy saver is turned on shortly after
    • After another 30 seconds: The energy saver is manually disabled producing a False verdict.
    • After another 30 seconds: The lid is put back on and the anomaly detection is given time to detect that the lid is back on. The simulation then ends.
    "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#example-structure","title":"Example structure","text":"

    A diagram depicting the logical software structure of the example can be seen below.

    The execute.py script is responsible for orchestrating and starting all the relevant services in this example. This includes the Incubator DT, CORBA naming service (omniNames) and the NuRV monitor server as well as implementing the Monitor connector component that connects the DT output to the NuRV monitor server.

    The NuRV monitor server utilizes a CORBA naming service where it registers under a specific name. A user can then query the naming service for the specific name, to obtain a reference to the monitor server. For more information on how the NuRV monitor server works, please refer to [1].

    After establishing connection with the NuRV monitor server, the Incubator DT is started and a RabbitMQ client is created that subscribes to changes in the anomaly and energy_saving states of the DT. Each time an update is received of either state, the full state (the new updated state and the previous other state) is pushed to the NuRV monitor server whereafter the verdict is printed to the console.

    "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#digital-twin-configuration","title":"Digital Twin configuration","text":"

    Before running the example, please configure the simulation.conf file with your RabbitMQ credentials.

    The example uses the following assets:

    Asset Type Names of Assets Visibility Reuse in other Examples Service common/services/NuRV_orbit Common Yes DT common/digital_twins/incubator Common Yes Specification safe-operation.smv Private No Script execute.py Private No

    The safe-operation.smv file contains the default monitored specification as described in the Simulated scenario section. These can be configured as desired.

    "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#lifecycle-phases","title":"Lifecycle phases","text":"

    The lifecycle phases for this example include:

    Lifecycle phase Completed tasks create Downloads the necessary tools and creates a virtual python environment with the necessary dependencies execute Runs a python script that starts up the necessary services as well as the Incubator simulation. Various status messages are printed to the console, including the monitored system states and monitor verdict. clean Removes created data directory and incubator log files.

    If required, change the execute permissions of lifecycle scripts you need to execute. This can be done using the following command

    chmod +x lifecycle/{script}\n

    where {script} is the name of the script, e.g. create, execute etc.

    "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#running-the-example","title":"Running the example","text":"

    To run the example, first run the following command in a terminal:

    cd /workspace/examples/digital_twins/incubator-monitor-server/\n

    Then, first execute the create script (this can take a few mins depending on your network connection) followed by the execute script using the following command:

    lifecycle/{script}\n

    The execute script will then start outputting system states and the monitor verdict approx every 3 seconds. The output is printed as follows \"State: {anomaly state} & {energy_saving state}, verdict: {Verdict}\" where \"anomaly\" indicates that an anomaly is detected and \"!anomaly\" indicates that an anomaly is not currently detected. The same format is used for the energy_saving state.

    The monitor verdict can be True, False or Unknown, where the latter indicates that the monitor does not yet have sufficient information to determine the satisfaction of the property.

    An example output trace is provided below:

    ....\nRunning scenario with initial state: lid closed and energy saver on\nSetting energy saver mode: enable\nSetting G_box to: 0.5763498\nState: !anomaly & !energy_saving, verdict: True\nState: !anomaly & !energy_saving, verdict: True\n....\nState: anomaly & !energy_saving, verdict: Unknown\nState: anomaly & energy_saving, verdict: True\nState: anomaly & energy_saving, verdict: True\n

    There is currently some startup issues with connecting to the NuRV server, and it will likely take a few tries before the connection is established. This is however handled automatically.

    "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#references","title":"References","text":"
    1. Information on the NuRV monitor can be found on FBK website.
    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html","title":"Incubator Co-Simulation Digital Twin validation with NuRV Monitor","text":""},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#overview","title":"Overview","text":"

    This example demonstrates how to validate some digital twin components using FMU monitors (in this example, the monitors are generated with NuRV[1]).

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#simulated-scenario","title":"Simulated scenario","text":"

    This example validates some components of the Incubator digital twin, by performing a simulation in which the commponents are wrapped inside FMUs, and are then inspected at runtime by some a FMU monitor generated by NuRV. Please note that the link to Incubator digital twin is only provided to know the details of the incubator physical twin. The digital twin (DT) presented here is a co-simulation DT of the Incubator.

    The input data for the simulation is generated by a purpose-built FMU component named source, which supplies testing data to the anomaly detector, simulating an anomaly occurring at time t=60s. An additional component, watcher, is employed to verify whether the energy saver activates in response to an anomaly reported by the anomaly detector.

    The output of the watcher is the passed to the monitor, which ensures that when an anomaly is detected, the energy saver activates within a maximum of three simulation cycles.

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#example-structure","title":"Example structure","text":"

    A diagram depicting the logical software structure of the example can be seen below.

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#digital-twin-configuration","title":"Digital Twin configuration","text":"

    The example uses the following assets:

    Asset Type Names of Assets Visibility Reuse in other Examples Models anomaly_detection.fmu Private No energy_saver.fmu Private No Source.fmu Private No Watcher.fmu Private No Specification safe-operation.smv Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

    The safe-operation.smv file contains the default monitored specification as described in the Simulated scenario section.

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#lifecycle-phases","title":"Lifecycle phases","text":"

    The lifecycle phases for this example include:

    Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro toolGenerates and compiles the monitor FMU Execute Produces and stores output in data/incubator-NuRV-monitor-validation/output directory Clean Clears run logs and outputs

    If required, change the execute permissions of lifecycle scripts you need to execute. This can be done using the following command

    chmod +x lifecycle/{script}\n

    where {script} is the name of the script, e.g. create, execute etc.

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/incubator-NuRV-monitor-validation\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#create","title":"Create","text":"
    • Installs Open Java Development Kit 17 in the workspace.
    • Generates and compiles the monitor FMU from the NuRV specification
    lifecycle/create\n
    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#execute","title":"Execute","text":"

    Run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the FMU models.

    lifecycle/execute\n
    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#analyze-phase","title":"Analyze phase","text":"

    Process the output of co-simulation to produce a plot at: /workspace/examples/data/incubator-NuRV-monitor-validation/output/plots.

    lifecycle/analyze\n

    A sample plot is given here.

    In the plot, four color-coded indicators provide a visual representation of distinct values. The blue line depicts the simulated temperature, while orange one represents the temperature estimate. A red dashed line indicates the target temperature set by the energy saver component. The green line shows the monitor's output verdict. As observed, when there is a disparity between the estimated and actual temperatures, the energy saver adjusts the target temperature downward, indicating that the component is working properly. Thus, the output of the monitor is fixed at unknown (0), signifying that the monitoring property is not violated.

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#examine-the-results","title":"Examine the results","text":"

    The results can be found in the /workspace/examples/data/incubator-NuRV-monitor-validation/output directory where the logs are also included.

    Figures of the output results can be found in the /workspace/examples/data/incubator-NuRV-monitor-validation/output directory.

    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#terminate-phase","title":"Terminate phase","text":"

    Terminate to clean up the debug files and co-simulation output files.

    lifecycle/terminate\n
    "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#references","title":"References","text":"
    1. More information about NuRV is available here.
    "},{"location":"user/examples/mass-spring-damper/index.html","title":"Mass Spring Damper","text":""},{"location":"user/examples/mass-spring-damper/index.html#overview","title":"Overview","text":"

    The mass spring damper digital twin (DT) comprises two mass spring dampers and demonstrates how a co-simulation based DT can be used within DTaaS.

    "},{"location":"user/examples/mass-spring-damper/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/mass-spring-damper/index.html#example-structure","title":"Example Structure","text":"

    There are two simulators included in the study, each representing a mass spring damper system. The first simulator calculates the mass displacement and speed of for a given force acting on mass . The second simulator calculates force given a displacement and speed of mass . By coupling these simulators, the evolution of the position of the two masses is computed.

    "},{"location":"user/examples/mass-spring-damper/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses two models and one tool. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Models MassSpringDamper1.fmu Private Yes MassSpringDamper2.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

    The co-sim.json and time.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

    "},{"location":"user/examples/mass-spring-damper/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute Produces and stores output in data/mass-spring-damper/output directory Clean Clears run logs and outputs"},{"location":"user/examples/mass-spring-damper/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/mass-spring-damper\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/mass-spring-damper/index.html#create","title":"Create","text":"

    Installs Open Java Development Kit 17 in the workspace.

    lifecycle/create\n
    "},{"location":"user/examples/mass-spring-damper/index.html#execute","title":"Execute","text":"

    Run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the two FMU models.

    lifecycle/execute\n
    "},{"location":"user/examples/mass-spring-damper/index.html#examine-the-results","title":"Examine the results","text":"

    The results can be found in the /workspace/examples/data/mass-spring-damper/output directory.

    You can also view run logs in the /workspace/examples/digital_twins/mass-spring-damper.

    "},{"location":"user/examples/mass-spring-damper/index.html#terminate-phase","title":"Terminate phase","text":"

    Terminate to clean up the debug files and co-simulation output files.

    lifecycle/terminate\n
    "},{"location":"user/examples/mass-spring-damper/index.html#references","title":"References","text":"

    More information about co-simulation techniques and mass spring damper case study are available in:

    Gomes, Cl\u00e1udio, et al. \"Co-simulation: State of the art.\"\narXiv preprint arXiv:1702.00686 (2017).\n

    The source code for the models used in this DT are available in mass spring damper github repository.

    "},{"location":"user/examples/mass-spring-damper-monitor/index.html","title":"Mass Spring Damper with NuRV Runtime Monitor","text":""},{"location":"user/examples/mass-spring-damper-monitor/index.html#overview","title":"Overview","text":"

    This digital twin is derives from te Mass String Damper digital twin.

    The mass spring damper digital twin (DT) comprises two mass spring dampers and demonstrates how a co-simulation based DT can be used within DTaaS. This version of the example is expanded with a monitor generated by NuRV. More information about NuRV is available here.

    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/mass-spring-damper-monitor/index.html#example-structure","title":"Example Structure","text":"

    There are two simulators included in the study, each representing a mass spring damper system. The first simulator calculates the mass displacement and speed of for a given force acting on mass . The second simulator calculates force given a displacement and speed of mass . By coupling these simulators, the evolution of the position of the two masses is computed.

    Additionally, a monitor is inserted in the simulation to check at runtime whether the displacement of the two masses stays below a maximum threshold.

    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses two models and one tool. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Models MassSpringDamper1.fmu Private Yes MassSpringDamper2.fmu Private Yes m2.fmu Private No RtI.fmu Private Yes Specification m2.smv Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

    The co-sim.json and time.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro toolGenerates and compiles the monitor FMU Execute Produces and stores output in data/mass-spring-damper-monitor/output directory Clean Clears run logs and outputs"},{"location":"user/examples/mass-spring-damper-monitor/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/mass-spring-damper-monitor\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#create","title":"Create","text":"
    • Installs Open Java Development Kit 17 in the workspace.
    • Generates and compiles the monitor FMU from the NuRV specification
    lifecycle/create\n
    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#execute","title":"Execute","text":"

    Run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the two FMU models.

    lifecycle/execute\n
    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#analyze-phase","title":"Analyze phase","text":"

    Process the output of co-simulation to produce a plot at: /workspace/examples/data/mass-spring-damper-monitor/output/plots.

    lifecycle/analyze\n

    A sample plot is given here.

    In the plot, three color-coded indicators are used to represent different values. The blue line shows the distance between the two masses, while the green indicates the monitor's verdict. A red dashed line serves as a reference point, marking the distance checked by the monitor. Since the distance of the masses is always below the threshold, the output of the monitor is fixed to unknown (0).

    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#examine-the-results","title":"Examine the results","text":"

    The results can be found in the /workspace/examples/data/mass-spring-damper-monitor/output directory.

    You can also view run logs in the /workspace/examples/digital_twins/mass-spring-damper-monitor.

    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#terminate-phase","title":"Terminate phase","text":"

    Terminate to clean up the debug files and co-simulation output files.

    lifecycle/terminate\n
    "},{"location":"user/examples/mass-spring-damper-monitor/index.html#references","title":"References","text":"

    More information about co-simulation techniques and mass spring damper case study are available in:

    Gomes, Cl\u00e1udio, et al. \"Co-simulation: State of the art.\"\narXiv preprint arXiv:1702.00686 (2017).\n

    The source code for the models used in this DT are available in mass spring damper github repository.

    "},{"location":"user/examples/o5g/index.html","title":"Firefighter Mission in a Burning Building","text":"

    In an firefighter mission it is important to monitor the oxygen levels of each firefighters Self Contained Breating Aparatus (SCBA) in context of their mission.

    "},{"location":"user/examples/o5g/index.html#physical-twin-overview","title":"Physical Twin Overview","text":"

    Image: Schematic overview of a firefighter mission. Note the mission commander on the lower left documenting the air supply pressure levels provided by radio communication from the firefighters inside and around the burning building. This image was created with the assistance of DALL\u00b7E.

    We assume the following scenario:

    • a set of firefighters work to extinguish a burning building
    • they each use an SCBA with pressurised oxygen to breath
    • a mission commander on the outside coordinates the efforts and surveills the oxygen levels
    "},{"location":"user/examples/o5g/index.html#digital-twin-overview","title":"Digital Twin Overview","text":"

    In this example a monitor is implemented, that calculates how much time the firefighers have left, until they need to leave the building. To that end, the inputs used are:

    • 3D-model of the building in which the mission takes place,
    • pressure data of a firefighters SCBA and
    • firefighters location inside of the building

    are used to estimate:

    • the shortest way out,
    • how much time this will need and
    • how much time is left until all oxygen from the SCBA is used up.

    The remaining mission time is monitored and the firefighter receive a warning if it drops under a certain threshold.

    This example is an implementation of the the paper Digital Twin for Rescue Missions--a Case Study by Leucker et al.

    "},{"location":"user/examples/o5g/index.html#quick-check","title":"Quick Check","text":"

    Before runnnig this example please make sure the following files are at the correct locations:

    /workspace/examples/\n   data/o5g/input/\n      runTessla.sh\n      sensorSimulation.py\n      telegraf.conf\n\n   models/\n    lab.ifc\n    makefmu.mos\n      PathOxygenEstimate.mo\n\n  tools/\n    graphToPath.py\n    ifc_to_graph\n    pathToTime.py\n    tessla-telegraf-connector/\n    tessla-telegraf-connector/\n      tessla.jar\n      specification.tessla (run-time specification)\n\n   digital_twins/o5g/\n      main.py\n      config\n      lifecycle/ (scripts)\n
    "},{"location":"user/examples/o5g/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    All configuration for this example is contained in digital_twins/o5g/config.

    To use the MQTT-Server, account information needs to be provided. The topics are set to their default values, which allow the DT to access the mock physical twins sensor metrics and to send back alerts.

    export O5G_MQTT_SERVER=\nexport O5G_MQTT_PORT=\nexport O5G_MQTT_USER=\nexport O5G_MQTT_PASS=\n\nexport O5G_MQTT_TOPIC_SENSOR='vgiot/ue/metric'\nexport O5G_MQTT_TOPIC_AIR_PREDICTION='vgiot/dt/prediction'\nexport O5g_MQTT_TOPIC_ALERT='vgiot/dt/alerts'\n

    This example uses InfuxDB as a data storage, which will need to be configured to use your Access data. The following configuration steps are needed:

    • Log into the InfluxDB Web UI
    • Obtain org name (is below your username in the sidebar)
    • Create a data bucket if you don't have one already in Load Data -> Buckets
    • Create an API access token in Load Data -> API Tokens, Copy and save this token somewhere immediately, you can not access it later!
    export O5G_INFLUX_SERVER=\nexport O5G_INFLUX_PORT=\nexport O5G_INFLUX_TOKEN=\nexport O5G_INFLUX_ORG=\nexport O5G_INFLUX_BUCKET=\n
    "},{"location":"user/examples/o5g/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

    The lifecycles that are covered include:

    Lifecycle Phase Completed Tasks Install Installs Open Modelica, Rust, Telegraf and the required pip dependencies Create Create FMU from Open Modelica file Execute Execute the example in the background tmux terminal session Terminate Terminate the tmux terminal session running in the background Clean Delete the temporary files"},{"location":"user/examples/o5g/index.html#run-the-example","title":"Run the example","text":""},{"location":"user/examples/o5g/index.html#install","title":"Install","text":"

    Run the install script by executing

    lifecycle/install\n

    This will install all the required dependencies from apt and pip, as well as Open Modelica, Rust, Telegraf and the required pip dependencies from their respective repos.

    "},{"location":"user/examples/o5g/index.html#create","title":"Create","text":"

    Run the create script by executing

    lifecycle/create\n

    This will compile the modelica model to an Functional Mockup Unit (FMU) for the correct platform.

    "},{"location":"user/examples/o5g/index.html#exceute","title":"Exceute","text":"

    To run the Digital Twin execute

    lifecycle/execute\n

    This will start all the required components in a single tmux session called o5g in the background. To view the running Digital Twin attatch to this tmux session by executing

    tmux a -t o5g\n

    To detatch press Ctrl-b followed by d.

    The tmux session contains 4 components of the digital twin:

    Panel location Purpose Top Left Sensor simulator generating random location and O2-level data Top Right Main Digital Twin receives the sensor data and calculates an estimate of how many minutes of air remain Bottom Left Telegraf to convert between different message formats, also displays all messages between components Bottom Right TeSSLa monitor raises an alarm, if the remaining time is to low."},{"location":"user/examples/o5g/index.html#examine-the-results","title":"Examine the Results","text":"

    For additional mission awareness, we recommend utilising the Influx data visualisation. We provide a dashboard configuration in the file influx-dashoard.json. Log in to your Influx Server to import (usually port 8086). A screenshot of the dashboard is given here.

    The data gets stored in o5g->prediction->air-remaining->37ae3e4fb3ea->true->vgiot/dt/prediction variable of the InfluxDB. In addition to importing dashboard configuration given above, it is possible to create your custom dashboards using the stored data.

    "},{"location":"user/examples/o5g/index.html#terminate","title":"Terminate","text":"

    To stop the all components and close the tmux session execute

    lifecycle/terminate\n
    "},{"location":"user/examples/o5g/index.html#clean","title":"Clean","text":"

    To remove temoporary files created during execution

    lifecycle/clean\n
    "},{"location":"user/examples/opc-ua-waterplant/index.html","title":"Waste Water Plant with OPC-UA","text":""},{"location":"user/examples/opc-ua-waterplant/index.html#introduction","title":"Introduction","text":"

    Waste water treatment (WWT) plants must comply with substance and species concentration limits established by regulation in order to ensure the good quality of the water. This is usually done taking periodic samples that are analyzed in the laboratory. This means that plant operators do not have continuous information for making decisions and, therefore, operation setpoints are set to higher values than needed to guarantee water quality. Some of the processes involved in WWT plants consume a lot of power, thus adjusting setpoints could significantly reduce energy consumption.

    "},{"location":"user/examples/opc-ua-waterplant/index.html#physical-twin-overview","title":"Physical Twin Overview","text":"

    This example demonstrates the communication between a physical ultraviolet (UV) disinfection process (the tertiary treatment of a WWT plant) and its digital twin, which is based on Computational Fluid Dynamics (CFD) and compartment models. The aim of this digital twin is to develop \"virtual sensors\" that provide continuous information that facilitates the decision making process for the plant operator.

    The physical twin of the waste water plant is composed of an ultraviolet channel controlled by a PLC that controls the power of the UV lamps needed to kill all the pathogens of the flow. The channel has 3 groups of UV lamps, therefore the real channel (and is mathematical model) is subdivided into 7 zones: 4 correspond to zones without UV lamps (2 for the entrance and exit of the channel + 2 zones between UV lamps) and the 3 reamaining for the UV lamps.

    The dose to be applied (related with the power) changes according to the residence time (computed from the measure of the volume flow) and the UV intensity (measured by the intensity sensor).

    The information of the volumetric flow and power (in the three parts of the channel) is transmitted to the PLC of the plant. Furthermore, the PLC is working as OPC UA Server to send and receive data to and from an OPC UA Client. Additionally, some sizing parameters and initial values are read from a spreadsheet filled in by the plant operator. In this case, the spreadsheet is an Open Office file (.ods) due to the software installed in the SCADA PC. Some of the variables like initial concentration of disinfectant and pathogens are included, among others. Some values defined by the plant operator correspond to input signals that are not currently being measured, but are expected to be measured in the future.

    "},{"location":"user/examples/opc-ua-waterplant/index.html#digital-twin-overview","title":"Digital Twin Overview","text":"

    The digital twin is a reduced model (developed in C)\u00a0that solves physical conservation laws (mass, energy and momentum), but simplifies details (geometry, mainly) to ensure real-time calculations and accurate results. The results are compared to the ones obtained by the CFD. C solver developed is used by the OpenModelica\u00a0model. OpenModelica converts\u00a0it into the FMI standard, to be integrated in the OPC UA Client (client-opcua.py).

    "},{"location":"user/examples/opc-ua-waterplant/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"Asset Type Name of Asset Visibility Reuse in Other Examples Model Test_DTCONEDAR.mo private No Data configuration_freopcua.ods private No model_description.csv (generated by client-asyncua.py) private No Mock OPC UA Server: opcua-mock-server.py private No Tool OPC UA Client: client-opcua.py private No FMU builder: create-fmu.mos private No

    In this example, a dummy model representation of the plant is used, instead of the real model. The simplified model (with not the real equations) is developed in Open Modelica (Test_DTCONEDAR.mo). The FMU is generated from the Open Modelica interface to obtain the needed binaries to run the FMU. It is possible to run an FMU previously generated, however, to ensure that we are using the right binaries it is recommended to install Open Modelica Compiler and run script.mos to build the FMU from the Modelica file Test_DTCONEDAR.mo.

    The FMU model description file (modelDescription.xml file inside Test_DTCONEDAR.fmu) has the information of the value references configuration_freeopcua.ods has the information of the OPC-UA node IDs And both have in common the variable name

    The client python script (client-opcua.py) does the following actions:

    • Reads the variable names and the variable value references from the model description file of the Test_DTCONEDAR.FMU.
    • Reads configuration_freeopcua.ods to obtain opcua node IDs and assigns those node IDs to the variables read from the FMU
    • Read configuration_freeopcua.ods to fix initial values, parameters and some inputs (those inputs that are not being measured, a reasonable value is assumed).
    • Read values from PLC using a client OPC.
    • Execute the algorithm with the FMPy library using the .fmu created from the compartment model (based on CFD)

    • Obtain results.

    • Send by OPC UA protocol the result values to the PLC, to visualize them in the SCADA and with the aim to improve the decision-making process of the plant operator.
    "},{"location":"user/examples/opc-ua-waterplant/index.html#input-data-variables","title":"Input Data Variables","text":"

    The configuration_freeopcua.ods date file is used for customizing the initial input data values used by the server.

    "},{"location":"user/examples/opc-ua-waterplant/index.html#dt-config","title":"DT Config","text":"

    The config.json specifies the configuration parameters for the OPC UA client.

    Optional parameters can be modified:

    • stop_time
    • step_size
    • record = True, if we want to save the results of the simulation
    • record_interval. Sometimes the simulation step_size is small and a the size of the results file can be too big. For instance, if the simulation step_size is 0.01 seconds, we can increase the record_interval so as to reduce the result file size.
    • record_variables: we can specify the list of variables that we want to record.
    • enable_send = True, if we want to send results to the OPC UA Server.
    "},{"location":"user/examples/opc-ua-waterplant/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

    The lifecycles that are covered include:

    Lifecycle Phase Completed Tasks Install Installs Open Modelica, Python 3.10 and the required pip dependencies Create Create FMU from Open Modelica file Execute Run OPC UA mock server and normal OPC-UA client Clean Delete the temporary files"},{"location":"user/examples/opc-ua-waterplant/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital twins/opc-ua-waterplant\n

    If required, change the execute permission of lifecycle scripts.

    chmod +x lifecycle/*\n

    Now, run the following scripts:

    "},{"location":"user/examples/opc-ua-waterplant/index.html#install","title":"Install","text":"

    Installs Open Modelica, Python 3.10 and the required pip dependencies

    lifecycle/install\n
    "},{"location":"user/examples/opc-ua-waterplant/index.html#create","title":"Create","text":"

    Create Test_DTCONEDAR.fmu co-simulation model from `Test_DTCONEDAR.mo open modelica file.

    lifecycle/create\n
    "},{"location":"user/examples/opc-ua-waterplant/index.html#execute","title":"Execute","text":"

    Start the mock OPC UA server in the background. Run the OPC UA client.

    lifecycle/execute\n
    "},{"location":"user/examples/opc-ua-waterplant/index.html#clean","title":"Clean","text":"

    Remove the temporary files created by Open Modelica and output files generated by OPC UA client.

    lifecycle/clean\n
    "},{"location":"user/examples/opc-ua-waterplant/index.html#references","title":"References","text":"

    More explanation about this example is available at:

    Royo, L., Labar\u00edas, A., Arnau, R., G\u00f3mez, A., Ezquerra, A., Cilla, I., &\nD\u00edez-Anto\u00f1azas, L. (2023). Improving energy efficiency in the tertiary\ntreatment of Alguazas WWTP (Spain) by means of digital twin development\nbased on Physics modelling . Cambridge Open Engage.\n[doi:10.33774/coe-2023-1vjcw](https://doi.org/10.33774/coe-2023-1vjcw)\n
    "},{"location":"user/examples/opc-ua-waterplant/index.html#acknowledgements","title":"Acknowledgements","text":"

    The work on this example was done in a project subsidised thanks to the support grants for Agrupaci\u00f3n Empresarial Innovadora (AEI) of the Ministry of Industry, Trade and Tourism (MINCOTUR) with the aim of improving the competitiveness of small and medium-sized enterprises within the Recovery, Transformation and Resilience Plan (PRTR) financed by the Next Generation EU (NGEU) funds, with Grant Number: AEI-010500-2022b-196.

    "},{"location":"user/examples/three-tank/index.html","title":"Three-Tank System Digital Twin","text":""},{"location":"user/examples/three-tank/index.html#overview","title":"Overview","text":"

    The three-tank system is a simple case study allows us to represent a system that is composed of three individual components that are coupled in a cascade as follows: The first tank is connected to the input of the second tank, and the output of the second tank is connected to the input of the third tank.

    This example contains only the simulated components for demonstration purposes; therefore, there is no configuration for the connection with the physical system.

    The three-tank system case study is managed using the DTManager, which is packed as a jar library in the tools, and run from a java main file. The DTManager uses Maestro as a slave for co-simulation, so it generates the output of the co-simulation.

    The main file can be changed according to the application scope, i.e., the /workspace/examples/tools/three-tank/TankMain.java can be manipulated to get a different result.

    The /workspace/examples/models/three-tank/ folder contains the Linear.fmu file, which is a non-realistic model for a tank with input and output and the TankSystem.aasx file for the schema representation with Asset Administration Shell. The three instances use the same .fmu file and the same schema due to being of the same object class. The DTManager is in charge of reading the values from the co-simulation output.

    "},{"location":"user/examples/three-tank/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/three-tank/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses two models, two tools, one data, and one script. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Model Linear.fmu Private No TankSystem.aasx Private No Tool DTManager-0.0.1-Maestro.jar (wraps Maestro) Common Yes maestro-2.3.0-jar-with-dependencies.jar (used by DTManager) Common Yes TankMain.java (main script) Private No Data outputs.csv Private No

    This DT has multiple configuration files. The coe.json and multimodel.json are used by Maestro tool. The tank1.conf, tank2.conf and tank3.conf are the config files for three different instances of one model (Linear.fmu).

    "},{"location":"user/examples/three-tank/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

    The lifecycles that are covered include:

    Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute The DT Manager executes the three-tank digital twin and produces output in data/three-tank/output directory Terminate Terminating the background processes and cleaning up the output"},{"location":"user/examples/three-tank/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital twins/three-tank\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/three-tank/index.html#create","title":"Create","text":"

    Installs Open Java Development Kit 11 and pip dependencies. Also creates DTManager tool (DTManager-0.0.1-Maestro.jar) from source code.

    lifecycle/create\n
    "},{"location":"user/examples/three-tank/index.html#execute","title":"Execute","text":"

    Execute the three-tank digital twin using DTManager. DTManager in-turn runs the co-simulation using Maestro. Generates the co-simulation output.csv file at /workspace/examples/data/three-tank/output.

    lifecycle/execute\n
    "},{"location":"user/examples/three-tank/index.html#terminate","title":"Terminate","text":"

    Stops the Maestro running in the background. Also stops any other jvm process started during execute phase.

    lifecycle/terminate\n
    "},{"location":"user/examples/three-tank/index.html#clean","title":"Clean","text":"

    Removes the output generated during execute phase.

    lifecycle/terminate\n
    "},{"location":"user/examples/three-tank/index.html#examining-the-results","title":"Examining the results","text":"

    Executing this Digital Twin will generate a co-simulation output, but the results can also be monitored from updating the/workspace/examples/tools/three-tank/TankMain.java with a specific set of getAttributeValue commands, such as shown in the code.

    That main file enables the online execution of the Digital Twin and its internal components.

    The output of the co-simulation is generated to the /workspace/examples/data/three-tank/output folder.

    In the default example, the co-simulation is run for 10 seconds in steps of 0.5 seconds. This can be modified for a longer period and different step size. The output stored in outputs.csv contains the level, in/out flow, and leak values.

    No data from the physical twin are generated/used.

    "},{"location":"user/examples/three-tank/index.html#references","title":"References","text":"

    More information about the DT Manager is available at:

    D. Lehner, S. Gil, P. H. Mikkelsen, P. G. Larsen and M. Wimmer,\n\"An Architectural Extension for Digital Twin Platforms to Leverage\nBehavioral Models,\" 2023 IEEE 19th International Conference on\nAutomation Science and Engineering (CASE), Auckland, New Zealand,\n2023, pp. 1-8, doi: 10.1109/CASE56687.2023.10260417.\n
    "},{"location":"user/examples/water_tank_FI/index.html","title":"Water Tank Fault Injection","text":""},{"location":"user/examples/water_tank_FI/index.html#overview","title":"Overview","text":"

    This example shows a fault injection (FI) enabled digital twin (DT). A live DT is subjected to simulated faults received from the environment. The simulated faults is specified as part of DT configuration and can be changed for new instances of DTs.

    In this co-simulation based DT, a watertank case-study is used; co-simulation consists of a tank and controller. The goal of which is to keep the level of water in the tank between Level-1 and Level-2. The faults are injected into output of the water tank controller (Watertankcontroller-c.fmu) from 12 to 20 time units, such that the tank output is closed for a period of time, leading to the water level increasing in the tank beyond the desired level (Level-2).

    "},{"location":"user/examples/water_tank_FI/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/water_tank_FI/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/water_tank_FI/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses two models and one tool. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Models watertankcontroller-c.fmu Private Yes singlewatertank-20sim.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

    The multimodelFI.json and simulation-config.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

    The faults are defined in wt_fault.xml.

    "},{"location":"user/examples/water_tank_FI/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute Produces and stores output in data/water_tank_FI/output directory Clean Clears run logs and outputs"},{"location":"user/examples/water_tank_FI/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/water_tank_FI\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/water_tank_FI/index.html#create","title":"Create","text":"

    Installs Open Java Development Kit 17 and pip dependencies. The pandas and matplotlib are the pip dependencies installated.

    lifecycle/create\n
    "},{"location":"user/examples/water_tank_FI/index.html#execute","title":"Execute","text":"

    Run the co-simulation. Generates the co-simulation output.csv file at /workspace/examples/data/water_tank_FI/output.

    lifecycle/execute\n
    "},{"location":"user/examples/water_tank_FI/index.html#analyze-phase","title":"Analyze phase","text":"

    Process the output of co-simulation to produce a plot at: /workspace/examples/data/water_tank_FI/output/plots/.

    lifecycle/analyze\n
    "},{"location":"user/examples/water_tank_FI/index.html#examine-the-results","title":"Examine the results","text":"

    The results can be found in the /workspace/examples/data/water_tank_FI/output directory.

    You can also view run logs in the /workspace/examples/digital_twins/water_tank_FI.

    "},{"location":"user/examples/water_tank_FI/index.html#terminate-phase","title":"Terminate phase","text":"

    Clean up the temporary files and delete output plot

    lifecycle/terminate\n
    "},{"location":"user/examples/water_tank_FI/index.html#references","title":"References","text":"

    More details on this case-study can be found in the paper:

    M. Frasheri, C. Thule, H. D. Macedo, K. Lausdahl, P. G. Larsen and\nL. Esterle, \"Fault Injecting Co-simulations for Safety,\"\n2021 5th International Conference on System Reliability and Safety (ICSRS),\nPalermo, Italy, 2021.\n

    The fault-injection plugin is an extension to the Maestro co-orchestration engine that enables injecting inputs and outputs of FMUs in an FMI-based co-simulation with tampered values. More details on the plugin can be found in fault injection git repository. The source code for this example is also in the same github repository in a example directory.

    "},{"location":"user/examples/water_tank_FI_monitor/index.html","title":"Water Tank Fault Injection with NuRV Runtime Monitor","text":""},{"location":"user/examples/water_tank_FI_monitor/index.html#overview","title":"Overview","text":"

    This example shows a fault injection (FI) enabled digital twin (DT). A live DT is subjected to simulated faults received from the environment. The simulated faults is specified as part of DT configuration and can be changed for new instances of DTs. This version of the example is expanded with a monitor generated by NuRV. More information about NuRV is available here.

    In this co-simulation based DT, a watertank case-study is used; co-simulation consists of a tank and controller. The goal of which is to keep the level of water in the tank between Level-1 and Level-2. The faults are injected into output of the water tank controller (Watertankcontroller-c.fmu) from 12 to 20 time units, such that the tank output is closed for a period of time, leading to the water level increasing in the tank beyond the desired level (Level-2). Additionally, a monitor is inserted in the simulation to check at runtime whether the level of the water stays below a maximum threshold.

    "},{"location":"user/examples/water_tank_FI_monitor/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/water_tank_FI_monitor/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/water_tank_FI_monitor/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

    This example uses two models and one tool. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Models watertankcontroller-c.fmu Private Yes singlewatertank-20sim.fmu Private Yes m1.fmu Private No RtI.fmu Private Yes Specification m1.smv Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

    The multimodelFI.json and simulation-config.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

    The faults are defined in wt_fault.xml.

    "},{"location":"user/examples/water_tank_FI_monitor/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro toolGenerates and compiles the monitor FMU Execute Produces and stores output in data/water_tank_FI_monitor/output directory Clean Clears run logs and outputs"},{"location":"user/examples/water_tank_FI_monitor/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/water_tank_FI_monitor\n

    If required, change the execute permission of lifecycle scripts you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/water_tank_FI_monitor/index.html#create","title":"Create","text":"

    Installs Open Java Development Kit 17 and pip dependencies. The pandas and matplotlib are the pip dependencies installated. The monitor FMU from the NuRV specification is generated and compiled.

    lifecycle/create\n
    "},{"location":"user/examples/water_tank_FI_monitor/index.html#execute","title":"Execute","text":"

    Run the co-simulation. Generates the co-simulation output.csv file at /workspace/examples/data/water_tank_FI_monitor/output.

    lifecycle/execute\n
    "},{"location":"user/examples/water_tank_FI_monitor/index.html#analyze-phase","title":"Analyze phase","text":"

    Process the output of co-simulation to produce a plot at: /workspace/examples/data/water_tank_FI_monitor/output/plots/.

    lifecycle/analyze\n

    A sample plot is given here.

    In the plot, four color-coded indicators are used to represent different values. The blue line shows the water tank level, while orange represents the control output and green indicates the monitor's verdict. A red dashed line serves as a reference point, marking the level checked by the monitor. As the water level exceeds this threshold, the monitor's verdict changes from unknown (0) to false (2).

    "},{"location":"user/examples/water_tank_FI_monitor/index.html#examine-the-results","title":"Examine the results","text":"

    The results can be found in the /workspace/examples/data/water_tank_FI_monitor/output directory.

    You can also view run logs in the /workspace/examples/digital_twins/water_tank_FI_monitor.

    "},{"location":"user/examples/water_tank_FI_monitor/index.html#terminate-phase","title":"Terminate phase","text":"

    Clean up the temporary files and delete output plot

    lifecycle/terminate\n
    "},{"location":"user/examples/water_tank_FI_monitor/index.html#references","title":"References","text":"

    More details on this case-study can be found in the paper:

    M. Frasheri, C. Thule, H. D. Macedo, K. Lausdahl, P. G. Larsen and\nL. Esterle, \"Fault Injecting Co-simulations for Safety,\"\n2021 5th International Conference on System Reliability and Safety (ICSRS),\nPalermo, Italy, 2021.\n

    The fault-injection plugin is an extension to the Maestro co-orchestration engine that enables injecting inputs and outputs of FMUs in an FMI-based co-simulation with tampered values. More details on the plugin can be found in fault injection git repository. The source code for this example is also in the same github repository in a example directory.

    "},{"location":"user/examples/water_tank_swap/index.html","title":"Water Tank Model Swap","text":""},{"location":"user/examples/water_tank_swap/index.html#overview","title":"Overview","text":"

    This example shows multi-stage execution and dynamic reconfiguration of a digital twin (DT). Two features of DTs are demonstrated here:

    • Fault injection into live DT
    • Dynamic auto-reconfiguration of live DT

    The co-simulation methodology is used to construct this DT.

    "},{"location":"user/examples/water_tank_swap/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/water_tank_swap/index.html#configuration-of-assets","title":"Configuration of assets","text":"

    This example uses four models and one tool. The specific assets used are:

    Asset Type Names of Assets Visibility Reuse in Other Examples Models Watertankcontroller-c.fmu Private Yes Singlewatertank-20sim.fmu Private Yes Leak_detector.fmu Private No Leak_controller.fmu Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

    This DT has many configuration files. The DT is executed in two stages. There exist separate DT configuration files for each stage. The following table shows the configuration files and their purpose.

    Configuration file name Execution Stage Purpose mm1. json stage-1 DT configuration wt_fault.xml, FaultInject.mabl stage-1 faults injected into DT during stage-1 mm2.json stage-2 DT configuration simulation-config.json Both stages Configuration for specifying DT execution time and output logs"},{"location":"user/examples/water_tank_swap/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute Produces and stores output in data/water_tank_swap/output directory Analyze Process the co-simulation output and produce plots Clean Clears run logs, outputs and plots"},{"location":"user/examples/water_tank_swap/index.html#run-the-example","title":"Run the example","text":"

    To run the example, change your present directory.

    cd /workspace/examples/digital_twins/water_tank_swap\n

    If required, change the permission of files you need to execute, for example:

    chmod +x lifecycle/create\n

    Now, run the following scripts:

    "},{"location":"user/examples/water_tank_swap/index.html#create","title":"Create","text":"

    Installs Open Java Development Kit 17 and pip dependencies. The matplotlib pip package is also installated.

    lifecycle/create\n
    "},{"location":"user/examples/water_tank_swap/index.html#execute","title":"Execute","text":"

    This DT has two-stage execution. In the first-stage, a co-simulation is executed. The Watertankcontroller-c.fmu and Singlewatertank-20sim.fmu models are used to execute the DT. During this stage, faults are injected into one of the models (Watertankcontroller-c.fmu) and the system performance is checked.

    In the second-stage, another co-simulation is run in which three FMUs are used. The FMUs used are: watertankcontroller, singlewatertank-20sim, and leak_detector. There is an in-built monitor in the Maestro tool. This monitor is enabled during the stage and a swap condition is set at the beginning of the second-stage. When the swap condition is satisfied, the Maestro swaps out Watertankcontroller-c.fmu model and swaps in Leakcontroller.fmu model. This swapping of FMU models demonstrates the dynamic reconfiguration of a DT.

    The end of execution phase generates the co-simulation output.csv file at /workspace/examples/data/water_tank_swap/output.

    lifecycle/execute\n
    "},{"location":"user/examples/water_tank_swap/index.html#analyze-phase","title":"Analyze phase","text":"

    Process the output of co-simulation to produce a plot at: /workspace/examples/data/water_tank_FI/output/plots/.

    lifecycle/analyze\n
    "},{"location":"user/examples/water_tank_swap/index.html#examine-the-results","title":"Examine the results","text":"

    The results can be found in the workspace/examples/data/water_tank_swap/output directory.

    You can also view run logs in the workspace/examples/digital_twins/water_tank_swap.

    "},{"location":"user/examples/water_tank_swap/index.html#terminate-phase","title":"Terminate phase","text":"

    Clean up the temporary files and delete output plot

    lifecycle/terminate\n
    "},{"location":"user/examples/water_tank_swap/index.html#references","title":"References","text":"

    The complete source of this example is available on model swap github repository.

    The runtime model (FMU) swap mechanism demonstrated by the experiment is detailed in the paper:

    Ejersbo, Henrik, et al. \"fmiSwap: Run-time Swapping of Models for\nCo-simulation and Digital Twins.\" arXiv preprint arXiv:2304.07328 (2023).\n

    The runtime reconfiguration of co-simulation by modifying the Functional Mockup Units (FMUs) used is further detailed in the paper:

    Ejersbo, Henrik, et al. \"Dynamic Runtime Integration of\nNew Models in Digital Twins.\" 2023 IEEE/ACM 18th Symposium on\nSoftware Engineering for Adaptive and Self-Managing Systems\n(SEAMS). IEEE, 2023.\n
    "},{"location":"user/servers/execution/runner/index.html","title":"Runner","text":"

    A utility service to manage safe execution of remote scripts / commands. User launches this from commandline and let the utility manage the commands to be executed.

    The runner utility runs as a service and provides REST API interface to safely execute remote commands. Multiple runners can be active simultaneously on one computer. The commands are sent via the REST API and are executed on the computer with active runner.

    "},{"location":"user/servers/execution/runner/index.html#install","title":"Install","text":""},{"location":"user/servers/execution/runner/index.html#npm-registry","title":"NPM Registry","text":"

    The package is available on npmjs.

    Install the package with the following command:

    sudo npm install -g @into-cps-association/runner\n
    "},{"location":"user/servers/execution/runner/index.html#github-registry","title":"Github Registry","text":"

    The package is available in Github packages registry.

    Set the registry and install the package with the following commands

    sudo npm config set @into-cps-association:registry https://npm.pkg.github.com\nsudo npm install -g @into-cps-association/runner\n

    The npm install command asks for username and password. The username is your Github username and the password is your Github personal access token. In order for the npm to download the package, your personal access token needs to have read:packages scope.

    "},{"location":"user/servers/execution/runner/index.html#configure","title":"Configure","text":"

    The utility requires config specified in YAML format. The template configuration file is:

    port: 5000\nlocation: 'script' #directory location of scripts\ncommands: #list of permitted scripts\n  - create\n  - execute\n  - terminate\n

    It is suggested that the configuration file be named as runner.yaml and placed in the directory in which the runner microservice is run.

    The location refers to the relative location of the scripts directory with respect to the location of runner.yaml file.

    However, there is no limitation on either the configuration filename or the location. The path to runner.yaml can either be relative or absolute path. However, the location path is always relative path with respect to the path of runner.yaml file.

    The commands must be executable. Please make sure that the commands have execute permission on Linux platforms.

    "},{"location":"user/servers/execution/runner/index.html#create-commands","title":"Create Commands","text":"

    The runner requires commands / scripts to be run. These need to be placed in the location specified in runner.yaml file. The location must be relative to the directory in which the runner microservice is being run.

    "},{"location":"user/servers/execution/runner/index.html#use","title":"Use","text":"

    Display help.

    $runner -h\nUsage: runner [options]\n\nRemote code execution for humans\n\nOptions:\n  -v --version          package version\n  -c --config <string>  runner config file specified in yaml format (default: \"runner.yaml\")\n  -h --help             display help\n

    The config option is not mandatory. If it is not used, runner looks for runner.yaml in the directory from which it is being run. Once launched, the utility runs at the port specified in runner.yaml file.

    runner  #use runner.yaml of the present working directory\nrunner -c FILE-PATH       #absolute or relative path to config file\nrunner --config FILE-PATH #absolute or relative path to config file\n

    If launched on one computer, you can access the same at http://localhost:<port>.

    Access to the service on network is available at http://<ip or hostname>:<port>/.

    "},{"location":"user/servers/execution/runner/index.html#application-programming-interface-api","title":"Application Programming Interface (API)","text":"

    Three REST API methods are active. The route paths and the responses given for these two sources are:

    REST API Route HTTP Method Return Value Comment localhost:port POST Returns the execution status of command Executes the command provided. Each invocation appends to array of commands executed so far. localhost:port GET Returns the execution status of the last command sent via POST request. localhost:port/history GET Returns the array of POST requests received so far."},{"location":"user/servers/execution/runner/index.html#post-request-to","title":"POST Request to /","text":"

    Executes a command. The command name given here must exist in location directory.

    Valid HTTP RequestHTTP Response - Valid CommandHTTP Response - Inalid Command
    POST / HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 388\n\n{\n  \"name\": \"<command-name>\"\n}\n
    Connection: close\nContent-Length: 134\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"status\": \"success\"\n}\n
    Connection: close\nContent-Length: 28\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"status\": \"invalid command\"\n}\n
    "},{"location":"user/servers/execution/runner/index.html#get-request-to","title":"GET Request to /","text":"

    Shows the status of the command last executed.

    Valid HTTP RequestHTTP Response - Valid CommandHTTP Response - Inalid Command
    GET / HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 388\n\n{\n  \"name\": \"<command-name>\"\n}\n
    Connection: close\nContent-Length: 134\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"name\": \"<command-name>\",\n  \"status\": \"valid\",\n  \"logs\": {\n    \"stdout\": \"<output log of command>\",\n    \"stderr\": \"<error log of command>\"\n  }\n}\n
    Connection: close\nContent-Length: 70\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"name\": \"<command-name\",\n  \"status\": \"invalid\",\n  \"logs\": {\n    \"stdout\": \"\",\n    \"stderr\": \"\"\n  }\n}\n
    "},{"location":"user/servers/execution/runner/index.html#get-request-to-history","title":"GET Request to /history","text":"

    Returns the array of POST requests received so far. Both valid and invalid commands are recorded in the history.

    [\n  {\n    \"name\": \"valid command\"\n  },\n  {\n    \"name\": \"valid command\"\n  },\n  {\n    \"name\": \"invalid command\"\n  }\n]\n
    "},{"location":"user/servers/lib/LIB-MS.html","title":"Library Microservice","text":"

    The lib microservice is responsible for handling and serving the contents of library assets of the DTaaS platform. It provides API endpoints for clients to query, and fetch these assets.

    This document provides instructions for using the library microservice.

    Please see assets for a suggested storage conventions of your library assets.

    Once the assets are stored in the library, they become available in user workspace.

    "},{"location":"user/servers/lib/LIB-MS.html#application-programming-interface-api","title":"Application Programming Interface (API)","text":"

    The lib microservice application provides services at two end points:

    GraphQL API Endpoint: http://foo.com/lib

    HTTP Endpoint: http://foo.com/lib/files

    "},{"location":"user/servers/lib/LIB-MS.html#http-protocol","title":"HTTP protocol","text":"

    Endpoint: localhost:PORT/lib/files

    This option needs to be enabled with -H http.json flag. The regular file upload and download options become available.

    Here are sample screenshots.

    "},{"location":"user/servers/lib/LIB-MS.html#graphql-protocol","title":"GraphQL protocol","text":"

    Endpoint: localhost:PORT/lib

    The http://foo.com/lib URL opens a graphql playground.

    You can check the query schema and try sample queries here. The graphql queries need to be sent as HTTP POST requests and get responses.

    The library microservice services two API calls:

    • Provide a list of contents for a directory
    • Fetch a file from the available files

    The API calls are accepted over GraphQL and HTTP API end points. The format of the accepted queries are:

    "},{"location":"user/servers/lib/LIB-MS.html#provide-list-of-contents-for-a-directory","title":"Provide list of contents for a directory","text":"

    To retrieve a list of files in a directory, use the following GraphQL query.

    Replace path with the desired directory path.

    send requests to: https://foo.com/lib

    "},{"location":"user/servers/lib/LIB-MS.html#graphql-query-for-list-of-contents","title":"GraphQL query for list of contents","text":"
    query {\n  listDirectory(path: \"user1\") {\n    repository {\n      tree {\n        blobs {\n          edges {\n            node {\n              name\n              type\n            }\n          }\n        }\n        trees {\n          edges {\n            node {\n              name\n              type\n            }\n          }\n        }\n      }\n    }\n  }\n}\n
    "},{"location":"user/servers/lib/LIB-MS.html#graphql-response-for-list-of-contents","title":"GraphQL response for list of contents","text":"
    {\n  \"data\": {\n    \"listDirectory\": {\n      \"repository\": {\n        \"tree\": {\n          \"blobs\": {\n            \"edges\": []\n          },\n          \"trees\": {\n            \"edges\": [\n              {\n                \"node\": {\n                  \"name\": \"common\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"data\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"digital twins\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"functions\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"models\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"tools\",\n                  \"type\": \"tree\"\n                }\n              }\n            ]\n          }\n        }\n      }\n    }\n  }\n}\n
    "},{"location":"user/servers/lib/LIB-MS.html#http-request-for-list-of-contents","title":"HTTP request for list of contents","text":"
    POST /lib HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 388\n\n{\n  \"query\":\"query {\\n  listDirectory(path: \\\"user1\\\") {\\n    repository {\\n      tree {\\n        blobs {\\n          edges {\\n            node {\\n              name\\n              type\\n            }\\n          }\\n        }\\n        trees {\\n          edges {\\n            node {\\n              name\\n              type\\n            }\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\"\n}\n
    "},{"location":"user/servers/lib/LIB-MS.html#http-response-for-list-of-contents","title":"HTTP response for list of contents","text":"
    HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: *\nConnection: close\nContent-Length: 306\nContent-Type: application/json; charset=utf-8\nDate: Tue, 26 Sep 2023 20:26:49 GMT\nX-Powered-By: Express\n{\"data\":{\"listDirectory\":{\"repository\":{\"tree\":{\"blobs\":{\"edges\":[]},\"trees\":{\"edges\":[{\"node\":{\"name\":\"data\",\"type\":\"tree\"}},{\"node\":{\"name\":\"digital twins\",\"type\":\"tree\"}},{\"node\":{\"name\":\"functions\",\"type\":\"tree\"}},{\"node\":{\"name\":\"models\",\"type\":\"tree\"}},{\"node\":{\"name\":\"tools\",\"type\":\"tree\"}}]}}}}}}\n
    "},{"location":"user/servers/lib/LIB-MS.html#fetch-a-file-from-the-available-files","title":"Fetch a file from the available files","text":"

    This query receives directory path and send the file contents to user in response.

    To check this query, create a file files/user2/data/welcome.txt with content of hello world.

    "},{"location":"user/servers/lib/LIB-MS.html#graphql-query-for-fetch-a-file","title":"GraphQL query for fetch a file","text":"
    query {\n  readFile(path: \"user2/data/sample.txt\") {\n    repository {\n      blobs {\n        nodes {\n          name\n          rawBlob\n          rawTextBlob\n        }\n      }\n    }\n  }\n}\n
    "},{"location":"user/servers/lib/LIB-MS.html#graphql-response-for-fetch-a-file","title":"GraphQL response for fetch a file","text":"
    {\n  \"data\": {\n    \"readFile\": {\n      \"repository\": {\n        \"blobs\": {\n          \"nodes\": [\n            {\n              \"name\": \"sample.txt\",\n              \"rawBlob\": \"hello world\",\n              \"rawTextBlob\": \"hello world\"\n            }\n          ]\n        }\n      }\n    }\n  }\n}\n
    "},{"location":"user/servers/lib/LIB-MS.html#http-request-for-fetch-a-file","title":"HTTP request for fetch a file","text":"
    POST /lib HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 217\n{\n  \"query\":\"query {\\n  readFile(path: \\\"user2/data/welcome.txt\\\") {\\n    repository {\\n      blobs {\\n        nodes {\\n          name\\n          rawBlob\\n          rawTextBlob\\n        }\\n      }\\n    }\\n  }\\n}\"\n}\n
    "},{"location":"user/servers/lib/LIB-MS.html#http-response-for-fetch-a-file","title":"HTTP response for fetch a file","text":"
    HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: *\nConnection: close\nContent-Length: 134\nContent-Type: application/json; charset=utf-8\nDate: Wed, 27 Sep 2023 09:17:18 GMT\nX-Powered-By: Express\n{\"data\":{\"readFile\":{\"repository\":{\"blobs\":{\"nodes\":[{\"name\":\"welcome.txt\",\"rawBlob\":\"hello world\",\"rawTextBlob\":\"hello world\"}]}}}}}\n

    The path refers to the file path to look at: For example, user1 looks at files of user1; user1/functions looks at contents of functions/ directory.

    "},{"location":"user/servers/lib/assets.html","title":"Reusable Assets","text":"

    The reusability of digital twin assets makes it easy for users to work with the digital twins. The reusability of assets is a fundamental feature of the platform.

    "},{"location":"user/servers/lib/assets.html#kinds-of-reusable-assets","title":"Kinds of Reusable Assets","text":"

    The DTaaS software categorizes all the reusable library assets into six categories:

    "},{"location":"user/servers/lib/assets.html#data","title":"Data","text":"

    The data sources and sinks available to a digital twins. Typical examples of data sources are sensor measurements from Physical Twins, and test data provided by manufacturers for calibration of models. Typical examples of data sinks are visualization software, external users and data storage services. There exist special outputs such as events, and commands which are akin to control outputs from a Digital Twin. These control outputs usually go to Physical Twins, but they can also go to another Digital Twin.

    "},{"location":"user/servers/lib/assets.html#models","title":"Models","text":"

    The model assets are used to describe different aspects of Physical Twins and their environment, at different levels of abstraction. Therefore, it is possible to have multiple models for the same Physical Twin. For example, a flexible robot used in a car production plant may have structural model(s) which will be useful in tracking the wear and tear of parts. The same robot can have a behavioural model(s) describing the safety guarantees provided by the robot manufacturer. The same robot can also have a functional model(s) describing the part manufacturing capabilities of the robot.

    "},{"location":"user/servers/lib/assets.html#tools","title":"Tools","text":"

    The software tool assets are software used to create, evaluate and analyze models. These tools are executed on top of a computing platforms, i.e., an operating system, or virtual machines like Java virtual machine, or inside docker containers. The tools tend to be platform specific, making them less reusable than models. A tool can be packaged to run on a local or distributed virtual machine environments thus allowing selection of most suitable execution environment for a Digital Twin. Most models require tools to evaluate them in the context of data inputs. There exist cases where executable packages are run as binaries in a computing environment. Each of these packages are a pre-packaged combination of models and tools put together to create a ready to use Digital Twins.

    "},{"location":"user/servers/lib/assets.html#functions","title":"Functions","text":"

    The functions responsible for pre- and post-processing of: data inputs, data outputs, control outputs. The data science libraries and functions can be used to create useful function assets for the platform. In some cases, Digital Twin models require calibration prior to their use; functions written by domain experts along with right data inputs can make model calibration an achievable goal. Another use of functions is to process the sensor and actuator data of both Physical Twins and Digital Twins.

    "},{"location":"user/servers/lib/assets.html#digital-twins","title":"Digital Twins","text":"

    These are ready to use digital twins created by one or more users. These digital twins can be reconfigured later for specific use cases.

    "},{"location":"user/servers/lib/assets.html#file-system-structure","title":"File System Structure","text":"

    Each user has their assets put into five different directories named above. In addition, there will also be common library assets that all users have access to. A simplified example of the structure is as follows:

    workspace/\n  data/\n    data1/ (ex: sensor)\n      filename (ex: sensor.csv)\n      README.md\n    data2/ (ex: turbine)\n      README.md (remote source; no local file)\n    ...\n  digital_twins/\n    digital_twin-1/ (ex: incubator)\n      config (yaml and json)\n      README.md (usage instructions)\n      description.md (short summary of digital twin)\n      lifecycle/ (directory containing lifecycle scripts)\n    digital_twin-2/ (ex: mass spring damper)\n      config (yaml and json)\n      README.md (usage instructions)\n      description.md (short summary of digital twin)\n      lifecycle/ (directory containing lifecycle scripts)\n    digital_twin-3/ (ex: model swap)\n      config (yaml and json)\n      README.md (usage instructions)\n      description.md (short summary of digital twin)\n      lifecycle/ (directory containing lifecycle scripts)\n    ...\n  functions/\n    function1/ (ex: graphs)\n      filename (ex: graphs.py)\n      README.md\n    function2/ (ex: statistics)\n      filename (ex: statistics.py)\n      README.md\n    ...\n  models/\n    model1/ (ex: spring)\n      filename (ex: spring.fmu)\n      README.md\n    model2/ (ex: building)\n      filename (ex: building.skp)\n      README.md\n    model3/ (ex: rabbitmq)\n      filename (ex: rabbitmq.fmu)\n      README.md\n    ...\n  tools/\n    tool1/ (ex: maestro)\n      filename (ex: maestro.jar)\n      README.md\n    ...\n  common/\n    data/\n    functions/\n    models/\n    tools/\n

    Tip

    The DTaaS is agnostic to the format of your assets. The only requirement is that they are files which can be uploaded on the Library page. Any directories can be compressed as one file and uploaded. You can decompress the file into a directory from a Terminal or xfce Desktop available on the Workbench page.

    A recommended file system structure for storing assets is also available in DTaaS examples.

    "},{"location":"user/servers/lib/assets.html#upload-assets","title":"Upload Assets","text":"

    Users can upload assets into their workspace using Library page of the website.

    You can go into a directory and click on the upload button to upload a file or a directory into your workspace. This asset is then available in all the workbench tools you can use. You can also create new assets on the page by clicking on new drop down menu. This is a simple web interface which allows you to create text-based files. You need to upload other files using upload button.

    The user workbench has the following services:

    • Jupyter Notebook and Lab
    • VS Code
    • XFCE Desktop Environment available via VNC
    • Terminal

    Users can also bring their DT assets into user workspaces from outside using any of the above mentioned services. The developers using git repositories can clone from and push to remote git servers. Users can also use widely used file transfer protocols such as FTP, and SCP to bring the required DT assets into their workspaces.

    "},{"location":"user/website/index.html","title":"DTaaS Website Screenshots","text":"

    This page contains a screenshot driven preview of the website serving the DTaaS software platform.

    "},{"location":"user/website/index.html#visit-the-dtaas-application","title":"Visit the DTaaS Application","text":"

    Start off by simply visiting the website of the DTaaS instance for which you are a user.

    "},{"location":"user/website/index.html#redirected-to-authorization-provider","title":"Redirected to Authorization Provider","text":"

    You will be redirected to the Gitlab Authorization for DTaaS.

    Enter your email/username and password. If the email ID registered with DTaaS, is the same as your Google Login email ID, you can also opt to sign in using Google.

    You will be redirected to the OAuth Application page.

    "},{"location":"user/website/index.html#permit-dtaas-server-to-use-gitlab","title":"Permit DTaaS Server to Use Gitlab","text":"

    Click on Authorize to allow the OAuth application to access the information connected to your Gitlab account. This is a necessary step.

    You are now logged into the DTaaS server. You will be redirected to the login page of the DTaaS website.

    The DTaaS website uses an additional layer of security - the third-party authorization protocol known as OAuth. This protocol provides secure access to a DTaaS installation if users have a working active accounts at the selected OAuth service provider. This also uses Gitlab as OAuth provider.

    You can see the Gitlab signin button. A click on this button takes you to Gitlab instance providing authorization for DTaaS. You will not need to sign in to Gitlab again, unless you have explicitly logged out of your Gitlab account.

    "},{"location":"user/website/index.html#permit-dtaas-website-to-use-gitlab","title":"Permit DTaaS Website to Use Gitlab","text":"

    The DTaaS website needs your permission to use your Gitlab account for authorization. Click on Authorize button.

    After successful authorization, you will be redirected to the Library page of the DTaaS website.

    There are two icons on the top-right of the webpage. The hyperlink on question mark icon redirects to help page while the hyperlink on github icon redirects to github code repository.

    "},{"location":"user/website/index.html#overview-of-menu-items","title":"Overview of menu items","text":"

    The menu is hidden by default. Only the icons of menu items are visible. You can click on the icon in the top-left corner of the page to see the menu.

    There are three menu items:

    Library: for management of reusable library assets. You can upload, download, create and modify new files on this page.

    Digital Twins: for management of digital twins. You are presented with the Jupyter Lab page from which you can run the digital twins.

    Workbench: Not all digital twins can be managed within Jupyter Lab. You have more tools at your disposal on this page.

    "},{"location":"user/website/index.html#library-tabs-and-their-help-text","title":"Library tabs and their help text","text":"

    You can see five tabs each corresponding to one type of digital twin assets. Each tab provides help text to guide users on the type of an asset.

    Functions

    The functions responsible for pre- and post-processing of: data inputs, data outputs, control outputs. The data science libraries and functions can be used to create useful function assets for the platform. In some cases, Digital Twin models require calibration prior to their use; functions written by domain experts along with right data inputs can make model calibration an achievable goal. Another use of functions is to process the sensor and actuator data of both Physical Twins and Digital Twins.

    Data

    The data sources and sinks available to a digital twins. Typical examples of data sources are sensor measurements from Physical Twins, and test data provided by manufacturers for calibration of models. Typical examples of data sinks are visualization software, external users and data storage services. There exist special outputs such as events, and commands which are akin to control outputs from a Digital Twin. These control outputs usually go to Physical Twins, but they can also go to another Digital Twin.

    Models

    The model assets are used to describe different aspects of Physical Twins and their environment, at different levels of abstraction. Therefore, it is possible to have multiple models for the same Physical Twin. For example, a flexible robot used in a car production plant may have structural model(s) which will be useful in tracking the wear and tear of parts. The same robot can have a behavioural model(s) describing the safety guarantees provided by the robot manufacturer. The same robot can also have a functional model(s) describing the part manufacturing capabilities of the robot.

    Tools

    The software tool assets are software used to create, evaluate and analyze models. These tools are executed on top of a computing platforms, i.e., an operating system, or virtual machines like Java virtual machine, or inside docker containers. The tools tend to be platform specific, making them less reusable than models. A tool can be packaged to run on a local or distributed virtual machine environments thus allowing selection of most suitable execution environment for a Digital Twin. Most models require tools to evaluate them in the context of data inputs. There exist cases where executable packages are run as binaries in a computing environment. Each of these packages are a pre-packaged combination of models and tools put together to create a ready to use Digital Twins.

    Digital Twins

    These are ready to use digital twins created by one or more users. These digital twins can be reconfigured later for specific use cases.

    There are two sub-tabs, namely private and common. The library assets in private category are visible only to the logged in user while the library assets in common category are available to all the users.

    Further explanation on the placement of reusable assets within each type and the underlying directory structure on the server is in the assets page

    Note

    You can upload assets (files) using the upload button.

    The file manager is based on Jupyter notebook and all the tasks you can perform in the Jupyter Notebook can be undertaken here.

    "},{"location":"user/website/index.html#digital-twins-page","title":"Digital Twins page","text":"

    The digital twins page has three tabs and the central pane opens Jupyter lab. There are three tabs with helpful instructions on the suggested tasks you can undertake in the Create - Execute - Analyze life cycle phases of digital twin. You can see more explanation on the life cycle phases of digital twin.

    Create

    Create digital twins from tools provided within user workspaces. Each digital twin will have one directory. It is suggested that user provide one bash shell script to run their digital twin. Users can create the required scripts and other files from tools provided in Workbench page.

    Execute

    Digital twins are executed from within user workspaces. The given bash script gets executed from digital twin directory. Terminal-based digital twins can be executed from VSCode and graphical digital twins can be executed from VNC GUI. The results of execution can be placed in the data directory.

    Analyze

    The analysis of digital twins requires running of digital twin script from user workspace. The execution results placed within data directory are processed by analysis scripts and results are placed back in the data directory. These scripts can either be executed from VSCode and graphical results or can be executed from VNC GUI. The analysis of digital twins requires running of digital twin script from user workspace. The execution results placed within data directory are processed by analysis scripts and results are placed back in the data directory. These scripts can either be executed from VSCode and graphical results or can be executed from VNC GUI.

    The reusable assets (files) seen in the file manager are available in the Jupyter Lab. In addition, there is a git plugin installed in the Jupyter Lab using which you can link your files with the external git repositories.

    "},{"location":"user/website/index.html#workbench","title":"Workbench","text":"

    The workbench page provides links to four integrated tools.

    • Desktop
    • VS Code
    • Jupyter Lab
    • Jupyter Notebook

    The hyperlinks open in new browser tab. The screenshots of pages opened in new browser are:

    Terminal

    The Terminal hyperlink does not exist on workbench page. If you want terminal. Please use the tools dropdown in the Jupyter Notebook.

    "},{"location":"user/website/index.html#digital-twins-preview-page","title":"Digital Twins Preview Page","text":"

    There is a fifth link on the Workbench page. It is Digital Twins Preview Page. It is an experimental feature at the moment. Clicking on the link opens a new page that is similar to the Digital Twins page.

    There are two tabs, namely Manage and Execute.

    Manage

    Read the complete description of digital twins. If necessary, users can delete a digital twin, removing it from the workspace with all its associated data. Users can also reconfigure the digital twin.

    Execute

    Execute the Digital Twins using Gitlab CI/CD workflows.

    "},{"location":"user/website/index.html#finally-logout","title":"Finally logout","text":"

    You have to close the browser in order to completely exit the DTaaS software platform.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"What is DTaaS?","text":"

    The Digital Twin as a Service (DTaaS) software platform is useful to Build, Use and Share digital twins (DTs).

    Build: DTs are built on DTaaS using reusable DT assets available on the platform.

    Use: Run your DTs on DTaaS.

    Share: Share ready-to-use DTs with other users. It is also possible to share the services offered by one DT with other users.

    There is an overview of DTaaS available in the form of slides, video, and feature walkthrough.

    "},{"location":"index.html#license","title":"License","text":"

    This software is owned by The INTO-CPS Association and is available under the INTO-CPS License.

    DTaaS software platform uses third-party open-source software. These software components have their own licenses.

    "},{"location":"FAQ.html","title":"Frequently Asked Questions","text":""},{"location":"FAQ.html#abreviations","title":"Abreviations","text":"Term Full Form DT Digital Twin DTaaS Digital Twin as a Service PT Physical Twin"},{"location":"FAQ.html#general-questions","title":"General Questions","text":"What is DTaaS?

    DTaaS is software platform on which you can create and run digital twins. Please see the features page to get a sense of the things you can do in DaaS.

    What is the scope and current capabilities of DTaaS?
    1. DTaaS is a web based interface to allow you to invoke various tools related to work you want to perform with one or more DTs.
    2. DTaaS permits users to run DTs in their private workspaces. These user workspaces are based on Ubuntu 20.04 Operating system.
    3. DTaaS can help you create reusable DT assets only if DT asset authoring tools can work in Ubuntu 20.04 xfce desktop environment.
    4. DTs are just executables, as far as DTaaS is concerned. Users are not constrained to work with DTs in a certain way. The DTaaS suggests creation of DTs from reusable assets and provides a suggestive structure for DTs. The examples provide more insight into DTaaS way of working with DTs. But this suggested workflow is not binding on the users.
    5. DTs can be run as services with REST API from within user workspace which can help with service-level DT composition.
    What can not be done inside DTaaS?
    1. DTaaS as such won't help you to install DTs that you get from elsewhere.
    2. The current user interface of DTaaS web application is heavily reliant on the use of Jupyter lab and notebook. The Digital Twins page has Create / Execute / Analyze sections but all point to Jupyter lab. Web interface. The functionality of these pages is still under development.
    3. DTaaS does not yet have DevOps like automation capabilities.
    Is there any fundamental difference between commercial solutions like Ansys Twin Builder and DTaaS?

    Commercial DT platforms like Ansys Twin Builder provide tight integration between models, simulation and sensors. This leads to fewer choices in DT design and implementation. In addition, there is a limitation of vendor lockin. On the other hand, DTaas lets users separate DT into reusable assets and combine these assets in a flexible way.

    Do you provide licensed software like Matlab?

    Proprietary and commercially licensed software is not available by default on the software platform. But users have private workspaces which are based on Linux-based xfce Desktop environment. Users can install proprietary and commercially licensed software in their workspaces. Please see a screencast of using Matlab Simulink within the DTaaS software. The licensed software installed by one user is not available to another user.

    "},{"location":"FAQ.html#digital-twin-assets","title":"Digital Twin Assets","text":"Can DTaaS be used to create new DT assets?

    The core feature of DTaaS software is to help users create DTs from assets already available in the library. However, it is possible for users to take advantage of services available in their workspace to install asset authoring tools in their own workspace. These authoring tools can then be used to create and publish new assets. User workspaces are private and are not shared with other users. Thus any licensed software tools installed in their workspace is only available to them.

    "},{"location":"FAQ.html#digital-twin-models","title":"Digital Twin Models","text":"Can DTaaS create new DT models?

    DTaaS is not a model creation tool. You can put model creation tool inside DTaaS and create new models. The DTaaS itself does not create digital twin models but it can help users create digital twin models. You can run Linux desktop / terminal tools inside the DTaaS. So you can create models inside DTaaS and run them using tools that can run in Linux. The Windows only tools can not run in DTaaS.

    How can DTaaS help to design geometric model? Does it support 3D modeling and simulation?

    Well, DTaaS by itself does not produce any models. DTaaS only provides a platform and an ecosystem of services to facilitate digital twins to be run as services. Since each user has a Linux OS at their disposal, they can also run digital twins that have graphical interface. In summary, DTaaS is neither a modeling nor simulation tool. If you need these kinds of tools, you need to bring them onto the platform. For example, if you need Matlab for your work, you need to bring he licensed Matlab software.

    Can DTaaS support only the information models (or behavioral models) or some other kind of models?

    The DTaaS as such is agnostic to the kind of models you use. DTaaS can run all kinds of models. This includes behavioral and data models. As long as you have models and the matching solvers that can run in Linux OS, you are good to go in DTaaS. In some cases, models and solvers (tools) are bundled together to form monolithic DTs. The DTaaS does not limit you from running such DTs as well. DTaaS does not provide dedicated solvers. But if you can install a solver in your workspace, then you don't need the platform to provide one.

    Does it support XML-based representation and ontology representation?

    Currently No. We are looking for users needing this capability. If you have concrete requirements and an example, we can discuss a way of realizing it in DTaaS.

    "},{"location":"FAQ.html#communication-between-physical-twin-and-digital-twin","title":"Communication Between Physical Twin and Digital Twin","text":"How can DTaaS control the physical entity? Which technologies it uses for controlling the physical world?

    At a very abstract level, there is a communication from physical entity to digital entity and back to physical entity. How this communication should happen is decided by the person designing the digital entity. The DTaaS can provide communication services that can help you do this communication with relative ease. You can use InfluxDB, RabbitMQ and Mosquitto services hosted on DTaaS for two communication between digital and physical entities.

    How would you measure a physical entity like shape, size, weight, structure, chemical attributes etc. using DTaaS? Any specific technology used in this case?

    The real measurements are done at physical twin which are then communicated to the digital twin. Any digital twin platform like DTaaS can only facilitate this communication of these measurements from physical twin. The DTaaS provides InfluxDB, RabbitMQ and Mosquitto services for this purpose. These three are probably most widely used services for digital twin communication. Having said that, DTaaS allows you to utilize other communication technologies and services hosted elsewhere on the Internet.

    How can real-time data differ from static data and what is the procedure to identify dynamic data? Is there any UI or specific tool used here?

    DTaaS can not understand the static or dynamic nature of data. It can facilitate storing names, units and any other text description of interesting quantities (weight of batter, voltage output etc). It can also store the data being sent by the physical twin. The distinction between static and dynamic data needs to be made by the user. Only metadata of the data can reveal such more information about the nature of data. A tool can probably help in very specific cases, but you need metadata. If there is a human being making this distinction, then the need for metadata goes down but does not completely go away. In some of the DT platforms supported by manufacturers, there is a tight integration between data and model. In this case, the tool itself is taking care of the metadata. The DTaaS is a generic platform which can support execution of digital twins. If a tool can be executed on a Linux desktop / commandline, the tool can be supported within DTaaS. The tool (ex. Matlab) itself can take care of the metadata requirements.

    "},{"location":"FAQ.html#data-management","title":"Data Management","text":"Can DTaaS collect data directly from sensors?

    Yes via platform services.

    Does DTaaS support data collection from different sources like hardware, software and network? Is there any user interface or any tracking instruments used for data collection?

    The DTaaS provids InfluxDB, RabbitMQ, MQTT and MongoDB services. Both the physical twin and digital twin can utilize these protocols for communication. The IoT (time-series) data can be collected using InfluxDB and MQTT broker services. There is a user interface for InfluxDB which can be used to analyze the data collected. Users can also manually upload their data files into DTaaS.

    Is DTaaS able to transmit data to cloud in real time?

    Yes via platform services.

    Which transmission protocol does DTaaS allow?

    InfluxDB, RabbitMQ, MQTT and anything else that can be used from Cloud service providers.

    Does DTaaS support multisource information and combined multi sensor input data? Can it provide analysis and decision-supporting inferences?

    You can store information from multiple sources. The existing InfluxDB services hosted on DTaaS already has a dedicated Influx / Flux query language for doing sensor fusion, analysis and inferences.

    Which kinds of visualization technologies DTaaS can support (e.g. graphical, geometry, image, VR/AR representation)?

    Graphical, geometric and images. If you need specific licensed software for the visualization, you will have to bring the license for it. DTaaS does not support AR/VR.

    "},{"location":"FAQ.html#platform-native-services-on-dtaas-platform","title":"Platform Native Services on DTaaS Platform","text":"Is DTaaS able to detect the anomalies about-to-fail components and prescribe solutions?

    This is the job of a digital twin. If you have a ready to use digital twin that does the job, DTaaS allows others to use your solution.

    "},{"location":"FAQ.html#comparison-with-other-dt-platforms","title":"Comparison with other DT Platforms","text":"All the DT platforms seem to provide different features. Is there a comparison chart?

    Here is a qualitative comparison of different DT integration platforms:

    Legend: high performance (H), mid performance (M) and low performance (L)

    DT Platforms License DT Development Process Connectivity Security Processing power, performance and Scalability Data Storage Visualization Modeling and Simulation Microsoft Azure DT Commercial Cloud H H H M H H H AWS IOT Greengrass Open source commercial H H H M H H H Eclipse Ditto Open source M H M H H L L Asset Administration Shell Open source H H L H M L M PTC Thingworx Commercial H H H H H M M GE Predix Commercial M H H M L M L AU's DTaaS Open source H H L L M M M

    Adopted by Tanusree Roy from Table 4 and 5 of the following paper.

    Ref: Naseri, F., Gil, S., Barbu, C., Cetkin, E., Yarimca, G., Jensen, A. C., ... & Gomes, C. (2023). Digital twin of electric vehicle battery systems: Comprehensive review of the use cases, requirements, and platforms. Renewable and Sustainable Energy Reviews, 179, 113280.

    All the comparisons between DT platforms seems so confusing. Why?

    The fundamental confusion comes from the fact that different DT platforms (Azure DT, GE Predix) provide different kind of DT capabilities. You can run all kinds of models natively in GE Predix. In fact you can run models even next to (on) PTs using GE Predix. But you cannot natively do that in Azure DT service. You have to do the leg work of integrating with other Azure services or third-party services to get the kind of capabilities that GE Predix natively provides in one interface. The takeaway is that we pick horses for the courses.

    "},{"location":"FAQ.html#gdpr-concerns","title":"GDPR Concerns","text":"Does your platform adhere to GDPR compliance standards? If so, how?

    The DTaaS software platform does not store any personal information of users. It only stores username to identify users and these usernames do not contain enough information to deduce the true identify of users.

    Which security measures are deployed? How is data encrypted (if exists)?

    The default installation requires a HTTPS terminating reverse proxy server from user to the DTaaS software installation. The administrators of DTaaS software can also install HTTPS certificates into the application. The codebase can generate HTTPS application and the users also have the option of installing their own certificates obtained from certification agencies such as LetsEncrypt.

    What security measures does your cloud provider offer?

    The current installation of DTaaS software runs on Aarhus University servers. The university network offers firewall access control to servers so that only permitted user groups have access to the network and physical access to the server.

    How is user access controlled and authenticated?

    There is a two-level authorization mechanism in place in each default installation of DTaaS. The first-level is HTTP basic authorization over secure HTTPS connection. The second-level is the OAuth PKCE authorization flow for each user. The OAuth authorization is provider by a Gitlab instance. The DTaaS does not store the account and authorization information of users.

    Does you platform manage personal data? How is data classified and tagged based on the sensitivity? Who has access to the critical data?

    The platform does not store personal data of users.

    How are identities and roles managed within the platform?

    There are two roles for users on the platform. One is the administrator and the other one is user. The user roles are managed by the administrator.

    "},{"location":"LICENSE.html","title":"License","text":"

    --- Start of Definition of INTO-CPS Association Public License ---

    /*

    • This file is part of the INTO-CPS Association.

    • Copyright (c) 2017-CurrentYear, INTO-CPS Association (ICA),

    • c/o Peter Gorm Larsen, Aarhus University, Department of Engineering,
    • Finlandsgade 22, 8200 Aarhus N, Denmark.

    • All rights reserved.

    • THIS PROGRAM IS PROVIDED UNDER THE TERMS OF GPL VERSION 3 LICENSE OR

    • THIS INTO-CPS ASSOCIATION PUBLIC LICENSE (ICAPL) VERSION 1.0.
    • ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
    • RECIPIENT'S ACCEPTANCE OF THE INTO-CPS ASSOCIATION PUBLIC LICENSE OR
    • THE GPL VERSION 3, ACCORDING TO RECIPIENTS CHOICE.

    • The INTO-CPS tool suite software and the INTO-CPS Association

    • Public License (ICAPL) are obtained from the INTO-CPS Association, either
    • from the above address, from the URLs: http://www.into-cps.org or
    • in the INTO-CPS tool suite distribution.
    • GNU version 3 is obtained from:
    • http://www.gnu.org/copyleft/gpl.html.

    • This program is distributed WITHOUT ANY WARRANTY; without

    • even the implied warranty of MERCHANTABILITY or FITNESS
    • FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
    • IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF
    • THE INTO-CPS ASSOCIATION PUBLIC LICENSE.

    • See the full ICAPL conditions for more details.

    */

    --- End of INTO-CPS Association Public License Header ---

    The ICAPL is a public license for the INTO-CPS tool suite with three modes/alternatives (GPL, ICA-Internal-EPL, ICA-External-EPL) for use and redistribution, in source and/or binary/object-code form:

    • GPL. Any party (member or non-member of the INTO-CPS Association) may use and redistribute INTO-CPS tool suite under GPL version 3.

    • Silver Level members of the INTO-CPS Association may also use and redistribute the INTO-CPS tool suite under ICA-Internal-EPL conditions.

    • Gold Level members of the INTO-CPS Association may also use and redistribute The INTO-CPS tool suite under ICA-Internal-EPL or ICA-External-EPL conditions.

    Definitions of the INTO-CPS Association Public license modes:

    • GPL = GPL version 3.

    • ICA-Internal-EPL = These INTO-CPA Association Public license conditions together with Internally restricted EPL, i.e., EPL version 1.0 with the Additional Condition that use and redistribution by a member of the INTO-CPS Association is only allowed within the INTO-CPS Association member's own organization (i.e., its own legal entity), or for a member of the INTO-CPS Association paying a membership fee corresponding to the size of the organization including all its affiliates, use and redistribution is allowed within/between its affiliates.

    • ICA-External-EPL = These INTO-CPA Association Public license conditions together with Externally restricted EPL, i.e., EPL version 1.0 with the Additional Condition that use and redistribution by a member of the INTO-CPS Association, or by a Licensed Third Party Distributor having a redistribution agreement with that member, to parties external to the INTO-CPS Association member\u2019s own organization (i.e., its own legal entity) is only allowed in binary/object-code form, except the case of redistribution to other members the INTO-CPS Association to which source is also allowed to be distributed.

    [This has the consequence that an external party who wishes to use the INTO-CPS Association in source form together with its own proprietary software in all cases must be a member of the INTO-CPS Association].

    In all cases of usage and redistribution by recipients, the following conditions also apply:

    a) Redistributions of source code must retain the above copyright notice, all definitions, and conditions. It is sufficient if the ICAPL Header is present in each source file, if the full ICAPL is available in a prominent and easily located place in the redistribution.

    b) Redistributions in binary/object-code form must reproduce the above copyright notice, all definitions, and conditions. It is sufficient if the ICAPL Header and the location in the redistribution of the full ICAPL are present in the documentation and/or other materials provided with the redistribution, if the full ICAPL is available in a prominent and easily located place in the redistribution.

    c) A recipient must clearly indicate its chosen usage mode of ICAPL, in accompanying documentation and in a text file ICA-USAGE-MODE.txt, provided with the distribution.

    d) Contributor(s) making a Contribution to the INTO-CPS Association thereby also makes a Transfer of Contribution Copyright. In return, upon the effective date of the transfer, ICA grants the Contributor(s) a Contribution License of the Contribution. ICA has the right to accept or refuse Contributions.

    Definitions:

    \"Subsidiary license conditions\" means:

    The additional license conditions depending on the by the recipient chosen mode of ICAPL, defined by GPL version 3.0 for GPL, and by EPL for ICA-Internal-EPL and ICA-External-EPL.

    \"ICAPL\" means:

    INTO-CPS Association Public License version 1.0, i.e., the license defined here (the text between \"--- Start of Definition of INTO-CPS Association Public License ---\" and \"--- End of Definition of INTO-CPS Association Public License ---\", or later versions thereof.

    \"ICAPL Header\" means:

    INTO-CPS Association Public License Header version 1.2, i.e., the text between \"--- Start of Definition of INTO-CPS Association Public License ---\" and \"--- End of INTO-CPS Association Public License Header ---, or later versions thereof.

    \"Contribution\" means:

    a) in the case of the initial Contributor, the initial code and documentation distributed under ICAPL, and

    b) in the case of each subsequent Contributor: i) changes to the INTO-CPS tool suite, and ii) additions to the INTO-CPS tool suite;

    where such changes and/or additions to the INTO-CPS tool suite originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the INTO-CPS tool suite by such Contributor itself or anyone acting on such Contributor's behalf.

    For Contributors licensing the INTO-CPS tool suite under ICA-Internal-EPL or ICA-External-EPL conditions, the following conditions also hold:

    Contributions do not include additions to the distributed Program which: (i) are separate modules of software distributed in conjunction with the INTO-CPS tool suite under their own license agreement, (ii) are separate modules which are not derivative works of the INTO-CPS tool suite, and (iii) are separate modules of software distributed in conjunction with the INTO-CPS tool suite under their own license agreement where these separate modules are merged with (weaved together with) modules of The INTO-CPS tool suite to form new modules that are distributed as object code or source code under their own license agreement, as allowed under the Additional Condition of internal distribution according to ICA-Internal-EPL and/or Additional Condition for external distribution according to ICA-External-EPL.

    \"Transfer of Contribution Copyright\" means that the Contributors of a Contribution transfer the ownership and the copyright of the Contribution to the INTO-CPS Association, the INTO-CPS Association Copyright owner, for inclusion in the INTO-CPS tool suite. The transfer takes place upon the effective date when the Contribution is made available on the INTO-CPS Association web site under ICAPL, by such Contributors themselves or anyone acting on such Contributors' behalf. The transfer is free of charge. If the Contributors or the INTO-CPS Association so wish, an optional Copyright transfer agreement can be signed between the INTO-CPS Association and the Contributors.

    \"Contribution License\" means a license from the INTO-CPS Association to the Contributors of the Contribution, effective on the date of the Transfer of Contribution Copyright, where the INTO-CPS Association grants the Contributors a non-exclusive, world-wide, transferable, free of charge, perpetual license, including sublicensing rights, to use, have used, modify, have modified, reproduce and or have reproduced the contributed material, for business and other purposes, including but not limited to evaluation, development, testing, integration and merging with other software and distribution. The warranty and liability disclaimers of ICAPL apply to this license.

    \"Contributor\" means any person or entity that distributes (part of) the INTO-CPS tool chain.

    \"The Program\" means the Contributions distributed in accordance with ICAPL.

    \"The INTO-CPS tool chain\" means the Contributions distributed in accordance with ICAPL.

    \"Recipient\" means anyone who receives the INTO-CPS tool chain under ICAPL, including all Contributors.

    \"Licensed Third Party Distributor\" means a reseller/distributor having signed a redistribution/resale agreement in accordance with ICAPL and the INTO-CPS Association Bylaws, with a Gold Level organizational member which is not an Affiliate of the reseller/distributor, for distributing a product containing part(s) of the INTO-CPS tool suite. The Licensed Third Party Distributor shall only be allowed further redistribution to other resellers if the Gold Level member is granting such a right to it in the redistribution/resale agreement between the Gold Level member and the Licensed Third Party Distributor.

    \"Affiliate\" shall mean any legal entity, directly or indirectly, through one or more intermediaries, controlling or controlled by or under common control with any other legal entity, as the case may be. For purposes of this definition, the term \"control\" (including the terms \"controlling,\" \"controlled by\" and \"under common control with\") means the possession, direct or indirect, of the power to direct or cause the direction of the management and policies of a legal entity, whether through the ownership of voting securities, by contract or otherwise.

    NO WARRANTY

    EXCEPT AS EXPRESSLY SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF ICAPL, THE INTO-CPS ASSOCIATION IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the INTO-CPS tool suite and assumes all risks associated with its exercise of rights under ICAPL , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

    DISCLAIMER OF LIABILITY

    EXCEPT AS EXPRESSLY SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF ICAPL, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE INTO-CPS TOOL SUITE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    A Contributor licensing the INTO-CPS tool suite under ICA-Internal-EPL or ICA-External-EPL may choose to distribute (parts of) the INTO-CPS tool suite in object code form under its own license agreement, provided that:

    a) it complies with the terms and conditions of ICAPL; or for the case of redistribution of the INTO-CPS tool suite together with proprietary code it is a dual license where the INTO-CPS tool suite parts are distributed under ICAPL compatible conditions and the proprietary code is distributed under proprietary license conditions; and

    b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from ICAPL are offered by that Contributor alone and not by any other party; and iv) states from where the source code for the INTO-CPS tool suite is available, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

    When the INTO-CPS tool suite is made available in source code form:

    a) it must be made available under ICAPL; and

    b) a copy of ICAPL must be included with each copy of the INTO-CPS tool suite.

    c) a copy of the subsidiary license associated with the selected mode of ICAPL must be included with each copy of the INTO-CPS tool suite.

    Contributors may not remove or alter any copyright notices contained within The INTO-CPS tool suite.

    If there is a conflict between ICAPL and the subsidiary license conditions, ICAPL has priority.

    This Agreement is governed by the laws of Denmark. The place of jurisdiction for all disagreements related to this Agreement, is Aarhus, Denmark.

    The EPL 1.0 license definition has been obtained from: http://www.eclipse.org/legal/epl-v10.html. It is also reproduced in the INTO-CPS distribution.

    The GPL Version 3 license definition has been obtained from http://www.gnu.org/copyleft/gpl.html. It is also reproduced in the INTO-CPS distribution.

    --- End of Definition of INTO-CPS Association Public License ---

    "},{"location":"PUBLISH.html","title":"Project Documentation","text":"

    This file contains instructions for creation, compilation and publication of project documentation.

    The documentation system is based on Material for Mkdocs. The documentation is generated based on the configuration files:

    • mkdocs.yml: used for generating online documentation which is hosted on the web
    • mkdocs-github.yml: used for generating documentation in github actions

    Install Mkdocs using the following command.

    pip install -r docs/requirements.txt\n
    "},{"location":"PUBLISH.html#fix-linting-errors","title":"Fix Linting Errors","text":"

    This project uses markdownlint linter tool for identifying the formatting issues in markdown files. Run

    mdl docs\n

    from top-directory of the project and fix any identified issues. This needs to be done before committing changes to the documentation.

    "},{"location":"PUBLISH.html#create-documentation","title":"Create documentation","text":"

    The document generation pipeline can generate both html and pdf versions of documentation.

    The generation of pdf version of documentation is controlled via a shell variable.

    export MKDOCS_ENABLE_PDF_EXPORT=0 #disables generation of pdf document\nexport MKDOCS_ENABLE_PDF_EXPORT=1 #enables generation of pdf document\n

    The mkdocs utility allows for live editing of documentation on the developer computer.

    You can add, and edit the markdown files in docs/ directory to update the documentation. There is a facility to check the status of your documentation by using:

    mkdocs serve --config-file mkdocs.yml\n
    "},{"location":"PUBLISH.html#publish-documentation","title":"Publish documentation","text":"

    You can compile and place the html version of documentation on the webpage-docs branch of the codebase.

    export MKDOCS_ENABLE_PDF_EXPORT=1 #enable generation of pdf document\nsource script/docs.sh [version]\n

    The command takes an optional version parameter. This version parameter is needed for making a release. Otherwise, the documentation gets published with the latest version tag. This command makes a new commit on webpage-docs branch. You need to push the branch to upstream.

    git push webpage-docs\n

    The github pages system serves the project documentation from this branch.

    "},{"location":"bugs.html","title":"Few issues in the Software","text":"

    If you find a bug, please open an issue

    "},{"location":"bugs.html#third-party-software","title":"Third-Party Software","text":"

    The explanation given below corresponds to the bugs you may face from third party software included in DTaaS. Known issues are listed below.

    "},{"location":"bugs.html#ml-workspace","title":"ML Workspace","text":"
    • the docker container might down a bit after two weeks. The only known solution is to restart the docker container. You don't need to restart the complete DTaaS platform, restart of the docker container of ml-workspace is sufficient.
    • the terminal tool doesn't seem to have the ability to refresh itself. If there is an issue, the only solution is to close and reopen the terminal from \"open tools\" drop down of notebook
    • terminal app does not show at all after some time: terminal always comes if it is open from drop-down menu of Jupyter Notebook, but not as a direct link.
    "},{"location":"bugs.html#gitlab","title":"Gitlab","text":"
    • The gilab oauth authorization service does not have a way to sign out of a third-party application. Even if you sign out of DTaaS, the gitlab still shows user as signed in. The next time you click on the sign in button on the DTaaS page, user is not shown the login page. Instead user is directly taken to the Library page. So close the brower window after you are done. Another way to overcome this limitation is to open your gitlab instance (https://gitlab.foo.com) and signout from there. Thus user needs to sign out of two places, namely DTaaS and gitlab, in order to completely exit the DTaaS application.
    "},{"location":"thanks.html","title":"Contributors","text":"

    code contributors

    "},{"location":"thanks.html#users","title":"Users","text":"

    Cl\u00e1udio \u00c2ngelo Gon\u00e7alves Gomes, Dmitri Tcherniak, Elif Ecem Bas, Farshid Naseri, Giuseppe Abbiati, Hannes Iven, Hao Feng, Henrik Ejersbo, Lars Vosteen, Lei Zhao, Mirgita Frasheri, Morten Haahr Kristensen, Neena Goveas, Tanusree Roy, Santiago Gil Arboleda, Swarup Mahato, Valdemar Tang

    "},{"location":"thanks.html#example-contributors","title":"Example Contributors","text":"Example Name Contributors Mass Spring Damper Prasad Talasila Water Tank Fault Injection Henrik Ejersbo and Mirgita Frasheri Water Tank Model Swap Henrik Ejersbo and Mirgita Frasheri Desktop Robotti with RabbitMQ Mirgita Frasheri Water Treatment Plant and OPC-UA Lucia Royo and Alejandro Labarias Three Water Tanks with DT Manager Framework Santiago Gil Arboleda Flex-Cell with Two Industrial Robots Santiago Gil Arboleda Incubator Morten Haahr Kristensen Firefighters in Emergency Environments Lars Vosteen and Hannes Iven Mass Spring Damper with NuRV Runtime Monitor Alberto Bonizzi Incubator with NuRV Runtime Monitor Alberto Bonizzi and Morten Haahr Kristensen Incubator with NuRV Runtime Monitor Service Valdemar Tang Water Tank Fault Injection with NuRV Runtime Monitor Alberto Bonizzi Incubator Co-Simulation with NuRV Runtime Monitor FMU Morten Haahr Kristensen Incubator with NuRV Runtime Monitor FMU as Service Valdemar Tang and Morten Haahr Kristensen Incubator with NuRV Runtime Monitor as Service Morten Haahr Kristensen and Valdemar Tang"},{"location":"thanks.html#documentation","title":"Documentation","text":"
    1. Talasila, P., Gomes, C., Mikkelsen, P. H., Arboleda, S. G., Kamburjan, E., & Larsen, P. G. (2023). Digital Twin as a Service (DTaaS): A Platform for Digital Twin Developers and Users arXiv preprint arXiv:2305.07244.
    2. Astitva Sehgal for developer and example documentation.
    3. Tanusree Roy and Farshid Naseri for asking interesting questions that ended up in FAQs.
    "},{"location":"third-party.html","title":"Third Party Software","text":"

    The DTaaS software platform uses many third-party software. These software components have their own licenses.

    "},{"location":"third-party.html#user-installations","title":"User Installations","text":"

    The list of software included with DTaaS installation scripts are:

    Software Package Usage License docker v24.0 mandatory Apache 2.0 ml-workspace-minimal v0.13 mandatory Apache 2.0 nodejs v20.10 mandatory Custom - Modified MIT npm v10.2 mandatory Artistic License 2.0 serve mandatory MIT Tr\u00e6fik v2.10 mandatory MIT yarn v1.22 mandatory BSD 2-Clause eclipse-mosquitto v2 optional Eclipse Public License-2.0 gitlab-ce v16.4 optional MIT Grafana v10.1 optional GNU Affero General Public (AGPL) License v3.0 InfluxDB v2.7 optional Apache2, MIT Mongodb v7.0 optional AGPL License and Server Side Public License (SSPL) v1 Tabbitmq v3-management optional Mozilla Public License Telegraf v1.28 optional MIT"},{"location":"third-party.html#development-environments","title":"Development Environments","text":"

    Inaddition to all the software included in user installations, the DTaaS development environments may use the following additional software packages.

    Software Package Usage License Material for mkdocs mandatory MIT Docker-compose v2.20 optional Apache 2.0 Jupyter Lab optional 3-Clause BSD Microk8s v1.27 optional Apache 2.0 Openssl optional Custom License"},{"location":"third-party.html#package-dependencies","title":"Package Dependencies","text":"

    There are specific software packages included in the development of client, library microservice and runner microservice. These packages can be seen in the package.json file of the matching directories.

    The plugins of material for mkdocs might have their own licenses. The list of plugins used are in requirements.txt file.

    "},{"location":"admin/cli.html","title":"DTaaS Command Line Interface","text":"

    This is a command line tool for the INTO-CPS-Association Digital Twins as a Service.

    "},{"location":"admin/cli.html#prerequisite","title":"Prerequisite","text":"

    The DTaaS application with base users and essential containers should be up and running before using the CLI.

    "},{"location":"admin/cli.html#installation","title":"Installation","text":"

    Simply install using:

    We recommend installing this in a virutal environment.

    Steps to install:

    • Change the working folder:
    cd <DTaaS-directory>/cli\n
    • We recommend installing this in a virtual environment. Create and activate a virtual environment.

    • To install, simply:

    pip install dtaas\n
    "},{"location":"admin/cli.html#usage","title":"Usage","text":""},{"location":"admin/cli.html#setup","title":"Setup","text":"

    The base DTaaS system should be up and running before adding/deleting users with the CLI.

    Additionally, Setup the dtaas.toml file in the cli directory:

    • Set common.server-dns to domain name of your server. If you want to bring up the server locally, please set this to \"localhost\".

    • Set the path to the full system path of the DTaaS directory.

    [common]\n# absolute path to the DTaaS application directory\nserver-dns = \"localhost\"\npath = \"/home/Desktop/DTaaS\"\n
    "},{"location":"admin/cli.html#select-template","title":"Select Template","text":"

    The cli uses YAML templates provided in this directory to create new user workspaces. The templates are:

    1. user.local.yml: localhost installation
    2. User.server.yml: multi-user web application application over HTTP
    3. user.server.secure.yml: multi-user web application application over HTTPS

    Please note that the cli is not capable of detecting the difference between HTTP and HTTPS modes of web application. Thus if you are serving web application over HTTPS, please do one extra step.

    cp user.server.secure.yml user.server.yml\n

    This will change the user template from insecure to secure.

    "},{"location":"admin/cli.html#add-users","title":"Add users","text":"

    To add new users using the CLI, fill in the users.add list in dtaas.toml with the Gitlab instance usernames of the users to be added

    [users]\n# matching user info must present in this config file\nadd = [\"username1\",\"username2\", \"username3\"]\n

    Make sure you are in the cli directory.

    Then simply:

    dtaas admin user add\n

    The command checks for the existence of files/<username> directory. If it does not exist, a new directory with correct file structure is created. The directory, if it exists, must be owned by the user executing dtaas command on the host operating system. If the files do not have the expected ownership rights, the command fails.

    "},{"location":"admin/cli.html#caveats","title":"Caveats","text":"

    This brings up the containers, without the AuthMS authentication.

    • Currently the email fields for each user in dtaas.toml are not in use, and are not necessary to fill in. These emails must be configured manually for each user in the deploy/docker/conf.server files and the traefik-forward-auth container must be restarted. This is done as follows:

    • Go to the docker directory

    cd <DTaaS>/deploy/docker\n
    • Add three lines to the conf.server file
    rule.onlyu3.action=auth\nrule.onlyu3.rule=PathPrefix(`/user3`)\nrule.onlyu3.whitelist = user3@emailservice.com\n
    • Run the command for these changes to take effect:
    docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n

    The new users are now added to the DTaaS instance, with authorization enabled.

    "},{"location":"admin/cli.html#delete-users","title":"Delete users","text":"
    • To delete existing users, fill in the users.delete list in dtaas.toml with the Gitlab instance usernames of the users to be deleted.
    [users]\n# matching user info must present in this config file\ndelete = [\"username1\",\"username2\", \"username3\"]\n
    • Make sure you are in the cli directory.

    Then simply:

    dtaas admin user delete\n
    • Remember to remove the rules for deleted users in conf.server.
    "},{"location":"admin/cli.html#additional-points-to-remember","title":"Additional Points to Remember","text":"
    • The user add CLI will add and start a container for a new user. It can also start a container for an existing user if that container was somehow stopped. It shows a Running status for existing user containers that are already up and running, it doesn't restart them.

    • user add and user delete CLIs return an error if the add and delete lists in dtaas.toml are empty, respectively.

    • '.' is a special character. Currently, usernames which have '.'s in them cannot be added properly through the CLI. This is an active issue that will be resolved in future releases.

    "},{"location":"admin/host.html","title":"Install DTaaS on a Production Server","text":"

    The installation instructions provided in this README are ideal for hosting the DTaaS as web application for multiple users.

    "},{"location":"admin/host.html#design","title":"Design","text":"

    An illustration of the docker containers used and the authorization setup is shown here.

    In the new application configuration, there are two OAuth2 applications.

    "},{"location":"admin/host.html#requirements","title":"Requirements","text":"

    The installation requirements to run this docker version of the DTaaS are:

    "},{"location":"admin/host.html#docker-with-compose-plugin","title":"Docker with Compose Plugin","text":"

    It is mandatory to have Docker installed on your computer. We highly recommend using Docker Desktop.

    "},{"location":"admin/host.html#domain-name","title":"Domain name","text":"

    The DTaaS software is a web application and is preferably hosted on a server with a domain name like foo.com. It is also possible to use an IP address in place of domain name.

    "},{"location":"admin/host.html#tls-https-certificate-optional","title":"TLS / HTTPS Certificate (Optional)","text":"

    It is possible to add HTTPS option to the DTaaS software installation. Creation of the required TLS certificates is possible through certbot.

    "},{"location":"admin/host.html#oauth-provider","title":"OAuth Provider","text":"

    Gitlab Instance - The DTaaS uses Gitlab OAuth2.0 authorization for user authorization. You can either have an on-premise instance of gitlab, or use gitlab.com itself.

    "},{"location":"admin/host.html#user-accounts","title":"User Accounts","text":"

    Create user accounts in a linked gitlab instance for all the users.

    The default docker compose file contains two - user1 and user2. These names need to be changed to suitable usernames.

    "},{"location":"admin/host.html#oauth2-application-registration","title":"OAuth2 Application Registration","text":"

    The multi-user installation setup requires dedicated authorization setup for both frontend website and backend services. Both these authorization requirements are satisfied using OAuth2 protocol.

    • The frontend website is a React single page application (SPA).
    • The details of Oauth2 app for the frontend website are in client docs.
    • The Oauth2 authorization for backend services is managed by Traefik forward-auth. The details of this authorization setup are in server docs.

    It is possible to use https://gitlab.com or a local installation of Gitlab can be used for this purpose. Based on your selection of gitlab instance, it is necessary to register these two OAuth2 applications and link them to your intended DTaaS installation.

    Please see gitlab oauth provider documentation for further help with creating these two OAuth applications.

    "},{"location":"admin/host.html#download-release-package","title":"Download Release Package","text":"

    The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

    Tip

    1. The filepaths shown here follow Linux OS. The installation procedures also work with Windows OS.
    2. The description below refers to filenames. All the file paths mentioned below are relatively to the top-level DTaaS directory.
    "},{"location":"admin/host.html#configuration","title":"Configuration","text":"

    Three following configuration files need to be updated.

    "},{"location":"admin/host.html#docker-compose","title":"Docker Compose","text":"

    The docker compose configuration is in deploy/docker/.env.server. it is a sample file. It contains environment variables that are used by the docker compose files. It can be updated to suit your local installation scenario. It contains the following environment variables.

    Edit all the fields according to your specific case.

    URL Path Example Value Explanation DTAAS_DIR '/Users/username/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. SERVER_DNS foo.com The server DNS, if you are deploying with a dedicated server. Remember not use http(s) at the beginning of the DNS string OAUTH_URL gitlab.foo.com The URL of your Gitlab instance. It can be gitlab.com if you are planning to use it for authorization. OAUTH_CLIENT_ID 'xx' The ID of your server OAuth application OAUTH_CLIENT_SECRET 'xx' The Secret of your server OAuth application OAUTH_SECRET 'random-secret-string' Any private random string. This is a password you choose for local installation. username1 'user1' The gitlab instance username of a user of DTaaS username2 'user2' The gitlab instance username of a user of DTaaS

    Tip

    Important points to note:

    1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
    2. The client configuration file is located at deploy/config/client/env.js.
    3. The Server DNS can also be an IP address. However, for proper working it is neccessary to use the same convention (IP/DNS) in the client configuration file as well.
    "},{"location":"admin/host.html#website-client","title":"Website Client","text":"

    The frontend React website requires configuration which is specified in the client configuration file (deploy/config/client/env.js).

    Further explanation on the client configuration is available in client config.

    Tip

    There is a default OAuth application registered on https://gitlab.com for client. The corresponding OAuth application details are:

    REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',\nREACT_APP_AUTH_AUTHORITY: 'https://gitlab.com/',\n

    This can be used for test purposes. Please use your own OAuth application for secure production deployments.

    "},{"location":"admin/host.html#create-user-workspace","title":"Create User Workspace","text":"

    The existing filesystem for installation is setup for files/user1. A new filesystem directory needs to be created for the selected user.

    Please execute the following commands from the top-level directory of the DTaaS project.

    cp -R files/user1 files/username\n

    where username is one of the selected usernames. This command needs to be repeated for all the selected users.

    "},{"location":"admin/host.html#configure-authorization-rules-for-backend-authorization","title":"Configure Authorization Rules for Backend Authorization","text":"

    The Traefik forward-auth microservices requires configuration rules to manage authorization for different URL paths. The deploy/docker/conf.server file can be used to configure the authorization for user workspaces.

    rule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user1`)\nrule.onlyu1.whitelist = user1@localhost\n\nrule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user2`)\nrule.onlyu1.whitelist = user2@localhost\n

    Please change the usernames and email addresses to the matching user accounts on the OAuth provider (either https://gitlab.foo.com or https://gitlab.com).

    "},{"location":"admin/host.html#caveat","title":"Caveat","text":"

    The usernames in the deploy/docker/.env.server file need to match those in the deploy/docker/conf.server file.

    Traefik routes are controlled by the deploy/docker/.env.server file. Authorization on these routes is controlled by the deploy/docker/conf.server file. If a route is not specified in deploy/docker/conf.server file but an authorisation is requested by traefik for this unknown route, the default behavior of traefik forward-auth kicks in. This default behavior is to enable endpoint being available to any signed in user.

    If there are extra routes in deploy/docker/conf.server file but these are not in deploy/docker/.env.server file, such routes are not served by traefik; it will give 404 server response.

    "},{"location":"admin/host.html#access-rights-over-files","title":"Access Rights Over Files","text":"

    Warning

    The default setting in docker compose file exposes all user files at http://foo.com/lib/files. All files of all the users are readable-writable by all logged in users. The compose.server.yml / compose.server.secure.yml file needs to be updated to expose another directory like common assets directory.

    If you wish to reduce this scope to only common assets, please change,

      libms:\n    image: intocps/libms:latest\n    restart: unless-stopped\n    volumes:\n      - ${DTAAS_DIR}/deploy/config/lib.env:/dtaas/libms/.env\n      - ${DTAAS_DIR}/files/common:/dtaas/libms/files\n

    The change in the last line. The ${DTAAS_DIR}/files got replaced by ${DTAAS_DIR}/files/common. With this change, only common files are readable-writable by all logged in users.

    "},{"location":"admin/host.html#add-tls-certificates-optional","title":"Add TLS Certificates (Optional)","text":"

    The application can be served on HTTPS connection for which TLS certificates are needed. The certificates need to be issued for foo.com or *.foo.com. The names of the certificates must be fullchain.pem and privkey.pem. Copy these two certificate files into:

    • certs/foo.com/fullchain.pem
    • certs/foo.com/privkey.pem

    Traefik will run with self-issued certificates if the above two certificates are either not found or found invalid.

    Remember to update dynamic/tls.yml with correct path matching your DNS name. For example, if your DNS name is www.foo.com, then copy the TLS certificates of www.foo.com to certs/ directory and update dynamic/tls.yml as follows.

    tls:\n  certificates:\n    - certFile: /etc/traefik-certs/www.foo.com/fullchain.pem\n      keyFile: /etc/traefik-certs/www.foo.com/privkey.pem\n      stores:\n        - default\n
    "},{"location":"admin/host.html#run","title":"Run","text":""},{"location":"admin/host.html#over-http","title":"Over HTTP","text":"

    This docker compose file serves application over HTTP.

    The commands to start and stop the appliation are:

    docker compose -f compose.server.yml --env-file .env.server up -d\ndocker compose -f compose.server.yml --env-file .env.server down\n

    To restart only a specific container, for example `client``

    docker compose -f compose.server.yml --env-file .env.server up -d --force-recreate client\n
    "},{"location":"admin/host.html#over-https","title":"Over HTTPS","text":"

    This docker compose file serves application over HTTP.

    The commands to start and stop the appliation are:

    docker compose -f compose.server.secure.yml --env-file .env.server up -d\ndocker compose -f compose.server.secure.yml --env-file .env.server down\n

    To restart only a specific container, for example `client``

    docker compose -f compose.server.secure.yml --env-file .env.server up -d --force-recreate client\n
    "},{"location":"admin/host.html#use","title":"Use","text":"

    The application will be accessible at: from web browser. Sign in using your account linked to either gitlab.com or your local gitlab instance.

    All the functionality of DTaaS should be available to your users through the single page client now.

    You may have to click Sign in to Gitlab on the Client page and authorize access to the shown application.

    "},{"location":"admin/host.html#adding-a-new-user","title":"Adding a new user","text":"

    Please see the add new user to add new users.

    "},{"location":"admin/host.html#references","title":"References","text":"

    Image sources: Traefik logo, ml-workspace, reactjs, gitlab

    "},{"location":"admin/localhost-secure.html","title":"Install DTaaS on localhost with Gitlab Integration","text":"

    This installation is ideal for single users intending to use DTaaS on their own computers.

    The installation instructions provided in this README are ideal for running the DTaaS on localhost served over HTTPS connection. The intention is to integrate Gitlab into DTaaS so that both are running on localhost.

    If you do not need gitlab running on localhost, please use the simpler localhost setup.

    "},{"location":"admin/localhost-secure.html#design","title":"Design","text":"

    An illustration of the docker containers used and the authorization setup is shown here.

    "},{"location":"admin/localhost-secure.html#requirements","title":"Requirements","text":"

    The installation requirements to run this docker version of the DTaaS are:

    • docker desktop / docker CLI with compose plugin
    • mkcert
    "},{"location":"admin/localhost-secure.html#download-release-package","title":"Download Release Package","text":"

    The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

    file pathnames

    1. The filepaths shown here follow POSIX convention. The installation procedures also work with Windows paths.
    2. The description below refers to filenames. All the file paths mentioned below are relatively to the top-level DTaaS directory.
    "},{"location":"admin/localhost-secure.html#configure-and-run","title":"Configure and Run","text":""},{"location":"admin/localhost-secure.html#create-user-workspace","title":"Create User Workspace","text":"

    The existing filesystem for installation is setup for user1. A new filesystem directory needs to be created for the selected user.

    Please execute the following commands from the top-level directory of the DTaaS project.

    cp -R files/user1 files/username\n

    where username is the selected username to be created (in next steps) on Gitlab running at https://localhost/gitlab.

    "},{"location":"admin/localhost-secure.html#obtain-tls-https-certificate","title":"Obtain TLS / HTTPS Certificate","text":"

    Use mkcert to generate TLS certificates using this guide. The certificates need to be generated for localhost.

    The names of the certificates must be fullchain.pem and privkey.pem. The fullchain.pem corresponds to public certificate and the privkey.pem corresponds to private key.

    "},{"location":"admin/localhost-secure.html#add-tls-certificates-to-traefik","title":"Add TLS Certificates to Traefik","text":"

    Copy the two certificate files into:

    • deploy/docker/certs/localhost/fullchain.pem
    • deploy/docker/certs/localhost/privkey.pem

    Traefik will run with self-issued certificates if the above two certificates are either not found or found invalid.

    "},{"location":"admin/localhost-secure.html#configure-docker-compose","title":"Configure Docker Compose","text":"

    The docker compose configuration is in deploy/docker/.env.local; it is a sample file. It contains environment variables that are used by the docker compose files. It can be updated to suit your local installation scenario. It contains the following environment variables.

    Edit all the fields according to your specific case.

    URL Path Example Value Explanation DTAAS_DIR '/home/Desktop/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. username1 'user1' Your gitlab username

    Important points to note:

    1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
    2. The client configuration file is located at deploy/config/client/env.local.js. Edit the URLs in this file by replacing http with https. Beyond this, it is not necessary to modify this file.
    "},{"location":"admin/localhost-secure.html#start-dtaas-to-integrate-gitlab","title":"Start DTaaS to Integrate Gitlab","text":"

    Start the appliation with

    docker compose -f compose.local.secure.yml --env-file .env.local up -d\n
    "},{"location":"admin/localhost-secure.html#start-gitlab","title":"Start Gitlab","text":"

    Use the instructions provided in gitlab integration to bring up Gitlab on localhost and the Gitlab service will be available at https://localhost/gitlab

    "},{"location":"admin/localhost-secure.html#register-oauth2-application","title":"Register OAuth2 Application","text":"

    The frontend website requires OAuth2 application registration on the integrated Gitlab. The details of Oauth2 app for the frontend website are in client docs.

    The default OAuth client application provided in env.local.js works. However, if you intend to run an integrated gitlab instance, then this application needs to be created on gitlab running at https://localhost/gitlab.

    Remember to use https://localhost/Library as the Callback URL (REACT_APP_REDIRECT_URI).

    Please see gitlab oauth provider documentation for further help with creating this OAuth application.

    "},{"location":"admin/localhost-secure.html#update-client-website-configuration","title":"Update Client Website Configuration","text":"

    Replace the contents of deploy/config/client/env.local.js with the following.

    if (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: 'local',\n    REACT_APP_URL: 'https://localhost/',\n    REACT_APP_URL_BASENAME: '',\n    REACT_APP_URL_DTLINK: '/lab',\n    REACT_APP_URL_LIBLINK: '',\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',\n    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',\n\n    REACT_APP_CLIENT_ID: 'xxxxxx',\n    REACT_APP_AUTH_AUTHORITY: 'https://localhost/gitlab/',\n    REACT_APP_REDIRECT_URI: 'https://localhost/Library',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'https://localhost/',\n    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',\n  };\n};\n

    And then update OAuth2 client application ID (REACT_APP_CLIENT_ID) with that of the newly registered OAuth2 application.

    "},{"location":"admin/localhost-secure.html#restart-dtaas-client-website","title":"Restart DTaaS Client Website","text":"

    To update the client website configuration, run

    docker compose -f compose.local.secure.yml --env-file .env.local up -d --force-recreate client\n
    "},{"location":"admin/localhost-secure.html#use","title":"Use","text":"

    The application will be accessible at: https://localhost from web browser. Sign in using your https://localhost/gitlab account.

    All the functionality of DTaaS should be available to you through the single page client now.

    "},{"location":"admin/localhost-secure.html#limitations","title":"Limitations","text":"

    The library microservice is not included in the localhost installation scenario.

    "},{"location":"admin/localhost-secure.html#docker-help","title":"Docker Help","text":"

    The commands to start and stop the appliation are:

    docker compose -f compose.local.secure.yml --env-file .env.local up -d\ndocker compose -f compose.local.secure.yml --env-file .env.local down\n

    To restart only a specific container, for example client

    docker compose -f compose.local.secure.yml --env-file .env.local up -d --force-recreate client\n
    "},{"location":"admin/localhost-secure.html#references","title":"References","text":"

    Image sources: Traefik logo, ml-workspace, reactjs, gitlab

    "},{"location":"admin/localhost.html","title":"Install DTaaS on localhost","text":"

    The installation instructions provided in this README are ideal for running the DTaaS on both localhost. This installation is ideal for single users intending to use DTaaS on their own computers.

    "},{"location":"admin/localhost.html#design","title":"Design","text":"

    An illustration of the docker containers used and the authorization setup is shown here.

    "},{"location":"admin/localhost.html#requirements","title":"Requirements","text":"

    The installation requirements to run this docker version of the DTaaS are:

    • docker desktop / docker CLI with compose plugin
    • User account on gitlab.com

    Tip

    The frontend website requires authorization. The default authorization configuration works for gitlab.com. If you desire to use locally hosted gitlab instance, please see the client docs.

    "},{"location":"admin/localhost.html#download-release-package","title":"Download Release Package","text":"

    The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

    Tip

    1. The filepaths shown here follow POSIX convention. The installation procedures also work with Windows paths.
    2. The description below refers to filenames. All the file paths mentioned below are relatively to the top-level DTaaS directory.
    "},{"location":"admin/localhost.html#configuration","title":"Configuration","text":""},{"location":"admin/localhost.html#docker-compose","title":"Docker Compose","text":"

    The docker compose configuration is in deploy/docker/.env.local; it is a sample file. It contains environment variables that are used by the docker compose files. It can be updated to suit your local installation scenario. It contains the following environment variables.

    Edit all the fields according to your specific case.

    URL Path Example Value Explanation DTAAS_DIR '/home/Desktop/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. username1 'user1' Your gitlab username

    Tip

    Important points to note:

    1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
    2. The client configuration file is located at deploy/config/client/env.local.js. If you are following the guide to use HTTPS on localhost, edit the URLs in this file by replacing http with https. Beyond this, it is not necessary to modify this file.
    "},{"location":"admin/localhost.html#create-user-workspace","title":"Create User Workspace","text":"

    The existing filesystem for installation is setup for user1. A new filesystem directory needs to be created for the selected user.

    Please execute the following commands from the top-level directory of the DTaaS project.

    cp -R files/user1 files/username\n

    where username is the selected username registered on https://gitlab.com.

    "},{"location":"admin/localhost.html#run","title":"Run","text":"

    The commands to start and stop the appliation are:

    docker compose -f compose.local.yml --env-file .env.local up -d\ndocker compose -f compose.local.yml --env-file .env.local down\n

    To restart only a specific container, for example `client``

    docker compose -f compose.local.yml --env-file .env.local up -d --force-recreate client\n
    "},{"location":"admin/localhost.html#use","title":"Use","text":"

    The application will be accessible at: http://localhost from web browser. Sign in using your https://gitlab.com account.

    All the functionality of DTaaS should be available to you through the single page client now.

    "},{"location":"admin/localhost.html#limitations","title":"Limitations","text":"

    The library microservice is not included in the localhost installation scenario.

    "},{"location":"admin/localhost.html#references","title":"References","text":"

    Image sources: Traefik logo, ml-workspace, reactjs, gitlab

    "},{"location":"admin/overview.html","title":"Overview","text":""},{"location":"admin/overview.html#install","title":"Install","text":"

    The goal is to install and administer the DTaaS application for users.

    The DTaaS can be installed in different ways. Each version serves a different purpose.

    Easy Setup on Localhost

    The localhost installation is easy for first time users. Please give it a try.

    Otherwise, use the installation setup that fits your needs.

    Installation Setup Purpose localhost Install DTaaS on your computer for a single user; does not need a web server. This setup does not require domain name. secure localhost Install DTaaS on your computer for a single user over HTTPS with integrated gitlab installation; does not need a web server. This setup does not require domain name. Server Install DTaaS on server for multiple users. Please check the requirements. It is also possible to host the application over HTTPS with integrated gitlab installation One vagrant machine Install DTaaS on a virtual machine; can be used for single or multiple users. Two vagrant machines Install DTaaS on two virtual machines; can be used for single or multiple users. The core DTaaS application is installed on the first virtual machine and all the services (RabbitMQ, MQTT, InfluxDB, Grafana and MongoDB) are installed on second virtual machine. Independent Packages Can be used independently; do not need full installation of DTaaS.

    The installation steps is a good place to start the installation process.

    "},{"location":"admin/overview.html#administer","title":"Administer","text":"

    There is a CLI to add and delete users of a running application.

    "},{"location":"admin/packages.html","title":"Independent Packages","text":"

    The DTaaS development team publishes reusable packages which are then put together to form the complete DTaaS application.

    The packages are published on github, npmjs, and docker hub repositories.

    The packages on github are published more frequently but are not user tested. The packages on npmjs and docker hub are published at least once per release. The regular users are encouraged to use the packages from npm and docker hub.

    A brief explanation of the packages is given below.

    Package Name Description Documentation for Availability dtaas-web React web application Not useful as standalone package docker hub and github libms Library microservice npm package npmjs and github container image docker hub and github runner REST API wrapper for multiple scripts/programs npm package npmjs and github ml-workspace-minimal (fork of ml-workspace) User workspace not available docker hub. Please note that this package is highly experimental and only v0.15.0-b2 is usable now."},{"location":"admin/requirements.html","title":"Requirements","text":"

    Tip

    These optional requirements are not needed for localhost installation. They are only required for installation of the DTaaS on a production web server.

    There are two optional requirements for installing the DTaaS.

    "},{"location":"admin/requirements.html#oauth-provider","title":"OAuth Provider","text":"

    The DTaaS software is uses OAuth for user authorization. It is possible to use either gitlab.com or your own OAuth service provider.

    "},{"location":"admin/requirements.html#domain-name","title":"Domain name","text":"

    The DTaaS software is a web application and is preferably hosted on a server with a domain name like foo.com. However, it is possible to install the software on your computer and use access it at localhost.

    "},{"location":"admin/services.html","title":"Third-party Services","text":"

    The DTaaS software platform uses third-party software services to provide enhanced value to users.

    InfluxDB, Grafana, RabbitMQ and Mosquitto are default services integrated into the DTaaS software platform.

    "},{"location":"admin/services.html#pre-requisites","title":"Pre-requisites","text":"

    All these services run on raw TCP/UDP ports. Thus a direct network access to these services is required for both the DTs running inside the DTaaS software and the PT located outside the DTaaS software.

    There are two possible choices here:

    • Configure Traefik gateway to permit TCP/UDP traffic
    • Bypass Traefik altogether

    Unless you are an informed user of Traefik, we recommend bypassing traefik and provide raw TCP/UDP access to these services from the Internet.

    The InfluxDB service requires a dedicated hostname. The management interface of RabbitMQ service requires a dedicated hostname as well.

    Grafana service can run well behind Traefik gateway. The default Traefik configuration makes permits access to Grafana at URL: http(s): foo.com/vis.

    "},{"location":"admin/services.html#configure-and-install","title":"Configure and Install","text":"

    The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

    The next step in installation is to specify the config of the services. There are two configuration files. The services.yml contains most of configuration settings. The mqtt-default.conf file contains the MQTT listening port. Update these two config files before proceeding with the installation of the services.

    Now continue with the installation of services.

    yarn install\nnode services.js\n
    "},{"location":"admin/services.html#use","title":"Use","text":"

    After the installation is complete, you can see the following services active at the following ports / URLs.

    service external url Influx services.foo.com Grafana services.foo.com:3000 RabbitMQ Broker services.foo.com:5672 RabbitMQ Broker Management Website services.foo.com:15672 MQTT Broker services.foo.com:1883 MongoDB database services.foo.com:27017

    The firewall and network access settings of corporate / cloud network need to be configured to allow external access to the services. Otherwise the users of DTaaS will not be able to utilize these services from their user workspaces.

    "},{"location":"admin/steps.html","title":"Installation Steps","text":""},{"location":"admin/steps.html#complete-dtaas-application","title":"Complete DTaaS Application","text":"

    DTaaS application is available in two flavors. One is localhost which is suitable for single-user, local usage. Another is production server which is suitable for multi-user setup.

    In both cases, the installation is a three step process.

    "},{"location":"admin/steps.html#setup-authorization","title":"Setup Authorization","text":"

    DTaaS provides security using OAuth authorization for both react client frontend and backend services.

    There is a default frontend authorization application setup for all localhost and backend authorization is not required for localhost installation.

    The production server installation requires both react client frontend and backend services applications.

    "},{"location":"admin/steps.html#configure-components","title":"Configure Components","text":"

    DTaaS is available as docker compose application. There are four docker compose files

    1. compose.local.yml for localhost installation served over HTTP connection.
    2. compose.local.secure.yml for secure localhost installation served over HTTPS connection.
    3. compose.server.yml for production server installation served over HTTP connection.
    4. compose.server.secure.yml for production server installation served over HTTPS connection.

    These four compose files require environment configuration files. The explanation of this configuration file is available directly on the installation pages.

    In addition, react client frontend requires configuration which is explained on this page.

    "},{"location":"admin/steps.html#install","title":"Install","text":"

    Follow installation instructions given on either localhost or production server pages.

    "},{"location":"admin/steps.html#independent-packages","title":"Independent Packages","text":"

    Each release of DTaaS also comes with release of three reusable packages. These packages have dedicated documentation.

    "},{"location":"admin/client/auth.html","title":"OAuth for React Client","text":"

    To enable user authorization on DTaaS React client website, you will use the OAuth authorization protocol, specifically the PKCE authorization flow. Here are the steps to get started:

    1. Choose Your GitLab Server:

    • You need to set up OAuth authorization on a GitLab server. The commercial gitlab.com is not suitable for multi-user authorization (DTaaS requires this), so you'll need an on-premise GitLab instance.
    • You can use GitLab Omnibus Docker for this purpose.
    • Configure the OAuth application as an instance-wide authorization type.

    2. Determine Your Website's Hostname:

    • Before setting up OAuth on GitLab, decide on the hostname for your website. It's recommended to use a self-hosted GitLab instance, which you will use in other parts of the DTaaS application.

    3. Define Callback and Logout URLs:

    • For the PKCE authorization flow to function correctly, you need two URLs: a callback URL and a logout URL.
    • The callback URL informs the OAuth provider of the page where signed-in users should be redirected. It's different from the landing homepage of the DTaaS application.
    • The logout URL is where users will be directed after logging out.

    4. OAuth Application Creation:

    • During the creation of the OAuth application on GitLab, you need to specify the scope. Choose openid, profile, read_user, read_repository, and api scopes.

    5. Application ID:

    • After successfully creating the OAuth application, GitLab generates an application ID. This is a long string of HEX values that you will need for your configuration files.

    6. Required Information from OAuth Application:

    • You will need the following information from the OAuth application registered on GitLab:
    GitLab Variable Name Variable Name in Client env.js Default Value OAuth Provider REACT_APP_AUTH_AUTHORITY https://gitlab.foo.com/ Application ID REACT_APP_CLIENT_ID Callback URL REACT_APP_REDIRECT_URI https://foo.com/Library Scopes REACT_APP_GITLAB_SCOPES openid, profile, read_user, read_repository, api

    7. Create User Accounts:

    Create user accounts in gitlab for all the usernames chosen during installation. The trial installation script comes with two default usernames - user1 and user2. For all other installation scenarios, accounts with specific usernames need to be created on gitlab.

    "},{"location":"admin/client/config.html","title":"Configure Client Website","text":"

    This page describes various configuration options for react website.

    if (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: \"prod | dev | local | test\",\n    REACT_APP_URL: \"URL for the gateway\",\n    REACT_APP_URL_BASENAME: \"Base URL for the client website\"(optional, can be null),\n    REACT_APP_URL_DTLINK: \"Endpoint for the Digital Twin\",\n    REACT_APP_URL_LIBLINK: \"Endpoint for the Library Assets\",\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: \"Endpoint for the VNC Desktop link\",\n    REACT_APP_WORKBENCHLINK_VSCODE: \"Endpoint for the VS Code link\",\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: \"Endpoint for the Jupyter Lab link\",\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK:\n      \"Endpoint for the Jupyter Notebook link\",\n    REACT_APP_WORKBENCHLINK_DT_PREVIEW: \"Endpoint for the Digital Twins page preview\",\n    REACT_APP_CLIENT_ID: 'AppID genereated by the gitlab OAuth provider',\n    REACT_APP_AUTH_AUTHORITY: 'URL of the private gitlab instance',\n    REACT_APP_REDIRECT_URI: 'URL of the homepage for the logged in users of the website',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'URL of the homepage for the anonymous users of the website',\n    REACT_APP_GITLAB_SCOPES: 'OAuth scopes. These should match with the scopes set in gitlab OAuth provider',\n  };\n};\n\n// Example values with no base URL. Trailing and ending slashes are optional.\nif (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: 'prod',\n    REACT_APP_URL: 'https://foo.com/',\n    REACT_APP_URL_BASENAME: '',\n    REACT_APP_URL_DTLINK: '/lab',\n    REACT_APP_URL_LIBLINK: '',\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',\n    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',\n    REACT_APP_WORKBENCHLINK_DT_PREVIEW: '/preview/digitaltwins',\n    REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',\n    REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/',\n    REACT_APP_REDIRECT_URI: 'https://foo.com/Library',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'https://foo.com/',\n    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',\n  };\n};\n\n\n// Example values with \"bar\" as basename URL.\n//Trailing and ending slashes are optional.\nif (typeof window !== 'undefined') {\n  window.env = {\n    REACT_APP_ENVIRONMENT: \"dev\",\n    REACT_APP_URL: 'http://localhost:4000/',\n    REACT_APP_URL_BASENAME: 'bar',\n    REACT_APP_URL_DTLINK: '/lab',\n    REACT_APP_URL_LIBLINK: '',\n    REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',\n    REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',\n    REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',\n    REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',\n    REACT_APP_WORKBENCHLINK_DT_PREVIEW: '/preview/digitaltwins',\n    REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c',\n    REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/',\n    REACT_APP_REDIRECT_URI: 'http://localhost:4000/bar/Library',\n    REACT_APP_LOGOUT_REDIRECT_URI: 'http://localhost:4000/bar',\n    REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',\n  };\n};\n
    "},{"location":"admin/client/config.html#multiple-dtaas-applications","title":"Multiple DTaaS applications","text":"

    Warning

    This is not a regular installation scenario and is only recommended for experts. This installation setup requires significant modifications to the docker compose files.

    The DTaaS is a regular web application. It is possible to host multiple DTaaS applications on the same server. The only requirement is to have a distinct URLs. You can have three DTaaS applications running at the following URLs.

    https://foo.com/au\nhttps://foo.com/acme\nhttps://foo.com/bar\n

    All of these instances can use the same gitlab instance for authorization.

    DTaaS application URL Gitlab Instance URL Callback URL Logout URL Application ID https://foo.com/au https://foo.gitlab.com https://foo.com/au/Library https://foo.com/au autogenerated by gitlab https://foo.com/acme https://foo.gitlab.com https://foo.com/au/Library https://foo.com/au autogenerated by gitlab https://foo.com/bar https://foo.gitlab.com https://foo.com/au/Library https://foo.com/au autogenerated by gitlab

    If you are hosting multiple DTaaS instances on the same server, do not install DTaaS with a null basename on the same server. Even though it works well, the setup is confusing to setup and may lead to maintenance issues.

    If you choose to host your DTaaS application with a basename (say bar), then the URLs in env.js change to:

    DTaaS application URL: https://foo.com/bar\nGitlab instance URL: https://gitlab.foo.com\nCallback URL: https://foo.com/bar/Library\nLogout URL: https://foo.com/bar\n
    "},{"location":"admin/gitlab/index.html","title":"Install Gitlab","text":"

    This guide helps with installation of a dedicated Gitlab service. This Gitlab installation can be used as OAuth2 authorization provider to the DTaaS software. In addition, it is also possible to use the integrated Gitlab for enabling the digital twin DevOps experimental features of the DTaaS.

    There are two possible ways you can install Gitlab:

    • At dedicated domain name (ex: gitlab.foo.com)
    • At a URL path on existing WWW server (ex: foo.com/gitlab)

      This guide illustrates the installation of Gitlab at: foo.com/gitlab. But the instructions can be adapted to install Gitlab at a dedicated domain name."},{"location":"admin/gitlab/index.html#download-release-package","title":"Download Release Package","text":"

      The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

      "},{"location":"admin/gitlab/index.html#configure-and-install","title":"Configure and Install","text":"
      cd DTaaS/deploy/services/gitlab\n

      This directory contains files needed to set up the docker container containing the local GitLab instance.

      1. ./data, ./config, ./logs are the directories that will contain data for the GitLab instance
      2. compose.gitlab.yml and .env are the Docker compose and environment files to manage the containerized instance of gitlab

      If the DTaaS application and gitlab are to be hosted at https://foo.com, then the client config file (deploy/config/client/env.js) needs to use the https://foo.com/gitlab as REACT_APP_AUTH_AUTHORITY. In addition, this hosting at https://foo.com also requires changes to config file (.env.server).

      If the DTaaS application and gitlab are to be hosted at https://localhost, then the client config file (deploy/config/client/env.local.js) needs to use the https://localhost/gitlab as REACT_APP_AUTH_AUTHORITY. If the application and the integrated gitlab are to be hosted at https://localhost/gitlab, then .env.server need not be modified.

      Edit the .env file available in this directory to contain the following variables:

      Variable Example Value Explanation GITLAB_HOME '/home/Desktop/DTaaS/deploy/services/gitlab' Full path to the DTaaS gitlab directory. This is an absolute path with no trailing slash. SERVER_DNS either foo.com or localhost The server DNS, if you are deploying with a dedicated server. Remember not use http(s) at the beginning of the DNS string.

      NOTE: The DTaaS client uses the react-oidc-context node package, which incorrectly causes redirects to use the HTTPS URL scheme. This is a known issue with the package, and forces us to use HTTPS for the DTaaS server. If you are hosting the DTaaS locally, your GitLab instance should be available at https://localhost/gitlab. If you are hosting the DTaaS at https://foo.com, then you Gitlab instance should be available at https://foo.com/gitlab.

      "},{"location":"admin/gitlab/index.html#run","title":"Run","text":"

      NOTE: The GitLab instance operates with the dtaas-frontend network, which requires the DTaaS server to be running before you start it. You may refer to secure installation scenarios (../overview.md) for the same.

      The commands to start and stop the instance are:

      # (cd deploy/services/gitlab)\ndocker compose -f compose.gitlab.yml up -d\ndocker compose -f compose.gitlab.yml down\n

      Each time you start the container, it may take a few minutes. You can monitor the progress with watch docker ps and check if the gitlab container is healthy.

      "},{"location":"admin/gitlab/index.html#post-install-configuration","title":"Post-install Configuration","text":"

      Gitlab also requires post-installation configuration.

      Information

      This configuration needs to be done from within the running container.

      docker exec -it gitlab bash\n

      The configuration file to change is /etc/gitlab/gitlab.rb. The variables to change are:

      external_url 'http(s)://foo.com/gitlab'\nnginx['listen_port'] = 80\nnginx['enable'] = true\n\nnginx['listen_https'] = false\nnginx['redirect_http_to_https'] = false\nletsencrypt['enable'] = false\n

      The external_url mentioned about indicates hosting of gitlab at https://foo.com/gitlab. If the gitlab needs to be available at https://localhost/gitlab, then the external_url should be https://localhost/gitlab.

      Save the changes and reconfigure gitlab by running:

      # inside the gitlab docker container\ngitlab-ctl reconfigure\nexit\n

      The administrator username for GitLab is: root. The password for this user account will be available in: /etc/gitlab/initial_root_password. Be sure to save this password somewhere, as this file will be deleted after 24 hours from the first time you start the local instance.

      After running the container, your local GitLab instance will be available at external_url specified in gitlab.rb, i.e., either at https://foo.com/gitlab or at https://localhost/gitlab.

      "},{"location":"admin/gitlab/index.html#create-users","title":"Create Users","text":"

      The newly installed gitlab only contains root user. More users need to be created for use with DTaaS. Please see the Gitlab docs for further help.

      "},{"location":"admin/gitlab/index.html#pending-tasks","title":"Pending Tasks","text":"

      This README helps with installation of Gitlab along side DTaaS application. But the OAuth2 integration between Gitlab and DTaaS will still be still pending. Follow the integration guide and runner setup to setup the Gitlab integration.

      "},{"location":"admin/gitlab/integration.html","title":"GitLab Integration Guide","text":"

      This guide helps with integration of a local GitLab instance with a DTaaS server installation, and integrating the OAuth Authorization feature with the DTaaS installation.

      After following this guide, the GitLab instance will be integrated as OAuth provider for both DTaaS client application and Traefik Forward Auth backend authorization.

      Note

      The DTaaS client uses the react-oidc-context node package, which incorrectly causes authorization redirects to use the HTTPS URL scheme. This is a known issue with the package, and forces us to use HTTPS for the DTaaS server. This means your server should be set up to use either https://localhost or https://foo.com. This guide will henceforth use foo.com to represent either localhost or a custom domain.

      "},{"location":"admin/gitlab/integration.html#integration-steps","title":"Integration Steps","text":""},{"location":"admin/gitlab/integration.html#1-set-up-the-dtaas-server-over-https","title":"1. Set up the DTaaS server over HTTPS","text":"

      Follow the existing guides to set up the DTaaS web application over HTTPS connection on either localhost (https://localhost) or a custom domain (https://foo.com).

      Note

      You may ignore steps related to configuring OAuth application tokens at https://gitlab.com. We will be using the initial installation to host the local GitLab instance, on which we will later create the OAuth application tokens.

      "},{"location":"admin/gitlab/integration.html#2-set-up-the-gitlab-instance","title":"2. Set up the GitLab Instance","text":"

      Follow the guide to set up a GitLab instance.

      After this step, and once you run gitlab-ctl reconfigure, you will have a functioning GitLab instance (at either https://localhost/gitlab or https://foo.com/gitlab). Login credentials of the root user.

      "},{"location":"admin/gitlab/integration.html#3-create-oauth-tokens-in-gitlab","title":"3. Create OAuth Tokens in GitLab","text":"

      Follow these guides to create OAuth Application Tokens for - backend and client. Please note that backend is not required for https://localhost installation.

      After this step you will have credentials for the application tokens titled \"DTaaS Server Authorization\" and \"DTaaS Client Authorization\", which we will use in the next step.

      "},{"location":"admin/gitlab/integration.html#4-use-valid-oauth-application-tokens","title":"4. Use Valid Oauth Application Tokens","text":"

      We can now use the OAuth tokens generated on the GitLab instance to enable authorization.

      If the DTaaS application is hosted at https://localhost, then configure the following files:

      1. DTaaS Client Authorization token in deploy/config/client/env.local.js.
      2. deploy/docker/.env.local Add localpath and username.

      If the DTaaS application is hosted at https://foo.com, then configure the following files:

      1. DTaaS Client Authorization token in deploy/config/client/env.js.
      2. deploy/docker/.env.server - Add localpath and username, OAuth client ID and client secret from the DTaaS Server Authorization token
      "},{"location":"admin/gitlab/integration.html#restart-services","title":"Restart Services","text":""},{"location":"admin/gitlab/integration.html#localhost-installation","title":"Localhost Installation","text":"

      The updated OAuth application configuration needs to be loaded into the client website service.

      cd deploy/docker\ndocker compose -f compose.local.yml --env-file .env.local up -d --force-recreate client\n
      "},{"location":"admin/gitlab/integration.html#production-server-installation","title":"Production Server Installation","text":"

      The updated OAuth application configuration needs to be loaded into the client website and the forward-auth services.

      The production server can be installed with either http or https option. If it is installed with http option, run the following commands.

      cd deploy/docker\ndocker compose -f compose.server.yml --env-file .env.server up -d --force-recreate client\ndocker compose -f compose.server.yml --env-file .env.server up -d --force-recreate traefik-forward-auth\n

      If the production server is installed with https option, run the following commands.

      cd deploy/docker\ndocker compose -f compose.server.secure.yml --env-file .env.server up -d --force-recreate client\ndocker compose -f compose.server.secure.yml --env-file .env.server up -d --force-recreate traefik-forward-auth\n
      "},{"location":"admin/gitlab/integration.html#post-setup-usage","title":"Post Setup Usage","text":"

      If you have set up everything correctly:

      1. You will have a functioning path-prefixed GitLab instance available at https://foo.com/gitlab that you may use in a similar manner to https://gitlab.com.
      2. Data, configuration settings and logs pertaining to the GitLab installation will be available on the DTaaS server within the directory: deploy/services/gitlab.
      3. Traefik Forward Auth will use the path-prefixed GitLab instance for authorization on the multi-user installation scenario i.e. foo.com (but not on localhost).
      "},{"location":"admin/gitlab/runner.html","title":"Gitlab Runner Integration","text":"

      To properly use the Digital Twins Preview Page, you need to configure at least one project runner in your GitLab profile. The first step is to configure the CI/CD pipeline in gitlab project. The second step is to install the runner and integrate it with the selected gitlab project.

      "},{"location":"admin/gitlab/runner.html#configure-gitlab-project","title":"Configure Gitlab Project","text":"

      Follow the steps below:

      1. Navigate to the DTaaS group and select the project named after your GitLab username.
      2. In the project menu, go to Settings and select CI/CD.
      3. Expand the Runners section and click on New project runner. Follow the configuration instructions carefully:
      4. Add linux as a tag during configuration.
      5. Click on Create runner. A runner authentication token is generated. This token will be used later for registering a runner.
      "},{"location":"admin/gitlab/runner.html#runner","title":"Runner","text":""},{"location":"admin/gitlab/runner.html#install-runner","title":"Install Runner","text":"

      A detailed guide on installation of gitlab runners on Linux OS is available on gitlab website. Remember to use linux as tag for the runner.

      "},{"location":"admin/gitlab/runner.html#register-runner","title":"Register Runner","text":"

      Please see this gitlab guide on registering a runner.

      Remember to choose docker as executor and ruby:2.7 as the default docker image.

      $sudo gitlab-runner register  --url https://gitlab.foo.com \\\n  --token xxxxx\n

      Or, you can also register the runner in non-interactive mode by running

      $sudo gitlab-runner register \\\n  --non-interactive \\\n  --url \"https://gitlab.foo.com/\" \\\n  --token \"xxxx\" \\\n  --executor \"docker\" \\\n  --docker-image ruby:2.7 \\\n  --description \"docker-runner\"\n
      "},{"location":"admin/gitlab/runner.html#start-runner","title":"Start Runner","text":"

      You can manually verify that the runner is available to pick up jobs by running the following command:

      $sudo gitlab-runner run\n

      It can also be used to reactivate offline runners during subsequent sessions.

      "},{"location":"admin/gitlab/runner.html#pipeline-trigger-token","title":"Pipeline Trigger Token","text":"

      You also need to create a pipeline trigger token. This token is required to trigger pipelines by using the API. You can create this token in your GitLab project's CI/CD settings under the Pipeline trigger tokens section.

      "},{"location":"admin/guides/add_service.html","title":"Add other services","text":"

      Pre-requisite

      You should read the documentation about the already available services

      This guide will show you how to add more services. In the following example we will be adding MongoDB as a service, but these steps could be modified to install other services as well.

      Adding other services requires more RAM and CPU power. Please make sure the host machine meets the hardware requirements for running all the services.

      1. Add the configuration:

      Select configuration parameters for the MongoDB service.

      Configuration Variable Name Description username the username of the root user in the MongoDB password the password of the root user in the MongoDB port the mapped port on the host machine (default is 27017) datapath path on host machine to mount the data from the MongoDB container

      Open the file /deploy/services/services.yml and add the configuration for MongoDB:

      services:\n    rabbitmq:\n        username: \"dtaas\"\n        password: \"dtaas\"\n        vhost: \"/\"\n        ports:\n            main: 5672\n            management: 15672\n    ...\n    mongodb:\n        username: <username>\n        password: <password>\n        port: <port>\n        datapath: <datapath>\n    ...\n

      2. Add the script:

      The next step is to add the script that sets up the MongoDB container with the configuraiton.

      Create new file named /deploy/services/mongodb.js and add the following code:

      #!/usr/bin/node\n/* Install the optional platform services for DTaaS */\nimport { $ } from \"execa\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport yaml from \"js-yaml\";\n\nconst $$ = $({ stdio: \"inherit\" });\nconst log = console.log;\nlet config;\n\ntry {\n  log(chalk.blue(\"Load services configuration\"));\n  config = await yaml.load(fs.readFileSync(\"services.yml\", \"utf8\"));\n  log(\n    chalk.green(\n      \"configuration loading is successful and config is a valid yaml file\"\n    )\n  );\n} catch (e) {\n  log(chalk.red(\"configuration is invalid. Please rectify services.yml file\"));\n  process.exit(1);\n}\n\nlog(chalk.blue(\"Start MongoDB server\"));\nconst mongodbConfig = config.services.mongodb;\n\ntry {\n  log(\n    chalk.green(\n      \"Attempt to delete any existing MongoDB server docker container\"\n    )\n  );\n  await $$`docker stop mongodb`;\n  await $$`docker rm mongodb`;\n} catch (e) {}\n\nlog(chalk.green(\"Start new Mongodb server docker container\"));\nawait $$`docker run -d -p ${mongodbConfig.port}:27017 \\\n  --name mongodb \\\n  -v ${mongodbConfig.datapath}:/data/db \\\n  -e MONGO_INITDB_ROOT_USERNAME=${mongodbConfig.username} \\\n  -e MONGO_INITDB_ROOT_PASSWORD=${mongodbConfig.password} \\\n  --restart always \\\n  mongo:7.0.3`;\nlog(chalk.green(\"MongoDB server docker container started successfully\"));\n

      3. Run the script:

      Go to the directory /deploy/services/ and run services script with the following commands:

      yarn install\nnode mongodb.js\n

      The MongoDB should now be available on services.foo.com:<port>.

      "},{"location":"admin/guides/add_user.html","title":"Add User","text":"

      This page provides steps to adding a user from a DTaaS installation. The username alice is used here to illustrate the steps involved in removing a user account.

      Please do the following:

      1. Add user to Gitlab instance:

      Add a new account for the new user on the Gitlab instance. Note the username and email of the new account.

      2. Create User Workspace:

      Use the DTaaS CLI to bring up the workspaces for new users. This brings up the containers, without the backend authorization.

      3. Add backend authorization for the user:

      • Go to the docker directory
      cd <DTaaS>/docker\n
      • Add three lines to the conf.server file
      rule.onlyu3.action=auth\nrule.onlyu3.rule=PathPrefix(`/alice`)\nrule.onlyu3.whitelist = alice@foo.com\n

      4. Restart the docker container responsible for backend authorization.

      docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n

      5. The new users are now added to the DTaaS instance, with authorization enabled.

      "},{"location":"admin/guides/common_workspace_readonly.html","title":"Make Common Assets Read Only","text":""},{"location":"admin/guides/common_workspace_readonly.html#why","title":"Why","text":"

      In some cases you might want to restrict the access rights of some users to the common assets. In order to make the common area read only, you have to change the install script section performing the creation of user workspaces.

      Note

      These step needs to be performed before installation of the application.

      "},{"location":"admin/guides/common_workspace_readonly.html#how","title":"How","text":"

      To make the common assets read-only for a user, the following changes need to be made to the compose.server.yml file.

        ...\n  user1:\n    ....\n    volumes:\n      - ${DTAAS_DIR}/files/common:/workspace/common:ro\n    ....\n\n  user2:\n    ....\n    volumes:\n      - ${DTAAS_DIR}/files/common:/workspace/common:ro\n    ....\n

      Please note the :ro at the end of the line. This suffix makes the common assets read only.

      If you want to have the same kind of read only restriction for new users as well, please make a similar change in cli/users.server.yml.

      "},{"location":"admin/guides/link_service.html","title":"Link services to local ports","text":"

      Requirements

      • User needs to have an account on server2.
      • SSH server must be running on server2

      To link a port from the service machine (server2) to the local port on the user workspace. You can use ssh local port forwarding technique.

      1. Step:

      Go to the user workspace, on which you want to map from localhost to the services machine

      • e.g. foo.com/user1

      2. Step:

      Open a terminal in your user workspace.

      3. Step:

      Run the following command to map a port:

      ssh -fNT -L <local_port>:<destination>:<destination_port> <user>@<services.server.com>\n

      Here's an example mapping the RabbitMQ broker service available at 5672 of services.foo.com to localhost port 5672.

      ssh -fNT -L 5672:localhost:5672 vagrant@services.foo.com\n

      Now the programs in user workspace can treat the RabbitMQ broker service as a local service running within user workspace.

      "},{"location":"admin/guides/localhost_portainer.html","title":"Install DTaaS on localhost (GUI)","text":"

      The installation instructions provided in this README are ideal for running the DTaaS on localhost via a Graphical User Interface (GUI). This installation is ideal for single users intending to use DTaaS on their own computers.

      "},{"location":"admin/guides/localhost_portainer.html#design","title":"Design","text":"

      An illustration of the docker containers used and the authorization setup is shown here.

      "},{"location":"admin/guides/localhost_portainer.html#requirements","title":"Requirements","text":"

      The installation requirements to run this docker version of the DTaaS are:

      • docker desktop / docker CLI with compose plugin
      • User account on gitlab.com

      Tip

      The frontend website requires authorization. The default authorization configuration works for gitlab.com. If you desire to use locally hosted gitlab instance, please see the client docs.

      "},{"location":"admin/guides/localhost_portainer.html#download-release-package","title":"Download Release Package","text":"

      The software is available for as zip package. Please download and unzip the same. A new DTaaS-v0.6.0 folder gets created. The rest of the installation instructions assume that you are using Windows/Linux/MacOS terminal in DTaaS-v0.6.0 folder.

      cd DTaaS/deploy/services/gitlab\n

      In this guide we will assume the contents of the zip file have been extracted to the directory: /home/DTaaS.

      Tip

      The path given here is for Linux OS. It can be Windows compatible as well, for example: C:\\\\DTaaS. Make sure to use this path and format in place of /home/DTaaS in this guide.

      "},{"location":"admin/guides/localhost_portainer.html#starting-portainer","title":"Starting Portainer","text":"

      The GUI used to run the application and docker containers will be provided by Portainer Community Edition. It is itself a Docker container that will create a website at https://localhost:9443, which will present a graphical interface for starting and stopping the application.

      You may follow the official documentation for setting up a Portainer CE Server . Alternatively, open a terminal on your system (Terminal on Linux / MacOS, Powershell on Windows, etc) and copy the following commands into it:

      docker volume create portainer_data\ndocker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.21.4\n

      This will start the Portainer server on your system, which will host its dashboard at https://localhost:9443. Follow the Initial Setup Guide to set up an administrator account for Portainer on your system.

      Portainer should now be set up on your system, and you can access the dashboard:

      Tip

      The next time you wish to start the Portainer server, run docker start portainer.

      "},{"location":"admin/guides/localhost_portainer.html#configuration","title":"Configuration","text":""},{"location":"admin/guides/localhost_portainer.html#create-user-workspace","title":"Create User Workspace","text":"

      The existing filesystem for installation is setup for user1. A new filesystem directory needs to be created for the selected user.

      You may use your file explorer or an equivalent application to duplicate the files/user1 directory and rename it as files/username where username is the selected username registered on https://gitlab.com.

      ALternatively, you may execute the following commands from the top-level directory of the DTaaS project.

      cp -R files/user1 files/username\n
      "},{"location":"admin/guides/localhost_portainer.html#creating-the-portainer-stack","title":"Creating the Portainer Stack","text":"

      Portainer Stacks are equivalent to using docker compose commands to manage containers.

      1. Navigate to the Stacks tab on the side panel, and click on the Add Stack button.
      2. Name the Stack anything descriptive, for example: dtaas-localhost.
      3. Select the Upload build method.
      4. Upload the compose file located at deploy/docker/compose.local.yml.
      5. Select the option to load variables from a .env file, and upload the file deploy/docker/.env.local.

      Tip

      Sometimes the .env.local file does not show up in the file explorer. You may fix this by selecting the option to show All Files rather than those with the extension .env.

      The .env.local file contains environment variables that are used by the compose file. Portainer allows you to modify them as shown in the screenshot above, here is a summary:

      URL Path Example Value Explanation DTAAS_DIR '/home/Desktop/DTaaS' Full path to the DTaaS directory. This is an absolute path with no trailing slash. username1 'user1' Your gitlab username

      Tip

      Important points to note:

      1. The path examples given here are for Linux OS. These paths can be Windows OS compatible paths as well.
      2. The client configuration file is located at deploy/config/client/env.local.js. If you are following the guide to use HTTPS on localhost, edit the URLs in this file by replacing http with https.

      Once you have configured the environment variables, click on the button Deploy the stack.

      "},{"location":"admin/guides/localhost_portainer.html#use","title":"Use","text":"

      The application will be accessible at: http://localhost from web browser. Sign in using your https://gitlab.com account.

      All the functionality of DTaaS should be available to you through the single page client now.

      "},{"location":"admin/guides/localhost_portainer.html#limitations","title":"Limitations","text":"

      The library microservice is not included in the localhost installation scenario.

      "},{"location":"admin/guides/localhost_portainer.html#references","title":"References","text":"

      Image sources: Traefik logo, ml-workspace, reactjs, gitlab

      "},{"location":"admin/guides/remove_user.html","title":"Remove User","text":"

      This page provides steps to remove a user from a DTaaS installation. The username alice is used here to illustrate the steps involved in removing a user account.

      Please do the following:

      1. Remove an existing user with the DTaaS CLI.

      2. Remove backend authorization for the user:

      • Go to the docker directory
      cd <DTaaS>/docker\n
      • Remove these three lines from the conf.server file
      rule.onlyu3.action=auth\nrule.onlyu3.rule=PathPrefix(`/alice`)\nrule.onlyu3.whitelist = alice@foo.com\n
      • Run the command for these changes to take effect:
      docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n

      The extra users now have no backend authorization.

      3. Remove users to Gitlab instance (optional):

      Please see gitlab docs for more help.

      4. The user account is now deleted.

      "},{"location":"admin/guides/remove_user.html#caveat","title":"Caveat","text":"

      You cannot delete the two base users that the DTaaS software is installed with. You can only delete the extra users that have been added to the software.

      "},{"location":"admin/servers/auth.html","title":"OAuth for Traefik Gateway","text":"

      The traefik gateway is used to serve the DTaaS. All the services provided as part of the application are secured at the traefik gateway. The security is based on Traefik forward-auth.

      An illustration of the docker containers used and the authorization setup is shown here.

      The traefik forward-auth can use any OAuth2 provider, but within the DTaaS gitlab is used as authorization provider. You will use the OAuth the web / server application authorization flow.

      Here are the steps to get started:

      1. Choose GitLab Server:

      • You need to set up OAuth authorization on a GitLab server. The commercial gitlab.com is not suitable for multi-user authorization (DTaaS requires this), so you'll need an on-premise GitLab instance.
      • You can use GitLab Omnibus Docker for this purpose.
      • Configure the OAuth application as an instance-wide authorization type. Select option to generate client secret and also selection option for trusted application.

      2. Determine Website Hostname:

      Before setting up OAuth on GitLab, decide on the hostname for your website. It's recommended to use a self-hosted GitLab instance, which you will use in other parts of the DTaaS application.

      3. Determine Callback and Logout URLs:

      For the web / server authorization flow to function correctly, you need two URLs: a callback URL and a logout URL.

      • The callback URL informs the OAuth provider of the page where signed-in users should be redirected. It is the landing homepage of the DTaaS application. (either http://foo.com/_oauth/ or http://localhost/_oauth/)
      • The logout URL is the URL for signout of gitlab and clear authorization within traefik-forward auth. (either http://foo.com/_oauth/logout or http://localhost/_oauth/logout). The logout URL is to help users logout of traefik forward-auth. The logout URL should not be entered into Gitlab OAuth application setup.

      4. Create OAuth Application:

      Oauth application setup on GitLab can be located on Edit Profile -> Application https://gitlab.foo.com/-/profile/applications.

      During the creation of the OAuth application on GitLab, you need to specify the scope. Choose read_user scope.

      5. Copy Application Credentials:

      After successfully creating the OAuth application, GitLab generates an application ID and client secret.

      Both these values are long string of HEX values that you will need for your configuration files.

      6. Checklist: Required Information from OAuth Application:

      You will need the following information from the OAuth application registered on GitLab:

      GitLab Variable Name Variable Name in .env of docker compose file Default Value OAuth Provider OAUTH_URL https://gitlab.foo.com/ Application ID OAUTH_CLIENT_ID xx Application Secret OAUTH_CLIENT_SECRET xx Callback URL (to be directly entered in Gitlab OAuth registration) Forward-auth secret OAUTH_SECRET random-secret-string (password for forward-auth, can be changed to your preferred string) Scopes read_user"},{"location":"admin/servers/auth.html#development-environment","title":"Development Environment","text":"

      The development environment and server installation scenarios requires traefik forward-auth.

      "},{"location":"admin/servers/auth.html#configure-authorization-rules-for-traefik-forward-auth","title":"Configure Authorization Rules for Traefik Forward-Auth","text":"

      The Traefik forward-auth microservices requires configuration rules to manage authorization for different URL paths. The conf.server file can be used to configure the specific rules. There are broadly three kinds of URLs:

      "},{"location":"admin/servers/auth.html#public-path-without-authorization","title":"Public Path Without Authorization","text":"

      To setup a public page, an example is shown below.

      rule.noauth.action=allow\nrule.noauth.rule=Path(`/public`)\n

      Here, 'noauth' is the rule name, and should be changed to suit rule use. Rule names should be unique for each rule. The 'action' property is set to \"allow\" to make the resource public. The 'rule' property defines the path/route to reach the resource.

      "},{"location":"admin/servers/auth.html#common-to-all-users","title":"Common to All Users","text":"

      To setup a common page that requires Gitlab OAuth, but is available to all users of the Gitlab instance:

      rule.all.action=auth\nrule.all.rule=Path(`/common`)\n

      The 'action' property is set to \"auth\", to enable Gitlab OAuth before the resource can be accessed.

      "},{"location":"admin/servers/auth.html#selective-access","title":"Selective Access","text":"

      Selective Access refers to the scenario of allowing access to a URL path for a few users. To setup selective access to a page:

      rule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user1`)\nrule.onlyu1.whitelist = user1@localhost\n

      The 'whitelist' property of a rule defines a comma separated list of email IDs that are allowed to access the resource. While signing in users can sign in with either their username or email ID as usual, but the email ID corresponding to the account should be included in the whitelist.

      This restricts access of the resource, allowing only users mentioned in the whitelist.

      "},{"location":"admin/servers/auth.html#user-management","title":"User management","text":"

      DTaaS provides an easy way to add and remove additional users from your DTaaS instance.

      All such user management can be done via the DTaaS CLI

      "},{"location":"admin/servers/auth.html#limitation","title":"Limitation","text":"

      The rules in _conf._ file are not dynamically loaded into the traefik-forward-auth microservice. Any change in the conf file requires restart of traefik-forward-auth for the changes to take effect. All the existing user sessions get invalidated when the traefik-forward-auth* restarts.

      Use a simple command on the terminal.

      • For a local instance:
      docker compose -f compose.server.yml --env-file .env up -d --force-recreate traefik-forward-auth\n
      • For a server instance:
      docker compose -f compose.server.yml --env-file .env.server up -d --force-recreate traefik-forward-auth\n
      "},{"location":"admin/servers/lib/config.html","title":"Configure Library Microservice","text":"

      The microservices requires config specified in INI format. The template configuration file is:

      PORT='4001'\nMODE='local'\nLOCAL_PATH='/Users/<Username>/DTaaS/files'\nLOG_LEVEL='debug'\nAPOLLO_PATH='/lib' or ''\nGRAPHQL_PLAYGROUND='false' or 'true'\n

      The LOCAL_PATH variable is the absolute filepath to the location of the local directory which will be served to users by the Library microservice.

      Replace the default values the appropriate values for your setup.

      The config is saved .env file by convention. The libms looks for .env file in the working directory from which it is run. If you want to run libms without explicitly specifying the configuration file, run

      "},{"location":"admin/servers/lib/docker.html","title":"Host Library Microservice","text":"

      The lib microservice is a simplified file manager serving files over graphQL and HTTP API.

      It has two features:

      • provide a listing of directory contents.
      • transfer a file to user.

      This document provides instructions for running docker container to provide a stand alone library microservice.

      "},{"location":"admin/servers/lib/docker.html#setup-the-file-system","title":"Setup the File System","text":""},{"location":"admin/servers/lib/docker.html#outside-dtaas","title":"Outside DTaaS","text":"

      The package can be used independently of DTaaS. If this is your use case, you do not need any specific file structure. A valid file directory named files is sufficient and it should be placed in the directory from which the compose.lib.yml will be run.

      "},{"location":"admin/servers/lib/docker.html#inside-dtaas","title":"Inside DTaaS","text":"

      The users of DTaaS expect the following file system structure for their reusable assets.

      There is a skeleton file structure in DTaaS codebase. You can copy and create file system for your users. Remember to name the directory containing the file structure as files and place it in the directory from which the compose.lib.yml will be run.

      "},{"location":"admin/servers/lib/docker.html#use","title":"Use","text":"

      Use the docker compose file to start the service.

      # To bring up the container\ndocker compose -f compose.lib.yml up -d\n# To bring down the container\ndocker compose -f compose.lib.yml down\n
      "},{"location":"admin/servers/lib/docker.html#service-endpoints","title":"Service Endpoints","text":"

      The GraphQL URL: localhost:4001/lib

      The HTTP URL: localhost:4001/lib/files

      The service API documentation is available on user page.

      "},{"location":"admin/servers/lib/npm.html","title":"Host Library Microservice","text":"

      The lib microservice is a simplified file manager serving files over graphQL and HTTP API.

      It has two features:

      • provide a listing of directory contents.
      • upload and download files

      This document provides instructions for installing npm package of library microservice and running the same as a standalone service.

      "},{"location":"admin/servers/lib/npm.html#setup-the-file-system","title":"Setup the File System","text":""},{"location":"admin/servers/lib/npm.html#outside-dtaas","title":"Outside DTaaS","text":"

      The package can be used independently of DTaaS. If this is your use case, you do not need any specific file structure. Any valid file directory is sufficient.

      "},{"location":"admin/servers/lib/npm.html#inside-dtaas","title":"Inside DTaaS","text":"

      The users of DTaaS expect the following file system structure for their reusable assets.

      There is a skeleton file structure in DTaaS codebase. You can copy and create file system for your users.

      "},{"location":"admin/servers/lib/npm.html#install","title":"Install","text":"

      The npm package is available in Github packages registry and on npmjs. Prefer the package on npmjs over Github.

      Set the registry and install the package with the one of the two following commands

      "},{"location":"admin/servers/lib/npm.html#npmjs","title":"npmjs","text":"
      sudo npm install -g @into-cps-association/libms  # requires no login\n
      "},{"location":"admin/servers/lib/npm.html#github","title":"Github","text":"
      # requires login\nsudo npm config set @into-cps-association:registry https://npm.pkg.github.com\n

      The github package registry asks for username and password. The username is your Github username and the password is your Github personal access token. In order for the npm to download the package, your personal access token needs to have read:packages scope.

      "},{"location":"admin/servers/lib/npm.html#use","title":"Use","text":"

      Display help.

      libms -h\n

      Please see configuration for explanation of configuration conventions. To use .env as configuration file, run

      libms\n

      To run libms with a custom config file,

      libms -c FILE-PATH\nlibms --config FILE-PATH\n

      If the environment file is named something other than .env, for example as .env.libms, you can run

      libms -c \".env.libms\"\n

      You can press Ctl+C to halt the application. If you wish to run the microservice in the background, use

      nohup libms [-c FILE-PATH] & disown\n

      The lib microservice is now running and ready to serve files.

      This microservice can also serve files in a browser with files transferred over HTTP protocol.

      This option needs to be enabled with -H http.json flag. A sample http config provided here can be used.

      nohup libms [-H http.json] & disown\n

      The regular file upload and download options become available.

      "},{"location":"admin/servers/lib/npm.html#service-endpoints","title":"Service Endpoints","text":"

      The GraphQL URL: localhost:PORT/lib

      The HTTP URL: localhost:PORT/lib/files

      The service API documentation is available on user page.

      "},{"location":"admin/vagrant/base-box.html","title":"DTaaS Vagrant Box","text":"

      This README provides instructions on creating a custom Operating System virtual disk for running the DTaaS software. The virtual disk is managed by vagrant. The purpose is two fold:

      • Provide cross-platform installation of the DTaaS application. Any operating system supporting use of vagrant software utility can support installation of the DTaaS software.
      • Create a ready to use development environment for code contributors.

      There are two scripts in this directory:

      Script name Purpose Default user.sh user installation developer.sh developer installation

      If you are installing the DTaaS for developers, the default installation caters to your needs. You can skip the next step and continue with the creation of vagrant box.

      If you are a developer and would like additional software installed, you need to modify Vagrantfile. The existing Vagrantfile has two lines:

          config.vm.provision \"shell\", path: \"user.sh\"\n    #config.vm.provision \"shell\", path: \"developer.sh\"\n

      Uncomment the second line to have more software components installed. If you are not a developer, no changes are required to the Vagrantfile.

      This vagrant box installed for users will have the following items:

      1. docker v24.0
      2. nodejs v20.10
      3. yarn v1.22
      4. npm v10.2
      5. containers - ml-workspace-minimal v0.13, traefik v2.10, gitlab-ce v16.4, influxdb v2.7, grafana v10.1, rabbitmq v3-management, eclipse-mosquitto (mqtt) v2, mongodb v7.0

      This vagrant box installed for developers will have the following items additional items:

      • docker-compose v2.20
      • microk8s v1.27
      • jupyterlab
      • mkdocs
      • container - telegraf v1.28

      At the end of installation, the software stack created in vagrant box can be visualised as shown in the following figure.

      The upcoming instructions will help with the creation of base vagrant box.

      #create a key pair\nssh-keygen -b 4096 -t rsa -f vagrant -q -N \"\"\n\nvagrant up\n\n# let the provisioning be complete\n# replace the vagrant ssh key-pair with personal one\nvagrant ssh\n\n# install the oh-my-zsh\nsh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\"\n# install plugins: history, autosuggestions,\ngit clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions\n\n# inside ~/.zshrc, modify the following line\nplugins=(git zsh-autosuggestions history cp tmux)\n\n# to replace the default vagrant ssh key-pair with\n# the generated private key into authorized keys\ncp /vagrant/vagrant.pub /home/vagrant/.ssh/authorized_keys\n\n# exit vagrant guest machine and then\n# copy own private key to vagrant private key location\ncp vagrant .vagrant/machines/default/virtualbox/private_key\n\n# check\nvagrant ssh #should work\n\n# exit vagrant guest machine and then\nvagrant halt\n\nvagrant package --base dtaas \\\n--info \"info.json\" --output dtaas.vagrant\n\n# Add box to the vagrant cache in ~/.vagrant.d/boxes directory\nvagrant box add --name dtaas ./dtaas.vagrant\n\n# You can use this box in other vagrant boxes using\n#config.vm.box = \"dtaas\"\n
      "},{"location":"admin/vagrant/base-box.html#references","title":"References","text":"

      Image sources: Ubuntu logo

      "},{"location":"admin/vagrant/single-machine.html","title":"DTaaS on Single Vagrant Machine","text":"

      These are installation instructions for running DTaaS software inside one vagrant Virtual Machine. The setup requires a machine which can spare 16GB RAM, 8 vCPUs and 50GB Hard Disk space to the vagrant box.

      "},{"location":"admin/vagrant/single-machine.html#create-base-vagrant-box","title":"Create Base Vagrant Box","text":"

      Create dtaas Vagrant box. You would have created an SSH key pair - vagrant and vagrant.pub. The vagrant is the private SSH key and is needed for the next steps. Copy vagrant SSH private key into the current directory (deploy/vagrant/single-machine). This shall be useful for logging into the vagrant machines created for two-machine deployment.

      "},{"location":"admin/vagrant/single-machine.html#target-installation-setup","title":"Target Installation Setup","text":"

      The goal is to use the dtaas Vagrant box to install the DTaaS software on one single vagrant machine. A graphical illustration of a successful installation can be seen here.

      There are many unused software packages/docker containers within the dtaas base box. The used packages/docker containers are highlighed in blue color.

      Tip

      The illustration shows hosting of gitlab on the same vagrant machine with http(s)://gitlab.foo.com The gitlab setup is outside the scope this installation guide. Please refer to gitlab docker install for gitlab installation.

      "},{"location":"admin/vagrant/single-machine.html#configure-server-settings","title":"Configure Server Settings","text":"

      A dummy foo.com URL has been used for illustration. Please change this to your unique website URL.

      Please follow the next steps to make this installation work in your local environment.

      Update the Vagrantfile. Fields to update are:

      1. Hostname (node.vm.hostname = \"foo.com\")
      2. MAC address (:mac => \"xxxxxxxx\"). This change is required if you have a DHCP server assigning domain names based on MAC address. Otherwise, you can leave this field unchanged.
      3. Other adjustments are optional.
      "},{"location":"admin/vagrant/single-machine.html#installation-steps","title":"Installation Steps","text":"

      Execute the following commands from terminal

      vagrant up\nvagrant ssh\n

      Set a cronjob inside the vagrant virtual machine to remote the conflicting default route. Download the route script and run the following command.

      sudo bash route.sh\n

      Please follow the instructions of regular server installation setup to complete the installation.

      "},{"location":"admin/vagrant/single-machine.html#references","title":"References","text":"

      Image sources: Ubuntu logo, Traefik logo, ml-workspace, nodejs, reactjs, nestjs

      "},{"location":"admin/vagrant/two-machines.html","title":"DTaaS on Two Vagrant Machines","text":"

      These are installation instructions for running DTaaS application in two vagrant virtual machines (VMs). In this setup, all the user workspaces shall be run on server1 while all the platform services will be run on server2.

      The setup requires two server VMs with the following hardware configuration:

      server1: 16GB RAM, 8 x64 vCPUs and 50GB Hard Disk space

      server2: 6GB RAM, 3 x64 vCPUs and 50GB Hard Disk space

      Under the default configuration, two user workspaces are provisioned on server1. The default installation setup also installs InfluxDB, Grafana, RabbitMQ and MQTT services on server2. If you would like to install more services, you can create shell scripts to install the same on server2.

      "},{"location":"admin/vagrant/two-machines.html#create-base-vagrant-box","title":"Create Base Vagrant Box","text":"

      Create dtaas Vagrant box. You would have created an SSH key pair - vagrant and vagrant.pub. The vagrant is the private SSH key and is needed for the next steps. Copy vagrant SSH private key into the current directory (deploy/vagrant/two-machine). This shall be useful for logging into the vagrant machines created for two-machine deployment.

      "},{"location":"admin/vagrant/two-machines.html#target-installation-setup","title":"Target Installation Setup","text":"

      The goal is to use this dtaas vagrant box to install the DTaaS software on server1 and the default platform services on server2. Both the servers are vagrant machines.

      There are many unused software packages/docker containers within the dtaas base box. The used packages/docker containers are highlighed in blue and red color.

      A graphical illustration of a successful installation can be seen here.

      In this case, both the vagrant boxes are spawed on one server using two vagrant configuration files, namely boxes.json and Vagrantfile.

      Tip

      The illustration shows hosting of gitlab on the same vagrant machine with http(s)://gitlab.foo.com The gitlab setup is outside the scope this installation guide. Please refer to gitlab docker install for gitlab installation.

      "},{"location":"admin/vagrant/two-machines.html#configure-server-settings","title":"Configure Server Settings","text":"

      A dummy foo.com and services.foo.com URLs has been used for illustration. Please change these to your unique website URLs.

      The first step is to define the network identity of the two VMs. For that, you need server name, hostname and MAC address. The hostname is the network URL at which the server can be accessed on the web. Please follow these steps to make this work in your local environment.

      Update the boxes.json. There are entries one for each server. The fields to update are:

      1. name - name of server1 (\"name\" = \"dtaas-two\")
      2. hostname - hostname of server1 (\"name\" = \"foo.com\")
      3. MAC address (:mac => \"xxxxxxxx\"). This change is required if you have a DHCP server assigning domain names based on MAC address. Otherwise, you can leave this field unchanged.
      4. name - name of server2 (\"name\" = \"services\")
      5. hostname - hostname of server2 (\"name\" = \"services.foo.com\")
      6. MAC address (:mac => \"xxxxxxxx\"). This change is required if you have a DHCP server assigning domain names based on MAC address. Otherwise, you can leave this field unchanged.
      7. Other adjustments are optional.
      "},{"location":"admin/vagrant/two-machines.html#installation-steps","title":"Installation Steps","text":"

      The installation instructions are given separately for each vagrant machine.

      "},{"location":"admin/vagrant/two-machines.html#launch-dtaas-platform-default-services","title":"Launch DTaaS Platform Default Services","text":"

      Follow the installation guide for services to install the DTaaS platform services.

      After the services are up and running, you can see the following services active within server2 (services.foo.com).

      service external url InfluxDB database services.foo.com Grafana visualization service services.foo.com:3000 MQTT Broker services.foo.com:1883 RabbitMQ Broker services.foo.com:5672 RabbitMQ Broker management website services.foo.com:15672 MongoDB database services.foo.com:27017"},{"location":"admin/vagrant/two-machines.html#install-dtaas-application","title":"Install DTaaS Application","text":"

      Execute the following commands from terminal

      vagrant up\nvagrant ssh\n

      Set a cronjob inside the vagrant virtual machine to remote the conflicting default route. Download the route script and run the following command.

      sudo bash route.sh\n

      Please follow the instructions of regular server installation setup to complete the installation.

      "},{"location":"admin/vagrant/two-machines.html#references","title":"References","text":"

      Image sources: Ubuntu logo, Traefik logo, ml-workspace, nodejs, reactjs, nestjs

      "},{"location":"developer/index.html","title":"Developer Guide","text":"

      This guide is for DTaaS platform developers. It helps development team members get familiar with the DTaaS project software design, and development processes. Please see developer-specific Slides, Video, and Research paper.

      "},{"location":"developer/index.html#development-environment","title":"Development Environment","text":"

      Ideally, developers should work on Ubuntu/Linux Operating System.There is an ongoing effort to bring support for Windows Operating System. But, the development and software installation scripts are still heavily suited to Ubuntu/Linux

      Please use the steps given here to install the required software packages.

      "},{"location":"developer/index.html#ubuntulinux","title":"Ubuntu/Linux","text":"
      bash script/env.sh\nbash script/docker.sh\n

      The docker images are large and are likely to consume about 5GB of bandwidth and 15GB of space. You will have to download the docker images on a really good network.

      "},{"location":"developer/index.html#windows","title":"Windows","text":"

      Two powershell installation scripts, namely base.ps1 and env.ps1 are available to install the required software packages. But errors might crop up due to missing environment variables. The potential errors are:

      1. npm is not recognized......... in base.ps1.
      2. gem is not recognized......... in env.ps1

      If you encounter these errors, remember to include node and ruby installation locations in PATH environment variable (Settings --> search for \"system environment variables\" --> Advanced --> Environment Variables --> PATH).

      The base.ps1 and env.ps1 scripts can be run again after setting the correct PATH environment variable.

      "},{"location":"developer/index.html#pre-install-nodejs-and-ruby-software","title":"Pre-install Nodejs and Ruby Software","text":"

      Another way to solve the PATH environment problem is to install Nodejs and Ruby software packages before running the powershell scripts.

      1. Install the latest stable version of NodeJS from the official NodeJS website.
      2. Install Ruby from official Ruby website and follow all the defaults during the installation.
      "},{"location":"developer/index.html#run-scripts","title":"Run Scripts","text":"

      Then, open powershell with administrative priviledges and run the following commands in the given order:

      powershell -F script/base.ps1\npowershell -F script/env.ps1\npowershell -F script/docker.ps1\n

      The docker images are large and are likely to consume about 5GB of bandwidth and 15GB of space. You will have to download the docker images on a really good network.

      "},{"location":"developer/index.html#development-workflow","title":"Development Workflow","text":"

      To manage collaboration by multiple developers on the software, a development workflow is in place. Each developer should follow these steps:

      1. Fork of the main repository into your github account.
      2. Setup Code Climate and Codecov for your fork. The codecov does not require secret token for public repositories.
      3. Install git-hooks for the project.
      4. Use Fork, Branch, PR workflow.
      5. Work in your fork and open a PR from your working branch to your feature/distributed-demo branch. The PR will run all the github actions, code climate and codecov checks.
      6. Resolve all the issues identified in the previous step.
      7. If you have access to the integration server, try your working branch on the integration server.
      8. Once changes are verified, a PR should be made to the feature/distributed-demo branch of the upstream DTaaS repository.
      9. The PR will be merged after checks by either the project administrators or the maintainers.

      Remember that every PR should be meaningful and satisfies a well-defined user story or improve the code quality.

      "},{"location":"developer/index.html#code-quality","title":"Code Quality","text":"

      The project code qualities are measured based on:

      • Linting issues identified by Code Climate
      • Test coverage report collected by Codecov
      • Successful github actions
      "},{"location":"developer/index.html#code-climate","title":"Code Climate","text":"

      Code Climate performs static analysis, linting and style checks. Quality checks are performed by codeclimate are to ensure the best possible quality of code to add to our project.

      While any new issues introduced in your code would be shown in the PR page itself, to address any specific issue, you can visit the issues or code section of the codeclimate page.

      It is highly recommended that any code you add does not introduce new quality issues. If they are introduced, they should be fixed immediately using the appropriate suggestions from Code Climate, or in worst case, adding a ignore flag (To be used with caution).

      "},{"location":"developer/index.html#codecov","title":"Codecov","text":"

      Codecov keeps track of the test coverage for the entire project. For information about testing and workflow related to that, please see the testing page.

      "},{"location":"developer/index.html#github-actions","title":"Github Actions","text":"

      The project has multiple github actions defined. All PRs and direct code commits must have successful status on github actions.

      "},{"location":"developer/github-actions.html","title":"Secrets for Github Action","text":"

      The Github actions require the following secrets to be obtained from docker hub:

      Secret Name Explanation DOCKERHUB_SCOPE Username or organization name on docker hub DOCKERHUB_USERNAME Username on docker hub DOCKERHUB_TOKEN API token to publish images to docker hub, with Read, Write and Delete permissions NPM_TOKEN Token to publish npm packages to the default npm registry.

      Remember to add these secrets to Github Secrets Setting of your fork.

      "},{"location":"developer/npm-packages.html","title":"Publish NPM packages","text":"

      The DTaaS software is developed as a monorepo with multiple npm packages.

      "},{"location":"developer/npm-packages.html#default-npm-registry","title":"Default npm registry","text":"

      The default registry for npm packages is npmjs. The freely-accessible public packages are published to the npmjs registry. The publication step is manual for the runner.

      npm login --registry=\"https://registry.npmjs.org\"\ncat ~/.npmrc  #shows the auth token for the registry\n//registry.npmjs.org/:_authToken=xxxxxxxxxx\nyarn publish --registry=\"https://registry.npmjs.org\" \\\n  --no-git-tag-version --access public\n

      At least one version of runner package is published to this registry for each release of DTaaS.

      The publication step for library microservice is automated via github actions.

      "},{"location":"developer/npm-packages.html#github-npm-registry","title":"Github npm registry","text":"

      The Github actions of the project publish packages. The only limitation is that the users need an access token from Github.

      "},{"location":"developer/npm-packages.html#private-registry","title":"Private Registry","text":""},{"location":"developer/npm-packages.html#setup-private-npm-registry","title":"Setup private npm registry","text":"

      Since publishing to npmjs is irrevocable and public, developers are encouraged to setup their own private npm registry for local development. A private npm registry will help with local publish and unpublish steps.

      We recommend using verdaccio for this task. The following commands help you create a working private npm registry for development.

      docker run -d --name verdaccio -p 4873:4873 verdaccio/verdaccio\nnpm adduser --registry http://localhost:4873 #create a user on the verdaccio registry\nnpm set registry http://localhost:4873/\nyarn config set registry \"http://localhost:4873\"\nyarn login --registry \"http://localhost:4873\" #login with the credentials for yarn utility\nnpm login #login with the credentials for npm utility\n

      You can open http://localhost:4873 in your browser, login with the user credentials to see the packages published.

      "},{"location":"developer/npm-packages.html#publish-to-private-npm-registry","title":"Publish to private npm registry","text":"

      To publish a package to your local registry, do:

      yarn install\nyarn build #the dist/ directory is needed for publishing step\nyarn publish --no-git-tag-version #increments version in package.json, publishes to registry\nyarn publish #increments version in package.json, publishes to registry and adds a git tag\n

      The package version in package.json gets updated as well. You can open http://localhost:4873 in your browser, login with the user credentials to see the packages published. Please see verdaccio docs for more information.

      If there is a need to unpublish a package, ex: @dtaas/runner@0.0.2, do:

      npm unpublish  --registry http://localhost:4873/ @dtaas/runner@0.0.2\n

      To install / uninstall this utility for all users, do:

      sudo npm install  --registry http://localhost:4873 -g @dtaas/runner\nsudo npm list -g # should list @dtaas/runner in the packages\nsudo npm remove --global @dtaas/runner\n
      "},{"location":"developer/npm-packages.html#use-the-packages","title":"Use the packages","text":"

      The packages available in private npm registry can be used like the regular npm packages installed from npmjs.

      For example, to use @dtaas/runner@0.0.2 package, do:

      sudo npm install  --registry http://localhost:4873 -g @dtaas/runner\nrunner # launch the digital twin runner\n
      "},{"location":"developer/client/client.html","title":"React Website","text":"

      The Website is how the end-users interact with the software platform. The website is being developed as a React single page web application.

      A dependency graph for the entire codebase of the react application is:

      "},{"location":"developer/client/client.html#dependency-graphs","title":"Dependency Graphs","text":"

      The figures are the dependency graphs generated from the code.

      "},{"location":"developer/client/client.html#src-directory","title":"src directory","text":""},{"location":"developer/client/client.html#test-directory","title":"test directory","text":""},{"location":"developer/docker/docker.html","title":"Docker workflow for DTaaS","text":"

      This readme will explain the building and use of different docker files for use in development and installation of the DTaaS software.

      NOTE: A local docker installation with compose plugin is a pre-requisite for using docker workflows.

      "},{"location":"developer/docker/docker.html#folder-structure","title":"Folder Structure","text":"

      There are two dockerfiles for building the containers:

      • client.dockerfile: Dockerfile for building the client application container.
      • libms.dockerfile: Dockerfile for building the library microservice container from source code.
      • libms.npm.dockerfile: Dockerfile for building the library microservice container from published npm package at npmjs.com. This Dockerfile is only used during publishing. It is used neither in the development builds nor in Github actions.

      There is a specific compose file for development:

      The compose.dev.yml: file is the docker compose file for development environment.

      "},{"location":"developer/docker/docker.html#build-and-publish-docker-images","title":"Build and Publish Docker Images","text":"

      The github workflows publish docker images of client website and libms to github and docker hub.

      "},{"location":"developer/docker/docker.html#developers","title":"Developers","text":"

      Use of docker images is handy for developers as well. It is suggested that developers build the required images locally on their computer and use them for development purposes. The images can be built using

      docker compose -f compose.dev.yml build\n
      "},{"location":"developer/docker/docker.html#running-docker-containers","title":"Running Docker Containers","text":"

      Follow these steps to use the application with docker.

      The DTaaS application requires multiple configuration files. The list of configuration files to be modified are given for each scenario.

      "},{"location":"developer/docker/docker.html#development-environment","title":"Development Environment","text":"

      This scenario is for software developers.

      The configuration files to be updated are:

      1. docker/.env : please see docker installation docs for help with updating this config file
      2. docker/conf.dev : please see docker installation docs for help with updating this config file
      3. client/config/local.js please see client config for help with updating this config file
      4. servers/lib/config/.env.default please see lib config for help with updating this config file

      The docker commands need to be executed from this directory (docker). The relevant docker commands are:

      docker compose -f compose.dev.yml up -d #start the application\ndocker compose -f compose.dev.yml down  #terminate the application\n
      "},{"location":"developer/docker/docker.html#access-the-application","title":"Access the Application","text":"

      You should access the application through the PORT mapped to the Traefik container. e.g. localhost

      "},{"location":"developer/oauth/AUTHMS.html","title":"Auth Microservice","text":"

      This document details the workflow and implementation of the DTaaS Auth Microservice. Please go through the System Design and the summary of the OAuth2.0 technology to be able to understand the content here better.

      "},{"location":"developer/oauth/AUTHMS.html#workflow","title":"Workflow","text":""},{"location":"developer/oauth/AUTHMS.html#user-identity-using-oauth20","title":"User Identity using OAuth2.0","text":"

      We define some constants that will help with the following discussion:

      • CLIENT ID: The OAuth2 Client ID of the Auth MS
      • CLIENT SECRET: The OAuth2 Client Secret of Auth MS
      • REDIRECT URI: The URI where the user is redirected to after the user has approved sharing of information with the client.
      • STATE: A random string used as an identifier for the specific \"GET authcode\" request (Figure 3.3)
      • AUTHCODE: The one-use-only Authorization code returned by the OAuth2 provider (GitLab instance) in response to \"GET authcode\" after user approval.

      Additionally, let's say DTaaS uses a dedicated gitlab instance hosted at the URL https://gitlab.foo.com (instead of https://foo.com)

      A successful OAuth2 workflow (Figure 3.3) has the following steps:

      • The user requests a resource, say GET/BackendMS
      • The Auth MS intercepts this request, and starts the OAuth2 process.
      • The Auth MS sends a authorization request to the Gitlab instance.

      This is written in shorthand as GET/authcode. The actual request (a user redirect) looks like:

      https ://gitlab.foo.com/oauth/\nauthorize?\nresponse_type=code&\nclient_id=OAUTH_CLIENT_ID&\nredirect_uri=REDIRECT_URI&\nscope=read_user&state = STATE\n

      Here the gitlab.foo.com/oauth/authorize is the specific endpoint of the Gitlab instance that handles authorisation code requests.

      The query parameters in the request include the expected response type, which is fixed as \u201dcode\u201d, meaning that we expect an Authorization code. Other query parameters are the client id, the redirect uri, the scope which is set to read user for our purpose, and the state (the random string to identify the specific request).

      • The OAuth2 provider redirects the user to the login page. Here the user logs into their protected account with their username/email ID and password.

      • The OAuth2 provider then asks the user to approve/deny sharing the requested information with the Auth MS. The user should approve this for successful authentication.

      • After approval, the user is redirected by the GitLab instance to the REDIRECT URI. This URI has the following form:

      REDIRECT_URI?code=AUTHCODE&state=STATE\n

      The REDIRECT URI is as defined previously, during the OAuth2 Client initialisation, i.e. the same as the one provided in the \u201dGET authcode\u201d request by the Auth MS. The query parameters are provided by the Gitlab instance. These include the AUTHCODE which is the authoriation code that the Auth MS had requested, and the STATE which is the same random string in the \u201dGET authcode\u201d request.

      • The Auth MS retrieves these query parameters. It verifies that the STATE is the same as the random string it provided during the \"GET authcode\" request. This confirms that the AUTHCODE it has received is in response to the specific request it had made.

      • The Auth MS uses this one-use-only AUTHCODE to exchange it for a general access token. This access token wouldn\u2019t be one-use-only, although it would expire after a specified duration of time. To perform this exchange, the Auth MS makes another request to the GitLab instance. This request is written in shorthand as GET/access_token in the sequence diagram. The true form of the request is:

      POST https://gitlab.foo.com/oauth/token,\nparameters = 'client_id=OAUTH_CLIENT_ID&\nclient_secret=OAUTH_CLIENT_SECRET&\ncode=AUTHCODE&\ngrant_type=authorization_code&\nredirect_uri=REDIRECT_URI'\n

      The request to get a token by exchanging an authorization code, is actually a POST request (for most OAuth2 providers). The https://gitlab.foo.com/oauth/token API endpoint handles the token exchange requests. The parameters sent with the POST request are the client ID, the client secret, the AUTHCODE and the redirect uri. The grant type parameter is always set to the string \u201dauthorization code\u201d, which conveys that we will be exchanging an authentication code for an access token.

      • The Gitlab instance exchanges a valid AUTHCODE for an Access Token. This is sent as a response to the Auth MS. An example response is of the following form:
      {\n  \"access_token\": \"d8aed28aa506f9dd350e54\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 7200,\n  \"refresh_token\":\"825f3bffb2544b976633a1\",\n  \"created_at\": 1607635748\n}\n

      The access token field provides the string that can be used as an access token in the headers of requests tryng to access user information. The token type field is usually \u201dbearer\u201d, the expires in field specifies the time in seconds for which the access token will be valid, and the

      created at field is the Epoch timestamp at which the token was created. The refresh token field has a string that can be used to refresh the access token, increasing it\u2019s lifetime. However we do not make use of the refresh token field. If an access token expires, the Auth MS simply asks for a new one. TOKEN is the access token string returned in the response.

      • The Auth MS has finally obtained an access token that it can use to retrieve the user\u2019s information. Note that if the Auth MS already had an existing valid access token for information about this user, the steps above wouldn\u2019t be necessary, and thus wouldn\u2019t be performed by the Auth MS. The steps till now in the sequence diagram are simply to get a valid access token for the user information.

      • The Auth MS makes a final request to the Gitlab instance, shorthanded as GET user_details in the sequence diagram. The actual request is of the form:

      GET https ://gitlab.foo.com/api/v4/user\n\"Authorization\": Bearer <TOKEN>\n

      Here, https://gitlab.foo.com/api/v4/user is the API endpoint that responds with user information. An authorization header is required on the request, with a valid access token. The required header is added here, and TOKEN is the access token that the Auth MS holds.

      • The Gitlab instance verifies the access token, and if it is valid, responds with the required user information. This includes username, email ID, etc. An example response looks like:
      {\n  \"id\": 8,\n  \"username\": \"UserX\",\n  \"name\": \"XX\",\n  \"state\": \"active\",\n  \"web_url\": \"http://gitlab.foo.com/UserX\",\n  \"created_at\":\"2023-12-03 T10:47:21.970 Z\",\n  \"bio\": \"\",\n  \"location\": \"\",\n  \"public_email\": null,\n  \"skype\": \"\",\n  \"linkedin\": \"\",\n  \"twitter\": \"\",\n  \"organization\": \"\",\n  \"job_title\": \"\",\n  \"work_information\": null,\n  \"followers\": 0,\n  \"following\": 0,\n  \"is_followed \": false,\n  \"local_time\": null,\n  \"last_sign_in_at\": \"2023-12-13 T12:46:21.223 Z\",\n  \"confirmed_at\": \"2023-12-03 T10:47:21.542 Z \",\n  \"last_activity_on\": \"2023-12-13\",\n  \"email\": \"UserX@localhost\",\n  \"projects_limit\": 100000,\n}\n

      The important fields from this response are the \u201demail\u201d, \u201dusername\u201d keys. These keys are unique to a user, and thus provide an identity to the user.

      • The Auth MS retrieves the values of candidate key fields like \u201demail\u201d, \u201dusername\u201d from the response. Thus, the Auth MS now knows the identity of the user.
      "},{"location":"developer/oauth/AUTHMS.html#checking-user-permissions-authorization","title":"Checking User permissions - Authorization","text":"

      An important feature of the Auth MS is to implement access policies for DTaaS resources. We may have requirements that certain resources and/or microservices in DTaaS should only be accessible to certain users. For example, we may want that /BackendMS/user1 should only be accessible to the user who has username user1. Another example may be that we may want /BackendMS/group3 to only be available to users who have an email ID in the domain @gmail.com. The Auth MS should be able to impose these restrictions and make certain services selectively available to certain users. There are two steps to doing this:

      • Firstly, the user\u2019s identity should be known and trusted. The Auth MS should know the identity of a user and believe that the user is who they claim to be. This has been achieved in the previous section

      • Secondly, this identity should be analysed against certain rules or against a database of allowed users, to determine whether this user should be allowed to access the requested resource.

      The second step requires, for every service, either a set of rules that define which users should be allowed access to the service, or a database of user identities that are allowed to access the service. This database and/or set of rules should use the user identities, in our case the email ID or username, to decide whether the user should be allowed or not. This means that the rules should be built based on the kind of username/ email ID the user has, say maybe using some RegEx. In the case of a database, the database should have the user identity as a key. For any service, we can simply look up if the key exists in the database or not and allow/deny the user access based on that.

      In the sequence diagram, the Auth MS has a self-request marked as \u201dChecks user permissions\u201d after receiving the user identity from the Gitlab instance. This is when the Auth MS compares the identity of the user to the rules and/or database it has for the requested service. Based on this, if the given identity has access to the requested resource, the Auth MS responds with a 200 OK. This finally marks a succcessful authentication, and the user can now access the requested resource. Note: Again, the Auth MS and user do not communicate directly. All requests/responses of the Auth MS are with the Traefik gateway, not the User directly. Infact, the Auth MS is the external server used by the ForwardAuth middleware of the specific route, and communicates with this middleware. If the authentication is successful, The gateway forwards the request to the specific resource when the 200 OK is recieved, else it drops the request and returns the error code to the user.

      "},{"location":"developer/oauth/AUTHMS.html#implementation","title":"Implementation","text":""},{"location":"developer/oauth/AUTHMS.html#traefik-forward-auth","title":"Traefik-forward-auth","text":"

      The implementation approach is setting up and configuring the open source thomseddon/traefik-forward-auth for our specific use case. This would work as our Auth microservice.

      The traefik-forward-auth software is available as a docker.io image. This works as a docker container. Thus there are no dependency management issues. Additionally, it can be added as a middleware server to traefik routers. Thus, it needs atleast Traefik to work along with it properly. It also needs active services that it will be controlling access to. Traefik, the traefikforward-auth service and any services are thus, treated as a stack of docker containers. The main setup needed for this system is configuring the compose.yml file.

      There are three main steps of configuring the Auth MS properly.

      • The traefik-forward-auth service needs to be configured carefully. Firstly, we set the environment variables for our specific case. Since, we are using Gitlab, we use the generic-oauth provider configuration. Some important variables that are required are the OAuth2 Client ID, Client Secret, Scope. The API endpoints for getting an AUTHCODE, exchanging the code for an access token and getting user information are also necessary

      Additionally, it is necessary to create a router that handles the REDIRECT URI path. This router should have a middleware which is set to traefik-forward-auth itself. This is so that after approval, when the user is taken to REDIRECT URI, this can be handled by the gateway and passed to the Auth service for token exchange. We add the ForwardAuth middleware here, which is a necessary part of our design as discussed before. We also add a load balancer for the service. We also need to add a conf file as a volume, for selective authorization rules (discussed later). This is according to the suggested configuration. Thus, we add the following to our docker services:

      traefik\u2212forward\u2212auth:\nimage: thomseddon/traefik\u2212forward\u2212auth:latest\nvolumes:\n  - <filepath>/conf:/conf\nenvironment:\n  - DEFAULT_PROVIDER = generic - oauth\n  - PROVIDERS_GENERIC_OAUTH_AUTH_URL=https://gitlab.foo.com/oauth/authorize\n  - PROVIDERS_GENERIC_OAUTH_TOKEN_URL=https://gitlab.foo.com/oauth/token\n  - PROVIDERS_GENERIC_OAUTH_USER_URL=https://gitlab.foo.com/api/v4/user\n  - PROVIDERS_GENERIC_OAUTH_CLIENT_ID=OAUTH_CLIENT_ID\n  - PROVIDERS_GENERIC_OAUTH_CLIENT_SECRET=OAUTH_CLIENT_SECRET\n  - PROVIDERS_GENERIC_OAUTH_SCOPE = read_user\n  - SECRET = a - random - string\n  # INSECURE_COOKIE is required if\n  # not using a https entrypoint\n  - INSECURE_COOKIE = true\nlabels:\n  - \"traefik.enable=true\"\n  - \"traefik.http.routers.redirect.entryPoints=web\"\n  - \"traefik.http.routers.redirect.rule=PathPrefix(/_oauth)\"\n  - \"traefik.http.routers.redirect.middlewares=traefik-forward-auth\"\n  - \"traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181\"\n  - \"traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User\"\n  - \"traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181\"\n
      • The traefik-forward-auth service should be added to the backend services as a middleware.

      To do this, the docker-compose configurations of the services need to be updated by adding the following lines:

          - \"traefik.http.routers.<service-router>.rule=Path(/<path>)\"\n    - \"traefik.http.routers.<service-router>.middlewares=traefik-forward-auth\"\n

      This creates a router that maps to the required route, and adds the auth middleware to the required route.

      • Finally, we need to set user permissions on user identities by creating rules in the conf file. Each rule has a name (an identifier for the rule), and an associated route for which the rule will be invoked. The rule also has an action property, which can be either \u201dauth\u201d or \u201dallow\u201d. If action is set to \u201dallow\u201d, any requests on this route are allowed to bypass even the OAuth2 identification. If the action is set to \u201dauth\u201d, requests on this route will require User identity OAuth2 and the system will follow the sequence diagram. For rules with action=\u201dauth\u201d, the user information is retrieved. The identity we use for a user is the user\u2019s email ID. For \u201dauth\u201d rules, we can configure two types of User restrictions/permissions on this identity:

      • Whitelist - This would be a list of user identities (email IDs in our case) that are allowed to access the corresponding route.

      • Domain - This would be a domain (example: gmail.com), and only email IDs (user identities) of that domain (example: johndoe@gmail.com) would be allowed access to the corresponding route.

      Configuring any of these two properties of an \u201dauth\u201d rule allows us to selectively permit access to certain users for certain resources. Not configuring any of these properties for an \u201dauth\u201d rule means that the OAuth2 process is carried out and the user identity is retrieved, but all known user identities (i.e. all users that successfully complete the OAuth) are allowed to access the resource.

      DTaaS currently uses only the whitelist type of rules.

      These rules can be used in 3 different ways described below. The exact format of lines to be added to the conf file are also shown.

      • No Auth - Serves the Path(\u2018/public\u2018) route. A rule with action=\u201dallow\u201d should be imposed on this.
      rule.noauth.action=allow\nrule.noauth.rule=Path(`/public`)\n
      • User specific: Serves the Path(\u2018/user1\u2018) route. A rule that only allows \u201duser1@localhost\u201d identity should be imposed on this
      rule.onlyu1.action=auth\nrule.onlyu1.rule=Path(`/user1`)\nrule.onlyu1.whitelist=user1@localhost\n
      • Common Auth - Serves the Path(\u2018/common\u2018) route. A rule that requires OAuth, i.e. with action=\u201dallow\u201d, but allows all valid and known user identities should be imposed on this.
      rule.all.action = auth\nrule.all.rule = Path(`/common`)\n
      "},{"location":"developer/oauth/DESIGN.html","title":"System Design of DTaaS Authorization Microservice","text":"

      DTaaS requires backend authorization to protect its backend services and user workspaces. This document details the system design of the DTaaS Auth Microservice which is responsible for the same.

      "},{"location":"developer/oauth/DESIGN.html#requirements","title":"Requirements","text":"

      For our purpose, we require the Auth MS to be able to handle only requests of the general form \u201dIs User X allowed to access /BackendMS/example?\u201d.

      If the user\u2019s identity is correctly verified though the GitLab OAuth2 provider AND this user is allowed to access the requested microservice/action, then the Auth MS should respond with a 200 (OK) code and let the request pass through the gateway to the required microservice/server.

      If the user\u2019s identity verification through GitLab OAuth2 fails OR this user is not permitted to access the request resource, then the Auth MS should respond with a 40X (NOT OK) code, and restrict the request from going forward.

      "},{"location":"developer/oauth/DESIGN.html#forward-auth-middleware-in-traefik","title":"Forward Auth Middleware in Traefik","text":"

      Traefik allows middlewares to be set for the routes configured into it. These middlewares intercept the route path requests, and perform analysis/modifications before sending the requests ahead to the services. Traefik has a ForwardAuth middleware that delegates authentication to an external service. If the external authentication server responds to the middleware with a 2XX response codes, the middleware acts as a proxy, letting the request pass through to the desired service. However, if the external server responds with any other response code, the request is dropped, and the response code returned by the external auth server is returned to the user

      (source: Treafik documentation)

      Thus, an Auth Microservice can be integrated into the existing gateway and DTaaS system structure easily by adding it as the external authentication server for ForwardAuth middlewares. These middlewares can be added on whichever routes/requests require authentication. For our specific purpose, this will be added to all routes since we impose atleast identity verification of users for any request through the gateway

      "},{"location":"developer/oauth/DESIGN.html#auth-ms-design","title":"Auth MS Design","text":"

      The integrated Auth MS should thus work as described in the sequence diagram.

      • Any request made by the user is made on the React website, i.e. the frontend of the DTaaS software.

      • This request then goes through the Traefik gateway. Here it should be interrupted by the respective ForwardAuth middleware.

      • The middleware asks the Auth MS if this request for the given user should be allowed.

      • The Auth MS, i.e. the Auth server verifies the identity of the user using OAuth2 with GitLab, and checks if this user should be allowed to make this request.

      • If the user is verified and allowed to make the request, the Auth server responds with a 200 OK to Traefik Gateway (more specifically to the middleware in Traefik)

      • Traefik then forwards this request to the respective service. A response by the service, if any, will be passed through the chain back to the user.

      • However, If the user is not verified or not allowed to make this request, the Auth server responds with a 40x to Traefik gateway.

      • Traefik will then drop the request and respond to the Client informing that the request was forbidden. It will also pass the Auth servers response code

      "},{"location":"developer/oauth/OAUTH2.0.html","title":"OAuth 2.0 Summary","text":"

      The Auth MS works on the OAuth 2.0 RFC. This document provides a brief summary of the working of the OAtuh 2.0 technology.

      "},{"location":"developer/oauth/OAUTH2.0.html#entities","title":"Entities","text":"

      OAuth2, as used for user identity verification, has 3 main entities:

      • The User: This is the entity whose identity we are trying to verify/know. In our case, this is the same as the user of the DTaaS software.
      • The Client: This is the entity that wishes to know/verify the identity of a user. In our case, this is the Auth MS (initialised with a Gitlab application). This shouldn\u2019t be confused with the frontend website of DTaaS (referred to as Client in the previous section).
      • The OAuth2 Identity Provider: This is the entity that allows the client to know the identity of the user. In our case, this is GitLab. Most commonly, users have an existing, protected account with this entity. The account is registered using a unique key, like an email ID or username and is usually password protected so that only that specific user can login using that account. After the user has logged in, they will be asked to approve sharing their profile information with the client. If they approve, the client will have access to the user\u2019s email id, username, and other profile information. This information can be used to know/verify the identity of the user.

      Note: In general, it is possible for the Authorization server (which asks user for approval) and the Resource (User Identity) provider to be 2 different servers. However, in our case the Gitlab instance itself handles both the functions, through different API endpoints. The concepts remain the same. Thus, we only discuss the 3 main entities, the User, the OAuth2 Client and the Gitlab instance in our discussion.

      "},{"location":"developer/oauth/OAUTH2.0.html#the-oauth2-client","title":"The OAuth2 Client","text":"

      Many sites allow you to initialise an OAuth2 client. For our purposes, we will use Gitlab itself, by making an \u201dapplication\u201d in Gitlab. However, it is not necessary to initialise a client using the same website as the identity provider. These are separate things. Our OAuth2 client is initialized by creating and configuring a Gitlab instance-wide application. There are two main things in this configuration:

      • Redirect URI: It is the URI where the users are redirected to after they approve sharing information with the client.
      • Scopes: These are the types and levels of access that the client can have over the user\u2019s profile. For our purposes, we only require the read user scope, which allows us to access the user\u2019s profile information for knowing the identity.

      After the GitLab application is successfully created, we are provided a Client ID and Client Secret. This means our initialization is complete. This Client ID and Client Secret can be used in any application, essentially making that application the OAuth2 Client. This is why the Client secret should never be shared. We will use this Client ID and Client secret in our Auth MS, making it an OAuth2 Client application. It will now be able to follow the OAuth2 workflow to verify the identity of users.

      "},{"location":"developer/oauth/OAUTH2.0.html#oauth-20-workflows","title":"OAuth 2.0 Workflows","text":"

      Two major different OAuth2.0 flows are used in DTaaS.

      "},{"location":"developer/oauth/OAUTH2.0.html#oauth2-authorization-code-flow","title":"OAuth2 Authorization Code Flow","text":"

      This flow involves several steps and the exchange of an authorization code for an access tokens to ensure secure authorization. This flow is used for the DTaaS AuthMS, which is responsible for securing all backend DTaaS services

      The OAuth2 workflow is initiated by the Client (Auth MS) whenever it requires knowing the identity of the user. Briefly, the flow starts when the Auth MS sends an authorization request to Gitlab. The Auth MS tries to obtain an access token, using which it can gather user information. Once it has user information, it can know the identity of the user and check whether the user has permission to access the requested resource.

      The requests made by the Auth MS to the OAuth2 provider are abbreviated. A detailed explanation of the workflow for DTaaS specifically can be found in the AuthMS implementation docs

      "},{"location":"developer/oauth/OAUTH2.0.html#oauth2-pkce-proof-key-for-code-exchange-flow","title":"OAuth2 PKCE (Proof Key for Code Exchange) Flow","text":"

      This is an extension to the OAuth2 Authorization Code Flow designed to provide an additional layer of security, particularly for public clients that cannot securely store client secrets. PKCE mitigates certain attack vectors, like authorization code interception.

      The DTaaS client website login works based on the PKCE OAuth2.0 flow. More information about the details of this flow can be found here

      "},{"location":"developer/servers/lib/lib-ms.html","title":"Library Microservice","text":"

      The Library Microservices provides users with access to files in user workspaces via API. This microservice will interface with local file system and Gitlab to provide uniform Gitlab-compliant API access to files.

      Warning

      This microservice is still under heavy development. It is still not a good replacement for file server we are using now.

      "},{"location":"developer/servers/lib/lib-ms.html#architecture-and-design","title":"Architecture and Design","text":"

      The C4 level 2 diagram of this microservice is:

      The GraphQL API provided by the library microservice shall be compliant with the Gitlab GraphQL service.

      "},{"location":"developer/servers/lib/lib-ms.html#uml-diagrams","title":"UML Diagrams","text":""},{"location":"developer/servers/lib/lib-ms.html#class-diagram","title":"Class Diagram","text":"
      classDiagram\n    class FilesResolver {\n    -filesService: IFilesService\n    +listDirectory(path: string): Promise<Project>\n    +readFile(path: string): Promise<Project>\n    }\n\n    class FilesServiceFactory {\n    -configService: ConfigService\n    -localFilesService: LocalFilesService\n    +create(): IFilesService\n    }\n\n    class LocalFilesService {\n    -configService: ConfigService\n    -getFileStats(fullPath: string, file: string): Promise<Project>\n    +listDirectory(path: string): Promise<Project>\n    +readFile(path: string): Promise<Project>\n    }\n\n    class ConfigService {\n    +get(propertyPath: string): any\n    }\n\n    class IFilesService{\n    listDirectory(path: string): Promise<Project>\n    readFile(path: string): Promise<Project>\n    }\n\n    IFilesService <|-- FilesResolver: uses\n    IFilesService <|.. LocalFilesService: implements\n    IFilesService <|-- FilesServiceFactory: creates\n    ConfigService <|-- FilesServiceFactory: uses\n    ConfigService <|-- LocalFilesService: uses
      "},{"location":"developer/servers/lib/lib-ms.html#sequence-diagram","title":"Sequence Diagram","text":"
      sequenceDiagram\n    actor Client\n    actor Traefik\n\n    box LightGreen Library Microservice\n    participant FR as FilesResolver\n    participant FSF as FilesServiceFactory\n    participant CS as ConfigService\n    participant IFS as IFilesService\n    participant LFS as LocalFilesService\n    end\n\n    participant FS as Local File System DB\n\n    Client ->> Traefik : HTTP request\n    Traefik ->> FR : GraphQL query\n    activate FR\n\n    FR ->> FSF : create()\n    activate FSF\n\n    FSF ->> CS : getConfiguration(\"MODE\")\n    activate CS\n\n    CS -->> FSF : return configuration value\n    deactivate CS\n\n    alt MODE = Local\n    FSF ->> FR : return filesService (LFS)\n    deactivate FSF\n\n    FR ->> IFS : listDirectory(path) or readFile(path)\n    activate IFS\n\n    IFS ->> LFS : listDirectory(path) or readFile(path)\n    activate LFS\n\n    LFS ->> CS : getConfiguration(\"LOCAL_PATH\")\n    activate CS\n\n    CS -->> LFS : return local path\n    deactivate CS\n\n    LFS ->> FS : Access filesystem\n    alt Filesystem error\n        FS -->> LFS : Filesystem error\n        LFS ->> LFS : Throw new InternalServerErrorException\n        LFS -->> IFS : Error\n    else Successful file operation\n        FS -->> LFS : Return filesystem data\n        LFS ->> IFS : return Promise<Project>\n    end\n    deactivate LFS\n    activate IFS\n    end\n\n    alt Error thrown\n    IFS ->> FR : return Error\n    deactivate IFS\n    FR ->> Traefik : return Error\n    Traefik ->> Client : HTTP error response\n    else Successful operation\n    IFS ->> FR : return Promise<Project>\n    deactivate IFS\n    FR ->> Traefik : return Promise<Project>\n    Traefik ->> Client : HTTP response\n    end\n\n    deactivate FR\n
      "},{"location":"developer/servers/lib/lib-ms.html#dependency-graphs","title":"Dependency Graphs","text":"

      The figures are the dependency graphs generated from the code.

      "},{"location":"developer/servers/lib/lib-ms.html#src-directory","title":"src directory","text":""},{"location":"developer/servers/lib/lib-ms.html#test-directory","title":"test directory","text":""},{"location":"developer/system/architecture.html","title":"System Overview","text":""},{"location":"developer/system/architecture.html#user-requirements","title":"User Requirements","text":"

      The DTaaS software platform users expect a single platform to support the complete DT lifecycle. To be more precise, the platform users expect the following features:

      1. Author \u2013 create different assets of the DT on the platform itself. This step requires use of some software frameworks and tools whose sole purpose is to author DT assets.
      2. Consolidate \u2013 consolidate the list of available DT assets and authoring tools so that user can navigate the library of reusable assets. This functionality requires support for discovery of available assets.
      3. Configure \u2013 support selection and configuration of DTs. This functionality also requires support for validation of a given configuration.
      4. Execute \u2013 provision computing infrastructure on demand to support execution of a DT.
      5. Explore \u2013 interact with a DT and explore the results stored both inside and outside the platform. Exploration may lead to analytical insights.
      6. Save \u2013 save the state of a DT that\u2019s already in the execution phase. This functionality is required for on demand saving and re-spawning of DTs.
      7. Services \u2013 integrate DTs with on-platform or external services with which users can interact with.
      8. Share \u2013 share a DT with other users of their organisation.
      "},{"location":"developer/system/architecture.html#system-architecture","title":"System Architecture","text":"

      The figure shows the system architecture of the the DTaaS software platform.

      "},{"location":"developer/system/architecture.html#system-components","title":"System Components","text":"

      The users interact with the software platform using a webapp. The service router is a single point of entry for direct access to the platform services. The service router is responsible for controlling user access to the microservice components. The service mesh enables discovery of microservices, load balancing and authorization functionalities.

      In addition, there are microservices for catering to managing DT reusable assets, platform services, DT lifecycle manager, DT execution manager, accouting and security. The microservices are complementary and composable; they fulfil core requirements of the system.

      The microservices responsible for satisfying the user requirements are:

      1. The security microservice implements role-based access control (RBAC) in the platform.
      2. The accounting microservice is responsible for keeping track of the live status of platform, DT asset and infrastructure usage. Any licensing, usage restrictions need to be enforced by the accounting microservice. Accounting is a pre-requisite to commercialisation of the platform. Due to significant use of external infrastructure and resources via the platform, the accounting microservice needs to interface with accounting systems of the external services.
      3. User Workspaces are virtual environments in which users can perform lifecycle operations on DTs. These virtual environments are either docker containers or virtual machines which provide desktop interface to users.
      4. Reusable Assets are assets / parts from which DTs are created. Further explation is available on the assets page
      5. Services are dedicated services available to all the DTs and users of the DTaaS platform. Services build upon DTs and provide user interfaces to users.
      6. DT Execution Manager provides virtual and isolated execution environments for DTs. The execution manager is also responsible for dynamic resource provisioning of cloud resources.
      7. DT Lifecycle Manager manages the lifecycle operations on all DTs. It also directs DT Execution Manager to perform execute, save and terminate operations on DTs.

      If you are interested, please take a look at the C4 architectural diagram.

      A mapping of the architectural components to the implementation components is available in the table.

      System Component Doc Page(s) Service Router Traefik Gateway Web Application React Webapplication Reusable Assets Library Microservice Digital Twins and DevOps Integrated Gitlab Services Third-party Services (MQTT, InfluxDB, RabbitMQ, Grafana and MongoDB) DT Lifecycle Not available yet Security Gitlab client OAuth and server OAuth Digital Twins as Services DT Runner Accounting Not available yet Execution Manager Not available yet"},{"location":"developer/system/architecture.html#references","title":"References","text":"

      Font sources: fileformat

      "},{"location":"developer/system/current-status.html","title":"Current Status","text":"

      The DTaaS software platform is currently under development. Crucial system components are in place with ongoing development work focusing on increased automation and feature enhancement. The figure below shows the current status of the development work.

      A C4 representation of the same diagram is also available.

      "},{"location":"developer/system/current-status.html#user-security","title":"User Security","text":"

      There is a two-level authorization mechanisms in place for the react website and the Traefik gateway.

      The react website component uses Gitlab for user authorization using OAuth protocol.

      "},{"location":"developer/system/current-status.html#gateway-authorization","title":"Gateway Authorization","text":"

      The Traefik gateway has OAuth2 web server authorization provided by Traefik-forward-auth microservice. This authorization protects all the microservices and workspaces running in the backend.

      "},{"location":"developer/system/current-status.html#user-workspaces","title":"User Workspaces","text":"

      All users have dedicated dockerized-workspaces. These docker-images are based on container images published by mltooling group.

      Thus DT experts can develop DTs from existing DT components and share them with other users. A file server has been setup to act as a DT asset repository. Each user gets space to store private DT assets and also gets access to shared DT assets. Users can synchronize their private DT assets with external git repositories. In addition, the asset repository transparently gets mapped to user workspaces within which users can perform DT lifecycle operations. There is also a library microservice which in the long-run will replace the file server.

      Users can run DTs in their workspaces and also permit remote access to other users. There is already shared access to internal and external services. With these two provisions, users can treat live DTs as service components in their own software systems.

      "},{"location":"developer/system/current-status.html#platform-services","title":"Platform Services","text":"

      There are four external services integrated with the DTaaS software platform. They are: InfluxDB, Grafana, RabbitMQ, MQTT, and MongoDB.

      These services can be used by DTs and PTs for communication, storing and visualization of data. There can also be monitoring services setup based on these services.

      "},{"location":"developer/system/current-status.html#development-priorities","title":"Development Priorities","text":"

      The development priorities for the DTaaS software development team are:

      • DevOps from React frontend website
      • Upgrade software stack of user workspaces
      • Increased automation of installation procedures
      • DT Runner (API Interface to DT)
      • DT Configuration DSL \u00edn the form of YAML schema

      Your contributions are highly welcome.

      "},{"location":"developer/system/current-status.html#references","title":"References","text":"

      Font sources: fileformat

      "},{"location":"developer/testing/intro.html","title":"Testing","text":""},{"location":"developer/testing/intro.html#common-questions-on-testing","title":"Common Questions on Testing","text":""},{"location":"developer/testing/intro.html#what-is-software-testing","title":"What is Software Testing","text":"

      Software testing is a procedure to investigate the quality of a software product in different scenarios. It can also be stated as the process of verifying and validating that a software program or application works as expected and meets the business and technical requirements that guided design and development.

      "},{"location":"developer/testing/intro.html#why-software-testing","title":"Why Software Testing","text":"

      Software testing is required to point out the defects and errors that were made during different development phases. Software testing also ensures that the product under test works as expected in all different cases \u2013 stronger the test suite, stronger is our confidence in the product that we have built. One important benefit of software testing is that it facilitates the developers to make incremental changes to source code and make sure that the current changes are not breaking the functionality of the previously existing code.

      "},{"location":"developer/testing/intro.html#what-is-tdd","title":"What is TDD","text":"

      TDD stands for Test Driven Development. It is a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) automated test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards. The goal of TDD can be viewed as specification and not validation. In other words, it\u2019s one way to think through your requirements or design before your write your functional code.

      "},{"location":"developer/testing/intro.html#what-is-bdd","title":"What is BDD","text":"

      BDD stands for \u201cBehaviour Driven Development\u201d. It is a software development process that emerged from TDD. It includes the practice of writing tests first, but focuses on tests which describe behavior, rather than tests which test a unit of implementation. This provides software development and management teams with shared tools and a shared process to collaborate on software development. BDD is largely facilitated through the use of a simple domain-specific language (DSL) using natural language constructs (e.g., English-like sentences) that can express the behavior and the expected outcomes. Mocha and Cucumber testing libraries are built around the concepts of BDD.

      "},{"location":"developer/testing/intro.html#testing-workflow","title":"Testing workflow","text":"

      (Ref: Ham Vocke, The Practical Test Pyramid)

      We follow a testing workflow in accordance with the test pyramid diagram given above, starting with isolated tests and moving towards complete integration for any new feature changes. The different types of tests (in the order that they should be performed) are explained below:

      "},{"location":"developer/testing/intro.html#unit-tests","title":"Unit Tests","text":"

      Unit testing is a level of software testing where individual units/ components of a software are tested. The objective of Unit Testing is to isolate a section of code and verify its correctness.

      Ideally, each test case is independent from the others. Substitutes such as method stubs, mock objects, and spies can be used to assist testing a module in isolation.

      "},{"location":"developer/testing/intro.html#benefits-of-unit-testing","title":"Benefits of Unit Testing","text":"
      • Unit testing increases confidence in changing/ maintaining code. If good unit tests are written and if they are run every time any code is changed, we will be able to promptly catch any defects introduced due to the change.
      • If codes are already made less interdependent to make unit testing possible, the unintended impact of changes to any code is less.
      • The cost, in terms of time, effort and money, of fixing a defect detected during unit testing is lesser in comparison to that of defects detected at higher levels.
      "},{"location":"developer/testing/intro.html#unit-tests-in-dtaas","title":"Unit Tests in DTaaS","text":"

      Each component DTaaS project uses unique technology stack. Thus the packages used for unit tests are different. Please check the test/ directory of a component to figure out the unit test packages used.

      "},{"location":"developer/testing/intro.html#integration-tests","title":"Integration tests","text":"

      Integration testing is the phase in software testing in which individual software modules are combined and tested as a group. In DTaaS, we use an integration server for software development as well as such tests.

      The existing integration tests are done at the component level. There are no integration tests between the components. This task has been postponed to future.

      "},{"location":"developer/testing/intro.html#end-to-end-tests","title":"End-to-End tests","text":"

      Testing any code changes through the end user interface of your software is essential to verify if your code has the desired effect for the user. End-to-End tests in DTaaS a functional setup.

      There are end-to-end tests in the DTaaS. This task has been postponed to future.

      "},{"location":"developer/testing/intro.html#feature-tests","title":"Feature Tests","text":"

      A Software feature can be defined as the changes made in the system to add new functionality or modify the existing functionality. Each feature is said to have a characteristics that is designed to be useful, intuitive and effective. It is important to test a new feature when it has been added. We also need to make sure that it does not break the functionality of already existing features. Hence feature tests prove to be useful.

      The DTaaS project does not have any feature tests yet. Cucumber shall be used in future to implement feature tests.

      "},{"location":"developer/testing/intro.html#references","title":"References","text":"
      1. Arthur Hicken, Shift left approach to software testing
      2. Justin Searls and Kevin Buchanan, Contributing Tests wiki.
      3. This wiki has good explanation of TDD and test doubles.
      "},{"location":"user/features.html","title":"Overview","text":""},{"location":"user/features.html#advantages","title":"Advantages","text":"

      The DTaaS software platform provides certain advantages to users:

      • Support for different kinds of Digital Twins
      • CFD, Simulink, co-simulation, FEM, ROM, ML etc.
      • Integrates with other Digital Twin frameworks
      • Facilitate availability of Digital Twin as a Service
      • Collaboration and reuse
      • Private workspaces for verification of reusable assets, trial run DTs
      • Cost effectiveness
      "},{"location":"user/features.html#software-features","title":"Software Features","text":"

      Each installation of DTaaS platform comes with the features highlighted in the following picture.

      All the users have dedicated workspaces. These workspaces are dockerized versions of Linux Desktops. The user desktops are isolated so the installations and customizations done in one user workspace do not effect the other user workspaces.

      Each user workspace comes with some development tools pre-installed. These tools are directly accessible from web browser. The following tools are available at present:

      Tool Advantage Jupyter Lab Provides flexible creation and use of digital twins and their components from web browser. All the native Jupyterlab usecases are supported here. Jupyter Notebook Useful for web-based management of their files (library assets) VS Code in the browser A popular IDE for software development. Users can develop their digital twin-related assets here. ungit An interactive git client. Users can work with git repositories from web browser

      In addition, users have access to xfce-based remote desktop via VNC client. The VNC client is available right in the web browser. The xfce supported desktop software can also be run in their workspace.

      The DTaaS software platform has some pre-installed services available. The currently available services are:

      Service Advantage InfluxDB Time-series database primarly for storing time-series data from physical twins. The digital twins can use an already existing data. Users can also create visualization dashboards for their digital twins. RabbitMQ Communication broker for communication between physical and digital twins Grafana Visualization dashboards for their digital twins. MQTT Lightweight data transfer broker for IoT devices / physical twins feeding data into digital twins. MongoDB NoSQL document database for storing metadata of data from physical twins

      In addition, the workspaces are connected to the Internet so all the Digital Twins running in the workspace can interact with both the internal and external services.

      The users can publish and reuse the digital twin assets available on the platform. In addition, users can run their digital twins and make these live digital twins available as services to their clients. The clients need not be users of the DTaaS software installation.

      "},{"location":"user/motivation.html","title":"DTaaS for Users","text":""},{"location":"user/motivation.html#user-guide","title":"User Guide","text":"

      This guide is for users of the DTaaS platform. Please make sure that you have access to a live installation of the DTaaS platform. The easiest is localhost installation scenario.

      Please see user-specific Slides and Video to get the conceptual framework behind composable digital twins in the DTaaS platform.

      "},{"location":"user/motivation.html#motivation","title":"Motivation","text":"

      How can DT software platforms enable users collaborate to:

      • Build digital twins (DTs)
      • Use DTs themselves
      • Share DTs with other users
      • Provide the existing DTs as Service to other users

      In addition, how can the DT software platforms:

      • Support DT lifecycle
      • Scale up rather than scale down (flexible convention over configuration)
      "},{"location":"user/motivation.html#existing-approaches","title":"Existing Approaches","text":"

      There are quite a few solutions proposed in the recent past to solve this problem. Some of them are:

      • Focus on data from Physical Twins (PTs) to perform analysis, diagnosis, planning etc\u2026
      • Share DT assets across the upstream, downstream etc\u2026.
      • Evaluate different models of PT
      • DevOps for Cyber Physical Systems (CPS)
      • Scale DT / execution of DT / ensemble of related DTs
      • Support for PT product lifecycle
      "},{"location":"user/motivation.html#our-approach","title":"Our Approach","text":"
      • Support for transition from existing workflows to DT frameworks
      • Create DTs from reusable assets
      • Enable users to share DT assets
      • Offer DTs as a Service
      • Integrate the DTs with external software systems
      • Separate configurations of independent DT components
      "},{"location":"user/digital-twins/create.html","title":"Create a Digital Twin","text":"

      The first step in digital twin creation is to use the available assets in your workspace. If you have assets / files in your computer that need to be available in the DTaaS workspace, then please follow the instructions provided in library assets.

      There are dependencies among the library assets. These dependencies are shown below.

      A digital twin can only be created by linking the assets in a meaningful way. This relationship can be expressed using a mathematical equation:

      where D denotes data, M denotes models, F denotes functions, T denotes tools, denotes DT configuration and is a symbolic notation for a digital twin itself. The expression denotes composition of DT from D,M,T and F assets. The indicates zero or one more instances of an asset and indicates one or more instances of an asset.

      The DT configuration specifies the relevant assets to use, the potential parameters to be set for these assets. If a DT needs to use RabbitMQ, InfluxDB like services supported by the platform, the DT configuration needs to have access credentials for these services.

      This kind of generic DT definition is based on the DT examples seen in the wild. You are at liberty to deviate from this definition of DT. The only requirement is the ability to run the DT from either commandline or desktop.

      Tip

      If you are stepping into the world of Digital Twins, you might not have distinct digital twin assets. You are likely to have one directory of everything in which you run your digital twin. In such a case we recommend that you upload this monolithic digital twin into digital_twin/your_digital_twin_name directory.

      "},{"location":"user/digital-twins/create.html#example","title":"Example","text":"

      The Examples repository contains a co-simulation setup for mass spring damper. This example illustrates the potential of using co-simulation for digital twins.

      The file system contents for this example are:

      workspace/\n  data/\n    mass-spring-damper\n        input/\n        output/\n\n  digital_twins/\n    mass-spring-damper/\n      cosim.json\n      time.json\n      lifecycle/\n        analyze\n        clean\n        evolve\n        execute\n        save\n        terminate\n      README.md\n\n  functions/\n  models/\n    MassSpringDamper1.fmu\n    MassSpringDamper2.fmu\n\n  tools/\n  common/\n    data/\n    functions/\n    models/\n    tools/\n        maestro-2.3.0-jar-with-dependencies.jar\n

      The workspace/data/mass-spring-damper/ contains input and output data for the mass-spring-damper digital twin.

      The two FMU models needed for this digital twin are in models/ directory.

      The co-simulation digital twin needs Maestro co-simulation orchestrator. Since this is a reusable asset for all the co-simulation based DTs, the tool has been placed in common/tools/ directory.

      The actual digital twin configuration is specified in digital twins/mass-spring-damper directory. The co-simulation configuration is specified in two json files, namely cosim.json and time.json. A small explanation of digital twin for its users can be placed in digital twins/mass-spring-damper/README.md.

      The launch program for this digital twin is in digital twins/mass-spring-damper/lifecycle/execute. This launch program runs the co-simulation digital twin. The co-simulation runs till completion and then ends. The programs in digital twins/mass-spring-damper/lifecycle are responsible for lifecycle management of this digital twin. The lifecycle page provides more explanation on these programs.

      Execution of a Digital Twin

      A frequent question arises on the run time characteristics of a digital twin. The natural intuition is to say that a digital twin must operate as long as its physical twin is in operation. If a digital twin runs for a finite time and then ends, can it be called a digital twin? The answer is a resounding YES. The Industry 4.0 usecases seen among SMEs have digital twins that run for a finite time. These digital twins are often run at the discretion of the user.

      You can run this digital twin by,

      1. Go to Workbench tools page of the DTaaS website and open VNC Desktop. This opens a new tab in your browser
      2. A page with VNC Desktop and a connect button comes up. Click on Connect. You are now connected to the Linux Desktop of your workspace.
      3. Open a Terminal (black rectangular icon in the top left region of your tab) and type the following commands.
      4. Download the example files by following the instructions given on examples overview.

      5. Go to the digital twin directory and run

      cd /workspace/examples/digital_twins/mass-spring-damper\nlifecycle/execute\n

      The last command executes the mass-spring-damper digital twin and stores the co-simulation output in data/mass-spring-damper/output.

      "},{"location":"user/digital-twins/devops.html","title":"Digital Twins and DevOps","text":"

      DevOps has been a well established software development practice. We are bringing out an experimental feature of integration DevOps in the DTaaS.

      Warning

      This feature is under documented. Please expect some instability in this release. However, we are working to mature the feature and improve the documentation.

      This feature requires specific installation setup.

      1. Integrated gitlab installation
      2. A valid gitlab repository for the logged in user. Please see an example repository. You can clone this repository and customize to your needs.
      3. A linked Gitlab Runner to the user gitlab repository.
      "},{"location":"user/digital-twins/devops.html#manage","title":"Manage","text":"

      The manage tab allows for different operations on a digital twin:

      • Checking the details (Details button)
      • Delete (Delete button)
      • Modify / Reconfigure (Reconfigure button)

      A digital twin placed in the DTaaS has a certain recommended structure. Please see the assets pag for an explanation and this example.

      The information page shown using the Details button, shows the README.md information stored inside the digital twin directory.

      A reconfigure button opens an editor and shows all the files corresponding to a digital twin. All of these files can be updated. These files correspond to three categories.

      • Description
      • Configuration
      • Lifecycle

      "},{"location":"user/digital-twins/devops.html#execute","title":"Execute","text":"

      The execute tabs shows the possibility of executing multiple digital twins. Once an execution of digital twin is complete, you can see the execution log as well.

      "},{"location":"user/digital-twins/lifecycle.html","title":"Digital Twin Lifecycle","text":"

      The physical products in the real world have product lifecycle. A simplified four-stage product life is illustrated here.

      A digital twin tracking the physical products (twins) need to track and evolve in conjunction with the corresponding physical twin.

      The possible activities undertaken in each lifecycle phases are illustrated in the figure.

      (Ref: Minerva, R, Lee, GM and Crespi, N (2020) Digital Twin in the IoT context: a survey on technical features, scenarios and architectural models. Proceedings of the IEEE, 108 (10). pp. 1785-1824. ISSN 0018-9219.)

      "},{"location":"user/digital-twins/lifecycle.html#lifecycle-phases","title":"Lifecycle Phases","text":"

      The four phase lifecycle has been extended to a lifecycle with eight phases. The new phase names and the typical activities undertaken in each phase are outlined in this section.

      A DT lifecycle consists of explore, create, execute, save, analyse, evolve and terminate phases.

      Phase Main Activities explore selection of suitable assets based on the user needs and checking their compatibility for the purposes of creating a DT. create specification of DT configuration. If DT already exists, there is no creation phase at the time of reuse. execute automated / manual execution of a DT based on its configuration. The DT configuration must checked before starting the execution phase. analyse checking the outputs of a DT and making a decision. The outputs can be text files, or visual dashboards. evolve reconfigure DT primarily based on analysis. save involves saving the state of DT to enable future recovery. terminate stop the execution of DT.

      A digital twin faithfully tracking the physical twin lifecycle will have to support all the phases. It is also possible for digital twin engineers to add more phases to digital they are developing. Thus it is important for the DTaaS software platform needs to accommodate needs of different DTs.

      A potential linear representation of the tasks undertaken in a digital twin lifecycle are shown here.

      Again this is only a one possible pathway. Users are at liberty to alter the sequence of steps.

      It is possible to map the lifecycle phases identified so far with the Build-Use-Share approach of the DTaaS software platform.

      Even though not mandatory, having a matching coding structure makes it easy to for users to create and manage their DTs within the DTaaS. It is recommended to have the following structure:

      workspace/\n  digital_twins/\n    digital-twin-1/\n      lifecycle/\n        analyze\n        clean\n        evolve\n        execute\n        save\n        terminate\n

      A dedicated program exists for each phase of DT lifecycle. Each program can be as simple as a script that launches other programs or sends messages to a live digital twin.

      The recommended way to implement lifecycle phases within DTaaS is to create scripts. These scripts can be as simple as shell scripts.

      "},{"location":"user/digital-twins/lifecycle.html#example-lifecycle-scripts","title":"Example Lifecycle Scripts","text":"

      Here are the example programs / scripts to manage three phases in the lifecycle of mass-spring-damper DT.

      lifecycle/execute
      #!/bin/bash\nmkdir -p /workspace/data/mass-spring-damper/output\n#cd ..\njava -jar /workspace/common/tools/maestro-2.3.0-jar-with-dependencies.jar \\\n    import -output /workspace/data/mass-spring-damper/output \\\n    --dump-intermediate sg1 cosim.json time.json -i -vi FMI2 \\\n    output-dir>debug.log 2>&1\n

      The execute phases uses the DT configuration, FMU models and Maestro tool to execute the digital twin. The script also stores the output of cosimulation in /workspace/data/mass-spring-damper/output.

      It is possible for a DT not to support a specific lifecycle phase. This intention can be specified with an empty script and a helpful message if deemed necessary.

      lifecycle/analyze
      #!/bin/bash\nprintf \"operation is not supported on this digital twin\"\n

      The lifecycle programs can call other programs in the code base. In the case of lifecycle/terminate program, it is calling another script to do the necessary job.

      lifecycle/terminate
      #!/bin/bash\nlifecycle/clean\n
      "},{"location":"user/examples/index.html","title":"DTaaS Examples","text":"

      There are some example digital twins created for the DTaaS software. You can peruse these examples and follow the steps given in this Examples section to experience features of the DTaaS software platform and understand best practices for managing digital twins within the platform. Please see these slides and video to get an overview of these examples.

      There are two demo vides available: CP-SENS project (slides and video) and Incubator (video). These two videos have been recorded using DTaaS v0.5.0.

      "},{"location":"user/examples/index.html#copy-examples","title":"Copy Examples","text":"

      The first step is to copy all the example code into your user workspace within the DTaaS. Use the given shell script to copy all the examples into /workspace/examples directory.

      wget https://raw.githubusercontent.com/INTO-CPS-Association/DTaaS-examples/main/getExamples.sh\nbash getExamples.sh\n
      "},{"location":"user/examples/index.html#example-list","title":"Example List","text":"

      The digital twins provided in examples vary in their complexity. It is best to use the examples in the following order.

      1. Mass Spring Damper
      2. Water Tank Fault Injection
      3. Water Tank Model Swap
      4. Desktop Robotti and RabbitMQ
      5. Water Treatment Plant and OPC-UA
      6. Three Water Tanks with DT Manager Framework
      7. Flex Cell with Two Industrial Robots
      8. Incubator
      9. Firefighters in Emergency Environments
      10. Mass Spring Damper with NuRV Runtime Monitor FMU
      11. Water Tank Fault Injection with NuRV Runtime Monitor FMU
      12. Incubator Co-Simulation with NuRV Runtime Monitor FMU
      13. Incubator with NuRV Runtime Monitor as Service
      14. Incubator with NuRV Runtime Monitor FMU as Service

      DTaaS examples

      "},{"location":"user/examples/drobotti-rmqfmu/index.html","title":"Desktop Robotti with RabbitMQ","text":""},{"location":"user/examples/drobotti-rmqfmu/index.html#overview","title":"Overview","text":"

      This example demonstrates bidirectional communication between a mock physical twin and a digital twin of a mobile robot (Desktop Robotti). The communication is enabled by RabbitMQ Broker.

      "},{"location":"user/examples/drobotti-rmqfmu/index.html#example-structure","title":"Example Structure","text":"

      The mock physical twin of mobile robot is created using two python scripts

      1. data/drobotti_rmqfmu/rmq-publisher.py
      2. data/drobotti_rmqfmu/consume.py

      The mock physical twin sends its physical location in (x,y) coordinates and expects a cartesian distance calculated from digital twin.

      The rmq-publisher.py reads the recorded (x,y) physical coordinates of mobile robot. The recorded values are stored in a data file. These (x,y) values are published to RabbitMQ Broker. The published (x,y) values are consumed by the digital twin.

      The consume.py subscribes to RabbitMQ Broker and waits for the calculated distance value from the digital twin.

      The digital twin consists of a FMI-based co-simulation, where Maestro is used as co-orchestration engine. In this case, the co-simulation is created by using two FMUs - RMQ FMU (rabbitmq-vhost.fmu) and distance FMU (distance-from-zero.fmu). The RMQ FMU receives the (x,y) coordinates from rmq-publisher.py and sends calculated distance value to consume.py. The RMQ FMU uses RabbitMQ broker for communication with the mock mobile robot, i.e., rmq-publisher.py and consume.py. The distance FMU is responsible for calculating the distance between (0,0) and (x,y). The RMQ FMU and distance FMU exchange values during co-simulation.

      "},{"location":"user/examples/drobotti-rmqfmu/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses two models, one tool, one data, and two scripts to create mock physical twin. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Models distance-from-zero.fmu Private No rmq-vhost.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes Data drobotti_playback_data.csv private No Mock PT rmq-publisher.py Private No consume.py Private No

      This DT has many configuration files. The coe.json and multimodel.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

      The RabbitMQ access credentials need to be provided in multimodel.json. The rabbitMQ-credentials.json provides RabbitMQ access credentials for mock PT python scripts. Please add your credentials in both these files.

      "},{"location":"user/examples/drobotti-rmqfmu/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool and pip packages for python scripts Execute Runs both DT and mock PT Clean Clears run logs and outputs"},{"location":"user/examples/drobotti-rmqfmu/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/drobotti_rmqfmu\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/drobotti-rmqfmu/index.html#create","title":"Create","text":"

      Installs Open Java Development Kit 17 in the workspace. Also install the required python pip packages for rmq-publisher.py and consume.py scripts.

      lifecycle/create\n
      "},{"location":"user/examples/drobotti-rmqfmu/index.html#execute","title":"Execute","text":"

      Run the python scripts to start mock physical twin. Also run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the two FMU models.

      lifecycle/execute\n
      "},{"location":"user/examples/drobotti-rmqfmu/index.html#examine-the-results","title":"Examine the results","text":"

      The results can be found in the /workspace/examples/digital_twins/drobotti_rmqfmu directory.

      Executing the DT will generate and launch a co-simulation (RMQFMU and distance FMU), and two python scripts. One to publish data that is read from a file. And one to consume what is sent by the distance FMU.

      In this examples the DT will run for 10 seconds, with a stepsize of 100ms. Thereafter it is possible to examine the logs produce in /workspace/examples/digital_twins/drobotti_rmqfmu/target. The outputs for each FMU, xpos and ypos for the RMQFMU, and the distance for the distance FMU are recorded in the outputs.csv file. Other logs can be examined for each FMU and the publisher scripts. Note that, the RMQFMU only sends data, if the current input is different to the previous one.

      "},{"location":"user/examples/drobotti-rmqfmu/index.html#terminate-phase","title":"Terminate phase","text":"

      Terminate to clean up the debug files and co-simulation output files.

      lifecycle/terminate\n
      "},{"location":"user/examples/drobotti-rmqfmu/index.html#references","title":"References","text":"

      The RabbitMQ FMU github repository contains complete documentation and source code of the rmq-vhost.fmu.

      More information about the case study is available in:

      Frasheri, Mirgita, et al. \"Addressing time discrepancy between digital\nand physical twins.\" Robotics and Autonomous Systems 161 (2023): 104347.\n
      "},{"location":"user/examples/flex-cell/index.html","title":"Flex Cell Digital Twin with Two Industrial Robots","text":""},{"location":"user/examples/flex-cell/index.html#overview","title":"Overview","text":"

      The flex-cell Digital Twin is a case study with two industrial robotic arms, a UR5e and a Kuka LBR iiwa 7, working in a cooperative setting on a manufacturing cell.

      The case study focuses on the robot positioning in the discrete cartesian space of the flex-cell working space. Therefore, it is possible to send (X,Y,Z) commands to both robots, which refer to the target hole and height they want should move to.

      The flex-cell case study is managed using the TwinManager (formerly DT Manager), which is packed as a jar library in the tools, and run from a java main file.

      The TwinManager uses Maestro as a slave for co-simulation, so it generates the output of the co-simulation and can interact with the real robots at the same time (with the proper configuration and setup). The mainfile can be changed according to the application scope, i.e., the /workspace/examples/tools/flex-cell/FlexCellDTaaS.java can be manipulated to get a different result.

      The /workspace/examples/models/flex-cell/ folder contains the .fmu files for the kinematic models of the robotic arms, the .urdf files for visualization (including the grippers), and the .aasx files for the schema representation with Asset Administration Shell.

      The case study also uses RabbitMQFMU to inject values into the co-simulation, therefore, there is the rabbitmqfmu in the models folder as well. Right now, RabbitMQFMU is only used for injecting values into the co-simulation, but not the other way around. The TwinManager is in charge of reading the values from the co-simulation output and the current state of the physical twins.

      "},{"location":"user/examples/flex-cell/index.html#example-structure","title":"Example Structure","text":"

      The example structure represents the components of the flex-cell DT implementation using the TwinManager architecture.

      The TwinManager orchestrates the flex-cell DT via the Flex-cell DT System, which is composed of 2 smaller Digital Twins, namely, the DT UR5e and the DT Kuka lbr iiwa 7. The TwinManager also provides the interface for the Physical Twins, namely, PT UR5e and PT Kuka lbr iiwa 7. Each Physical Twin and Digital Twin System has a particular endpoint (with a different specialization), which is initialized from configuration files and data model (twin schema).

      The current endpoints used in this implementation are:

      Digital or Physical Twin Endpoint Flex-cell DT System MaestroEndpoint DT UR5e FMIEndpoint DT Kuka lbr iiwa 7 FMIEndpoint PT UR5e MQTTEndpoint and RabbitMQEndpoint PT Kuka lbr iiwa 7 MQTTEndpoint and RabbitMQEndpoint

      The Flex-cell DT System uses another configuration to be integrated with the Maestro co-simulation engine.

      In the lower part, the Flex-cell System represents the composed physical twin, including the two robotic arms and controller and the Flex-cell Simulation is the mock-up representation for the real system, which is implemented by FMU blocks and their connections.

      "},{"location":"user/examples/flex-cell/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses seven models, five tools, six data files, two functions, and one script. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Model kukalbriiwa_model.fmu Private No kuka_irw_gripper_rg6.urdf Private No kuka.aasx Private No ur5e_model.fmu Private No ur5e_gripper_2fg7.urdf Private No ur5e.aasx Private No rmq-vhost.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes TwinManagerFramework-0.0.2.jar Private Yes urinterface (installed with pip) Private No kukalbrinterface Private No robots_flexcell Private No FlexCellDTaaS.java (main script) Private No Data publisher-flexcell-physical.py Private No ur5e_mqtt_publisher.py Private No connections.conf Private No outputs.csv Private No kukalbriiwa7_actual.csv Private No ur5e_actual.csv Private No Function plots.py Private No prepare.py Private No"},{"location":"user/examples/flex-cell/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

      The lifecycles that are covered include:

      1. Installation of dependencies in the create phase.
      2. Preparing the credentials for connections in the prepare phase.
      3. Execution of the experiment in the execution phase.
      4. Saving experiments in the save phase.
      5. Plotting the results of the co-simulation and the real data coming from the robots in the analyze phase.
      6. Terminating the background processes and cleaning up the outputs in the termination phase.
      Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool, Compiles source code of TwinManager to create a usable jar package (used as tool) Prepare Takes the RabbitMQ and MQTT credentials in connections.conf file and configures different assets of DT. Execute The TwinManager executes the flex-cell DT and produces output in data/flex-cell/output directory Save Save the experimental results Analyze Uses plotting functions to generate plots of co-simulation results Terminate Terminating the background processes Clean Cleans up the output data"},{"location":"user/examples/flex-cell/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/flex-cell\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      This example requires Java 11. The create script installs Java 11; however if you have already installed other Java versions, your default java might be pointing to another version. You can check and modify the default version using the following commands.

      java -version\nupdate-alternatives --config java\n

      Now, run the following scripts:

      "},{"location":"user/examples/flex-cell/index.html#create","title":"Create","text":"

      Installs Open Java Development Kit 11 and a python virtual environment with pip dependencies. Also builds the TwinManager tool (TwinManagerFramework-0.0.2.jar) from source code.

      lifecycle/create\n
      "},{"location":"user/examples/flex-cell/index.html#prepare","title":"Prepare","text":"

      Configure different assets of DT with these credentials. The functions/flex-cell/prepare.py script is used for this purpose. The only thing needed to set up the connection is to update the file /workspace/examples/data/flex-cell/input/connections.conf with the connection parameters for MQTT and RabbitMQ and then execute the prepare script.

      lifecycle/prepare\n

      The following files are updated with the configuration information:

      1. /workspace/examples/digital_twins/flex-cell/kuka_actual.conf
      2. /workspace/examples/digital_twins/flex-cell/ur5e_actual.conf
      3. /workspace/examples/data/flex-cell/input/publisher-flexcell-physical.py
      4. modelDescription.xml for the RabbitMQFMU require special credentials to connect to the RabbitMQ and the MQTT brokers.
      "},{"location":"user/examples/flex-cell/index.html#execute","title":"Execute","text":"

      Execute the flex-cell digital twin using TwinManager. TwinManager in-turn runs the co-simulation using Maestro. Generates the co-simulation output.csv file at /workspace/examples/data/flex-cell/output. The execution needs to be stopped with control + c since the TwinManager runs the application in a non-stopping loop.

      lifecycle/execute\n
      "},{"location":"user/examples/flex-cell/index.html#save","title":"Save","text":"

      Each execution of the DT is treated as a single run. The results of one execution are saved as time-stamped co-simulation output file in The TwinManager executes the flex-cell digital twin and produces output in data/flex-cell/output/saved_experiments directory.

      lifecycle/save\n

      The execute and save scripts can be executed in that order any number of times. A new file data/flex-cell/output/saved_experiments directory with each iteration.

      "},{"location":"user/examples/flex-cell/index.html#analyze","title":"Analyze","text":"

      There are dedicated plotting functions in functions/flex-cell/plots.py. This script plots the co-simulation results against the recorded values from the two robots.

      lifecycle/analyze\n
      "},{"location":"user/examples/flex-cell/index.html#terminate","title":"Terminate","text":"

      Stops the Maestro running in the background. Also stops any other jvm process started during execute phase.

      lifecycle/terminate\n
      "},{"location":"user/examples/flex-cell/index.html#clean","title":"Clean","text":"

      Removes the output generated during execute phase.

      lifecycle/clean\n
      "},{"location":"user/examples/flex-cell/index.html#examining-the-results","title":"Examining the results","text":"

      Executing this Digital Twin will generate a co-simulation output, but the results can also be monitored from updating the /workspace/examples/tools/flex-cell/FlexCellDTaaS.java with a specific set of getAttributeValue commands, such as shown in the code. That main file enables the online execution and comparison on Digital Twin and Physical Twin at the same time and at the same abstraction level.

      The output is generated to the /workspace/examples/data/flex-cell/output folder. In case a specific experiments is to be saved, the save lifecycle script stores the co-simulation results into the /workspace/examples/data/flex-cell/output/saved_experiments folder.

      In the default example, the co-simulation is run for 11 seconds in steps of 0.2 seconds. This can be modified for a longer period and different step size. The output stored in outputs.csv contains the joint position of both robotic arms and the current discrete (X,Y,Z) position of the TCP of the robot. Additional variables can be added, such as the discrete (X,Y,Z) position of the other joints.

      When connected to the real robots, the tools urinterface and kukalbrinterface log their data at a higher sampling rate.

      "},{"location":"user/examples/flex-cell/index.html#references","title":"References","text":"

      The RabbitMQ FMU github repository contains complete documentation and source code of the rmq-vhost.fmu.

      More information about the TwinManager (formerly DT Manager) and the case study is available in:

      1. D. Lehner, S. Gil, P. H. Mikkelsen, P. G. Larsen and M. Wimmer, \"An Architectural Extension for Digital Twin Platforms to Leverage Behavioral Models,\" 2023 IEEE 19th International Conference on Automation Science and Engineering (CASE), Auckland, New Zealand, 2023, pp. 1-8, doi: 10.1109/CASE56687.2023.10260417.
      2. S. Gil, P. H. Mikkelsen, D. Tola, C. Schou and P. G. Larsen, \"A Modeling Approach for Composed Digital Twins in Cooperative Systems,\" 2023 IEEE 28th International Conference on Emerging Technologies and Factory Automation (ETFA), Sinaia, Romania, 2023, pp. 1-8, doi: 10.1109/ETFA54631.2023.10275601.
      3. S. Gil, C. Schou, P. H. Mikkelsen, and P. G. Larsen, \u201cIntegrating Skills into Digital Twins in Cooperative Systems,\u201d in 2024 IEEE/SICE International Symposium on System Integration (SII), 2024, pp. 1124\u20131131, doi: 10.1109/SII58957.2024.10417610.
      "},{"location":"user/examples/incubator/index.html","title":"Incubator Digital Twin","text":""},{"location":"user/examples/incubator/index.html#overview","title":"Overview","text":"

      This is a case study of an Incubator with the purpose of understanding the steps and processes involved in developing a digital twin system. This incubator is an insulated container with the ability to keep a temperature and heat, but not cool. A picture of the incubator is given below.

      The overall purpose of the system is to reach a certain temperature within a box and keep the temperature regardless of content. An overview of the system can be seen below:

      The system consists of:

      • 1x styrofoam box in order to have an insulated container
      • 1x heat source to heat up the content within the Styrofoam box.
      • 1x fan to distribute the heating within the box
      • 2x temperature sensor to monitor the temperature within the box
      • 1x temperature Sensor to monitor the temperature outside the box
      • 1x controller to actuate the heat source and the fan and read sensory information from the temperature sensors, and communicate with the digital twin.

      The original repository for the example can be found: Original repository. This trimmed version of the codebase does not have the following:

      • docker support
      • tests
      • datasets

      The original repository contains the complete documentation of the example, including the full system architecture, instructions for running with a physical twin, and instructions for running a 3D visualization of the incubator.

      "},{"location":"user/examples/incubator/index.html#digital-twin-structure","title":"Digital Twin Structure","text":"

      This diagrams shows the main components and the interfaces they use to communicate. All components communicate via the RabbitMQ message exchange, and the data is stored in a time series database. The RabbitMQ and InfluxDB are platform services hosted by the DTaaS.

      The Incubator digital twin is a pre-packaged digital twin. It can be used as is or integrated with other digital twins.

      The mock physical twin is executed from incubator/mock_plant/real_time_model_solver.py script.

      "},{"location":"user/examples/incubator/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses a plethora of Python scripts to run the digital twin. By default it is configured to run with a mock physical twin. Furthermore, it depends on a RabbitMQ and an InfluxDB instances.

      There is one configuration file: simulation.conf. The RabbitMQ and InfluxDB configuration parameters need to be updated.

      "},{"location":"user/examples/incubator/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

      The lifecycles that are covered include:

      Lifecycle Phase Completed Tasks Create Potentially updates the system and installs Python dependencies Execute Executes the Incubator digital twin and produces output in the terminal and in incubator/log.log. Clean Removes the log file."},{"location":"user/examples/incubator/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/incubator\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/incubator/index.html#create","title":"Create","text":"

      Potentially updates the system and installs Python dependencies.

      lifecycle/create\n
      "},{"location":"user/examples/incubator/index.html#execute","title":"Execute","text":"

      Executes the Incubator digital twin with a mock physical twin. Pushes the results in the terminal, incubator/log.log, and in InfluxDB.

      lifecycle/execute\n
      "},{"location":"user/examples/incubator/index.html#clean","title":"Clean","text":"

      Removes the output log file.

      lifecycle/clean\n
      "},{"location":"user/examples/incubator/index.html#examining-the-results","title":"Examining the results","text":"

      After starting all services successfully, the controller service will start producing output that looks like the following:

      time           execution_interval  elapsed  heater_on  fan_on   room   box_air_temperature  state\n19/11 16:17:59  3.00                0.01     True       False   10.70  19.68                Heating\n19/11 16:18:02  3.00                0.03     True       True    10.70  19.57                Heating\n19/11 16:18:05  3.00                0.01     True       True    10.70  19.57                Heating\n19/11 16:18:08  3.00                0.01     True       True    10.69  19.47                Heating\n19/11 16:18:11  3.00                0.01     True       True    10.69  19.41                Heating\n

      An InfluxDB dashboard can be setup based on incubator/digital_twin/data_access/influxdbserver/dashboards/incubator_data.json. If the dashboard on the InfluxDB is setup properly, the following visualization can be seen:

      "},{"location":"user/examples/incubator/index.html#references","title":"References","text":"

      Forked from: Incubator repository with commit ID: 989ccf5909a684ad26a9c3ec16be2390667643aa

      To understand what a digital twin is, we recommend you read/watch one or more of the following resources:

      1. Feng, Hao, Cl\u00e1udio Gomes, Casper Thule, Kenneth Lausdahl, Alexandros Iosifidis, and Peter Gorm Larsen. \u201cIntroduction to Digital Twin Engineering.\u201d In 2021 Annual Modeling and Simulation Conference (ANNSIM), 1\u201312. Fairfax, VA, USA: IEEE, 2021. https://doi.org/10.23919/ANNSIM52504.2021.9552135.
      2. Video recording of presentation by Claudio Gomes
      "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html","title":"Incubator Digital Twin with NuRV FMU Monitoring Service","text":""},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#overview","title":"Overview","text":"

      This example demonstrates how an FMU can be used as a runtime monitoring service (in this example NuRV[1]) and connected with the Incubator digital twin to verify runtime behavior of the Incubator.

      "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#simulated-scenario","title":"Simulated scenario","text":"

      This example simulates a scenario where the lid of the Incubator is removed and later put back on. The Incubator is equipped with anomaly detection capabilities, which can detect anomalous behavior (i.e. the removal of the lid). When an anomaly is detected, the Incubator triggers an energy saving mode where the heater is turned off.

      From a monitoring perspective, we wish to verify that within 3 messages of an anomaly detection, the energy saving mode is turned on. To verify this behavior, we construct the property:

      .

      The monitor will output the unknown state as long as the property is satisfied and will transition to the false state once a violation is detected.

      The simulated scenario progresses as follows:

      • Initialization: The services are initialized and the Kalman filter in the Incubator is given 2 minutes to stabilize. Sometimes, the anomaly detection algorithm will detect an anomaly at startup even though the lid is still on. It will disappear after approx 15 seconds.
      • After 2 minutes: The lid is lifted and an anomaly is detected. The energy saver is turned on shortly after.
      • After another 30 seconds: The energy saver is manually disabled producing a false verdict.
      • After another 30 seconds: The lid is put back on and the anomaly detection is given time to detect that the lid is back on. The monitor is then reset producing an Unknown verdict again. The simulation then ends.
      "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#example-structure","title":"Example structure","text":"

      A diagram depicting the logical software structure of the example can be seen below.

      The execute script is responsible for starting the NuRV service and running the Python script that controls the scenario (execute.py).

      The execute.py script starts the Incubator services and runs the example scenario. Once the Incubator DT is started, a RabbitMQ client is created that subscribes to changes in the anomaly and energy_saving states of the DT, as well as the verdicts produced by the NuRV service. Each time an update is received, the full state and verdict is printed to the console.

      "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#digital-twin-configuration","title":"Digital Twin configuration","text":"

      Before running the example, please configure the simulation.conf file with your RabbitMQ credentials.

      The example uses the following assets:

      Asset Type Names of Assets Visibility Reuse in other Examples Tools common/tool/NuRV/NuRV Common Yes Other common/fmi2_headers Common Yes DT common/digital_twins/incubator Common Yes Specification safe-operation.smv Private No Script execute.py Private No

      The safe-operation.smv file contains the default monitored specification as described in the Simulated scenario section. These can be configured as desired.

      "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#lifecycle-phases","title":"Lifecycle phases","text":"

      The lifecycle phases for this example include:

      Lifecycle phase Completed tasks create Downloads the necessary tools and creates a virtual python environment with the necessary dependencies execute Runs a python script that starts up the necessary services as well as the Incubator simulation. Various status messages are printed to the console, including the monitored system states and monitor verdict.

      If required, change the execute permissions of lifecycle scripts you need to execute. This can be done using the following command.

      chmod +x lifecycle/{script}\n

      where {script} is the name of the script, e.g. create, execute etc.

      "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#running-the-example","title":"Running the example","text":"

      To run the example, first run the following command in a terminal:

      cd /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/\n

      Then, first execute the create script followed by the execute script using the following command:

      lifecycle/{script}\n

      The execute script will then start outputting system states and the monitor verdict approx every 3 seconds. The output is printed as follows.

      \"State: {anomaly state} & {energy_saving state}\"

      where \"anomaly\" indicates that an anomaly is detected and \"!anomaly\" indicates that an anomaly is not currently detected. The same format is used for the energy_saving state. NuRV verdicts are printed as follows

      \"Verdict from NuRV: {verdict}\".

      The monitor verdict can be false or unknown, where the latter indicates that the monitor does not yet have sufficient information to determine the satisfaction of the property. The monitor will never produce a true verdict as the entire trace must be verified to ensure satisfaction due to the G operator. Thus the unknown state can be viewed as a tentative true verdict.

      An example output trace is provided below:

      ....\nUsing LIFECYCLE_PATH: /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/lifecycle\nUsing INCUBATOR_PATH: /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/lifecycle/../../../common/digital_twins/incubator\nStarting NuRV FMU Monitor Service, see output at /tmp/nurv-fmu-service.log\nNuRVService.py PID: 13496\nStarting incubator\nConnected to rabbitmq server.\nRunning scenario with initial state: lid closed and energy saver on\nSetting energy saver mode: enable\nSetting G_box to: 0.5763498\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\nState: !anomaly & !energy_saving\nState: !anomaly & !energy_saving\nVerdict from NuRV: unknown\n
      "},{"location":"user/examples/incubator-NuRV-fmu-monitor-service/index.html#references","title":"References","text":"
      1. Information on the NuRV monitor can be found on FBK website.
      "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html","title":"Incubator Digital Twin with NuRV monitoring service","text":""},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#overview","title":"Overview","text":"

      This example demonstrates how a runtime monitoring service (in this example NuRV[1]) can be connected with the Incubator digital twin to verify runtime behavior of the Incubator.

      "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#simulated-scenario","title":"Simulated scenario","text":"

      This example simulates a scenario where the lid of the Incubator is removed and later put back on. The Incubator is equipped with anomaly detection capabilities, which can detect anomalous behavior (i.e. the removal of the lid). When an anomaly is detected, the Incubator triggers an energy saving mode where the heater is turned off.

      From a monitoring perspective, we wish to verify that within 3 simulation steps of an anomaly detection, the energy saving mode is turned on. To verify this behavior, we construct the property: . Whenever a True or False verdict is produced by the monitor, it is reset, allowing for the detection of repeated satisfaction/violation detections of the property.

      The simulated scenario progresses as follows:

      • Initialization: The services are initialized and the Kalman filter in the Incubator is given 2 minutes to stabilize. Sometimes, the anomaly detection algorithm will detect an anomaly at startup even though the lid is still on. It will disappear after approx 15 seconds.
      • After 2 minutes: The lid is lifted and an anomaly is detected. The energy saver is turned on shortly after
      • After another 30 seconds: The energy saver is manually disabled producing a False verdict.
      • After another 30 seconds: The lid is put back on and the anomaly detection is given time to detect that the lid is back on. The simulation then ends.
      "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#example-structure","title":"Example structure","text":"

      A diagram depicting the logical software structure of the example can be seen below.

      The execute.py script is responsible for orchestrating and starting all the relevant services in this example. This includes the Incubator DT, CORBA naming service (omniNames) and the NuRV monitor server as well as implementing the Monitor connector component that connects the DT output to the NuRV monitor server.

      The NuRV monitor server utilizes a CORBA naming service where it registers under a specific name. A user can then query the naming service for the specific name, to obtain a reference to the monitor server. For more information on how the NuRV monitor server works, please refer to [1].

      After establishing connection with the NuRV monitor server, the Incubator DT is started and a RabbitMQ client is created that subscribes to changes in the anomaly and energy_saving states of the DT. Each time an update is received of either state, the full state (the new updated state and the previous other state) is pushed to the NuRV monitor server whereafter the verdict is printed to the console.

      "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#digital-twin-configuration","title":"Digital Twin configuration","text":"

      Before running the example, please configure the simulation.conf file with your RabbitMQ credentials.

      The example uses the following assets:

      Asset Type Names of Assets Visibility Reuse in other Examples Service common/services/NuRV_orbit Common Yes DT common/digital_twins/incubator Common Yes Specification safe-operation.smv Private No Script execute.py Private No

      The safe-operation.smv file contains the default monitored specification as described in the Simulated scenario section. These can be configured as desired.

      "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#lifecycle-phases","title":"Lifecycle phases","text":"

      The lifecycle phases for this example include:

      Lifecycle phase Completed tasks create Downloads the necessary tools and creates a virtual python environment with the necessary dependencies execute Runs a python script that starts up the necessary services as well as the Incubator simulation. Various status messages are printed to the console, including the monitored system states and monitor verdict. clean Removes created data directory and incubator log files.

      If required, change the execute permissions of lifecycle scripts you need to execute. This can be done using the following command

      chmod +x lifecycle/{script}\n

      where {script} is the name of the script, e.g. create, execute etc.

      "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#running-the-example","title":"Running the example","text":"

      To run the example, first run the following command in a terminal:

      cd /workspace/examples/digital_twins/incubator-monitor-server/\n

      Then, first execute the create script (this can take a few mins depending on your network connection) followed by the execute script using the following command:

      lifecycle/{script}\n

      The execute script will then start outputting system states and the monitor verdict approx every 3 seconds. The output is printed as follows \"State: {anomaly state} & {energy_saving state}, verdict: {Verdict}\" where \"anomaly\" indicates that an anomaly is detected and \"!anomaly\" indicates that an anomaly is not currently detected. The same format is used for the energy_saving state.

      The monitor verdict can be True, False or Unknown, where the latter indicates that the monitor does not yet have sufficient information to determine the satisfaction of the property.

      An example output trace is provided below:

      ....\nRunning scenario with initial state: lid closed and energy saver on\nSetting energy saver mode: enable\nSetting G_box to: 0.5763498\nState: !anomaly & !energy_saving, verdict: True\nState: !anomaly & !energy_saving, verdict: True\n....\nState: anomaly & !energy_saving, verdict: Unknown\nState: anomaly & energy_saving, verdict: True\nState: anomaly & energy_saving, verdict: True\n

      There is currently some startup issues with connecting to the NuRV server, and it will likely take a few tries before the connection is established. This is however handled automatically.

      "},{"location":"user/examples/incubator-NuRV-monitor-service/index.html#references","title":"References","text":"
      1. Information on the NuRV monitor can be found on FBK website.
      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html","title":"Incubator Co-Simulation Digital Twin validation with NuRV Monitor","text":""},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#overview","title":"Overview","text":"

      This example demonstrates how to validate some digital twin components using FMU monitors (in this example, the monitors are generated with NuRV[1]).

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#simulated-scenario","title":"Simulated scenario","text":"

      This example validates some components of the Incubator digital twin, by performing a simulation in which the commponents are wrapped inside FMUs, and are then inspected at runtime by some a FMU monitor generated by NuRV. Please note that the link to Incubator digital twin is only provided to know the details of the incubator physical twin. The digital twin (DT) presented here is a co-simulation DT of the Incubator.

      The input data for the simulation is generated by a purpose-built FMU component named source, which supplies testing data to the anomaly detector, simulating an anomaly occurring at time t=60s. An additional component, watcher, is employed to verify whether the energy saver activates in response to an anomaly reported by the anomaly detector.

      The output of the watcher is the passed to the monitor, which ensures that when an anomaly is detected, the energy saver activates within a maximum of three simulation cycles.

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#example-structure","title":"Example structure","text":"

      A diagram depicting the logical software structure of the example can be seen below.

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#digital-twin-configuration","title":"Digital Twin configuration","text":"

      The example uses the following assets:

      Asset Type Names of Assets Visibility Reuse in other Examples Models anomaly_detection.fmu Private No energy_saver.fmu Private No Source.fmu Private No Watcher.fmu Private No Specification safe-operation.smv Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

      The safe-operation.smv file contains the default monitored specification as described in the Simulated scenario section.

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#lifecycle-phases","title":"Lifecycle phases","text":"

      The lifecycle phases for this example include:

      Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro toolGenerates and compiles the monitor FMU Execute Produces and stores output in data/incubator-NuRV-monitor-validation/output directory Clean Clears run logs and outputs

      If required, change the execute permissions of lifecycle scripts you need to execute. This can be done using the following command

      chmod +x lifecycle/{script}\n

      where {script} is the name of the script, e.g. create, execute etc.

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/incubator-NuRV-monitor-validation\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#create","title":"Create","text":"
      • Installs Open Java Development Kit 17 in the workspace.
      • Generates and compiles the monitor FMU from the NuRV specification
      lifecycle/create\n
      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#execute","title":"Execute","text":"

      Run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the FMU models.

      lifecycle/execute\n
      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#analyze-phase","title":"Analyze phase","text":"

      Process the output of co-simulation to produce a plot at: /workspace/examples/data/incubator-NuRV-monitor-validation/output/plots.

      lifecycle/analyze\n

      A sample plot is given here.

      In the plot, four color-coded indicators provide a visual representation of distinct values. The blue line depicts the simulated temperature, while orange one represents the temperature estimate. A red dashed line indicates the target temperature set by the energy saver component. The green line shows the monitor's output verdict. As observed, when there is a disparity between the estimated and actual temperatures, the energy saver adjusts the target temperature downward, indicating that the component is working properly. Thus, the output of the monitor is fixed at unknown (0), signifying that the monitoring property is not violated.

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#examine-the-results","title":"Examine the results","text":"

      The results can be found in the /workspace/examples/data/incubator-NuRV-monitor-validation/output directory where the logs are also included.

      Figures of the output results can be found in the /workspace/examples/data/incubator-NuRV-monitor-validation/output directory.

      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#terminate-phase","title":"Terminate phase","text":"

      Terminate to clean up the debug files and co-simulation output files.

      lifecycle/terminate\n
      "},{"location":"user/examples/incubator-NuRV-monitor-validation/index.html#references","title":"References","text":"
      1. More information about NuRV is available here.
      "},{"location":"user/examples/mass-spring-damper/index.html","title":"Mass Spring Damper","text":""},{"location":"user/examples/mass-spring-damper/index.html#overview","title":"Overview","text":"

      The mass spring damper digital twin (DT) comprises two mass spring dampers and demonstrates how a co-simulation based DT can be used within DTaaS.

      "},{"location":"user/examples/mass-spring-damper/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/mass-spring-damper/index.html#example-structure","title":"Example Structure","text":"

      There are two simulators included in the study, each representing a mass spring damper system. The first simulator calculates the mass displacement and speed of for a given force acting on mass . The second simulator calculates force given a displacement and speed of mass . By coupling these simulators, the evolution of the position of the two masses is computed.

      "},{"location":"user/examples/mass-spring-damper/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses two models and one tool. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Models MassSpringDamper1.fmu Private Yes MassSpringDamper2.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

      The co-sim.json and time.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

      "},{"location":"user/examples/mass-spring-damper/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute Produces and stores output in data/mass-spring-damper/output directory Clean Clears run logs and outputs"},{"location":"user/examples/mass-spring-damper/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/mass-spring-damper\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/mass-spring-damper/index.html#create","title":"Create","text":"

      Installs Open Java Development Kit 17 in the workspace.

      lifecycle/create\n
      "},{"location":"user/examples/mass-spring-damper/index.html#execute","title":"Execute","text":"

      Run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the two FMU models.

      lifecycle/execute\n
      "},{"location":"user/examples/mass-spring-damper/index.html#examine-the-results","title":"Examine the results","text":"

      The results can be found in the /workspace/examples/data/mass-spring-damper/output directory.

      You can also view run logs in the /workspace/examples/digital_twins/mass-spring-damper.

      "},{"location":"user/examples/mass-spring-damper/index.html#terminate-phase","title":"Terminate phase","text":"

      Terminate to clean up the debug files and co-simulation output files.

      lifecycle/terminate\n
      "},{"location":"user/examples/mass-spring-damper/index.html#references","title":"References","text":"

      More information about co-simulation techniques and mass spring damper case study are available in:

      Gomes, Cl\u00e1udio, et al. \"Co-simulation: State of the art.\"\narXiv preprint arXiv:1702.00686 (2017).\n

      The source code for the models used in this DT are available in mass spring damper github repository.

      "},{"location":"user/examples/mass-spring-damper-monitor/index.html","title":"Mass Spring Damper with NuRV Runtime Monitor","text":""},{"location":"user/examples/mass-spring-damper-monitor/index.html#overview","title":"Overview","text":"

      This digital twin is derives from te Mass String Damper digital twin.

      The mass spring damper digital twin (DT) comprises two mass spring dampers and demonstrates how a co-simulation based DT can be used within DTaaS. This version of the example is expanded with a monitor generated by NuRV. More information about NuRV is available here.

      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/mass-spring-damper-monitor/index.html#example-structure","title":"Example Structure","text":"

      There are two simulators included in the study, each representing a mass spring damper system. The first simulator calculates the mass displacement and speed of for a given force acting on mass . The second simulator calculates force given a displacement and speed of mass . By coupling these simulators, the evolution of the position of the two masses is computed.

      Additionally, a monitor is inserted in the simulation to check at runtime whether the displacement of the two masses stays below a maximum threshold.

      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses two models and one tool. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Models MassSpringDamper1.fmu Private Yes MassSpringDamper2.fmu Private Yes m2.fmu Private No RtI.fmu Private Yes Specification m2.smv Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

      The co-sim.json and time.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro toolGenerates and compiles the monitor FMU Execute Produces and stores output in data/mass-spring-damper-monitor/output directory Clean Clears run logs and outputs"},{"location":"user/examples/mass-spring-damper-monitor/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/mass-spring-damper-monitor\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#create","title":"Create","text":"
      • Installs Open Java Development Kit 17 in the workspace.
      • Generates and compiles the monitor FMU from the NuRV specification
      lifecycle/create\n
      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#execute","title":"Execute","text":"

      Run the the Digital Twin. Since this is a co-simulation based digital twin, the Maestro co-simulation tool executes co-simulation using the two FMU models.

      lifecycle/execute\n
      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#analyze-phase","title":"Analyze phase","text":"

      Process the output of co-simulation to produce a plot at: /workspace/examples/data/mass-spring-damper-monitor/output/plots.

      lifecycle/analyze\n

      A sample plot is given here.

      In the plot, three color-coded indicators are used to represent different values. The blue line shows the distance between the two masses, while the green indicates the monitor's verdict. A red dashed line serves as a reference point, marking the distance checked by the monitor. Since the distance of the masses is always below the threshold, the output of the monitor is fixed to unknown (0).

      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#examine-the-results","title":"Examine the results","text":"

      The results can be found in the /workspace/examples/data/mass-spring-damper-monitor/output directory.

      You can also view run logs in the /workspace/examples/digital_twins/mass-spring-damper-monitor.

      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#terminate-phase","title":"Terminate phase","text":"

      Terminate to clean up the debug files and co-simulation output files.

      lifecycle/terminate\n
      "},{"location":"user/examples/mass-spring-damper-monitor/index.html#references","title":"References","text":"

      More information about co-simulation techniques and mass spring damper case study are available in:

      Gomes, Cl\u00e1udio, et al. \"Co-simulation: State of the art.\"\narXiv preprint arXiv:1702.00686 (2017).\n

      The source code for the models used in this DT are available in mass spring damper github repository.

      "},{"location":"user/examples/o5g/index.html","title":"Firefighter Mission in a Burning Building","text":"

      In an firefighter mission it is important to monitor the oxygen levels of each firefighters Self Contained Breating Aparatus (SCBA) in context of their mission.

      "},{"location":"user/examples/o5g/index.html#physical-twin-overview","title":"Physical Twin Overview","text":"

      Image: Schematic overview of a firefighter mission. Note the mission commander on the lower left documenting the air supply pressure levels provided by radio communication from the firefighters inside and around the burning building. This image was created with the assistance of DALL\u00b7E.

      We assume the following scenario:

      • a set of firefighters work to extinguish a burning building
      • they each use an SCBA with pressurised oxygen to breath
      • a mission commander on the outside coordinates the efforts and surveills the oxygen levels
      "},{"location":"user/examples/o5g/index.html#digital-twin-overview","title":"Digital Twin Overview","text":"

      In this example a monitor is implemented, that calculates how much time the firefighers have left, until they need to leave the building. To that end, the inputs used are:

      • 3D-model of the building in which the mission takes place,
      • pressure data of a firefighters SCBA and
      • firefighters location inside of the building

      are used to estimate:

      • the shortest way out,
      • how much time this will need and
      • how much time is left until all oxygen from the SCBA is used up.

      The remaining mission time is monitored and the firefighter receive a warning if it drops under a certain threshold.

      This example is an implementation of the the paper Digital Twin for Rescue Missions--a Case Study by Leucker et al.

      "},{"location":"user/examples/o5g/index.html#quick-check","title":"Quick Check","text":"

      Before runnnig this example please make sure the following files are at the correct locations:

      /workspace/examples/\n   data/o5g/input/\n      runTessla.sh\n      sensorSimulation.py\n      telegraf.conf\n\n   models/\n    lab.ifc\n    makefmu.mos\n      PathOxygenEstimate.mo\n\n  tools/\n    graphToPath.py\n    ifc_to_graph\n    pathToTime.py\n    tessla-telegraf-connector/\n    tessla-telegraf-connector/\n      tessla.jar\n      specification.tessla (run-time specification)\n\n   digital_twins/o5g/\n      main.py\n      config\n      lifecycle/ (scripts)\n
      "},{"location":"user/examples/o5g/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      All configuration for this example is contained in digital_twins/o5g/config.

      To use the MQTT-Server, account information needs to be provided. The topics are set to their default values, which allow the DT to access the mock physical twins sensor metrics and to send back alerts.

      export O5G_MQTT_SERVER=\nexport O5G_MQTT_PORT=\nexport O5G_MQTT_USER=\nexport O5G_MQTT_PASS=\n\nexport O5G_MQTT_TOPIC_SENSOR='vgiot/ue/metric'\nexport O5G_MQTT_TOPIC_AIR_PREDICTION='vgiot/dt/prediction'\nexport O5g_MQTT_TOPIC_ALERT='vgiot/dt/alerts'\n

      This example uses InfuxDB as a data storage, which will need to be configured to use your Access data. The following configuration steps are needed:

      • Log into the InfluxDB Web UI
      • Obtain org name (is below your username in the sidebar)
      • Create a data bucket if you don't have one already in Load Data -> Buckets
      • Create an API access token in Load Data -> API Tokens, Copy and save this token somewhere immediately, you can not access it later!
      export O5G_INFLUX_SERVER=\nexport O5G_INFLUX_PORT=\nexport O5G_INFLUX_TOKEN=\nexport O5G_INFLUX_ORG=\nexport O5G_INFLUX_BUCKET=\n
      "},{"location":"user/examples/o5g/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

      The lifecycles that are covered include:

      Lifecycle Phase Completed Tasks Install Installs Open Modelica, Rust, Telegraf and the required pip dependencies Create Create FMU from Open Modelica file Execute Execute the example in the background tmux terminal session Terminate Terminate the tmux terminal session running in the background Clean Delete the temporary files"},{"location":"user/examples/o5g/index.html#run-the-example","title":"Run the example","text":""},{"location":"user/examples/o5g/index.html#install","title":"Install","text":"

      Run the install script by executing

      lifecycle/install\n

      This will install all the required dependencies from apt and pip, as well as Open Modelica, Rust, Telegraf and the required pip dependencies from their respective repos.

      "},{"location":"user/examples/o5g/index.html#create","title":"Create","text":"

      Run the create script by executing

      lifecycle/create\n

      This will compile the modelica model to an Functional Mockup Unit (FMU) for the correct platform.

      "},{"location":"user/examples/o5g/index.html#exceute","title":"Exceute","text":"

      To run the Digital Twin execute

      lifecycle/execute\n

      This will start all the required components in a single tmux session called o5g in the background. To view the running Digital Twin attatch to this tmux session by executing

      tmux a -t o5g\n

      To detatch press Ctrl-b followed by d.

      The tmux session contains 4 components of the digital twin:

      Panel location Purpose Top Left Sensor simulator generating random location and O2-level data Top Right Main Digital Twin receives the sensor data and calculates an estimate of how many minutes of air remain Bottom Left Telegraf to convert between different message formats, also displays all messages between components Bottom Right TeSSLa monitor raises an alarm, if the remaining time is to low."},{"location":"user/examples/o5g/index.html#examine-the-results","title":"Examine the Results","text":"

      For additional mission awareness, we recommend utilising the Influx data visualisation. We provide a dashboard configuration in the file influx-dashoard.json. Log in to your Influx Server to import (usually port 8086). A screenshot of the dashboard is given here.

      The data gets stored in o5g->prediction->air-remaining->37ae3e4fb3ea->true->vgiot/dt/prediction variable of the InfluxDB. In addition to importing dashboard configuration given above, it is possible to create your custom dashboards using the stored data.

      "},{"location":"user/examples/o5g/index.html#terminate","title":"Terminate","text":"

      To stop the all components and close the tmux session execute

      lifecycle/terminate\n
      "},{"location":"user/examples/o5g/index.html#clean","title":"Clean","text":"

      To remove temoporary files created during execution

      lifecycle/clean\n
      "},{"location":"user/examples/opc-ua-waterplant/index.html","title":"Waste Water Plant with OPC-UA","text":""},{"location":"user/examples/opc-ua-waterplant/index.html#introduction","title":"Introduction","text":"

      Waste water treatment (WWT) plants must comply with substance and species concentration limits established by regulation in order to ensure the good quality of the water. This is usually done taking periodic samples that are analyzed in the laboratory. This means that plant operators do not have continuous information for making decisions and, therefore, operation setpoints are set to higher values than needed to guarantee water quality. Some of the processes involved in WWT plants consume a lot of power, thus adjusting setpoints could significantly reduce energy consumption.

      "},{"location":"user/examples/opc-ua-waterplant/index.html#physical-twin-overview","title":"Physical Twin Overview","text":"

      This example demonstrates the communication between a physical ultraviolet (UV) disinfection process (the tertiary treatment of a WWT plant) and its digital twin, which is based on Computational Fluid Dynamics (CFD) and compartment models. The aim of this digital twin is to develop \"virtual sensors\" that provide continuous information that facilitates the decision making process for the plant operator.

      The physical twin of the waste water plant is composed of an ultraviolet channel controlled by a PLC that controls the power of the UV lamps needed to kill all the pathogens of the flow. The channel has 3 groups of UV lamps, therefore the real channel (and is mathematical model) is subdivided into 7 zones: 4 correspond to zones without UV lamps (2 for the entrance and exit of the channel + 2 zones between UV lamps) and the 3 reamaining for the UV lamps.

      The dose to be applied (related with the power) changes according to the residence time (computed from the measure of the volume flow) and the UV intensity (measured by the intensity sensor).

      The information of the volumetric flow and power (in the three parts of the channel) is transmitted to the PLC of the plant. Furthermore, the PLC is working as OPC UA Server to send and receive data to and from an OPC UA Client. Additionally, some sizing parameters and initial values are read from a spreadsheet filled in by the plant operator. In this case, the spreadsheet is an Open Office file (.ods) due to the software installed in the SCADA PC. Some of the variables like initial concentration of disinfectant and pathogens are included, among others. Some values defined by the plant operator correspond to input signals that are not currently being measured, but are expected to be measured in the future.

      "},{"location":"user/examples/opc-ua-waterplant/index.html#digital-twin-overview","title":"Digital Twin Overview","text":"

      The digital twin is a reduced model (developed in C)\u00a0that solves physical conservation laws (mass, energy and momentum), but simplifies details (geometry, mainly) to ensure real-time calculations and accurate results. The results are compared to the ones obtained by the CFD. C solver developed is used by the OpenModelica\u00a0model. OpenModelica converts\u00a0it into the FMI standard, to be integrated in the OPC UA Client (client-opcua.py).

      "},{"location":"user/examples/opc-ua-waterplant/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"Asset Type Name of Asset Visibility Reuse in Other Examples Model Test_DTCONEDAR.mo private No Data configuration_freopcua.ods private No model_description.csv (generated by client-asyncua.py) private No Mock OPC UA Server: opcua-mock-server.py private No Tool OPC UA Client: client-opcua.py private No FMU builder: create-fmu.mos private No

      In this example, a dummy model representation of the plant is used, instead of the real model. The simplified model (with not the real equations) is developed in Open Modelica (Test_DTCONEDAR.mo). The FMU is generated from the Open Modelica interface to obtain the needed binaries to run the FMU. It is possible to run an FMU previously generated, however, to ensure that we are using the right binaries it is recommended to install Open Modelica Compiler and run script.mos to build the FMU from the Modelica file Test_DTCONEDAR.mo.

      The FMU model description file (modelDescription.xml file inside Test_DTCONEDAR.fmu) has the information of the value references configuration_freeopcua.ods has the information of the OPC-UA node IDs And both have in common the variable name

      The client python script (client-opcua.py) does the following actions:

      • Reads the variable names and the variable value references from the model description file of the Test_DTCONEDAR.FMU.
      • Reads configuration_freeopcua.ods to obtain opcua node IDs and assigns those node IDs to the variables read from the FMU
      • Read configuration_freeopcua.ods to fix initial values, parameters and some inputs (those inputs that are not being measured, a reasonable value is assumed).
      • Read values from PLC using a client OPC.
      • Execute the algorithm with the FMPy library using the .fmu created from the compartment model (based on CFD)

      • Obtain results.

      • Send by OPC UA protocol the result values to the PLC, to visualize them in the SCADA and with the aim to improve the decision-making process of the plant operator.
      "},{"location":"user/examples/opc-ua-waterplant/index.html#input-data-variables","title":"Input Data Variables","text":"

      The configuration_freeopcua.ods date file is used for customizing the initial input data values used by the server.

      "},{"location":"user/examples/opc-ua-waterplant/index.html#dt-config","title":"DT Config","text":"

      The config.json specifies the configuration parameters for the OPC UA client.

      Optional parameters can be modified:

      • stop_time
      • step_size
      • record = True, if we want to save the results of the simulation
      • record_interval. Sometimes the simulation step_size is small and a the size of the results file can be too big. For instance, if the simulation step_size is 0.01 seconds, we can increase the record_interval so as to reduce the result file size.
      • record_variables: we can specify the list of variables that we want to record.
      • enable_send = True, if we want to send results to the OPC UA Server.
      "},{"location":"user/examples/opc-ua-waterplant/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

      The lifecycles that are covered include:

      Lifecycle Phase Completed Tasks Install Installs Open Modelica, Python 3.10 and the required pip dependencies Create Create FMU from Open Modelica file Execute Run OPC UA mock server and normal OPC-UA client Clean Delete the temporary files"},{"location":"user/examples/opc-ua-waterplant/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital twins/opc-ua-waterplant\n

      If required, change the execute permission of lifecycle scripts.

      chmod +x lifecycle/*\n

      Now, run the following scripts:

      "},{"location":"user/examples/opc-ua-waterplant/index.html#install","title":"Install","text":"

      Installs Open Modelica, Python 3.10 and the required pip dependencies

      lifecycle/install\n
      "},{"location":"user/examples/opc-ua-waterplant/index.html#create","title":"Create","text":"

      Create Test_DTCONEDAR.fmu co-simulation model from `Test_DTCONEDAR.mo open modelica file.

      lifecycle/create\n
      "},{"location":"user/examples/opc-ua-waterplant/index.html#execute","title":"Execute","text":"

      Start the mock OPC UA server in the background. Run the OPC UA client.

      lifecycle/execute\n
      "},{"location":"user/examples/opc-ua-waterplant/index.html#clean","title":"Clean","text":"

      Remove the temporary files created by Open Modelica and output files generated by OPC UA client.

      lifecycle/clean\n
      "},{"location":"user/examples/opc-ua-waterplant/index.html#references","title":"References","text":"

      More explanation about this example is available at:

      Royo, L., Labar\u00edas, A., Arnau, R., G\u00f3mez, A., Ezquerra, A., Cilla, I., &\nD\u00edez-Anto\u00f1azas, L. (2023). Improving energy efficiency in the tertiary\ntreatment of Alguazas WWTP (Spain) by means of digital twin development\nbased on Physics modelling . Cambridge Open Engage.\n[doi:10.33774/coe-2023-1vjcw](https://doi.org/10.33774/coe-2023-1vjcw)\n
      "},{"location":"user/examples/opc-ua-waterplant/index.html#acknowledgements","title":"Acknowledgements","text":"

      The work on this example was done in a project subsidised thanks to the support grants for Agrupaci\u00f3n Empresarial Innovadora (AEI) of the Ministry of Industry, Trade and Tourism (MINCOTUR) with the aim of improving the competitiveness of small and medium-sized enterprises within the Recovery, Transformation and Resilience Plan (PRTR) financed by the Next Generation EU (NGEU) funds, with Grant Number: AEI-010500-2022b-196.

      "},{"location":"user/examples/three-tank/index.html","title":"Three-Tank System Digital Twin","text":""},{"location":"user/examples/three-tank/index.html#overview","title":"Overview","text":"

      The three-tank system is a simple case study allows us to represent a system that is composed of three individual components that are coupled in a cascade as follows: The first tank is connected to the input of the second tank, and the output of the second tank is connected to the input of the third tank.

      This example contains only the simulated components for demonstration purposes; therefore, there is no configuration for the connection with the physical system.

      The three-tank system case study is managed using the DTManager, which is packed as a jar library in the tools, and run from a java main file. The DTManager uses Maestro as a slave for co-simulation, so it generates the output of the co-simulation.

      The main file can be changed according to the application scope, i.e., the /workspace/examples/tools/three-tank/TankMain.java can be manipulated to get a different result.

      The /workspace/examples/models/three-tank/ folder contains the Linear.fmu file, which is a non-realistic model for a tank with input and output and the TankSystem.aasx file for the schema representation with Asset Administration Shell. The three instances use the same .fmu file and the same schema due to being of the same object class. The DTManager is in charge of reading the values from the co-simulation output.

      "},{"location":"user/examples/three-tank/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/three-tank/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses two models, two tools, one data, and one script. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Model Linear.fmu Private No TankSystem.aasx Private No Tool DTManager-0.0.1-Maestro.jar (wraps Maestro) Common Yes maestro-2.3.0-jar-with-dependencies.jar (used by DTManager) Common Yes TankMain.java (main script) Private No Data outputs.csv Private No

      This DT has multiple configuration files. The coe.json and multimodel.json are used by Maestro tool. The tank1.conf, tank2.conf and tank3.conf are the config files for three different instances of one model (Linear.fmu).

      "},{"location":"user/examples/three-tank/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"

      The lifecycles that are covered include:

      Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute The DT Manager executes the three-tank digital twin and produces output in data/three-tank/output directory Terminate Terminating the background processes and cleaning up the output"},{"location":"user/examples/three-tank/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital twins/three-tank\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/three-tank/index.html#create","title":"Create","text":"

      Installs Open Java Development Kit 11 and pip dependencies. Also creates DTManager tool (DTManager-0.0.1-Maestro.jar) from source code.

      lifecycle/create\n
      "},{"location":"user/examples/three-tank/index.html#execute","title":"Execute","text":"

      Execute the three-tank digital twin using DTManager. DTManager in-turn runs the co-simulation using Maestro. Generates the co-simulation output.csv file at /workspace/examples/data/three-tank/output.

      lifecycle/execute\n
      "},{"location":"user/examples/three-tank/index.html#terminate","title":"Terminate","text":"

      Stops the Maestro running in the background. Also stops any other jvm process started during execute phase.

      lifecycle/terminate\n
      "},{"location":"user/examples/three-tank/index.html#clean","title":"Clean","text":"

      Removes the output generated during execute phase.

      lifecycle/terminate\n
      "},{"location":"user/examples/three-tank/index.html#examining-the-results","title":"Examining the results","text":"

      Executing this Digital Twin will generate a co-simulation output, but the results can also be monitored from updating the/workspace/examples/tools/three-tank/TankMain.java with a specific set of getAttributeValue commands, such as shown in the code.

      That main file enables the online execution of the Digital Twin and its internal components.

      The output of the co-simulation is generated to the /workspace/examples/data/three-tank/output folder.

      In the default example, the co-simulation is run for 10 seconds in steps of 0.5 seconds. This can be modified for a longer period and different step size. The output stored in outputs.csv contains the level, in/out flow, and leak values.

      No data from the physical twin are generated/used.

      "},{"location":"user/examples/three-tank/index.html#references","title":"References","text":"

      More information about the DT Manager is available at:

      D. Lehner, S. Gil, P. H. Mikkelsen, P. G. Larsen and M. Wimmer,\n\"An Architectural Extension for Digital Twin Platforms to Leverage\nBehavioral Models,\" 2023 IEEE 19th International Conference on\nAutomation Science and Engineering (CASE), Auckland, New Zealand,\n2023, pp. 1-8, doi: 10.1109/CASE56687.2023.10260417.\n
      "},{"location":"user/examples/water_tank_FI/index.html","title":"Water Tank Fault Injection","text":""},{"location":"user/examples/water_tank_FI/index.html#overview","title":"Overview","text":"

      This example shows a fault injection (FI) enabled digital twin (DT). A live DT is subjected to simulated faults received from the environment. The simulated faults is specified as part of DT configuration and can be changed for new instances of DTs.

      In this co-simulation based DT, a watertank case-study is used; co-simulation consists of a tank and controller. The goal of which is to keep the level of water in the tank between Level-1 and Level-2. The faults are injected into output of the water tank controller (Watertankcontroller-c.fmu) from 12 to 20 time units, such that the tank output is closed for a period of time, leading to the water level increasing in the tank beyond the desired level (Level-2).

      "},{"location":"user/examples/water_tank_FI/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/water_tank_FI/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/water_tank_FI/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses two models and one tool. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Models watertankcontroller-c.fmu Private Yes singlewatertank-20sim.fmu Private Yes Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

      The multimodelFI.json and simulation-config.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

      The faults are defined in wt_fault.xml.

      "},{"location":"user/examples/water_tank_FI/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute Produces and stores output in data/water_tank_FI/output directory Clean Clears run logs and outputs"},{"location":"user/examples/water_tank_FI/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/water_tank_FI\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/water_tank_FI/index.html#create","title":"Create","text":"

      Installs Open Java Development Kit 17 and pip dependencies. The pandas and matplotlib are the pip dependencies installated.

      lifecycle/create\n
      "},{"location":"user/examples/water_tank_FI/index.html#execute","title":"Execute","text":"

      Run the co-simulation. Generates the co-simulation output.csv file at /workspace/examples/data/water_tank_FI/output.

      lifecycle/execute\n
      "},{"location":"user/examples/water_tank_FI/index.html#analyze-phase","title":"Analyze phase","text":"

      Process the output of co-simulation to produce a plot at: /workspace/examples/data/water_tank_FI/output/plots/.

      lifecycle/analyze\n
      "},{"location":"user/examples/water_tank_FI/index.html#examine-the-results","title":"Examine the results","text":"

      The results can be found in the /workspace/examples/data/water_tank_FI/output directory.

      You can also view run logs in the /workspace/examples/digital_twins/water_tank_FI.

      "},{"location":"user/examples/water_tank_FI/index.html#terminate-phase","title":"Terminate phase","text":"

      Clean up the temporary files and delete output plot

      lifecycle/terminate\n
      "},{"location":"user/examples/water_tank_FI/index.html#references","title":"References","text":"

      More details on this case-study can be found in the paper:

      M. Frasheri, C. Thule, H. D. Macedo, K. Lausdahl, P. G. Larsen and\nL. Esterle, \"Fault Injecting Co-simulations for Safety,\"\n2021 5th International Conference on System Reliability and Safety (ICSRS),\nPalermo, Italy, 2021.\n

      The fault-injection plugin is an extension to the Maestro co-orchestration engine that enables injecting inputs and outputs of FMUs in an FMI-based co-simulation with tampered values. More details on the plugin can be found in fault injection git repository. The source code for this example is also in the same github repository in a example directory.

      "},{"location":"user/examples/water_tank_FI_monitor/index.html","title":"Water Tank Fault Injection with NuRV Runtime Monitor","text":""},{"location":"user/examples/water_tank_FI_monitor/index.html#overview","title":"Overview","text":"

      This example shows a fault injection (FI) enabled digital twin (DT). A live DT is subjected to simulated faults received from the environment. The simulated faults is specified as part of DT configuration and can be changed for new instances of DTs. This version of the example is expanded with a monitor generated by NuRV. More information about NuRV is available here.

      In this co-simulation based DT, a watertank case-study is used; co-simulation consists of a tank and controller. The goal of which is to keep the level of water in the tank between Level-1 and Level-2. The faults are injected into output of the water tank controller (Watertankcontroller-c.fmu) from 12 to 20 time units, such that the tank output is closed for a period of time, leading to the water level increasing in the tank beyond the desired level (Level-2). Additionally, a monitor is inserted in the simulation to check at runtime whether the level of the water stays below a maximum threshold.

      "},{"location":"user/examples/water_tank_FI_monitor/index.html#example-diagram","title":"Example Diagram","text":""},{"location":"user/examples/water_tank_FI_monitor/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/water_tank_FI_monitor/index.html#digital-twin-configuration","title":"Digital Twin Configuration","text":"

      This example uses two models and one tool. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Models watertankcontroller-c.fmu Private Yes singlewatertank-20sim.fmu Private Yes m1.fmu Private No RtI.fmu Private Yes Specification m1.smv Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

      The multimodelFI.json and simulation-config.json are two DT configuration files used for executing the digital twin. You can change these two files to customize the DT to your needs.

      The faults are defined in wt_fault.xml.

      "},{"location":"user/examples/water_tank_FI_monitor/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro toolGenerates and compiles the monitor FMU Execute Produces and stores output in data/water_tank_FI_monitor/output directory Clean Clears run logs and outputs"},{"location":"user/examples/water_tank_FI_monitor/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/water_tank_FI_monitor\n

      If required, change the execute permission of lifecycle scripts you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/water_tank_FI_monitor/index.html#create","title":"Create","text":"

      Installs Open Java Development Kit 17 and pip dependencies. The pandas and matplotlib are the pip dependencies installated. The monitor FMU from the NuRV specification is generated and compiled.

      lifecycle/create\n
      "},{"location":"user/examples/water_tank_FI_monitor/index.html#execute","title":"Execute","text":"

      Run the co-simulation. Generates the co-simulation output.csv file at /workspace/examples/data/water_tank_FI_monitor/output.

      lifecycle/execute\n
      "},{"location":"user/examples/water_tank_FI_monitor/index.html#analyze-phase","title":"Analyze phase","text":"

      Process the output of co-simulation to produce a plot at: /workspace/examples/data/water_tank_FI_monitor/output/plots/.

      lifecycle/analyze\n

      A sample plot is given here.

      In the plot, four color-coded indicators are used to represent different values. The blue line shows the water tank level, while orange represents the control output and green indicates the monitor's verdict. A red dashed line serves as a reference point, marking the level checked by the monitor. As the water level exceeds this threshold, the monitor's verdict changes from unknown (0) to false (2).

      "},{"location":"user/examples/water_tank_FI_monitor/index.html#examine-the-results","title":"Examine the results","text":"

      The results can be found in the /workspace/examples/data/water_tank_FI_monitor/output directory.

      You can also view run logs in the /workspace/examples/digital_twins/water_tank_FI_monitor.

      "},{"location":"user/examples/water_tank_FI_monitor/index.html#terminate-phase","title":"Terminate phase","text":"

      Clean up the temporary files and delete output plot

      lifecycle/terminate\n
      "},{"location":"user/examples/water_tank_FI_monitor/index.html#references","title":"References","text":"

      More details on this case-study can be found in the paper:

      M. Frasheri, C. Thule, H. D. Macedo, K. Lausdahl, P. G. Larsen and\nL. Esterle, \"Fault Injecting Co-simulations for Safety,\"\n2021 5th International Conference on System Reliability and Safety (ICSRS),\nPalermo, Italy, 2021.\n

      The fault-injection plugin is an extension to the Maestro co-orchestration engine that enables injecting inputs and outputs of FMUs in an FMI-based co-simulation with tampered values. More details on the plugin can be found in fault injection git repository. The source code for this example is also in the same github repository in a example directory.

      "},{"location":"user/examples/water_tank_swap/index.html","title":"Water Tank Model Swap","text":""},{"location":"user/examples/water_tank_swap/index.html#overview","title":"Overview","text":"

      This example shows multi-stage execution and dynamic reconfiguration of a digital twin (DT). Two features of DTs are demonstrated here:

      • Fault injection into live DT
      • Dynamic auto-reconfiguration of live DT

      The co-simulation methodology is used to construct this DT.

      "},{"location":"user/examples/water_tank_swap/index.html#example-structure","title":"Example Structure","text":""},{"location":"user/examples/water_tank_swap/index.html#configuration-of-assets","title":"Configuration of assets","text":"

      This example uses four models and one tool. The specific assets used are:

      Asset Type Names of Assets Visibility Reuse in Other Examples Models Watertankcontroller-c.fmu Private Yes Singlewatertank-20sim.fmu Private Yes Leak_detector.fmu Private No Leak_controller.fmu Private No Tool maestro-2.3.0-jar-with-dependencies.jar Common Yes

      This DT has many configuration files. The DT is executed in two stages. There exist separate DT configuration files for each stage. The following table shows the configuration files and their purpose.

      Configuration file name Execution Stage Purpose mm1. json stage-1 DT configuration wt_fault.xml, FaultInject.mabl stage-1 faults injected into DT during stage-1 mm2.json stage-2 DT configuration simulation-config.json Both stages Configuration for specifying DT execution time and output logs"},{"location":"user/examples/water_tank_swap/index.html#lifecycle-phases","title":"Lifecycle Phases","text":"Lifecycle Phase Completed Tasks Create Installs Java Development Kit for Maestro tool Execute Produces and stores output in data/water_tank_swap/output directory Analyze Process the co-simulation output and produce plots Clean Clears run logs, outputs and plots"},{"location":"user/examples/water_tank_swap/index.html#run-the-example","title":"Run the example","text":"

      To run the example, change your present directory.

      cd /workspace/examples/digital_twins/water_tank_swap\n

      If required, change the permission of files you need to execute, for example:

      chmod +x lifecycle/create\n

      Now, run the following scripts:

      "},{"location":"user/examples/water_tank_swap/index.html#create","title":"Create","text":"

      Installs Open Java Development Kit 17 and pip dependencies. The matplotlib pip package is also installated.

      lifecycle/create\n
      "},{"location":"user/examples/water_tank_swap/index.html#execute","title":"Execute","text":"

      This DT has two-stage execution. In the first-stage, a co-simulation is executed. The Watertankcontroller-c.fmu and Singlewatertank-20sim.fmu models are used to execute the DT. During this stage, faults are injected into one of the models (Watertankcontroller-c.fmu) and the system performance is checked.

      In the second-stage, another co-simulation is run in which three FMUs are used. The FMUs used are: watertankcontroller, singlewatertank-20sim, and leak_detector. There is an in-built monitor in the Maestro tool. This monitor is enabled during the stage and a swap condition is set at the beginning of the second-stage. When the swap condition is satisfied, the Maestro swaps out Watertankcontroller-c.fmu model and swaps in Leakcontroller.fmu model. This swapping of FMU models demonstrates the dynamic reconfiguration of a DT.

      The end of execution phase generates the co-simulation output.csv file at /workspace/examples/data/water_tank_swap/output.

      lifecycle/execute\n
      "},{"location":"user/examples/water_tank_swap/index.html#analyze-phase","title":"Analyze phase","text":"

      Process the output of co-simulation to produce a plot at: /workspace/examples/data/water_tank_FI/output/plots/.

      lifecycle/analyze\n
      "},{"location":"user/examples/water_tank_swap/index.html#examine-the-results","title":"Examine the results","text":"

      The results can be found in the workspace/examples/data/water_tank_swap/output directory.

      You can also view run logs in the workspace/examples/digital_twins/water_tank_swap.

      "},{"location":"user/examples/water_tank_swap/index.html#terminate-phase","title":"Terminate phase","text":"

      Clean up the temporary files and delete output plot

      lifecycle/terminate\n
      "},{"location":"user/examples/water_tank_swap/index.html#references","title":"References","text":"

      The complete source of this example is available on model swap github repository.

      The runtime model (FMU) swap mechanism demonstrated by the experiment is detailed in the paper:

      Ejersbo, Henrik, et al. \"fmiSwap: Run-time Swapping of Models for\nCo-simulation and Digital Twins.\" arXiv preprint arXiv:2304.07328 (2023).\n

      The runtime reconfiguration of co-simulation by modifying the Functional Mockup Units (FMUs) used is further detailed in the paper:

      Ejersbo, Henrik, et al. \"Dynamic Runtime Integration of\nNew Models in Digital Twins.\" 2023 IEEE/ACM 18th Symposium on\nSoftware Engineering for Adaptive and Self-Managing Systems\n(SEAMS). IEEE, 2023.\n
      "},{"location":"user/servers/execution/runner/index.html","title":"Runner","text":"

      A utility service to manage safe execution of remote scripts / commands. User launches this from commandline and let the utility manage the commands to be executed.

      The runner utility runs as a service and provides REST API interface to safely execute remote commands. Multiple runners can be active simultaneously on one computer. The commands are sent via the REST API and are executed on the computer with active runner.

      "},{"location":"user/servers/execution/runner/index.html#install","title":"Install","text":""},{"location":"user/servers/execution/runner/index.html#npm-registry","title":"NPM Registry","text":"

      The package is available on npmjs.

      Install the package with the following command:

      sudo npm install -g @into-cps-association/runner\n
      "},{"location":"user/servers/execution/runner/index.html#github-registry","title":"Github Registry","text":"

      The package is available in Github packages registry.

      Set the registry and install the package with the following commands

      sudo npm config set @into-cps-association:registry https://npm.pkg.github.com\nsudo npm install -g @into-cps-association/runner\n

      The npm install command asks for username and password. The username is your Github username and the password is your Github personal access token. In order for the npm to download the package, your personal access token needs to have read:packages scope.

      "},{"location":"user/servers/execution/runner/index.html#configure","title":"Configure","text":"

      The utility requires config specified in YAML format. The template configuration file is:

      port: 5000\nlocation: 'script' #directory location of scripts\ncommands: #list of permitted scripts\n  - create\n  - execute\n  - terminate\n

      It is suggested that the configuration file be named as runner.yaml and placed in the directory in which the runner microservice is run.

      The location refers to the relative location of the scripts directory with respect to the location of runner.yaml file.

      However, there is no limitation on either the configuration filename or the location. The path to runner.yaml can either be relative or absolute path. However, the location path is always relative path with respect to the path of runner.yaml file.

      The commands must be executable. Please make sure that the commands have execute permission on Linux platforms.

      "},{"location":"user/servers/execution/runner/index.html#create-commands","title":"Create Commands","text":"

      The runner requires commands / scripts to be run. These need to be placed in the location specified in runner.yaml file. The location must be relative to the directory in which the runner microservice is being run.

      "},{"location":"user/servers/execution/runner/index.html#use","title":"Use","text":"

      Display help.

      $runner -h\nUsage: runner [options]\n\nRemote code execution for humans\n\nOptions:\n  -v --version          package version\n  -c --config <string>  runner config file specified in yaml format (default: \"runner.yaml\")\n  -h --help             display help\n

      The config option is not mandatory. If it is not used, runner looks for runner.yaml in the directory from which it is being run. Once launched, the utility runs at the port specified in runner.yaml file.

      runner  #use runner.yaml of the present working directory\nrunner -c FILE-PATH       #absolute or relative path to config file\nrunner --config FILE-PATH #absolute or relative path to config file\n

      If launched on one computer, you can access the same at http://localhost:<port>.

      Access to the service on network is available at http://<ip or hostname>:<port>/.

      "},{"location":"user/servers/execution/runner/index.html#application-programming-interface-api","title":"Application Programming Interface (API)","text":"

      Three REST API methods are active. The route paths and the responses given for these two sources are:

      REST API Route HTTP Method Return Value Comment localhost:port POST Returns the execution status of command Executes the command provided. Each invocation appends to array of commands executed so far. localhost:port GET Returns the execution status of the last command sent via POST request. localhost:port/history GET Returns the array of POST requests received so far."},{"location":"user/servers/execution/runner/index.html#post-request-to","title":"POST Request to /","text":"

      Executes a command. The command name given here must exist in location directory.

      Valid HTTP RequestHTTP Response - Valid CommandHTTP Response - Inalid Command
      POST / HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 388\n\n{\n  \"name\": \"<command-name>\"\n}\n
      Connection: close\nContent-Length: 134\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"status\": \"success\"\n}\n
      Connection: close\nContent-Length: 28\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"status\": \"invalid command\"\n}\n
      "},{"location":"user/servers/execution/runner/index.html#get-request-to","title":"GET Request to /","text":"

      Shows the status of the command last executed.

      Valid HTTP RequestHTTP Response - Valid CommandHTTP Response - Inalid Command
      GET / HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 388\n\n{\n  \"name\": \"<command-name>\"\n}\n
      Connection: close\nContent-Length: 134\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"name\": \"<command-name>\",\n  \"status\": \"valid\",\n  \"logs\": {\n    \"stdout\": \"<output log of command>\",\n    \"stderr\": \"<error log of command>\"\n  }\n}\n
      Connection: close\nContent-Length: 70\nContent-Type: application/json; charset=utf-8\nDate: Tue, 09 Apr 2024 08:51:11 GMT\nEtag: W/\"86-ja15r8P5HJu72JcROfBTV4sAn2I\"\nX-Powered-By: Express\n\n{\n  \"name\": \"<command-name\",\n  \"status\": \"invalid\",\n  \"logs\": {\n    \"stdout\": \"\",\n    \"stderr\": \"\"\n  }\n}\n
      "},{"location":"user/servers/execution/runner/index.html#get-request-to-history","title":"GET Request to /history","text":"

      Returns the array of POST requests received so far. Both valid and invalid commands are recorded in the history.

      [\n  {\n    \"name\": \"valid command\"\n  },\n  {\n    \"name\": \"valid command\"\n  },\n  {\n    \"name\": \"invalid command\"\n  }\n]\n
      "},{"location":"user/servers/lib/LIB-MS.html","title":"Library Microservice","text":"

      The lib microservice is responsible for handling and serving the contents of library assets of the DTaaS platform. It provides API endpoints for clients to query, and fetch these assets.

      This document provides instructions for using the library microservice.

      Please see assets for a suggested storage conventions of your library assets.

      Once the assets are stored in the library, they become available in user workspace.

      "},{"location":"user/servers/lib/LIB-MS.html#application-programming-interface-api","title":"Application Programming Interface (API)","text":"

      The lib microservice application provides services at two end points:

      GraphQL API Endpoint: http://foo.com/lib

      HTTP Endpoint: http://foo.com/lib/files

      "},{"location":"user/servers/lib/LIB-MS.html#http-protocol","title":"HTTP protocol","text":"

      Endpoint: localhost:PORT/lib/files

      This option needs to be enabled with -H http.json flag. The regular file upload and download options become available.

      Here are sample screenshots.

      "},{"location":"user/servers/lib/LIB-MS.html#graphql-protocol","title":"GraphQL protocol","text":"

      Endpoint: localhost:PORT/lib

      The http://foo.com/lib URL opens a graphql playground.

      You can check the query schema and try sample queries here. The graphql queries need to be sent as HTTP POST requests and get responses.

      The library microservice services two API calls:

      • Provide a list of contents for a directory
      • Fetch a file from the available files

      The API calls are accepted over GraphQL and HTTP API end points. The format of the accepted queries are:

      "},{"location":"user/servers/lib/LIB-MS.html#provide-list-of-contents-for-a-directory","title":"Provide list of contents for a directory","text":"

      To retrieve a list of files in a directory, use the following GraphQL query.

      Replace path with the desired directory path.

      send requests to: https://foo.com/lib

      "},{"location":"user/servers/lib/LIB-MS.html#graphql-query-for-list-of-contents","title":"GraphQL query for list of contents","text":"
      query {\n  listDirectory(path: \"user1\") {\n    repository {\n      tree {\n        blobs {\n          edges {\n            node {\n              name\n              type\n            }\n          }\n        }\n        trees {\n          edges {\n            node {\n              name\n              type\n            }\n          }\n        }\n      }\n    }\n  }\n}\n
      "},{"location":"user/servers/lib/LIB-MS.html#graphql-response-for-list-of-contents","title":"GraphQL response for list of contents","text":"
      {\n  \"data\": {\n    \"listDirectory\": {\n      \"repository\": {\n        \"tree\": {\n          \"blobs\": {\n            \"edges\": []\n          },\n          \"trees\": {\n            \"edges\": [\n              {\n                \"node\": {\n                  \"name\": \"common\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"data\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"digital twins\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"functions\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"models\",\n                  \"type\": \"tree\"\n                }\n              },\n              {\n                \"node\": {\n                  \"name\": \"tools\",\n                  \"type\": \"tree\"\n                }\n              }\n            ]\n          }\n        }\n      }\n    }\n  }\n}\n
      "},{"location":"user/servers/lib/LIB-MS.html#http-request-for-list-of-contents","title":"HTTP request for list of contents","text":"
      POST /lib HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 388\n\n{\n  \"query\":\"query {\\n  listDirectory(path: \\\"user1\\\") {\\n    repository {\\n      tree {\\n        blobs {\\n          edges {\\n            node {\\n              name\\n              type\\n            }\\n          }\\n        }\\n        trees {\\n          edges {\\n            node {\\n              name\\n              type\\n            }\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\"\n}\n
      "},{"location":"user/servers/lib/LIB-MS.html#http-response-for-list-of-contents","title":"HTTP response for list of contents","text":"
      HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: *\nConnection: close\nContent-Length: 306\nContent-Type: application/json; charset=utf-8\nDate: Tue, 26 Sep 2023 20:26:49 GMT\nX-Powered-By: Express\n{\"data\":{\"listDirectory\":{\"repository\":{\"tree\":{\"blobs\":{\"edges\":[]},\"trees\":{\"edges\":[{\"node\":{\"name\":\"data\",\"type\":\"tree\"}},{\"node\":{\"name\":\"digital twins\",\"type\":\"tree\"}},{\"node\":{\"name\":\"functions\",\"type\":\"tree\"}},{\"node\":{\"name\":\"models\",\"type\":\"tree\"}},{\"node\":{\"name\":\"tools\",\"type\":\"tree\"}}]}}}}}}\n
      "},{"location":"user/servers/lib/LIB-MS.html#fetch-a-file-from-the-available-files","title":"Fetch a file from the available files","text":"

      This query receives directory path and send the file contents to user in response.

      To check this query, create a file files/user2/data/welcome.txt with content of hello world.

      "},{"location":"user/servers/lib/LIB-MS.html#graphql-query-for-fetch-a-file","title":"GraphQL query for fetch a file","text":"
      query {\n  readFile(path: \"user2/data/sample.txt\") {\n    repository {\n      blobs {\n        nodes {\n          name\n          rawBlob\n          rawTextBlob\n        }\n      }\n    }\n  }\n}\n
      "},{"location":"user/servers/lib/LIB-MS.html#graphql-response-for-fetch-a-file","title":"GraphQL response for fetch a file","text":"
      {\n  \"data\": {\n    \"readFile\": {\n      \"repository\": {\n        \"blobs\": {\n          \"nodes\": [\n            {\n              \"name\": \"sample.txt\",\n              \"rawBlob\": \"hello world\",\n              \"rawTextBlob\": \"hello world\"\n            }\n          ]\n        }\n      }\n    }\n  }\n}\n
      "},{"location":"user/servers/lib/LIB-MS.html#http-request-for-fetch-a-file","title":"HTTP request for fetch a file","text":"
      POST /lib HTTP/1.1\nHost: foo.com\nContent-Type: application/json\nContent-Length: 217\n{\n  \"query\":\"query {\\n  readFile(path: \\\"user2/data/welcome.txt\\\") {\\n    repository {\\n      blobs {\\n        nodes {\\n          name\\n          rawBlob\\n          rawTextBlob\\n        }\\n      }\\n    }\\n  }\\n}\"\n}\n
      "},{"location":"user/servers/lib/LIB-MS.html#http-response-for-fetch-a-file","title":"HTTP response for fetch a file","text":"
      HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: *\nConnection: close\nContent-Length: 134\nContent-Type: application/json; charset=utf-8\nDate: Wed, 27 Sep 2023 09:17:18 GMT\nX-Powered-By: Express\n{\"data\":{\"readFile\":{\"repository\":{\"blobs\":{\"nodes\":[{\"name\":\"welcome.txt\",\"rawBlob\":\"hello world\",\"rawTextBlob\":\"hello world\"}]}}}}}\n

      The path refers to the file path to look at: For example, user1 looks at files of user1; user1/functions looks at contents of functions/ directory.

      "},{"location":"user/servers/lib/assets.html","title":"Reusable Assets","text":"

      The reusability of digital twin assets makes it easy for users to work with the digital twins. The reusability of assets is a fundamental feature of the platform.

      "},{"location":"user/servers/lib/assets.html#kinds-of-reusable-assets","title":"Kinds of Reusable Assets","text":"

      The DTaaS software categorizes all the reusable library assets into six categories:

      "},{"location":"user/servers/lib/assets.html#data","title":"Data","text":"

      The data sources and sinks available to a digital twins. Typical examples of data sources are sensor measurements from Physical Twins, and test data provided by manufacturers for calibration of models. Typical examples of data sinks are visualization software, external users and data storage services. There exist special outputs such as events, and commands which are akin to control outputs from a Digital Twin. These control outputs usually go to Physical Twins, but they can also go to another Digital Twin.

      "},{"location":"user/servers/lib/assets.html#models","title":"Models","text":"

      The model assets are used to describe different aspects of Physical Twins and their environment, at different levels of abstraction. Therefore, it is possible to have multiple models for the same Physical Twin. For example, a flexible robot used in a car production plant may have structural model(s) which will be useful in tracking the wear and tear of parts. The same robot can have a behavioural model(s) describing the safety guarantees provided by the robot manufacturer. The same robot can also have a functional model(s) describing the part manufacturing capabilities of the robot.

      "},{"location":"user/servers/lib/assets.html#tools","title":"Tools","text":"

      The software tool assets are software used to create, evaluate and analyze models. These tools are executed on top of a computing platforms, i.e., an operating system, or virtual machines like Java virtual machine, or inside docker containers. The tools tend to be platform specific, making them less reusable than models. A tool can be packaged to run on a local or distributed virtual machine environments thus allowing selection of most suitable execution environment for a Digital Twin. Most models require tools to evaluate them in the context of data inputs. There exist cases where executable packages are run as binaries in a computing environment. Each of these packages are a pre-packaged combination of models and tools put together to create a ready to use Digital Twins.

      "},{"location":"user/servers/lib/assets.html#functions","title":"Functions","text":"

      The functions responsible for pre- and post-processing of: data inputs, data outputs, control outputs. The data science libraries and functions can be used to create useful function assets for the platform. In some cases, Digital Twin models require calibration prior to their use; functions written by domain experts along with right data inputs can make model calibration an achievable goal. Another use of functions is to process the sensor and actuator data of both Physical Twins and Digital Twins.

      "},{"location":"user/servers/lib/assets.html#digital-twins","title":"Digital Twins","text":"

      These are ready to use digital twins created by one or more users. These digital twins can be reconfigured later for specific use cases.

      "},{"location":"user/servers/lib/assets.html#file-system-structure","title":"File System Structure","text":"

      Each user has their assets put into five different directories named above. In addition, there will also be common library assets that all users have access to. A simplified example of the structure is as follows:

      workspace/\n  data/\n    data1/ (ex: sensor)\n      filename (ex: sensor.csv)\n      README.md\n    data2/ (ex: turbine)\n      README.md (remote source; no local file)\n    ...\n  digital_twins/\n    digital_twin-1/ (ex: incubator)\n      config (yaml and json)\n      README.md (usage instructions)\n      description.md (short summary of digital twin)\n      lifecycle/ (directory containing lifecycle scripts)\n    digital_twin-2/ (ex: mass spring damper)\n      config (yaml and json)\n      README.md (usage instructions)\n      description.md (short summary of digital twin)\n      lifecycle/ (directory containing lifecycle scripts)\n    digital_twin-3/ (ex: model swap)\n      config (yaml and json)\n      README.md (usage instructions)\n      description.md (short summary of digital twin)\n      lifecycle/ (directory containing lifecycle scripts)\n    ...\n  functions/\n    function1/ (ex: graphs)\n      filename (ex: graphs.py)\n      README.md\n    function2/ (ex: statistics)\n      filename (ex: statistics.py)\n      README.md\n    ...\n  models/\n    model1/ (ex: spring)\n      filename (ex: spring.fmu)\n      README.md\n    model2/ (ex: building)\n      filename (ex: building.skp)\n      README.md\n    model3/ (ex: rabbitmq)\n      filename (ex: rabbitmq.fmu)\n      README.md\n    ...\n  tools/\n    tool1/ (ex: maestro)\n      filename (ex: maestro.jar)\n      README.md\n    ...\n  common/\n    data/\n    functions/\n    models/\n    tools/\n

      Tip

      The DTaaS is agnostic to the format of your assets. The only requirement is that they are files which can be uploaded on the Library page. Any directories can be compressed as one file and uploaded. You can decompress the file into a directory from a Terminal or xfce Desktop available on the Workbench page.

      A recommended file system structure for storing assets is also available in DTaaS examples.

      "},{"location":"user/servers/lib/assets.html#upload-assets","title":"Upload Assets","text":"

      Users can upload assets into their workspace using Library page of the website.

      You can go into a directory and click on the upload button to upload a file or a directory into your workspace. This asset is then available in all the workbench tools you can use. You can also create new assets on the page by clicking on new drop down menu. This is a simple web interface which allows you to create text-based files. You need to upload other files using upload button.

      The user workbench has the following services:

      • Jupyter Notebook and Lab
      • VS Code
      • XFCE Desktop Environment available via VNC
      • Terminal

      Users can also bring their DT assets into user workspaces from outside using any of the above mentioned services. The developers using git repositories can clone from and push to remote git servers. Users can also use widely used file transfer protocols such as FTP, and SCP to bring the required DT assets into their workspaces.

      "},{"location":"user/website/index.html","title":"DTaaS Website Screenshots","text":"

      This page contains a screenshot driven preview of the website serving the DTaaS software platform.

      "},{"location":"user/website/index.html#visit-the-dtaas-application","title":"Visit the DTaaS Application","text":"

      Start off by simply visiting the website of the DTaaS instance for which you are a user.

      "},{"location":"user/website/index.html#redirected-to-authorization-provider","title":"Redirected to Authorization Provider","text":"

      You will be redirected to the Gitlab Authorization for DTaaS.

      Enter your email/username and password. If the email ID registered with DTaaS, is the same as your Google Login email ID, you can also opt to sign in using Google.

      You will be redirected to the OAuth Application page.

      "},{"location":"user/website/index.html#permit-dtaas-server-to-use-gitlab","title":"Permit DTaaS Server to Use Gitlab","text":"

      Click on Authorize to allow the OAuth application to access the information connected to your Gitlab account. This is a necessary step.

      You are now logged into the DTaaS server. You will be redirected to the login page of the DTaaS website.

      The DTaaS website uses an additional layer of security - the third-party authorization protocol known as OAuth. This protocol provides secure access to a DTaaS installation if users have a working active accounts at the selected OAuth service provider. This also uses Gitlab as OAuth provider.

      You can see the Gitlab signin button. A click on this button takes you to Gitlab instance providing authorization for DTaaS. You will not need to sign in to Gitlab again, unless you have explicitly logged out of your Gitlab account.

      "},{"location":"user/website/index.html#permit-dtaas-website-to-use-gitlab","title":"Permit DTaaS Website to Use Gitlab","text":"

      The DTaaS website needs your permission to use your Gitlab account for authorization. Click on Authorize button.

      After successful authorization, you will be redirected to the Library page of the DTaaS website.

      There are two icons on the top-right of the webpage. The hyperlink on question mark icon redirects to help page while the hyperlink on github icon redirects to github code repository.

      "},{"location":"user/website/index.html#overview-of-menu-items","title":"Overview of menu items","text":"

      The menu is hidden by default. Only the icons of menu items are visible. You can click on the icon in the top-left corner of the page to see the menu.

      There are three menu items:

      Library: for management of reusable library assets. You can upload, download, create and modify new files on this page.

      Digital Twins: for management of digital twins. You are presented with the Jupyter Lab page from which you can run the digital twins.

      Workbench: Not all digital twins can be managed within Jupyter Lab. You have more tools at your disposal on this page.

      "},{"location":"user/website/index.html#library-tabs-and-their-help-text","title":"Library tabs and their help text","text":"

      You can see five tabs each corresponding to one type of digital twin assets. Each tab provides help text to guide users on the type of an asset.

      Functions

      The functions responsible for pre- and post-processing of: data inputs, data outputs, control outputs. The data science libraries and functions can be used to create useful function assets for the platform. In some cases, Digital Twin models require calibration prior to their use; functions written by domain experts along with right data inputs can make model calibration an achievable goal. Another use of functions is to process the sensor and actuator data of both Physical Twins and Digital Twins.

      Data

      The data sources and sinks available to a digital twins. Typical examples of data sources are sensor measurements from Physical Twins, and test data provided by manufacturers for calibration of models. Typical examples of data sinks are visualization software, external users and data storage services. There exist special outputs such as events, and commands which are akin to control outputs from a Digital Twin. These control outputs usually go to Physical Twins, but they can also go to another Digital Twin.

      Models

      The model assets are used to describe different aspects of Physical Twins and their environment, at different levels of abstraction. Therefore, it is possible to have multiple models for the same Physical Twin. For example, a flexible robot used in a car production plant may have structural model(s) which will be useful in tracking the wear and tear of parts. The same robot can have a behavioural model(s) describing the safety guarantees provided by the robot manufacturer. The same robot can also have a functional model(s) describing the part manufacturing capabilities of the robot.

      Tools

      The software tool assets are software used to create, evaluate and analyze models. These tools are executed on top of a computing platforms, i.e., an operating system, or virtual machines like Java virtual machine, or inside docker containers. The tools tend to be platform specific, making them less reusable than models. A tool can be packaged to run on a local or distributed virtual machine environments thus allowing selection of most suitable execution environment for a Digital Twin. Most models require tools to evaluate them in the context of data inputs. There exist cases where executable packages are run as binaries in a computing environment. Each of these packages are a pre-packaged combination of models and tools put together to create a ready to use Digital Twins.

      Digital Twins

      These are ready to use digital twins created by one or more users. These digital twins can be reconfigured later for specific use cases.

      There are two sub-tabs, namely private and common. The library assets in private category are visible only to the logged in user while the library assets in common category are available to all the users.

      Further explanation on the placement of reusable assets within each type and the underlying directory structure on the server is in the assets page

      Note

      You can upload assets (files) using the upload button.

      The file manager is based on Jupyter notebook and all the tasks you can perform in the Jupyter Notebook can be undertaken here.

      "},{"location":"user/website/index.html#digital-twins-page","title":"Digital Twins page","text":"

      The digital twins page has three tabs and the central pane opens Jupyter lab. There are three tabs with helpful instructions on the suggested tasks you can undertake in the Create - Execute - Analyze life cycle phases of digital twin. You can see more explanation on the life cycle phases of digital twin.

      Create

      Create digital twins from tools provided within user workspaces. Each digital twin will have one directory. It is suggested that user provide one bash shell script to run their digital twin. Users can create the required scripts and other files from tools provided in Workbench page.

      Execute

      Digital twins are executed from within user workspaces. The given bash script gets executed from digital twin directory. Terminal-based digital twins can be executed from VSCode and graphical digital twins can be executed from VNC GUI. The results of execution can be placed in the data directory.

      Analyze

      The analysis of digital twins requires running of digital twin script from user workspace. The execution results placed within data directory are processed by analysis scripts and results are placed back in the data directory. These scripts can either be executed from VSCode and graphical results or can be executed from VNC GUI. The analysis of digital twins requires running of digital twin script from user workspace. The execution results placed within data directory are processed by analysis scripts and results are placed back in the data directory. These scripts can either be executed from VSCode and graphical results or can be executed from VNC GUI.

      The reusable assets (files) seen in the file manager are available in the Jupyter Lab. In addition, there is a git plugin installed in the Jupyter Lab using which you can link your files with the external git repositories.

      "},{"location":"user/website/index.html#workbench","title":"Workbench","text":"

      The workbench page provides links to four integrated tools.

      • Desktop
      • VS Code
      • Jupyter Lab
      • Jupyter Notebook

      The hyperlinks open in new browser tab. The screenshots of pages opened in new browser are:

      Terminal

      The Terminal hyperlink does not exist on workbench page. If you want terminal. Please use the tools dropdown in the Jupyter Notebook.

      "},{"location":"user/website/index.html#digital-twins-preview-page","title":"Digital Twins Preview Page","text":"

      There is a fifth link on the Workbench page. It is Digital Twins Preview Page. It is an experimental feature at the moment. Clicking on the link opens a new page that is similar to the Digital Twins page.

      There are two tabs, namely Manage and Execute.

      Manage

      Read the complete description of digital twins. If necessary, users can delete a digital twin, removing it from the workspace with all its associated data. Users can also reconfigure the digital twin.

      Execute

      Execute the Digital Twins using Gitlab CI/CD workflows.

      "},{"location":"user/website/index.html#finally-logout","title":"Finally logout","text":"

      You have to close the browser in order to completely exit the DTaaS software platform.

      "}]} \ No newline at end of file diff --git a/version0.6/sitemap.xml.gz b/version0.6/sitemap.xml.gz index fb1b3510e4c58a70dc833b4bbf6d29da5ed8dda6..4c66b1f52de6281915029e176412ae6a6d6ae84f 100644 GIT binary patch delta 12 Tcmb=gXOr*d;CT6VB3mT@903HS delta 12 Tcmb=gXOr*d;AmEw$W{pe7S{uG

Service RouterTraefik GatewayTraefik Gateway
Web ApplicationReact WebapplicationReact Webapplication
Reusable AssetsLibrary MicroserviceLibrary Microservice
Digital Twins and DevOps
Digital Twins as ServicesDT RunnerDT Runner
Accounting

NX|tSOiyqm+a0ESu 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𝔫Ha{0)Hk>mq<6ND6gii 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�gkeHcUHDjJ*&4A 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 delta 229370 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ⅇ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≦f6oDk**4n`L`>C#=+Py7(D(8F?zdIA#n%wOZHXX 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