From ec44a7a655b7e7babe989d036337fcaa2d776f5d Mon Sep 17 00:00:00 2001
From: ismaeel <mohammad.ismaael@cnit.it>
Date: Wed, 23 Oct 2024 04:12:36 +0000
Subject: [PATCH] API for configuring openroadm

---
 .context.log.swn                              | Bin 24576 -> 0 bytes
 .context.log.swo                              | Bin 16384 -> 0 bytes
 .context.log.swp                              | Bin 40960 -> 0 bytes
 proto/context.proto                           |   3 +
 src/context/service/database/OpticalConfig.py |  10 +-
 .../OpticalConfig/OpticalConfigModel.py       |  14 +-
 .../models/OpticalConfig/RoadmModel.py        |  12 +-
 src/device/service/Tools.py                   | 132 ++++++++-----
 .../service/drivers/oc_driver/OCDriver.py     |  16 +-
 .../oc_driver/templates/VPN/openroadm.py      | 187 ++++++++++++++++++
 .../templates/descovery_tool/open_roadm.py    |  89 +++++++--
 src/tests/ofc24/r_t.sh                        |   0
 src/webui/service/opticalconfig/routes.py     | 114 ++++++++++-
 .../templates/opticalconfig/details.html      |  32 +++
 test.py                                       | 172 ++++++++++------
 15 files changed, 620 insertions(+), 161 deletions(-)
 delete mode 100644 .context.log.swn
 delete mode 100644 .context.log.swo
 delete mode 100644 .context.log.swp
 create mode 100644 src/device/service/drivers/oc_driver/templates/VPN/openroadm.py
 mode change 100644 => 100755 src/tests/ofc24/r_t.sh

diff --git a/.context.log.swn b/.context.log.swn
deleted file mode 100644
index 438f657217b971861a154b8bd3b81b1b02507337..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 24576
zcmeI3Pj1^r6vo-~KTxMldjUpWs0Bn>A|;#R&Z*<nfGxL{(grXLf+9yY5s_3#%86mP
z-E^5{cfCSy&>o@aHQFO|**8NDMaiNl&jg4Cj00L0XTHbB-wfY36qP~ahy6oYud5RL
zd?rb+AN)6Lf1peEtM{aM7~#F8KhRIP@JhQ$KS9S$+}V!9(WV{vF?to(N5NUSRP+!8
z1OaXW8<M6r8#v6Dm51^dpFib}C;|uqf`A|(2nYg#fFK|U2m*q@`Vff6_oSa8-Fs=u
zAEmGF%)P#wzJEV`{WyK4`_s4LMGz1K1OY)n5D)|e0YN|z5CjAPK|l}?1nwXK%aNqt
zKar$=VZ+b=>HYs-pGwj%uvK9D?Y<<v2ivb3lGK3>_x%U=7e9i4ARq_`0)l`bAP5Ko
zf`A|(2;4yeCu&1&DUFVz>T<JXsG6bbwN9gRD(`pqjtu%`<Oqcqu8r!B6<Y%<LiJsQ
z-y3dZ2Da&h?ga|vemFtWOhC<OwTxD$*4DIwfZrtFcJ3wdjRQA|k?;Cva^TC2I{9Zb
z8_h<&UM~o(wzJTl7x;A#MUi!e%t07DM`3+n+0T*h)O{<C>RtHtDB00J50T{<CuTVD
z&GBR~a-(w;p30DrkL(yZ4;LR#>oni!@wz+xp8WK9-;i;J#^xqTl>CY=?7BUg0Fe;B
z4Q^W_qot~9L0Y<=rImbtoDSI>;a+ToF$SC>m%jqwu@%Dz%D`zHxPENRps&fE^~!u1
zgn%<LWVO-wx^Of!eLG8I(P->hb{vG4Mh}e$Wce@|tw&_A<aBHj77I>PQ){jER(b@}
z^eopmP2&lQlQa7MU}t2XBkxk)eI!5j&s-lZ&J@SdD6lLJMT0f?{{QudlJqBR5_~h5
zKHvWv9`IkohTsE%4cKt|AGnYB5d;JQK|l}?1O$P%N?>LQO4hVmqo!)pmC5V^>6UBS
zEMTK(O`8Qg8pkdy+h7GYbk7XSagZb1=N2q5N0EGTI=jH(j5~8I6Q>}bTvdZ41Dj-E
zPA0BXHRP(^Y+H_P*@}t=y3*DLEv18Wq%^mh!>x96YdBDyYE7=DxthKOi|VmuBM^53
zA3+mcDn_vD<P>%|<c1(S1RAQ2Hq;%(-tMSMTh(nv-);<)!L~E7+fAgaI>LvDFUL44
zB#QhnupF;?{ie9!kS2-whCtf^4CAGVQ<kqP_@!dVl`Qj0E%(NB{b2yjR~0{Skm5SH
z>+#Xf?xE5TLe~#)Z_?yXya5Vvb2HmVV~381_t~S7dqaPX8{E*IxN!uHCs*_x87|y?
z_wkdavUB*|@iP)6=}Xebt<J>rE)~lg=Nn-FTtA9Kaz9{3a9=RN!7Hwx-Y(=jqZbo*
z?7`gw=}2JsL9B!b-+CZNas5ez@&XS~;Aq{W<HMZ;+!Bp~81LzQ`}knb#0i_dgQGtA
zYnnRTnT>|C-LQBZg!I($p9{`g+3(Vh=8K6n!ZFB<P~d;qqR@vufboh%S|mSu+Aq+<
zT~ew)B@xn*xDlkkzU-6K8QJ%r6|<kRD`XGyV)oOqTf+XwUJnl)9T$2<CA0oz6y+Q5
z)T~bvXW<S~piasNxgchzd>Qsct(H#s#e<fpH7<3FOWo#DZ*iz$s`5YwIS+M^^I!)#
z4|kCBfCo7b`NY~7Cwo%hmWm4tj5>9v#U<vh8LOHZYcBPhMJAhw>6&8RSW|Ivai13F
zMRkJ8Vc1Krx8>~D$yn#u7a8kH?AeW#u;(>aRZ0D6@vOgV#+oOeCeAYF6LVv$@q`#$
zFWKnMtwfjGGF7uxc&cVA@KnuK->I6dyeDcX6FksC&O;sKJlH|b!yV*2;6ctqp3zv7
zVdF7YZQYDj%ZxRb`pqJf&7=ZjO~tInO64%@?8Zuhtdp_Mu`e>#mDsZzYl@BUj#XPP
zW6hH<G}dzNJjP0hF&isYXF1-=mZ_Spz*99_eWz-+@}8)nOt2YiCTBC&OwNNHlIP(L
zavty?=ONE%tO+<CV{NUQv9>Z}&82?RShJ~6V63T_)mW(<hMnD5Nsx6i);ab?#<~)F
zc4JMk@fmAty^J+azR+09x$_t+A;xU1RLxf5sX9BuTiG&Iv(<O1W-ITB8p;Hlv1W2M
zW6k6|*dciy?jYv@4{{#zjK-RPV>Z^_F+5{UuhaRD#N2Th_^usc-=J-8_fZqhHgVN_
z-gBOco2b<-@>C+-@AjcWWc^mZN^@$4nVwTKO!S<ZVV-Adwre~u=Q(pYI?t(toc-L3
z#(T+!{^@BKopHIc=w!>4Mdw+rEGlE=%AyKZrd%?oR*<sNT{4$eI4Ub&I4Ub(kd_lJ
zd~lTeHVl5QMT*<<&Qo6~>zsN(dEDINw-r0Dngsdqb*6F`o?QBI;Vn9^ngqE~T`g{U
XYjumxt0qBAeTBHBINcn%(`)H}>|g?r

diff --git a/.context.log.swo b/.context.log.swo
deleted file mode 100644
index 49a59c9ed538de8fd9541463916ab80290aed960..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 16384
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
AJpcdz

diff --git a/.context.log.swp b/.context.log.swp
deleted file mode 100644
index 5d3a8a7bc4f452de1e9db725e83fcbdbfbf83580..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 40960
zcmeHQORQwMSuR3&69OT#pv9slLAn!BzGM5?=lIkHWk?2%m<LSvfJAFl_}D%@S99;J
zrmF5Fqo&CMHfZ)p0Ra+X0}(4&0AYp10x3bP*|Ew7u>is|Jic@4{I2SHOjUK)Om|;=
zTkfhlKKAkd+2{A~|6y1B=U#fHZ%$<oe?Qpkz4n!tYxaieJ@cC%>CNhCb9Lt*?qly<
z?7Xe_E4cCb=4LmWoImfzm$UH2+3ETC&hDb=j)Xu$;875`n$^sF?2Swc-c<AHPd(fJ
z;ZMBrC^e?C34w$_LLecK5J(6l1QG%XfrP+QhQRFZ$9rEwn?KUE`_tX$x2=5sZ}<01
zcm2m!^8csH|73T)T*?2Q?l+ZxWhMVxEA>|^`Tw<2{})#B|8ph(y_Nj`SgHSaSMvY8
z%m2>q`k$=i|67+&xcqsSPxt@pO8!?@^1s>Tf1<no7c2Sy(&ZDbf79jD^ZvQZf3Ca!
zPb>M~zViD<SCHD*Wv7pXKtdoPkPt`+Bm@!y34w$_LLecK5cq$Jfc3rJAA|PW&3X~`
ze_H>4?c=@PuOWR3>AfH5^*)O92OsP8N~EuUf3Nq;NI#DBci-3R{W_9C`o{P6dcT46
zd8EI@g8!G0{_(qez28Q<f%Mnk)$6^8^i3>Ee;?^tq`&=+Uhhjt-}-2;_Z6g{K>8~z
zX1@-F#7(58UB5t!;HRsPZc8o|<C;m)7i!4Mp)v!Vm2dW6diBNEhUEV+4U>1yTsZZ1
zW-B`lr?1_eojH5{^4aCvLpPe9k7v{Vy%SNM4EtixKM_Uu#dM#l`=lFW_nYpMyt^Ri
zPC-RQMp-$1p-)X;VrkJ`iDl?PRJJX0zqf^Ma|qp6cL7Hjodbi>)zz8r8&OzUyNYRF
zd#1I`S(WD{vqA|jlyjN!+n%fsdGZqCM6e(TBIN{i#BYHyp-zSAR>D5!6MC^P=nfH~
zr!2ZPW)R}-=T^iIqI(VTU@Bj7BUz|ygLq|FB?M=MlcM(C*22}B5Lbgts$GcR8s8nm
z@#o#)cs|(Mp6=I^@kRemn2ly#_Q;2sJv*QFZ@<~!^sH=9O0nx%p9{_VH9VV+#%|;%
zXYYhb|JLLxY_8Dc`@Wz*IlipV?hLK>!S|<E&V}i;zB)gDxBuKpoz=e7iZfkn!E~Nw
z%m!aDX9_QKZ;QgKlfh>;H$jy<d+sorGRcn%k}Qf{6?R<g{XmkUFm+`d)6x}8hcd8I
zSb(HV;R<PLtNa#_<e=0$n{Wt7a$vHZ9O|$N^YSr|Bss`MwyU2Gqe+!JQU9PjUS>yq
zJLEu^ofYmu(<8j`Vo>s(9P^NV5(A@mcKjYRJ;Dph2U(sUbL^qQY$r{JfP@N<J9qGb
z-2KKM)<Rjz<6<byQJEY_7DpYqd?57BxA6cBGc_plog^Pa8ZnJ@FZJSC7Z>Bp(+kK1
z_D&d8lkwYOa#~sUcDVGXmv%NieHH(`Fu!o?tx2$cczZOtx*XlTs?N`*Z-vR5eaxPh
z!Oenyc1=>4KQG%hK2WmpuD&^6Tnt}6o6f@J+2x)7__EJW+kZm{&iwTBbW7D+g}9Zf
zZ_eyw*3{fRtN$FHG_y0vS$)uYcYJm^8$R&NLI1*jarA}p1dvRJeaZP}-lrK03Xg&4
ztDn7fv;W5HFAe)m9}J&=zU_+kzv(;f)SX`es0p0Xu>u<^DdjeF7Gme7X1!?LY&>~)
zcr%>0{nvkGJ`i4L$3egA_IV>VJRt)I&x!ES=)#^|jz+_u3bQ%TKl}1$&)r+$;@$q|
zUg&@R^3K_1*bHD(k0L1~)<Zqklxf!gU&h-0&yae**z3_!yZQa6&9(HG5J(6l1QG%X
zfrLOpAR&+tNC+eZ5&{W<$BDp-l~M2^&!8e)EX(K7<!jc}gLOUkPFgGEnTPqa``%b2
z+h5(66J1&1%PMC=atm{h;jAhYEWg1@WrGv2PoCVr59{rvy$C3J^15WV<f%BprEzBh
z>ug=~$Arr}v$yb-<A&+PjqZ*ov!<MEO8Dt4UdWpZt-4}#H-t&NF4{XM;bIIs>H|4#
ziK}U7NO;knPXj9Gte)+&$#O|nN3wd7eUhw@WP~J(CRr=V;u+1Rf@(yYIvY0CxiCpn
ztzvG|Y>1lMzUOV?u?`+9;jtD@Z4*4!!>N6OQws&BHVPhFxzx<~j73AEg;y+^x-ihr
z8;iDzXq6WW<NCs6KQ|9I{XbnIN=Kq}BuYo3bR<egqI4umN1}8jN=Kq}BuYo{btFnh
zqI4umN1}8jN=Kq}BuYo3bVpP}Rr`jJvTt<er|7iX_fDc2w|iaOTq%hg+D@gPYp;{a
zjL0fmGg0aQi$9G0ww8FOGS5pXLjfz{{B?>?SgXSoFn;NfF}#4LF)m70R>3ouxl&|h
zrb}n$b@<jkOpWS(t<?v^ZJ|V-v%INPHw~+DmEnz-m8w0@cvjEri#V*+k;8DVMX;<i
zWe$_Ngh}1i8H0UR+9J<QsH?V)>jj-Fm9jQetg3tsi@5aYN#U4r&XfR7=_=m^ofn}9
zIn2bhfEiuqK&=XyWTrHLPL_FIH+8&;(YP1GuFG0wykuS~I5)_^S?P0(Fl&^_N~<ex
z=S_N$VYf{6Acmdo&9K`$pH_z5@W9AsBbOy6yWoF`sdrOgV(L!-Q$Gf0Qh8SEN=tAz
zgUL#Tg4sOt@b{^d^{Ogl<*p%9=R!Ia@`CZk%Td=En5ULt%{n+ZIMp)G%3VyomQEC^
ztWXE=L&1ubnZUGP6~>gl2p$eV`!n@CbGenenIj4~U6pm?u@(#qnN!^4mCf>1rY_hm
zaSSQE732?+!rKy0xD=k4`mB*;@0}z`y<JVWuDC5AooIXVBueVaSKdi)n5#S(a!`iZ
z%)u2?U`1dGtBvbc58EYm4dz`7owLFSu#yboW+@7Yn~F;z3s)D_oV#5wNj*1M<21_>
z8A>p9Stw?!%rW@;I&Zw=I_zBJxS|5axn^9!KU-sZWQK#sV{xO57T%Oj9l+H0ar~ao
zGbE{lqf7Ss;i{Fk#IkAy%j9Nl+qi-}s6lD(+$5>D1rk$l=8dSSNa~k1Y$K^(9!dRj
z49+BrDi2;-R&fueUWJlXXcTh}3x36|!{wHhTrZ}M=}Lm^jD<o$IV}t}f|R^jph#!%
zUk2HD&Ox`&hYrj;ub{%oH9{G*Ey2{a5-fOaJ%Spv(((|dZj{R*tTXEcLV6@-9IMc-
zQ2I($&7#0}^GsywvSI3nt6y4W_g+lBy)!ZOq*KT2m2~Qe&03fCkF8TbhWe!n(BLZA
z3S40zvU2C3#I=f*MQ&AD)(#x%8Zz}KQ2k=ckXdkb=CRId0tRbVO6?HyCW?SwvLahG
zg0||HR%kv*r;gCM2aTYuK)y*(Z|~g1)Y}qCQcsdP#r7sc>5&Yj$B@)j?W`#gaV)c<
z2@kD2gGE?C2P2^%&Y@^lbNTRkN$Rf7g$V+hD{iqsF%Hw1flj?tnUzq!$jtAQ)V+hL
zHG_#-NvAO%RvPnRT`>=9XW?~Tz=VE)q>hm90E2tQLd~H<bI^vB9z0&xK2wz!qRzv7
z@j#OL>n&41TvBhRfd?e@ZQ7Ui&cxJ{q@E=8`7R0{yrg~%rY@}Uc^+Ws^R053*HFJe
zBLT&WRj!6&SX@V@{sgLDs!-S(^9joXoD{VwOZd^`@Xvw&q|a@YYx0dErVd}l>^SO|
zRwCaZs&7@lv;~r+o+R}osUO*;(FN|Xo07){RoLbSKBxtx?4n?Kkvoe`d{kXF?iUz&
z+ZDsP&`y?63}=nmP=^AJbnvW$*Cn=c3Gk3COmb;#Lg3fuXzR*Q@}gw9tHFi66wGAs
zMiiyu(6rUQFo$@*cohtkUWy6P2>!K(b))cbvdXNL-c~AG)v3>Y(2t;gX?gbso(}I~
z44zGrdRrnf^~BT@Q%_9&NpbN%hB?9*%PS}0!x*6d)>zuGO2Ki+W$-E&F5|L3MEw$E
zk>yG`#(fRjE!VKS8qFCmBsLqubPK1(HTBCwm`Sk}%$iOekt5(wo7nn1XA@uV>Umhs
z-o}zFMaVSObrC}`LPo?084)97QrJ)DW0KhEk=f}n6d!OQtTG7Gkjx~s*$(2FRfssr
z1EjRT5o*!}n_M$(_A$bKilPV_T+h}`#8haU>#_4Ab699p3I@mAHqQ0?hW+fbr|E<2
zv~dqVjx%Aa5#Pj3x5>zDfrsU!;M^1mNpX-Ao<q?&6r2-d1!JgSj1-K4f-z1oh6$!P
z%^1i-!KW#t=LrbuN#5TN9pZY7xh^lcY@GX;H8p~Pl;v<XMA)q;Lm>t96H+!lmU}bo
z#y=5$<4p0!mmj9hCJ0!t8Xo=LO4x#nE{c~l)lh0YjPLi8A^(0zT)R;_&}<MRyJKK?
z3f4@V{Yi}LIR<-D5>fXBqBF720@T$4q39(x{$^f#kFDfgW%Qh%BvE{IkCR$yU1n9q
zl&IjG!r^jhAmPJ1M<FE2S$HHij+T3K_Nr<M)yyl0>I8gUpraPdyAW*2Yb=`9UBDrV
zAMRMv>Y5*LEZHWCZ?!=_4Wf8r>M2;Wjm><jwpBTX&Q(+h^@eQNY$$?=!>R;Rhm#sJ
zH4niRLiv0i@OizM`iHn9&Av>%E=mg%vcnDt5d5|F8Ug(!f_pS}X~9I>#9XcESKwIE
zYMKvn0bf^FZ*weZ@7$!TPL3s{AxgoTo%)=t4Jlaju?K5HDV|GSAnraW7}6?utCgyN
z;9dyq1BE~no?lBz{ljzt$Dvxy{{P>=K8`=%o&Wbtx2NMD;oQHkVgLVsz<GaPM*1zB
z_4hkC<L{@DUcvc(KZCRV{u^id{VLLXIMeTkkbVT``F#@UM{%Ct@8KN3Kg2nH9LeAu
zzo!1be=Pe&u51+99K%-*IH$vDCgbsJScQ5#3H|ZJhe>mk#l4g0TusW|h2lGA5w}<<
z(4$KIu{@MarKIqW?45KytD65v8*QmbCFwU6oU4SI6-Had{f&pQnL)ny=}=n_H>4)f
zlL>5Udc>SEsHsFORj@E-5K#+F7nNBk!N_h(_eO$akGA!1IchI2X*6}R_vzZUqpvL;
z>bQ2)p4lTDdhL{u_BctXTX!80wEX17;f6%l8o`8P1bnq8BEa2nqx=QDv5%;(h<7YY
zy%&{^ans4g%hZ<IiugfvuOS}x&^~NIeDBl3R>wG@K!C+DMj3H9Mszxesk0(B)N6!i
z?5ubvLBBBE#a@ZEQ>l1wTkZXxyK&>j7UJ`LkAGVwe(j;LVFX7cj^K#+#6hyT!C*_V
zb|R8+Ab_GplaO1m^Z5J*>}|vCFuK=<+dey!Z9!bq@jZL7mc<JmA&C&gZjM=mR)jtx
z9dih;SeW3VzSxO0bte^EbZcA1HpG`s(%Q0<^D<*wLp<zZINE}^B4*x-2DZj|Pz%YR
z!bwb*R~LPbz_|6lZS&&$R(V~v7u%2cbx~`{Y#!grr41P3;9S}oIZp1~Cd6O?%bOq5
zkXznDnTFr;md9~$M>n&j4VL44w!958y*f+VAkQ7swu(gW+w~vFXu2Lwa}PV3;A2H{
z@RCeHJ-xgcRb-3{FPFH1wumDUFFDm0x8YtwIF8Qc9l(hviiOkSg6l20FA@)3-dlXm
z6!)Y4!{ALsJ)uf(0HH?{10hWB8PT@Df?%W?7ac`)MwwuNK2;lKqxf3JxoQsW_7{-O
zliae>TQq~76`M@7(I?Ti==9j~j=0#(1Q*pAZzSB->4*c3po=uOWwsMY2L(RNeD#0b
C^hlBb

diff --git a/proto/context.proto b/proto/context.proto
index 03ecd459a..64a015265 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -560,6 +560,9 @@ message Location {
   oneof location {
     string region = 1;
     GPS_Position gps_position = 2;
+    
+    string interface=3;
+    string circuit_pack=4;
   }
 }
 
diff --git a/src/context/service/database/OpticalConfig.py b/src/context/service/database/OpticalConfig.py
index b370375d3..e3248d8bd 100644
--- a/src/context/service/database/OpticalConfig.py
+++ b/src/context/service/database/OpticalConfig.py
@@ -207,7 +207,7 @@ def set_opticalconfig(db_engine : Engine, request : OpticalConfig):
         )
             
         LOGGER.info(f"added OpticalConfig_data {OpticalConfig_data}")
-        LOGGER.info(f"added channels {channels}")
+        LOGGER.info(f"added interfaces {interfaces}")
 
     def callback(session:Session)->bool:
         stmt = insert(OpticalConfigModel).values(OpticalConfig_data)
@@ -260,7 +260,7 @@ def set_opticalconfig(db_engine : Engine, request : OpticalConfig):
                 stmt = stmt.on_conflict_do_update(
                         index_elements=[RoadmTypeModel.roadm_uuid],
                         set_=dict(
-                            circuits=stmt.excluded.circuits
+                            opticalconfig_uuid=stmt.excluded.opticalconfig_uuid
                         )
                     )
                 stmt = stmt.returning(RoadmTypeModel.roadm_uuid)
@@ -298,14 +298,14 @@ def set_opticalconfig(db_engine : Engine, request : OpticalConfig):
                 stmt = stmt.on_conflict_do_update(
                         index_elements=[RoadmTypeModel.roadm_uuid],
                         set_=dict(
-                            interfaces=stmt.excluded.interfaces
+                            opticalconfig_uuid=stmt.excluded.opticalconfig_uuid
                         )
                     )
                 stmt = stmt.returning(RoadmTypeModel.roadm_uuid)
                 roadm_id = session.execute(stmt).fetchone() 
                 
-             if len(interface) >0 :      
-                stmt = insert(ORInterfaceModel).values(interface)
+             if len(interfaces) >0 :      
+                stmt = insert(ORInterfaceModel).values(interfaces)
                 stmt = stmt.on_conflict_do_update(
                         index_elements=[ORInterfaceModel.interface_uuid ],
                         set_=dict(
diff --git a/src/context/service/database/models/OpticalConfig/OpticalConfigModel.py b/src/context/service/database/models/OpticalConfig/OpticalConfigModel.py
index 515a21a85..eafafaa7c 100644
--- a/src/context/service/database/models/OpticalConfig/OpticalConfigModel.py
+++ b/src/context/service/database/models/OpticalConfig/OpticalConfigModel.py
@@ -64,9 +64,17 @@ class OpticalConfigModel(_Base):
             obj['trasponder_uuid']=channels['trasponder_uuid'] if 'trasponder_uuid' in channels else None
             
         if self.type =="optical-roadm" :
-            channels=[roadms.dump() for roadms in self.roadms ][0]
-            obj['channels']=channels['channels'] if 'channels' in channels else None
-            obj['roadm_uuid']=channels['roadm_uuid'] if 'roadm_uuid' in channels else None
+            dev=[roadms.dump() for roadms in self.roadms ][0]
+     
+            obj['channels']=dev['channels'] if 'channels' in dev else None
+            obj['roadm_uuid']=dev['roadm_uuid'] if 'roadm_uuid' in dev else None
+        
+        if self.type =="openroadm" :
+            dev=[roadms.dump() for roadms in self.roadms ][0]
+     
+            obj['interfaces']=dev['interfaces'] if 'interfaces' in dev else None
+            obj['roadm_uuid']=dev['roadm_uuid'] if 'roadm_uuid' in dev else None    
+
                 
                         
             logging.info(f"optical_config_model {obj}")
diff --git a/src/context/service/database/models/OpticalConfig/RoadmModel.py b/src/context/service/database/models/OpticalConfig/RoadmModel.py
index 6d1ec19fa..52e831e73 100644
--- a/src/context/service/database/models/OpticalConfig/RoadmModel.py
+++ b/src/context/service/database/models/OpticalConfig/RoadmModel.py
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 import json , logging
-from sqlalchemy import Column, String, Integer , ForeignKey, Boolean
+from sqlalchemy import Column, String, Integer , ForeignKey, Boolean , Float
 from sqlalchemy.dialects.postgresql import ARRAY
 from sqlalchemy.orm import relationship
 from context.service.database.models._Base import _Base
@@ -27,8 +27,8 @@ class RoadmTypeModel (_Base):
     __tablename__             = 'roadm_type'
     roadm_uuid                = Column(String, primary_key=True)
 
-    channels                  = relationship("ChannelModel")
-    interfaces                   = relationship ("ORInterfaceModel")
+    channels                   = relationship("ChannelModel")
+    interfaces                 = relationship ("ORInterfaceModel")
     
     opticalconfig_uuid        = Column(ForeignKey('optical_config.opticalconfig_uuid',  ondelete='CASCADE' ),index=True ,nullable=False)
     opticalconfig             = relationship('OpticalConfigModel',     back_populates='roadms')
@@ -39,10 +39,12 @@ class RoadmTypeModel (_Base):
         }
     
     def dump (self):
+        i=[interface.dump() for interface in self.interfaces] 
+        logging.info(f"roamd_type_model {i}")
         return {
             "channels"          : [channel.dump() for channel in self.channels],
             "roadm_uuid"        : self.dump_id(),
-            "interfaces"       :[]
+            "interfaces"       :[interface.dump() for interface in self.interfaces] 
         }
 
 class ChannelModel(_Base):
@@ -92,7 +94,7 @@ class ORInterfaceModel (_Base):
     circuit_pack_name    =  Column(String,nullable=True)
     port                 =  Column(String,nullable=True)
     interface_list       =  Column(String ,nullable=True)
-    frequency            =  Column(Integer ,nullable=True)
+    frequency            =  Column(Float ,nullable=True)
     width                =  Column(Integer ,nullable=True)
     
     roadm_uuid           =       Column(ForeignKey('roadm_type.roadm_uuid', ondelete='CASCADE' ),nullable=False)
diff --git a/src/device/service/Tools.py b/src/device/service/Tools.py
index 68a65d1ba..c4d4efb8f 100644
--- a/src/device/service/Tools.py
+++ b/src/device/service/Tools.py
@@ -465,6 +465,7 @@ def get_edit_target(device : Device, is_opticalband : bool) -> str:
 
     if is_opticalband: return 'optical-band'
     if device.device_type == DeviceTypeEnum.OPTICAL_ROADM._value_: return 'media-channel'
+    if device.device_type == DeviceTypeEnum.OPEN_ROADM._value_: return 'network-media-channel'
     return 'optical-channel'
 
 def is_key_existed(key : str, keys_dic = dict, key_name_to_use = None) -> dict:
@@ -481,63 +482,86 @@ def is_key_existed(key : str, keys_dic = dict, key_name_to_use = None) -> dict:
 def extract_resources(config : dict, device : Device) -> list[list[dict],dict]:
     conditions = {}
     resources:list[dict] = []
-    resources.append(is_key_existed('channel_namespace', config))
-    resources.append(is_key_existed('add_transceiver', config))
     is_opticalband = config.get('is_opticalband', False)
-    conditions['is_opticalband'] = is_opticalband
     conditions['edit_type'] = get_edit_target(device, is_opticalband)
-  
-    if 'flow' in config:
-        #for tuple_value in config['flow'][device.name]:
-        source_vals = []
-        dest_vals = []
-        handled_flow=[]
-        for tuple_value in config['flow']:
-            source_port = None 
-            destination_port = None
-            source_port_uuid, destination_port_uuid = tuple_value
-            if source_port_uuid != '0':
-                src_endpoint_obj = get_endpoint_matching(device, source_port_uuid)
-                source_port = src_endpoint_obj.name
-            source_vals.append(source_port)
-            if destination_port_uuid != '0':
-                dst_endpoint_obj = get_endpoint_matching(device, destination_port_uuid)
-                destination_port = dst_endpoint_obj.name
-            dest_vals.append(destination_port)
-            handled_flow.append((source_port,destination_port))
-        resources.append({'resource_key': 'source_port',      'value': source_vals})
-        resources.append({'resource_key': 'destination_port', 'value': dest_vals  })
-        resources.append({'resource_key':'handled_flow','value':handled_flow})
-    if 'new_config' in config:
-        lower_frequency = None
-        upper_frequency = None
-        resources.append(is_key_existed('target-output-power', keys_dic=config['new_config']))
-        resources.append(is_key_existed('frequency',           keys_dic=config['new_config']))
-        resources.append(is_key_existed('operational-mode',    keys_dic=config['new_config']))
-        resources.append(is_key_existed('line-port',           keys_dic=config['new_config']))
-        resources.append(is_key_existed('status',              keys_dic=config['new_config'] , key_name_to_use="admin-state"))
-        resources.append(is_key_existed('band_type', keys_dic=config['new_config'], key_name_to_use='name'))
-        resources.append(is_key_existed('ob_id',     keys_dic=config['new_config'], key_name_to_use='optical-band-parent'))
-        #resources.append(is_key_existed('name',      keys_dic=config['new_config'], key_name_to_use='channel_name'))
-        if not is_opticalband:
+
     
-            if 'frequency' in config['new_config'] and 'band' in config['new_config'] and conditions['edit_type'] == 'media-channel':
-                if config['new_config']['frequency'] is not None and config['new_config']['band'] is not None:
-                    lower_frequency = int(int(config['new_config']['frequency']) - (int(config['new_config']['band'])/2)+1)
-                    upper_frequency = int(int(config['new_config']['frequency']) + (int(config['new_config']['band'])/2))
-            
-           
-                resources.append(is_key_existed('flow_id', keys_dic=config['new_config'], key_name_to_use='index'))
-                #resources.append({'resource_key':'index','value':config['new_config']['flow_id'] if 'flow_id' in config['new_config'] else None})
-        else:
-            
-            lower_frequency = config['new_config']['low-freq'] if 'low-freq' in config['new_config'] else None
-            upper_frequency = config['new_config']['up-freq' ] if 'up-freq'  in config['new_config'] else None
-   
+    if device.device_type == DeviceTypeEnum.OPEN_ROADM._value_ :
+        ports_dic=is_key_existed('ports',keys_dic=config['new_config'])
+        interfaces_list=[]
+        config_type= is_key_existed('config_type', keys_dic=config['new_config'])
+        resources.append(config_type)
+        resources.append(is_key_existed('administrative-state', keys_dic=config['new_config']))
+        resources.append(is_key_existed('frequency', keys_dic=config['new_config']))
+        resources.append(is_key_existed('width', keys_dic=config['new_config']))
+        for port in ports_dic["value"]:
+            circuit_pack_dic=is_key_existed('supporting-circuit-pack-name', keys_dic=port)
+            interface_list=is_key_existed('supporting-interface-list', keys_dic=port)
+            supporting_port=is_key_existed('supporting-port', keys_dic=port)
+            interfaces_list.append([
+            circuit_pack_dic,
+            interface_list,
+            supporting_port])
+
+        resources.append({'resource_key':'interfaces','value':interfaces_list})
+
+    
+    else :
+        resources.append(is_key_existed('channel_namespace', config))
+        resources.append(is_key_existed('add_transceiver', config))
+        
+        conditions['is_opticalband'] = is_opticalband
+        if 'flow' in config:
+            #for tuple_value in config['flow'][device.name]:
+            source_vals = []
+            dest_vals = []
+            handled_flow=[]
+            for tuple_value in config['flow']:
+                source_port = None 
+                destination_port = None
+                source_port_uuid, destination_port_uuid = tuple_value
+                if source_port_uuid != '0':
+                    src_endpoint_obj = get_endpoint_matching(device, source_port_uuid)
+                    source_port = src_endpoint_obj.name
+                source_vals.append(source_port)
+                if destination_port_uuid != '0':
+                    dst_endpoint_obj = get_endpoint_matching(device, destination_port_uuid)
+                    destination_port = dst_endpoint_obj.name
+                dest_vals.append(destination_port)
+                handled_flow.append((source_port,destination_port))
+            resources.append({'resource_key': 'source_port',      'value': source_vals})
+            resources.append({'resource_key': 'destination_port', 'value': dest_vals  })
+            resources.append({'resource_key':'handled_flow','value':handled_flow})
+        if 'new_config' in config:
+            lower_frequency = None
+            upper_frequency = None
+            resources.append(is_key_existed('target-output-power', keys_dic=config['new_config']))
+            resources.append(is_key_existed('frequency',           keys_dic=config['new_config']))
+            resources.append(is_key_existed('operational-mode',    keys_dic=config['new_config']))
+            resources.append(is_key_existed('line-port',           keys_dic=config['new_config']))
+            resources.append(is_key_existed('status',              keys_dic=config['new_config'] , key_name_to_use="admin-state"))
+            resources.append(is_key_existed('band_type', keys_dic=config['new_config'], key_name_to_use='name'))
+            resources.append(is_key_existed('ob_id',     keys_dic=config['new_config'], key_name_to_use='optical-band-parent'))
+            #resources.append(is_key_existed('name',      keys_dic=config['new_config'], key_name_to_use='channel_name'))
+            if not is_opticalband:
+        
+                if 'frequency' in config['new_config'] and 'band' in config['new_config'] and conditions['edit_type'] == 'media-channel':
+                    if config['new_config']['frequency'] is not None and config['new_config']['band'] is not None:
+                        lower_frequency = int(int(config['new_config']['frequency']) - (int(config['new_config']['band'])/2)+1)
+                        upper_frequency = int(int(config['new_config']['frequency']) + (int(config['new_config']['band'])/2))
+                
             
-            resources.append(is_key_existed('ob_id', keys_dic=config['new_config'], key_name_to_use='index'))
-            #resources.append({'resource_key':'index','value':config['new_config']['ob_id'] if 'ob_id' in config['new_config'] else None})
-        resources.append({'resource_key': 'lower-frequency', 'value': lower_frequency})
-        resources.append({'resource_key': 'upper-frequency', 'value': upper_frequency})
+                    resources.append(is_key_existed('flow_id', keys_dic=config['new_config'], key_name_to_use='index'))
+                    #resources.append({'resource_key':'index','value':config['new_config']['flow_id'] if 'flow_id' in config['new_config'] else None})
+            else:
+                
+                lower_frequency = config['new_config']['low-freq'] if 'low-freq' in config['new_config'] else None
+                upper_frequency = config['new_config']['up-freq' ] if 'up-freq'  in config['new_config'] else None
+    
+                
+                resources.append(is_key_existed('ob_id', keys_dic=config['new_config'], key_name_to_use='index'))
+                #resources.append({'resource_key':'index','value':config['new_config']['ob_id'] if 'ob_id' in config['new_config'] else None})
+            resources.append({'resource_key': 'lower-frequency', 'value': lower_frequency})
+            resources.append({'resource_key': 'upper-frequency', 'value': upper_frequency})
 
     return [resources, conditions]
diff --git a/src/device/service/drivers/oc_driver/OCDriver.py b/src/device/service/drivers/oc_driver/OCDriver.py
index 8959178b8..3d0078c85 100644
--- a/src/device/service/drivers/oc_driver/OCDriver.py
+++ b/src/device/service/drivers/oc_driver/OCDriver.py
@@ -41,6 +41,9 @@ from common.proto.context_pb2 import (
 from .templates.descovery_tool.transponders import  transponder_values_extractor
 from .templates.descovery_tool.roadms import roadm_values_extractor ,extract_media_channels
 from .templates.descovery_tool.open_roadm import openroadm_values_extractor
+from .templates.VPN.openroadm import network_media_channel_handler
+
+
 DEBUG_MODE = False
 logging.getLogger('ncclient.manager').setLevel(logging.DEBUG if DEBUG_MODE else logging.WARNING)
 logging.getLogger('ncclient.transport.ssh').setLevel(logging.DEBUG if DEBUG_MODE else logging.WARNING)
@@ -130,7 +133,6 @@ class NetconfSessionHandler:
         self, config, target='running', default_operation=None, test_option=None,
         error_option=None, format='xml'                                             # pylint: disable=redefined-builtin
     ):
-        
 
         response = None
         with self.__lock:
@@ -164,7 +166,8 @@ def edit_config(
 ):
     str_method = 'DeleteConfig' if delete else 'SetConfig'
     results = []
-
+   
+    logging.info(f"commmit per rule {commit_per_rule}")
     str_config_messages=[]
     if str_method == 'SetConfig':
         if (conditions['edit_type']=='optical-channel'):
@@ -172,7 +175,12 @@ def edit_config(
             str_config_messages =  edit_optical_channel(resources)
         elif (conditions['edit_type']=='optical-band'):
             #roadm optical-band
-            str_config_messages = create_optical_band(resources)   
+            str_config_messages = create_optical_band(resources)  
+            
+        elif (conditions['edit_type']=='network-media-channel'):
+            commit_per_rule=True
+            #openroadm network media channel
+            str_config_messages = network_media_channel_handler(resources)       
         else :
             #roadm media-channel
             str_config_messages=create_media_channel_v2(resources)
@@ -196,7 +204,7 @@ def edit_config(
     for str_config_message in str_config_messages:  
             # configuration of the received templates 
             if str_config_message is None: raise UnsupportedResourceKeyException("CONFIG")
-        
+
             result= netconf_handler.edit_config(                                                                               # configure the device
                 config=str_config_message, target=target, default_operation=default_operation,
                 test_option=test_option, error_option=error_option, format=format)
diff --git a/src/device/service/drivers/oc_driver/templates/VPN/openroadm.py b/src/device/service/drivers/oc_driver/templates/VPN/openroadm.py
new file mode 100644
index 000000000..f960c3d63
--- /dev/null
+++ b/src/device/service/drivers/oc_driver/templates/VPN/openroadm.py
@@ -0,0 +1,187 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+
+from yattag import Doc, indent
+import logging
+from .common  import seperate_port_config ,filter_config
+from decimal import Decimal
+
+
+
+create_mc_err= '''
+ <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+<org-openroadm-device xmlns="http://org/openroadm/device">
+  <interface>
+    <name>MC-TTP-DEG2-RX-193.3</name>
+    <description>Media-Channel-TTP-193.3THz-degree-2-in</description>
+    <type>openROADM-if:mediaChannelTrailTerminationPoint</type>
+    <administrative-state>inService</administrative-state>
+    <supporting-circuit-pack-name>DEG2-AMPRX</supporting-circuit-pack-name>
+    <supporting-port>DEG2-AMPRX-IN</supporting-port>
+    <supporting-interface-list>OMS-DEG2-TTP-RX</supporting-interface-list>
+    <mc-ttp xmlns="http://org/openroadm/media-channel-interfaces">
+      <min-freq>193.25</min-freq>
+      <max-freq>193.35</max-freq>
+    </mc-ttp>
+  </interface>
+  <interface>
+    <name>MC-TTP-DEG2-TX-193.3</name>
+    <description>Media-Channel-TTP-193.3THz-degree-2-out</description>
+    <type>openROADM-if:mediaChannelTrailTerminationPoint</type>
+    <administrative-state>inService</administrative-state>
+    <supporting-circuit-pack-name>DEG2-AMPTX</supporting-circuit-pack-name>
+    <supporting-port>DEG2-AMPTX-OUT</supporting-port>
+    <supporting-interface-list>OMS-DEG2-TTP-TX</supporting-interface-list>
+    <mc-ttp xmlns="http://org/openroadm/media-channel-interfaces">
+      <min-freq>193.25</min-freq>
+      <max-freq>193.35</max-freq>
+    </mc-ttp>
+  </interface>
+</org-openroadm-device>
+
+
+</config>
+
+'''
+
+def define_interface_name (type:str,interface_list:str,freq:int)->str:
+    interface_str = interface_list.split('-')
+    port_rank=''
+    port_type=''
+    if (len(interface_str)==4):
+        port_rank=interface_str[1]
+        port_type=interface_str[3]
+    elif (len(interface_str)==5):
+        port_rank=interface_str[2]
+        port_type=interface_str[3]
+    else :
+        port_rank=interface_list
+        port_type=interface_list+'type'    
+            
+            
+    return f'{type.upper()}-{port_rank}-{port_type}-{freq}'    
+        
+    
+       
+def create_media_channel (resources):
+   
+    frequency_dict=next((r for r in resources if r['resource_key']== 'frequency'),None)
+    width_dict=next((r for r in resources if r['resource_key']== 'width'),None)
+    interfaces_lists =next((r for r in resources if r['resource_key']== 'interfaces'),None)
+    administrative_state= next((r for r in resources if r['resource_key']== 'administrative-state'),None)
+    min_freq= int(Decimal(frequency_dict["value"])*1000) - (int(width_dict["value"])/2)
+    max_freq = int(Decimal(frequency_dict["value"])*1000) + (int(width_dict["value"])/2)
+    #config,_,_ = filter_config(resources=resources,unwanted_keys=unwanted_keys)
+        
+    or_device_ns="http://org/openroadm/device"
+    or_interface_ns="http://org/openroadm/interfaces"
+
+    results=[]
+    logging.info(f"from openroadm mc {resources}")
+    doc, tag, text = Doc().tagtext()
+    with tag('config',xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"):
+        with tag('org-openroadm-device', ('xmlns',or_device_ns)):
+       
+            for interface in interfaces_lists["value"]:
+                port = next((r for r in interface if r['resource_key']=='supporting-port'),None)
+                circuit_pack =next((r for r in interface if r['resource_key']=='supporting-circuit-pack-name'),None)
+                interface_list = next((r for r in interface if r['resource_key']=='supporting-interface-list'),None)
+                mc_name = define_interface_name('mc-ttp',interface_list['value'],frequency_dict['value'])
+                interface.append({'resource_key':'mc_name','value':mc_name})
+                with tag('interface'):
+                    
+                        with tag('name'):text(mc_name)
+                        with tag('description'):text(f'Media-channel-{frequency_dict["value"]}THz')
+                        with tag('type'):text("openROADM-if:mediaChannelTrailTerminationPoint")
+                        with tag('administrative-state'):text(administrative_state["value"])
+                        with tag('supporting-circuit-pack-name'):text(circuit_pack["value"])
+                        with tag('supporting-port'):text(port["value"])
+                        with tag('supporting-interface-list'):text(interface_list["value"])
+                        with tag('mc-ttp',xmlns="http://org/openroadm/media-channel-interfaces"):
+                            with tag('max-freq'):text(max_freq)
+                            with tag('min-freq'):text(min_freq)
+                     
+       
+                            
+    result = indent(
+                    doc.getvalue(),
+                    indentation = ' '*2,
+                    newline = ''
+                )
+    results.append(result)
+    logging.info(f"from openroadm mc results {results}")
+    return [results,resources]
+        
+
+
+       
+def create_network_media_channel (resources):
+    
+    logging.info(f"nmc resources {resources}")
+    
+    unwanted_keys= ['max-freq','min-freq']
+    #config,_,_ = filter_config(resources=resources,unwanted_keys=unwanted_keys)
+        
+    or_device_ns="http://org/openroadm/device"
+    frequency_dict=next((r for r in resources if r['resource_key']== 'frequency'),None)
+    width_dict=next((r for r in resources if r['resource_key']== 'width'),None)
+    interfaces_lists =next((r for r in resources if r['resource_key']== 'interfaces'),None)
+    administrative_state= next((r for r in resources if r['resource_key']== 'administrative-state'),None)
+  
+
+    results=[]
+    doc, tag, text = Doc().tagtext()
+    with tag('config',xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"):
+        with tag('org-openroadm-device', ('xmlns',or_device_ns)):
+              for interface in interfaces_lists["value"]:
+                port = next((r for r in interface if r['resource_key']=='supporting-port'),None)
+                circuit_pack =next((r for r in interface if r['resource_key']=='supporting-circuit-pack-name'),None)
+                interface_list = next((r for r in interface if r['resource_key']=='mc_name'),None)
+                nmc_name = define_interface_name('nmc-ctp',interface_list['value'],frequency_dict['value'])
+
+                with tag('interface'):
+                    
+                        with tag('name'):text(nmc_name)
+                        with tag('description'):text(f'Media-channel-{frequency_dict["value"]}THz')
+                        with tag('type'):text("openROADM-if:networkMediaChannelConnectionTerminationPoint")
+                        with tag('administrative-state'):text(administrative_state["value"])
+                        with tag('supporting-circuit-pack-name'):text(circuit_pack["value"])
+                        with tag('supporting-port'):text(port["value"])
+                        with tag('supporting-interface-list'):text(interface_list["value"])
+                        with tag('nmc-ctp',xmlns="http://org/openroadm/network-media-channel-interfaces"):
+                            with tag('frequency'):text(frequency_dict['value'])
+                            with tag('width'):text(width_dict['value'])
+                            
+
+                            
+    result = indent(
+                    doc.getvalue(),
+                    indentation = ' '*2,
+                    newline = ''
+                )
+    results.append(result)
+    logging.info(f"nmc message {results}")
+    return results
+        
+
+def network_media_channel_handler (resources):
+     unwanted_keys=["config_type"]
+     config,_,_ = filter_config(resources=resources,unwanted_keys=unwanted_keys)
+     mc_list,resources_updated= create_media_channel(resources=config)
+     nmc_list= create_network_media_channel(resources=resources_updated)
+     mc_list.extend(nmc_list)
+    
+     return mc_list
diff --git a/src/device/service/drivers/oc_driver/templates/descovery_tool/open_roadm.py b/src/device/service/drivers/oc_driver/templates/descovery_tool/open_roadm.py
index 337207072..3c4b099a0 100644
--- a/src/device/service/drivers/oc_driver/templates/descovery_tool/open_roadm.py
+++ b/src/device/service/drivers/oc_driver/templates/descovery_tool/open_roadm.py
@@ -17,7 +17,8 @@ import re,logging
 import json
 import lxml.etree as ET
 from typing import Collection, Dict, Any
- 
+from common.proto.context_pb2 import  Location
+from decimal import Decimal
 def extract_roadm_circuits_pack (xml_data:str):
   
    
@@ -112,8 +113,9 @@ def extract_openroadm_info(xml_data:str):
 
 
 def extract_openroadm_interface (xml_data:str):
+    or_config=[]
     or_interfaces=[]
-   
+    
     xml_bytes = xml_data.encode("utf-8")
     root = ET.fromstring(xml_bytes)
     # with open('xml.log', 'w') as f:
@@ -122,24 +124,38 @@ def extract_openroadm_interface (xml_data:str):
     
     namespace = {'oc': "http://org/openroadm/device" 
                  , 'mc':"http://org/openroadm/media-channel-interfaces"
-                 ,'nmc':"http://org/openroadm/network-media-channel-interfaces"}
+                 ,'nmc':"http://org/openroadm/network-media-channel-interfaces"
+                 ,'or-type':'http://org/openroadm/interfaces'}
     
     interfaces = root.findall('.//oc:interface',namespace)
     for interface in interfaces :
       mc = interface.find('.//mc:mc-ttp',namespace)
       name = interface.find('.//oc:name',namespace)
       description = interface.find('.//oc:description',namespace)
-      type=''
+      type=interface.find('.//oc:type',namespace)
       administrative_state=interface.find('.//oc:administrative-state',namespace)
       circuit_pack_name=interface.find('.//oc:supporting-circuit-pack-name',namespace)
       port=interface.find('.//oc:supporting-port',namespace)
       interface_list =interface.find('.//oc:supporting-interface-list',namespace)
       
-     
+      or_interfaces.append({
+          'interface_list':name.text if name is not None else None,
+           'administrative_state':administrative_state.text if administrative_state is not None else None,
+          'circuit_pack_name':circuit_pack_name.text if circuit_pack_name is not None else None,
+          'port':port.text if port is not None else None ,
+          'type':type.text if type is not None else None
+      })
       if mc is not None :
         print (mc)
-        frequency = mc.find('.//mc:min-freq',namespace)
-        width=mc.find('.//mc:width',namespace)
+        frequency=None
+        width=None
+        min_frequency = mc.find('.//mc:min-freq',namespace)
+        max_frequency = mc.find('.//mc:max-freq',namespace)
+        if min_frequency is not None and max_frequency is not None:
+            frequency = (Decimal(max_frequency.text) + Decimal(min_frequency.text) )/2
+            width = int(( Decimal(max_frequency.text) - Decimal(min_frequency.text)) * 1000)
+            
+  
         mc= {
           'name':name.text if name is not None else None,
           'description':description.text if description is not None else None ,
@@ -148,13 +164,15 @@ def extract_openroadm_interface (xml_data:str):
           'circuit_pack_name':circuit_pack_name.text if circuit_pack_name is not None else None,
           'port':port.text if port is not None else None ,
           'interface_list': interface_list.text if interface_list is not None else None,
-           'frequency': frequency.text if frequency is not None else None,
-           'width':width.text if width is not None else None
+           'frequency': str(frequency),
+           'width':width
         } 
-        or_interfaces.append(mc)
+        or_config.append(mc)
         
       else :
         nmc = interface.find('.//nmc:nmc-ctp',namespace)
+                  
+
         if nmc is not None :
           frequency = nmc.find('.//nmc:frequency',namespace)
           width=nmc.find('.//nmc:width',namespace)
@@ -169,26 +187,65 @@ def extract_openroadm_interface (xml_data:str):
             'frequency': frequency.text if frequency is not None else None,
             'width':width.text if width is not None else None
           } 
-          or_interfaces.append(nmc)
-    return or_interfaces    
+          or_config.append(nmc)
+    logging.info(f"or_config for or {or_config}")
+    return [or_interfaces,or_config]    
                
 
 def  openroadm_values_extractor (data_xml:str,resource_keys:list,dic:dict):
     ports_result=[]
     openroadm_info= extract_openroadm_info(data_xml)
     circuits_list = extract_roadm_circuits_pack(data_xml)
-    interfaces = extract_openroadm_interface(data_xml)
+    interfaces,config = extract_openroadm_interface(data_xml)
     dic["openroadm_info"]=openroadm_info
     dic["circuits"]=circuits_list
-    dic['interfaces']=interfaces
+    dic['interfaces']=config
     
     for circuit in circuits_list :
- 
+        circuit_name=circuit['circuit_name']
+        location = Location()
+        location.circuit_pack=circuit_name
         for port in circuit['ports']:
             if port is not None and  'port_name' in port :
                 resource_key = '/endpoints/endpoint[{:s}]'.format(port["port_name"])
-                resource_value = {'uuid': port["port_name"], 'type':port["port_qual"] if "port_qual" in port else None}
+                resource_value = {'uuid': port["port_name"]
+                                 , 'type':port["port_qual"] if "port_qual" in port else None,
+                                 'location':{"circuit_pack":location.circuit_pack}
+                                 }
                 ports_result.append((resource_key, resource_value))
+    for interface in interfaces:
+         existed=False
+         circuit_name=interface['circuit_pack_name']
+         interface_list=interface['interface_list']
+
+         location_interface=f'{interface_list}/{circuit_name}'
+         port = interface["port"]
+         type = interface['type']
+         if port is not None:
+                for i , (key,value) in enumerate(ports_result):
+                   if value['uuid'] == port:
+                       new_value = value
+                       merged_interface=None
+                       if 'interface' in value['location']:
+                           merged_interface= f"{value['location']['interface']},{location_interface}"
+                       if merged_interface is not None :
+                           new_value['location']={"interface":merged_interface}
+                       else :
+                           new_value['location']={"interface":location_interface}
+                              
+                       ports_result[i]= (key,new_value )
+                       existed=True
+                       break
+                
+                if not existed:
+                    resource_key = '/endpoints/endpoint[{:s}]'.format(port)
+                    resource_value = {'uuid': f'{port}'
+                                    , 'type':type ,
+                                    'location':{"interface":location_interface}
+                                    }
+                    ports_result.append((resource_key, resource_value))
+        
+        
     return [dic,ports_result]            
     
     
diff --git a/src/tests/ofc24/r_t.sh b/src/tests/ofc24/r_t.sh
old mode 100644
new mode 100755
diff --git a/src/webui/service/opticalconfig/routes.py b/src/webui/service/opticalconfig/routes.py
index ace59d670..1b60bff1b 100644
--- a/src/webui/service/opticalconfig/routes.py
+++ b/src/webui/service/opticalconfig/routes.py
@@ -10,7 +10,7 @@ from slice.client.SliceClient import SliceClient
 from .forms import UpdateDeviceForm ,AddTrancseiver ,UpdateInterfaceForm ,UpdateStatusForm
 from common.tools.context_queries.OpticalConfig import opticalconfig_get_uuid , device_get_uuid
 
-
+from common.DeviceTypes import DeviceTypeEnum
 opticalconfig = Blueprint('opticalconfig', __name__,url_prefix="/opticalconfig")
 
 context_client = ContextClient()
@@ -41,11 +41,15 @@ def home() :
 
         value=json.loads(configs.config) if type(configs.config)==str else configs.config
         config_type = value["type"]
-        if ('channels' in value):
-           
-           
-            channels_num=len(value['channels']) 
-            value["channels_number"]=channels_num
+        if config_type != DeviceTypeEnum.OPEN_ROADM._value_ :
+            if ('channels' in value):
+            
+            
+                value["channels_number"]=len(value['channels']) 
+                
+        else :
+            if ('interfaces' in value) :
+                value["channels_number"]=len(value['interfaces'])        
         # value['operationalMode']=value['operational-mode']
         # value['targetOutputPower']=value['target-output-power']
         value['opticalconfig_id']=configs.opticalconfig_id
@@ -82,7 +86,7 @@ def show_details(config_uuid):
                device_name= config["device_name"]
             config_type = config["type"]
             
-            if config_type == 'optical-transponder':
+            if config_type == DeviceTypeEnum.OPTICAL_TRANSPONDER._value_:
             
                 LOGGER.info("config details from show detail %s",config)
             
@@ -100,7 +104,7 @@ def show_details(config_uuid):
                     
                         device_details.append(new_config)
             
-            if config_type == 'optical-roadm':
+            if config_type == DeviceTypeEnum.OPTICAL_ROADM._value_:
             
                 LOGGER.info("config details from show detail %s",config)
             
@@ -119,7 +123,24 @@ def show_details(config_uuid):
                         new_config['optical_band_parent']= channel['optical_band_parent'] if 'optical_band_parent' in channel else ''
                         new_config['channel_index']= channel['channel_index'] if 'channel_index' in channel else ''
                     
-                        device_details.append(new_config)            
+                        device_details.append(new_config)   
+            if config_type == DeviceTypeEnum.OPEN_ROADM._value_:
+                if 'interfaces' in config :
+                    for interface in config["interfaces"]:
+                        new_config={}
+                        new_config["name"]=interface["name"] if "name" in interface else '' 
+                        new_config["administrative_state"]=interface[ "administrative_state"]
+                        new_config["circuit_pack_name"]=interface["circuit_pack_name"]
+                        new_config["port"]=interface["port"]
+                        new_config["interface_list"]=interface["interface_list"]
+                        new_config["frequency"]=interface["frequency"]
+                        new_config["width"]=interface[ "width"]
+                        new_config["type"]=interface["type"]
+                        
+                        device_details.append(new_config)     
+
+                    
+                                     
         LOGGER.info("device details  %s",device_details)
         
         return render_template('opticalconfig/details.html', device=device_details,config_id=config_uuid,device_name=device_name,type=config_type)
@@ -360,6 +381,81 @@ def update_status (config_uuid,channel_name):
              flash(f'Problem updating the device. {e}', 'danger')  
     return render_template('opticalconfig/update_status.html',form=form , channel_name=channel_name, submit_text='Update Device Status')         
  
+ 
+ 
+@opticalconfig.route('/configure_openroadm', methods=['POST'])
+def update_openroadm ()  :
+   
+    if (request.method == 'POST'):
+        ports_list= []
+        data = request.get_json()
+        LOGGER.info(f"data {data}")  
+        devices=data.get('devices')
+        LOGGER.info(f"devices {devices}")  
+        myResponse =[]
+        status_code=''
+        config={}
+        target_interface={}
+        for device in devices :
+            frequency = device.get("frequency")
+            width= device.get("width")
+            ports=device.get('ports')
+            device_name=device.get("device_name")
+            LOGGER.info(f"device from post {device}")
+            target_interface["frequency"]=frequency
+            target_interface["width"]=width
+            target_interface["administrative-state"]="inService"
+            target_interface["config_type"]=device.get("config_type")
+       
+        
+            if (device_name):
+             
+                opticalconfig_uuid = opticalconfig_get_uuid(device_name=device_name)
+                opticalconfigId=OpticalConfigId()
+                opticalconfigId.opticalconfig_uuid=opticalconfig_uuid
+                context_client.connect()
+                opticalconfig = context_client.SelectOpticalConfig(opticalconfigId)
+                context_client.close()
+                config =json.loads(opticalconfig.config)    
+                for port in ports :
+                    ports_list.append({
+                        "supporting-circuit-pack-name":port["circuit_pack"],
+                        'supporting-interface-list':port["interface_list"],
+                        'supporting-port':port["port"]
+                    })
+                target_interface["ports"]=ports_list    
+                config["new_config"]=target_interface
+                opticalconfig.config =json.dumps(config)    
+                try:
+                        device_client.connect()
+                        device_client.ConfigureOpticalDevice(opticalconfig)
+                        device_client.close()
+                    
+                        myResponse.append(f"device {device_name} port {port} is updated successfully")
+                        status_code = 200
+                            
+                            
+                except Exception as e: # pylint: disable=broad-except
+                            
+                        myResponse.append(f"Problem updating the device. {e}")
+                        status_code = 500 
+                        break   
+                            
+                           
+                    
+            else :
+                    
+                    myResponse.append(f"requested device {device_name} is not existed")
+                    status_code = 400
+                    break              
+            
+       
+
+        response=make_response(f'{myResponse}')
+        response.status_code=status_code
+        
+        return response
+        
         
                
     
\ No newline at end of file
diff --git a/src/webui/service/templates/opticalconfig/details.html b/src/webui/service/templates/opticalconfig/details.html
index e1d009efd..08c22db84 100644
--- a/src/webui/service/templates/opticalconfig/details.html
+++ b/src/webui/service/templates/opticalconfig/details.html
@@ -83,6 +83,38 @@
                             {% endfor %}
                         </tbody>
                   </table>
+              {% elif type == 'openroadm' %}  
+                 
+                  <table class="table table-striped table-hover">
+                    <thead>
+                      <tr>
+                        <th scope="col"> name</th>
+                        <th scope="col"> type</th>
+                        <th scope="col">administrative state</th>
+                        <th scope="col">circuit pack name</th>
+                        <th scope="col">port</th>
+                        <th scope="col">interface list</th>
+                        <th scope="col">frequency</th>
+                        <th scope="col">width</th>
+                      </tr>
+                    </thead>
+                    <tbody>
+                
+                        {% for channel in device %}
+                        <tr style="background-color:{%if channel.status == 'DISABLED' %} gray {% endif %};">
+                          <td>{{channel.name}}</td>
+                          <td>{{channel.type}}</td>
+                          <td>{{channel.administrative_state}}</td>
+                          <td> {{channel.circuit_pack_name}}</td>
+                          <td>{{channel.port}}</td>
+                          <td>{{channel.interface_list}}</td>
+                          <td> {{channel.frequency}}</td>
+                          <td> {{channel.width}}</td>
+                        </tr>
+                        {% endfor %}
+                    </tbody>
+              </table>
+
               {%else%}     
                   <table class="table table-striped table-hover">
                     <thead>
diff --git a/test.py b/test.py
index 4a5d82ee8..9595e5bb8 100644
--- a/test.py
+++ b/test.py
@@ -5,31 +5,48 @@ import re
 from typing import Optional, Union
 from uuid import UUID, uuid4, uuid5
 import logging
+from decimal import Decimal
+
+
+create_mc_test = '''
+<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> 
+<org-openroadm-device xmlns="http://org/openroadm/device" xmlns:openROADM-if="http://org/openroadm/interfaces">   
+<interface>      <name>MC-TTP-DEG1-RX-193.3</name>      <description>Media-channel-193.3THz</description>     
+<type>openROADM-if:mediaChannelTrailTerminationPoint</type>      <administrative-state>inService</administrative-state>   
+<supporting-circuit-pack-name>DEG1-AMPTX</supporting-circuit-pack-name>      <supporting-port>DEG1-AMPTX-OUT</supporting-port>   
+<supporting-interface-list>OMS-DEG1-TTP-RX</supporting-interface-list>      <mc-ttp xmlns="http://org/openroadm/media-channel-interfaces">      
+<max-freq>193350.0</max-freq>        <min-freq>193250.0</min-freq>      </mc-ttp>    </interface>    <interface>      <name>MC-TTP-DEG1-TX-193.3</name>    
+<description>Media-channel-193.3THz</description>      <type>openROADM-if:mediaChannelTrailTerminationPoint</type>      
+<administrative-state>inService</administrative-state>      <supporting-circuit-pack-name>DEG1-AMPRX</supporting-circuit-pack-name>   
+<supporting-port>DEG1-AMPRX-IN</supporting-port>      <supporting-interface-list>OMS-DEG1-TTP-TX</supporting-interface-list>    
+<mc-ttp xmlns="http://org/openroadm/media-channel-interfaces">     
+<max-freq>193350.0</max-freq>        <min-freq>193250.0</min-freq>      </mc-ttp>    </interface>  </org-openroadm-device></config>
+'''
 
 create_mc_err= '''
  <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
-<org-openroadm-device xmlns="http://org/openroadm/device" xmlns:openROADM-if="http://org/openroadm/interfaces">
+<org-openroadm-device xmlns="http://org/openroadm/device">
   <interface>
-    <name>MC-TTP-DEG1-RX-193.3</name>
-    <description>Media-Channel-TTP-193.3THz-degree-1-in</description>
+    <name>MC-TTP-DEG2-RX-193.3</name>
+    <description>Media-Channel-TTP-193.3THz-degree-2-in</description>
     <type>openROADM-if:mediaChannelTrailTerminationPoint</type>
     <administrative-state>inService</administrative-state>
-    <supporting-circuit-pack-name>DEG1-AMPRX</supporting-circuit-pack-name>
-    <supporting-port>DEG1-AMPRX-IN</supporting-port>
-    <supporting-interface-list>OMS-DEG1-TTP-RX</supporting-interface-list>
+    <supporting-circuit-pack-name>DEG2-AMPRX</supporting-circuit-pack-name>
+    <supporting-port>DEG2-AMPRX-IN</supporting-port>
+    <supporting-interface-list>OMS-DEG2-TTP-RX</supporting-interface-list>
     <mc-ttp xmlns="http://org/openroadm/media-channel-interfaces">
       <min-freq>193.25</min-freq>
       <max-freq>193.35</max-freq>
     </mc-ttp>
   </interface>
   <interface>
-    <name>MC-TTP-DEG1-TX-193.3</name>
-    <description>Media-Channel-TTP-193.3THz-degree-1-out</description>
+    <name>MC-TTP-DEG2-TX-193.3</name>
+    <description>Media-Channel-TTP-193.3THz-degree-2-out</description>
     <type>openROADM-if:mediaChannelTrailTerminationPoint</type>
     <administrative-state>inService</administrative-state>
-    <supporting-circuit-pack-name>DEG1-AMPTX</supporting-circuit-pack-name>
-    <supporting-port>DEG1-AMPTX-OUT</supporting-port>
-    <supporting-interface-list>OMS-DEG1-TTP-TX</supporting-interface-list>
+    <supporting-circuit-pack-name>DEG2-AMPTX</supporting-circuit-pack-name>
+    <supporting-port>DEG2-AMPTX-OUT</supporting-port>
+    <supporting-interface-list>OMS-DEG2-TTP-TX</supporting-interface-list>
     <mc-ttp xmlns="http://org/openroadm/media-channel-interfaces">
       <min-freq>193.25</min-freq>
       <max-freq>193.35</max-freq>
@@ -42,28 +59,31 @@ create_mc_err= '''
 
 '''
 
-create_srg = '''
+
+create_nmc = '''
  <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
- <org-openroadm-device xmlns="http://org/openroadm/device">
+   <org-openroadm-device xmlns="http://org/openroadm/device">
   <interface>
-     <name>SRG1-PP01-TX-193.3</name>
-     <description>Network-Media-Channel-CTP-193.3THz-srg-1-out</description>
+     <name>NMC-CTP-DEG2-TX-193.3</name>
+     <description>Network-Media-Channel-CTP-193.3THz-degree-2-out</description>
      <type>openROADM-if:networkMediaChannelConnectionTerminationPoint</type>
      <administrative-state>inService</administrative-state>
-     <supporting-circuit-pack-name>SRG1-WSS</supporting-circuit-pack-name>
-     <supporting-port>SRG1-OUT1</supporting-port>
+     <supporting-circuit-pack-name>DEG2-AMPTX</supporting-circuit-pack-name>
+     <supporting-interface-list>MC-TTP-DEG2-TX-193.3</supporting-interface-list>
+     <supporting-port>DEG2-AMPTX-OUT</supporting-port>
      <nmc-ctp xmlns="http://org/openroadm/network-media-channel-interfaces">
         <frequency>193.30</frequency>
         <width>100</width>
      </nmc-ctp>
   </interface>
   <interface>
-     <name>SRG1-PP01-RX-193.3</name>
-     <description>Network-Media-Channel-CTP-193.3THz-srg-1-in</description>
+     <name>NMC-CTP-DEG2-RX-193.3</name>
+     <description>Network-Media-Channel-CTP-193.3THz-degree-2-in</description>
      <type>openROADM-if:networkMediaChannelConnectionTerminationPoint</type>
      <administrative-state>inService</administrative-state>
-     <supporting-circuit-pack-name>SRG1-WSS</supporting-circuit-pack-name>
-     <supporting-port>SRG1-IN1</supporting-port>
+     <supporting-circuit-pack-name>DEG2-AMPRX</supporting-circuit-pack-name>
+     <supporting-port>DEG2-AMPRX-IN</supporting-port>
+     <supporting-interface-list>MC-TTP-DEG2-RX-193.3</supporting-interface-list>
      <nmc-ctp xmlns="http://org/openroadm/network-media-channel-interfaces">
         <frequency>193.30</frequency>
         <width>100</width>
@@ -71,34 +91,32 @@ create_srg = '''
   </interface>
 </org-openroadm-device>
 
-
-
 </config>
+
 '''
-create_nmc = '''
+
+create_srg = '''
  <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
-   <org-openroadm-device xmlns="http://org/openroadm/device">
+ <org-openroadm-device xmlns="http://org/openroadm/device">
   <interface>
-     <name>NMC-CTP-DEG1-TX-193.3</name>
-     <description>Network-Media-Channel-CTP-193.3THz-degree-1-out</description>
+     <name>SRG1-PP01-TX-193.3</name>
+     <description>Network-Media-Channel-CTP-193.3THz-srg-1-out</description>
      <type>openROADM-if:networkMediaChannelConnectionTerminationPoint</type>
      <administrative-state>inService</administrative-state>
-     <supporting-circuit-pack-name>DEG1-AMPTX</supporting-circuit-pack-name>
-     <supporting-interface-list>MC-TTP-DEG1-TX-193.3</supporting-interface-list>
-     <supporting-port>DEG1-AMPTX-OUT</supporting-port>
+     <supporting-circuit-pack-name>SRG1-WSS</supporting-circuit-pack-name>
+     <supporting-port>SRG1-OUT1</supporting-port>
      <nmc-ctp xmlns="http://org/openroadm/network-media-channel-interfaces">
         <frequency>193.30</frequency>
         <width>100</width>
      </nmc-ctp>
   </interface>
   <interface>
-     <name>NMC-CTP-DEG1-RX-193.3</name>
-     <description>Network-Media-Channel-CTP-193.3THz-degree-1-in</description>
+     <name>SRG1-PP01-RX-193.3</name>
+     <description>Network-Media-Channel-CTP-193.3THz-srg-1-in</description>
      <type>openROADM-if:networkMediaChannelConnectionTerminationPoint</type>
      <administrative-state>inService</administrative-state>
-     <supporting-circuit-pack-name>DEG1-AMPRX</supporting-circuit-pack-name>
-     <supporting-port>DEG1-AMPRX-IN</supporting-port>
-     <supporting-interface-list>MC-TTP-DEG1-RX-193.3</supporting-interface-list>
+     <supporting-circuit-pack-name>SRG1-WSS</supporting-circuit-pack-name>
+     <supporting-port>SRG1-IN1</supporting-port>
      <nmc-ctp xmlns="http://org/openroadm/network-media-channel-interfaces">
         <frequency>193.30</frequency>
         <width>100</width>
@@ -106,11 +124,13 @@ create_nmc = '''
   </interface>
 </org-openroadm-device>
 
-</config>
 
+
+</config>
 '''
 
 
+
 create_connec= '''
  <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <org-openroadm-device xmlns="http://org/openroadm/device">
@@ -130,22 +150,11 @@ create_connec= '''
 </config>
 '''
 
-device = {
-    'host':'172.17.0.2',        # IP address or hostname of the remote machine  '172.17.0.2'
-    'port': 830,                # SSH port (default: 22)
-    'username': 'openroadm',    # SSH username
-    'password': 'openroadm',    # SSH password
-    'device_params': {'name': 'default'},
-     'hostkey_verify':False,
-     "allow_agent":False
-     ,"look_for_keys":False
-}
-
-
 
 def extract_openroadm_interface (xml_data:str):
+    or_config=[]
     or_interfaces=[]
-   
+    
     xml_bytes = xml_data.encode("utf-8")
     root = ET.fromstring(xml_bytes)
     # with open('xml.log', 'w') as f:
@@ -154,20 +163,27 @@ def extract_openroadm_interface (xml_data:str):
     
     namespace = {'oc': "http://org/openroadm/device" 
                  , 'mc':"http://org/openroadm/media-channel-interfaces"
-                 ,'nmc':"http://org/openroadm/network-media-channel-interfaces"}
+                 ,'nmc':"http://org/openroadm/network-media-channel-interfaces"
+                 ,'or-type':'http://org/openroadm/interfaces'}
     
     interfaces = root.findall('.//oc:interface',namespace)
     for interface in interfaces :
       mc = interface.find('.//mc:mc-ttp',namespace)
       name = interface.find('.//oc:name',namespace)
       description = interface.find('.//oc:description',namespace)
-      type=''
+      type=interface.find('.//oc:type',namespace)
       administrative_state=interface.find('.//oc:administrative-state',namespace)
       circuit_pack_name=interface.find('.//oc:supporting-circuit-pack-name',namespace)
       port=interface.find('.//oc:supporting-port',namespace)
       interface_list =interface.find('.//oc:supporting-interface-list',namespace)
       
-     
+      or_interfaces.append({
+          'interface_list':name.text if name is not None else None,
+           'administrative_state':administrative_state.text if administrative_state is not None else None,
+          'circuit_pack_name':circuit_pack_name.text if circuit_pack_name is not None else None,
+          'port':port.text if port is not None else None ,
+          'type':type.text if type is not None else None
+      })
       if mc is not None :
         print (mc)
         frequency = mc.find('.//mc:min-freq',namespace)
@@ -183,7 +199,7 @@ def extract_openroadm_interface (xml_data:str):
            'frequency': frequency.text if frequency is not None else None,
            'width':width.text if width is not None else None
         } 
-        or_interfaces.append(mc)
+        or_config.append(mc)
         
       else :
         nmc = interface.find('.//nmc:nmc-ctp',namespace)
@@ -201,26 +217,51 @@ def extract_openroadm_interface (xml_data:str):
             'frequency': frequency.text if frequency is not None else None,
             'width':width.text if width is not None else None
           } 
-          or_interfaces.append(nmc)
-    return or_interfaces    
-       
-        
-        
+          or_config.append(nmc)
+ 
+    return [or_interfaces,or_config]    
+               
+
+
+
+
+
+device = {
+    'host':'172.17.0.2',        # IP address or hostname of the remote machine  '172.17.0.2'
+    'port': 830,                # SSH port (default: 22)
+    'username': 'openroadm',    # SSH username
+    'password': 'openroadm',    # SSH password
+    'device_params': {'name': 'default'},
+     'hostkey_verify':False,
+
+
+      "force_running": False,
+
+      "look_for_keys": False,
+      "allow_agent": False,
+      "commit_per_rule": False,
+}
+
+
+
 
       
 if __name__ == '__main__':
+
     
-    with manager.connect(host=device['host']
-                         ,port=device['port']
+    with manager.connect(  host=device['host']
+                          ,port=device['port']
                           ,username=device['username']
                           ,password=device['password']
                           ,hostkey_verify=device['hostkey_verify']
                           ,allow_agent=device['allow_agent']
                           ,look_for_keys=device['look_for_keys']) as m :
-         #edit_result = m.edit_config (target="running",config=create_nmc )
+         edit_result = m.edit_config (target="running",config=create_mc_test )
          result = m.get_config (source="running").data_xml
-         interfaces=extract_roadm_interface(result)
-         print(interfaces)
+         #interfaces,config = extract_openroadm_interface(result)
+         #print (interfaces)
+         #interfaces=extract_roadm_interface(result)
+         #print(interfaces)
         # optical_band_namespaces="http://flex-scale-project.eu/yang/flex-scale-mg-on"
          #namespaces={"oc":"http://openconfig.net/yang/wavelength-router"}
          #obj=extract_media_channels(result,namespaces)
@@ -233,8 +274,9 @@ if __name__ == '__main__':
          #print(f"optical_bands {obj1}")
 
         #print(f"circuits {circuits}")
-        #  with open("xml.log","w") as f:
-        #       print (result,file=f)
+         with open("xml.log","w") as f:
+              print (result,file=f)
+       
         
 
         
-- 
GitLab