From 372c2470e613128f1e33cfc581ea2c5b1b732d2b Mon Sep 17 00:00:00 2001 From: Jan Malkiewicz Date: Tue, 9 Feb 2021 08:39:23 +0100 Subject: [PATCH] Add validation of manifest for helm packages. For ONAP native zip packages added validation of manifest file. HELM package is only valid if: * isBase flag is set to 'true' for exactly one helm entry * isBase flag is present for all helm entries Zip package is considered to be a helm package if it contains HELM entries but does not contain any HEAT entries (however it may contains entries of other types). Refactored method OnboardingPackageProcessor.processPackage(): * simplified logic * enhanced exception handling Issue-ID: SDC-3185 Signed-off-by: Jan Malkiewicz Change-Id: Ica3b1f1504ce4fc3a671c4b8fa8de2bf0236bd77 --- .../src/test/resources/Files/VNFs/vLB.zip | Bin 6789 -> 7218 bytes .../src/test/resources/Files/VNFs/vLBMS.zip | Bin 7218 -> 0 bytes .../OrchestrationTemplateCandidateImpl.java | 3 +- .../impl/onboarding/ManifestAnalyzer.java | 73 +++++++ .../onboarding/OnboardingPackageProcessor.java | 217 +++++++++++++-------- .../onboarding/validation/CnfPackageValidator.java | 77 ++++++++ .../impl/onboarding/ManifestAnalyzerTest.java | 152 +++++++++++++++ .../onboarding/OnboardingPackageProcessorTest.java | 40 +++- .../OnboardingPackageProcessorUnitTest.java | 143 ++++++++++++++ .../validation/CnfPackageValidatorTest.java | 137 +++++++++++++ .../helm-package-invalid-missing-flag-isbase.zip | Bin 0 -> 1374 bytes .../vspmanager.csar/helm-package-valid.zip | Bin 0 -> 1393 bytes .../org/openecomp/sdc/common/errors/Messages.java | 4 + 13 files changed, 760 insertions(+), 86 deletions(-) delete mode 100644 integration-tests/src/test/resources/Files/VNFs/vLBMS.zip create mode 100644 openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzer.java create mode 100644 openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidator.java create mode 100644 openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzerTest.java create mode 100644 openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorUnitTest.java create mode 100644 openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidatorTest.java create mode 100644 openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/helm-package-invalid-missing-flag-isbase.zip create mode 100644 openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/helm-package-valid.zip diff --git a/integration-tests/src/test/resources/Files/VNFs/vLB.zip b/integration-tests/src/test/resources/Files/VNFs/vLB.zip index b61ca1b83b85ec4cb2ef9adb37280abcabe1e8bc..c542870bad6c69a7bd6e3587fd11e445aaf8bcef 100644 GIT binary patch delta 6213 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 W(a`@M=m{DK4YYy;0!cmp8~zV=X~`o1 delta 5774 zcmZ8l2Q-{b+g@D|o#=ufqODF4UWpbp+31@UJw#ukdm?%Z(OdKyu{w(oR_{cwu`5E9 z&1y^3KkxgW@BhBM zi3tf~-RfBgUlRa-FM^CtZC+D=K>X?;(9J(vt*zj8mamX^?|F}ke}VDmIMvLKq=$0vzTol~J9MGu zhAKP+bWz_P#h6H_gVU%csrGrUq!)S!lB42Oq=dR(S01CgBLyIfvP2Rter&9bn3DD= zHetTJbFPGegA+=V{Hk@P8t@}|_M$AVb5ICKmWiX^R+R#vMR;BQB#C+(ebGs*$=n}b z?A}k=0;`JicTFK6ei=a{sQ7S;+Tc&xHHyIJHyq+^MVjNe32Sx^;H@K#mGg(bvTxeP z{ZCqpu=QM5N1*%dCOG6$n-2jpR*D?jZN`G-R3s{#-!2g<{~e@$#4RUB^7;SRjOP z1PvEheSc3?Kf3;{Kdo+)pA;SE?$pZ>`Q)_k$U0rmR~7B;dJfy$y*hK^u$IM_@=A5# z?2lz|ahMgUTceO(?$Jh2a|HCIDfZuN4h)Pj!10;zxDmCKs2I^G$^L+`w}ug+ z-kW&;s;IpwETd*7_rvQGr{rHBY`ol*c;4TUS~nBqvLG$&YoKAA$Z-zyT|NrCHRdz~ zXQ#-2hGbbUXbcn+om+SSvHXjmfSYjNHMWHG*_eAki$Ot%TAxxP#~wb&l_3XU^q&l% zW#^*siPksNDT)hF6)`jDBF=U~8Vd~_Y~vnx+?w=nPljNBmD=Sk{6Yo}T=G?BjD*^T zjH5m@Oh2(53p|=sIN2cZDxRviP{h4YRHIi{Tip5lcGCKD`n$V69=DWle2GN(eQ9{E zc@gKZy0^;Cm}8ogpnUwKZF%+hZR==3MN-q#xP4ld!t1gdKQ8Kr$qyO<~$ zXN8z+^k?rCu^eojLWSVWNlPf!Sj_?$NBtDDFkV6xIYT7_R`%fCd-%`p;rD!>@>95( zL0&;>V5;&AU9rL3WtKv-75PSjZOz--N1W~QuP(W$v7yixX&Ba_5*^2T$uZ~>=*zoj zp*zFRXKpal52ucDs?h^t0wX^Zf0p?@wUTO|hyE2LQSMZJ;B1eQ)Xwlf#tG@0vMp`v zg-w=FtDuhdEBhA#C4b*9CXuFm(Mx&HO2;w=wnyeiDligWjzi^Xh@wS>?G(D-Jy~R9 zsP$Bc2=@!YEu!wG4CcGp;?3#?Oh_m}zx{F@(M)}3405~pTN|*{LUSXqo20qL;d7~i z75o59>sj_wJO4H#X6mcZw|%4dx@!r`zXqUtXgd<$SDcNjE`{DRZs>aR;|CbsD=*zf z1`M8r4c&t-EwASBWih2ho7sr7xa9@BnHcCLG3z?)Vz3GJN5WL!t9sk!lDvOrlI+S9 z&SHRbjgj4SPyjGIJ$ODJ;sFZcdb2dgD4+&pbr2J_9_8b%fXadNP3uw`k)tAM2q$iQ%xina7 zqWdaouOzJpZZM;MYyscX=AFrZ+?sr&7m#~%$;BzQX^BYYf$koq_uMSMpK@sbWkpUS znr(m7#H(o^$sXALVsO!giZh5qq~K`*8HW2!+Kk#Jej@nMCzTzTC~voF;$v2M zPew3#{js7V81^0B@4F^;JrSo?%Nx^8+0ln&N(9-RAG9bu4h zYhMF_iAy%ISvgfJ44nXMf7fk{O0{L;WOBiCr}sX%MRltvmuU2tqWNrGV$*KFFQV4( z6(RmB@N3fjF;C{#Fu5}2*+M6L(5#UTwyuF+Ss9q}5PKr_)RoVkB_iA`+~@FZ^!a_4NYXT%f_Pz5XAtysWqM6TT_X!!t@oLZ5e16$F?7yZBo3IqQ?I=X*&05 z!!!UbN~#=!W*;?;Mux>x;;d_h?Z0&t1jYy&fCZ)aI^U_KpU|}?F`?#)My!$w5)n#p z4fMkxuCI%eppu6aY!Hb4JrPV3Ze}Z|02Vqnd|}!KR;bWY5g9J$6BRB?4tY~;p)g&S zAtE3!{xEsC^XUgt#)f;L)&dVOhf-Kego&@EQoUT~O4#e$fxt2IVb>|Xu=Bjbe;h5sC@f4l@p&pym$E-*0 zOwp_YdZmnz3W$I}mTo56Dd|pOCZH=&8io*w$V%x&(k}*rMaxDp_Z(vhOSPQ}KXR62 z84>L;Kpr9f(y2KscI=eN{8}ryFWr~*b&&SPCedd5TIesdFv)QhXDu#ywP3ZGYEh#< zH1^jBRYAC=k4sXEo@Xhu%p=E2^NrQ7=H{!u%8POK?h=OgH}f1eeHaDKoq>o7aLzUP z5^*-E3tzCs@%S-uik>}0_2z}m^N@>MLb7_7>%+Fw`vz6XPa2geHsXLw2K8z=W5>5U zCbLmn{t>(HjOO{1d22FF2Hy@}9g^@QT~w1_H^$)HDqFv<+n0g|P0b@RFsV1%Mt8ET08yfm4>IScMfGwEd!r>u8rXDYERSApA|Kx&-GV`0GyYWtQ;+p6J*Q9 zljAx)NgzX{k5b4SUEeoI*8f1zD`XUY|2uljX3e6z@I#N$ry^wc*bE!KvsvAo*>tJxoB^AaOBu7 z2V}jBV35s0oNZrI#=KRffIs6gr&jTRCX)nbbrT&(#8S7+^ldChcV$xAIlHITfsxTx z?A*3FU8VU3TQ3pL>3DIGicpc8L2>s~;<<|LkZmQ(>$;Z?Pt>MJjkolHSd7#FA;HA} z7}1${A>T0|CTiDP{(XD(w8ZNXz`1}n;>8H&gaLg$ikf_wEVKC7p2?gJqPpZja?X=q3F}W52{=PGAS3f4hr@}b#r{LU>-lWB zfKGad=5&YKq6>bv=kW`?tJ*eTVLOm&caWKu2$?T=UFBv-6p!U_RRm6 zp0fDf!SLwZrNGSR=g-0|?bXB_)ucbTh*#FW(OsAiD(UNqwWc}t3E$a*>;(oBmFap% z@pdJeSh+=#=^dmk!iotMY>7r7i-(EqjeDo&Kd9CYH#C1wc$_#r3E=NYJ5_CSEi6qR3{Qxdj>&XI<5&5z2s z-P^4wFTpJufnDigaCrAQ(RabLA$`yo440&dDr@=pHP5fr(WLBR?P$tuX(+y&Xv_C0 z7j@}dVIv|<4mr1_>Q}Faa{34N59iBD3S~W zBH&KWrDFjQQ()SwZxE{6JhTmVOi$^w>=>8~4J}m33kLL-XA^t6UYiej-bQo{W_To( zMo-1dXmt(;9{L#v4J`&s%1V`PZd5FzU3CF1oh6&eWRaL0E3IUnBh!*pMd>hAHioE_Tvcx_DlNZb! zXEzS_^PrxrFprY(IJEgD1@w030@MqSaj`WWX5?*(FlEz{(WEG_5>TVQNFHY(;w81z z(7tQB3pc${uR0R(C6v+4lR`n}@2}g9E9s>^0;#Bxyl@Ha>ZRvZ#+>$5ds;HTB3PgL z0EZJzlh!-mhvmO#DP3n!gm>uAbtVy`on!1HoJpP%WDCEO5C%oN_P95xM0A~sEbk%h|&U{)n=j6p)aN+6K|X*XGV2qpBdWH19SFlZEq1sOlQBW(vM@*}7VMO;@^|B#_G`~n0>>c!s8AwX$0j!YB6NjT>M8LL)TR*%=GSUFaDWG<=p#*^_>?7 z8F8k#joeezhs%;kPE56~ga%|1q})SAMMZSK8o}DW zEUHZp@Y$s0*cOQ{NA+f$MfLxnG1ZJ~a<+{No8E5dHYDG{|MWT&7AQ17XOy}DTvL|L z*6+otUg~%JqTz~TI|I$}X$PO~Z4MCm7MgwE5I0Z0yGz2I(A*j<`ha&Iaq-xhRQwG| zi1JQc4@7RF;ZuD^wz=jv`&lk2-^Edz07M%>Z+gnFyYU{3;0@=b-BoIj6air$12vrDCC0AEmAXJ;cMghoo`7pO@XngWeLL!jdFh zfU#{cVlmv$Oer^8od$5FwQML|?R)KW8sRzU zue^L8mhVnx)N%ZshHb;jC2}kHH+{@G-&g(2A6$Ml{Ea8~c}2KUJZF?69z*p9tM)~q zZcKOHGY#+>wpZQWz>RuSIDYKu#WoQ*HGS{x%Ib0unf`2)V>l;^5{B`ndZ79sMKw@= zal?6zCX8*B83usW$!d)D2y(4SR0rVj!wb83cRcy=usgFu=tUwz2)Rxhc#cPOjaLHm z25jGf{>d}F?ev^>bMK~>)BdAlcay!PahjV7HNPqwv!3JFYclgGO1ZZuJf-iw$c}KY z{NntR3Myb-Il4GHICx&Hs}o(u>(2ZN8$ET5Fh0gT1ZXHTtjg0z-DHIK?a~fB3E`?G z18Q)m`+O;y%Ur?Vqgk?Kx4$5Usj-fFZE2fU8vL2u7FL$?< zFzx{{GQiu;x|OwocjHP8wcynDA-rwr)KzFF!=O}qWlui6H)QwraKJAxcfq@oN9Q#3 zygy7^ACI@_GVNO>>GdOZ#q7ye5M16u*&d3(%bn5I?4}q+t)=NiF-Ha`GP~IhO?UcT z->-Vjt&iC0gyymjL!iAp!9g{7p+;SlrefV+Ve`$6Wq5shSh5w)S-_H2XA8-73 zyZvYICkwK3K5PYn{|OH*3;RdsU-+Lo|Lq|_AR5qr>L@2ivU7=nvMu)Ee~y1(9{2O_ cG!{uC{?RkkAtC)cBJrOdOaKDyv-~~#AF@3i7ytkO diff --git a/integration-tests/src/test/resources/Files/VNFs/vLBMS.zip b/integration-tests/src/test/resources/Files/VNFs/vLBMS.zip deleted file mode 100644 index c542870bad6c69a7bd6e3587fd11e445aaf8bcef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7218 zcmZ{pWl$YWx3)L#ZXsB3cZZD=+%34Xk>KtYoZuGR9X9R~HkJ@9xVt+9_me#J)p_%r zx4xOGS+)Ad)zdY-YVNz2iaZP~E&u>P1e}^DD!fYPFY3Yo073`=0P62iQxg{pBX?U< z77Kg#YK?{Z0ya#)+?w_0+3%Yi`$U;hD0J(+ohne!YNpsQ1tW79`nMG=<{{Htv{2Ga)YXL76m!w#DWfJ z4;^W$6^}yYmHabcNrT(cLX=DL`H7}7INBd3=<{WvobQZZ5eqqUABY2_ZNeXcVf%B_ zL^tB!5aS=~^Lx39;2LVLnzn&dLNfu)V@fX~f_GV(@gc4~=YIJExBd9zO?+DW!1@Q6 zrT~j>d7E=XJfUQ|cAIB8S#jX$d${pSMPw0Us-;c>@P+?2c`+FrB1lXYw|;EI7{3R zF}rUD1+|A{R9;N`uN^FXNJQd%(B+<2m8+1nGI<-F7XY%peJZXe=cZv|bf0kZ0BWou z2**(3HsaePj-GNRNm}_PfINbAu28X9>y+s(&fIVd^cs211THCdOHM_n5xq2?6QmN& zT?*P+xcqqIGfDMvMpc-fHF$Tf=E;dKfw*{t4%02CUmhnyK`D zx$l>|ogt%kHMnK_+M&mM;goR{K&ctG%;OITWrY!|Osi;2-uBkhtr)HrbXqAI&8R$E z(ky7rWW(rIY?Jt~(L3bor}LSwEP8QQaAwf{O9`SLzSq@-T4hy_ub(3Pjm z=y+8vn)TO=tI;8HblK4@KMJ_Fd7h;B@eU!zeZ|SjZ5Yf9%jquTVal4Kl6&*yUhhOx z;h8$VWD-g4fMRv}<-vNo4qpn3L~g)oPSELyE{Z0WU;yk#54#w|&KGz0-f}^weD8Tl zDWzp>46me_@2tLnhn01UyOiwv2rYQ?yPCscMSBVvM%{{hi3L4=@DG@!6Vl+95SMnZ zHGHXorH9AKc_vLa8`O!NeQ2ahS~RkS5Rscjy<*1l6XUPfp-odLkv~(@E>&WloZ1#8 zle`5!;pU2C6l~5mf9YwjfaH`5OxJW1LP2$2A1bT-Zw&%05*1n=hYVVf0RRDM008ap z8uT);vpvzX9-kD&d>N~G!+jBfoWl;W3g%V4K+79^GsScQJu^9b61;h_mc4Ky*1^n- zXo!V#eFD5Z9yvWe9Z9|&fe14{xqQ0=9<2rNy%B1Z+FEt=ExjmpgO9*CMcB}7ZDW@>}2X^mL!3IBM)=$Hd2HJdmt>@a2 z$~pSgetN&(HqyfH>%2qEP9H!-zuJ!rk>rr%><_=2a>YSVpx}5JDMszc9xGMOT~yFn zLhrBIvNoTN+`Hk>t;+H}@Bvbci?A33bt}#G^kQz<27|nhabTh66&#a?0#RS6^bZ~y z%S75kh-)6VXju(oH{2Zf zj?o66!zn%4LmpY-F&?&FqM=@{5WPR~o;QkkIwG}3QzB-4Q^|WaFOt73n?;w(+C%*U zznDk2-7M&4cQu^Lyzse?N!w|oP%vmrH??t_nmrRFt#+@^}8?j(I5(e`O=vT7aHavCs6wKtemt@+RgO! z@CSRtZuhPkXHRn!-ekFR*o*jedP8DTZ^&D%ap>J;Gt$tu{VLLRn}PtS&fO8-@fAAuzqF8rNiW3t?$*^E)#g7iZDi@^09}cu(VH5;HH#)Z?n5CyeK%k*&~q zq<}2mKT!6#cS6x%R2cP@9H(@J(^8LY$qppNpz?E}FHE9K;WfsbyxNqdVMqw0MV+sf zZrcpz1)JFzU7-6H~S1y_s)}1BQ~9*J5L>Uo%r^M_zh% z%udM``dx{sP<-)E&5MQKOtTyu+T1gwuz<$#)BL6>`CzsvcYsH2%u!;z0aUu(_ntqc|{+a73ph^2RsIC?%0L|SQ^v2iY<`r+9gMhz;M>{e!d*EjQ(A#c@w z_#!pLR5KMGcQ8EzBT$@5zNGW@d)pJ3(dl9l%3y@zmcT1bF#ba<*$H++^3l@|(f*4c zS!@O|ehbu?M0d`~cYRKoVFr9l7EbjtHl!{H2Gz;U_ZguL2B}qb;nF&-u2&_)dtpn@ zUOUK|=jKw$tMw%_C8iB98~U&{N=lA*O{UpM8E(IPDzhcmrjnB8Z$0lYx3L>=$Jtmi z<)*$Upt0_#Nwbsc8=cxH)h26$ZNZp{j_ejZYeT}LN%WZq1G}h)(PEksO+K6+Oi5wZ zbAa5)trFuIG%p93Y8^KcAI&RYL!X@<(+`1#>r$?XE^0sze4yMaof` zd+efxq;L~{P{Wny31+4AJkmpdEprK8#ULZogbN&)r>BmvJ&nuuild^QlcqZBpTh4U~ zy~&(t0%+7vLR$TTl=v>3)Mw`~fv8o*=T(se3e9msl2+TBAypeY=jrUiLJBl0MJj$A zhanyJg zZr)75L=yd2c@nll`{vyUUXXHIq)9kZ&}FC4M_xFKq#R*Tyke-j_bKlI8{At`iO>yS?ao=)#KzTHTF(<5)6w)?0gjM zK~0!)I>Cij{^sYT4`!=(YNmld1I(`*@m4rH($9rRYk%HV5Icly=8~!vn$4Xju(w#K z#~-R9l!9=B-wE5vl2{7J3)W=zk$zO;eiXi};PyygjLOL&3sIqRX#sB!F>z6#tN~n;@y%wa$PklR76<&`jxTW`&tEj$UdyQHTpFD zfR}x=LfoahyWb?izsLto#8L^mFHh-eJ~&VL6>TlaI#GE_ef<_}j(QCYh}kDFpw?!N zfXomHGjii-cx$G+B&{?LP?~H(cj}Wy-M2WD zs5EbH0H;HZONOPoGp5eAf|S6{j9Or~6S;+cs=(x;8wNVZ?L%`3AzE(N(YJH&*vR4K zy%KELQuet$0Z58gz)kY+gyLnG+67Kb;C7qBGVN2L<>Z& zA7i(|M#!^ldcc3sWhI&|!Y($$_gHgQuvBuR0k1*i>{oxFtaq;~1eBW{j-`ro!%Xwe z77#mLKp;N#I3e|g`TX=Pdr(;{LgmVRD~e6AP}ala^+<$@ADBsk7!Xk`TV$K)!Q_zy zZBeumw)qUCJ2a|>-P!P?EITqGONd$)QI*Wd3t0At7WHy&Cu-E6@aN*`N*U;7w55%6 zZfTUm%H0?|S~C^+orGk)xiS@KN`k?M9BlN%PI!$2difbVah1i)g7=DQIGSYE*Hv%l zv%Y{+;TvH;DrKw?)2P!_s*SUts0-pHIA6efV*36P@~tWC7NAb`U+kGVN|ji8o%JVSA)@lD>+!YfH~F?QFHUqy=`caPZ-m*&+r77t1P33Ul~ z3Eqy;-}-L636!i1a*#rLsoVXmQ)do-xmZDNyim6LkZ0|4#prx-t$an=87YUW|Fv1; z+fPnc4<@>rWL5LFBEf3PR?t2I&!tT@pNyUUlHi>Y@vGm!#hO+iXlX_vSWQPOA^ot4 zI*8X=7Yp|WEUO97z#PbIU1byJZaN9LxI7~ekuFz#8Kn4RPt)+@XRy%lXXXsMq}JlE zQl29MTfE&YRNqESKjpldHA!8}$nEZv8Ci!kh&25~wDg%Kl(K@7~v!R$3l%NEAQPm)#7 zW!sikgj@yKIc_hCIyfdtiPWgbV+2mVf7~;q3b`7VW&n>W1gLjfb{kc$f!}N+{72!! z{8qRVY$K#s&;UR>8~}j+Tj849ySSK{*jn3L{_&Y98bgT%qL^Ld9~{r#=-?uB;YCNG zFszFkML;7{hZHd37k~Aa>(DE8OMSy43F`Jedv9TZC1VmMCmH?18(TTmqs-ANAq-j& zZqaVb66D}>fe(YX3`&Q@pf25s4$@b-JOD@(Al~)?kVFQVq@Ul)u9Eg+8&N$tTWGV& zU*+Vi)cUYjembc7Vo!-;iZG(4naK$E(Jr>Z;V<{{%=L6xFP{M22{g~wVB>iDs0#d) zj%AtaDjOy9sn6B+B=(W+H1`H;(%YW}UqbGB3G7vIbICVju0h26?RI?Vykz=QN98}# zXB)r`fQ$LT z47zFL&CcyxeZ*;qX}$@`W$X07=S3vz^nNy`=z!)kE5n3fR=HOB^H?W++ttVCjB3+F zGj}j^Id!dfFd>iPGer>+J=x(JiM#Wd)hWk16!%$&XEtTDHj2X9dl|RUtG0sqfKs?^ zz~glDH9U7667?4Lp)u05{9C5$omnCu!^z#f%DEGUiB3h0FcBJYnvddKIaTA)`GE=p z^POsD+wbeb+cTHluIk(cx+1=5xFN=ye6Or+fOL7kCN7#9fN8=9r#%(A@@VI+@S5($@3}BgkCOO$;-A~t^;RHPr3ixmT{#5y6l0tkLOV;V;iJg zx~>fu+A~0Oh3~r@az948|3uFT+bn1}uDY7qu&Alj^Ei{mkxn1#G#$yfv||23m=51R zrH|)In`6JY!@k77Vm`?w$9zEH3gk!eF@vNG=TM>@rClFQE;70KnWCNF?~BDprzDWw zO9I`O^c3N}1%b9O)+g?i6iqWbOp{y2(^Whd^QJC{Q=L)1AxF2Nqe$%vyg*Jcf7N`FA2@L2R0D$rD`uO7k2Xy}90omXBK{#pND4x?WV2j4E zm*_0QX)W5XtOR>Lc~~|x7q2*b&Pn*(j~=UUxo(BzgV<7ojj22E3zo%kr9!GE%VZ&n3S3KrYtn(6NDLWyv3c< zulD@e3}g)%HyeeK*$QN2LqYEfxxZ6pX+w5sofIE*Ec8QT!CLoa5eT?v;jlGF##$0( zLMzIk4E@Q5LyqvWuonr1^@+8R3YY1IzbaJc9cXw>D$0XDH0y1cRoESDK*q^tAfe>$ zc<+~@rGu)uBc6uY=Hd*GUet0yFWd2-rbpXHeA^ko*JR|-ZYAEHMA!}6C{UO!ni^Cl zV=M>d(0UWLRR3jV-p)u>`sR0RM7!iKB_$DB1HgPnK%{-YV>fTu%N-E7AM?0X`Te3< z#Ovnp8g}(Ys&LhKG5{F%fztEN=DbYg;OpCUW#v3xPlWNuPtqTPQ1r!2h;c%1k`jV9 zty~by#u(v8%t7%=t*oG4>93n!KX!?Cod+~Op8~WbsJJZD3%#J~LnyGr2)(xiW`yY|K&w&asaB|NRJ zw>eW&UIBKvKOPT`YB8=aexP92I!C=wSuZz)&Ixh;L|RRXHpqif1K&liKPimDerRb8 z{dQ|8IX+EKbBdly5aXHeIL4cmOqn!pa9!r8gjS(0f{3ea30gZ;U0L#r6YF5h9Xwfs ztS3P&%LL{lg}FMZd%iN?JK_}0*MyXl)^zeJA9W=^l6bS`gu3p!_l^1PV;{0ZZK-FF zhK1`yJ?fA)*^l%LTa#4{SJ?qgiLOxwM+3{A6nveNKgFT)KbEH=0NwIHLH9fCCuoh9 zl9P^Cg0XGNzdhgRy6mZEK|gZkI#sk5D-{Z9ZTypZ{Kp*7I=-H+_Lri{PWOPO(6R*S zL8g0pBD)PKrom}xAWuM#fN7%zr5RO`Rw+rCxOR(j>68&W*36jyphE9!aQU_EBZbP> zq_gm6>B2DKo@<#zGXHS?Ux1e)o$Vb~-6XnWII_5wc7JAJiVN_wob7{zv6%6=0OiFr z8W-~s({9P^L`!xi0ZqoOfNlMzej@$O z3j_mwwDhmryYz9d2_8Ga+uE2%x#cnf9j_MTo8F2_t>E46Ck67H^G)^? zN=pRmqKboAhoCP^o9PORJ&6SFY5tFvoF}nDVAToc3agR06T8$R{nRoghI`RXuUyE^ zKemWJwnl4p#oqP2E10StS_ihG1E+|%yNi}WF{O2WrCD@TtCLTg^X_wKMoSdV;h>i1 zsC*HJ(!8e)ZmPUTMDK1b9_`0b?Ax1GZW|imOF*30O6aZ8xaC~IC2g5e=p`S~cDSn| zgd}|Z@fHKk-|)51e-drSgSgrVD`05hNYgSiIzS=!{q0QmGk7u{=CND1av?1m-j=2; z_#j-MkvIlf;m}zGRb~jKiA#``zRf;aIRp`kZkDbeI+D9*qWMwMDoq4?PvmCw`1y9Z%s6)#i zY)@ZGAuQ!o9oZ|xs*}MVC&Vr&<=8iocIWl04DU&6v7^{z~;bd1%A#pybNp*#L!wj?hEWp8@jjEgA96-L|+hj1__iW%> zn%p#MIaPG(UNyWadK1szb)+@}@QL_EBW(XBU#STV#wi(-y>wDDW6q)?A}+~RZ`{I} z-Dm%XyF-5A^OA(#*~4?A=CbNy$(Xxrriu@Jd7tt+)%-!xQnN>7Gld%1M=;ZEbHFwL8>)YF6sh!LP=XqAV$T4GKNS++><@p4kf%aa3dv)QmGy%8iB zT!9t@r@6-Lco)c+yO9T4B7cGU&+oldFHympIit4b_ix?hw*>xkz^f>xBrEk^U4zBO z#lgNwMGU!@4YTtWk9uztrc;N`6H|HfeUa^w2J})Rm34md(+XFR2GR7V_R{R^g%y($ zI-d7@T*j?A3S~?@9=XEB8m$GMxlgf3nb*R1DP5W;1V{YB)$VlzGT~jQ-aUz*NSUX?K(B^KI zwI)-)+iGEjE{EC~$JQZ!rce5A;`dwFLqUrG{(lW5s^6>obG`fL`R{fT^8Xu!0=xlC zco{G0#Zy6$g&7}me||91gU zFBQUnfRo8aLVse8iq}8+-xK`z&iZ=-3&Q`i&;EY@f=_80XTPzV7jFNGD)Mmff4&^t O?|TIb01$cmC;K0RCy$Z< diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java index c331deb134..073400fd68 100644 --- a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java @@ -1,5 +1,6 @@ /* * Copyright © 2016-2018 European Support Limited + * Copyright © 2021 Nokia * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -104,7 +105,7 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate final OnboardingPackageProcessor onboardingPackageProcessor = new OnboardingPackageProcessor(filename, fileToUploadBytes); if (onboardingPackageProcessor.hasErrors()) { final UploadFileResponseDto uploadFileResponseDto = - buildUploadResponseWithError(onboardingPackageProcessor.getErrorMessageSet().toArray(new ErrorMessage[0])); + buildUploadResponseWithError(onboardingPackageProcessor.getErrorMessages().toArray(new ErrorMessage[0])); return Response.ok(uploadFileResponseDto).build(); } diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzer.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzer.java new file mode 100644 index 0000000000..ecb3ac62ed --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzer.java @@ -0,0 +1,73 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nokia + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.manifest.FileData.Type; +import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent; + +public class ManifestAnalyzer { + + private final ManifestContent manifest; + + private final static Set HEAT_TYPES = Collections.singleton(Type.HEAT); + + private final static Set HELM_TYPES = Collections.singleton(Type.HELM); + + public ManifestAnalyzer(ManifestContent manifest) { + this.manifest = manifest; + } + + public boolean hasHeatEntries() { + return hasEntriesOfType(HEAT_TYPES); + } + + public boolean hasHelmEntries() { + return hasEntriesOfType(HELM_TYPES); + } + + public List getHelmEntries() { + List entries = new ArrayList<>(); + if (hasFileData()) { + for (FileData d : manifest.getData()) { + if (HELM_TYPES.contains(d.getType())) { + entries.add(d); + } + } + } + return entries; + } + + private boolean hasEntriesOfType(Set types) { + boolean result = false; + if (hasFileData()) { + result = manifest.getData().stream().anyMatch(fileData -> types.contains(fileData.getType())); + } + return result; + } + + private boolean hasFileData() { + return manifest != null && manifest.getData() != null && !manifest.getData().isEmpty(); + } +} diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessor.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessor.java index a40f2ebd30..e863f34696 100644 --- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessor.java +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessor.java @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation + * Copyright (C) 2021 Nokia * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +20,7 @@ package org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding; +import static org.openecomp.sdc.common.errors.Messages.COULD_NOT_READ_MANIFEST_FILE; import static org.openecomp.sdc.common.errors.Messages.PACKAGE_EMPTY_ERROR; import static org.openecomp.sdc.common.errors.Messages.PACKAGE_INVALID_ERROR; import static org.openecomp.sdc.common.errors.Messages.PACKAGE_INVALID_EXTENSION; @@ -35,6 +37,7 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -47,89 +50,157 @@ import org.apache.commons.io.FilenameUtils; import org.openecomp.core.utilities.file.FileContentHandler; import org.openecomp.core.utilities.json.JsonUtil; import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum; +import org.openecomp.sdc.common.utils.CommonUtil; import org.openecomp.sdc.common.utils.SdcCommon; import org.openecomp.sdc.common.zip.exception.ZipException; -import org.openecomp.sdc.common.utils.CommonUtil; import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.datatypes.error.ErrorMessage; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding.validation.CnfPackageValidator; import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardPackage; import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardPackageInfo; import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardSignedPackage; public class OnboardingPackageProcessor { + private static final Logger LOGGER = LoggerFactory.getLogger(OnboardingPackageProcessor.class); private static final String CSAR_EXTENSION = "csar"; private static final String ZIP_EXTENSION = "zip"; - private static boolean helmBase = false; private final String packageFileName; private final byte[] packageFileContent; - private FileContentHandler onboardPackageContentHandler; - private Set errorMessageSet = new HashSet<>(); - private OnboardPackageInfo onboardPackageInfo; + private FileContentHandler packageContent; + private final Set errorMessages = new HashSet<>(); + private final OnboardPackageInfo onboardPackageInfo; + private final CnfPackageValidator cnfPackageValidator; public OnboardingPackageProcessor(final String packageFileName, final byte[] packageFileContent) { this.packageFileName = packageFileName; this.packageFileContent = packageFileContent; + this.cnfPackageValidator = new CnfPackageValidator(); onboardPackageInfo = processPackage(); } + public Optional getOnboardPackageInfo() { + return Optional.ofNullable(onboardPackageInfo); + } + + public boolean hasErrors() { + return !errorMessages.isEmpty(); + } + + public boolean hasNoErrors() { + return errorMessages.isEmpty(); + } + + public Set getErrorMessages() { + return errorMessages; + } + private OnboardPackageInfo processPackage() { - if (!hasValidExtension()) { - final String message = PACKAGE_INVALID_EXTENSION.formatMessage(packageFileName, String.join(", ", CSAR_EXTENSION, ZIP_EXTENSION)); - reportError(ErrorLevel.ERROR, message); - return null; - } - try { - onboardPackageContentHandler = CommonUtil.getZipContent(packageFileContent); - } catch (final ZipException e) { - final String message = PACKAGE_PROCESS_ERROR.formatMessage(packageFileName); - LOGGER.error(message, e); - reportError(ErrorLevel.ERROR, message); - return null; + OnboardPackageInfo packageInfo = null; + validateFile(); + if (hasNoErrors()) { + final String packageName = FilenameUtils.getBaseName(packageFileName); + final String packageExtension = FilenameUtils.getExtension(packageFileName); + + if (hasSignedPackageStructure()) { + packageInfo = processSignedPackage(packageName, packageExtension); + } else { + if (packageExtension.equalsIgnoreCase(CSAR_EXTENSION)) { + packageInfo = processCsarPackage(packageName, packageExtension); + } else if (packageExtension.equalsIgnoreCase(ZIP_EXTENSION)) { + packageInfo = processOnapNativeZipPackage(packageName, packageExtension); + } + } } - if (isPackageEmpty()) { - final String message = PACKAGE_EMPTY_ERROR.formatMessage(packageFileName); + return packageInfo; + } + + private void validateFile() { + if (!hasValidExtension()) { + String message = PACKAGE_INVALID_EXTENSION + .formatMessage(packageFileName, String.join(", ", CSAR_EXTENSION, ZIP_EXTENSION)); reportError(ErrorLevel.ERROR, message); - return null; + } else { + try { + packageContent = CommonUtil.getZipContent(packageFileContent); + if (isPackageEmpty()) { + String message = PACKAGE_EMPTY_ERROR.formatMessage(packageFileName); + reportError(ErrorLevel.ERROR, message); + } + } catch (final ZipException e) { + String message = PACKAGE_PROCESS_ERROR.formatMessage(packageFileName); + reportError(ErrorLevel.ERROR, message); + LOGGER.error(message, e); + } } + } - final String packageName = FilenameUtils.getBaseName(packageFileName); - final String packageExtension = FilenameUtils.getExtension(packageFileName); + private OnboardPackageInfo processCsarPackage(String packageName, String packageExtension) { + OnboardPackage onboardPackage = new OnboardPackage(packageName, packageExtension, + ByteBuffer.wrap(packageFileContent), new OnboardingPackageContentHandler(packageContent)); + return new OnboardPackageInfo(onboardPackage, OnboardingTypesEnum.CSAR); + } - if (hasSignedPackageStructure()) { - return processSignedPackage(packageName, packageExtension); - } else { - if (packageExtension.equalsIgnoreCase(CSAR_EXTENSION)) { + private OnboardPackageInfo processOnapNativeZipPackage(String packageName, String packageExtension) { + ManifestContent manifest = getManifest(); + if (manifest != null) { + List errors = validateZipPackage(manifest); + if (errors.isEmpty()) { final OnboardPackage onboardPackage = new OnboardPackage(packageName, packageExtension, - ByteBuffer.wrap(packageFileContent), new OnboardingPackageContentHandler(onboardPackageContentHandler)); - return new OnboardPackageInfo(onboardPackage, OnboardingTypesEnum.CSAR); - } else if (packageExtension.equalsIgnoreCase(ZIP_EXTENSION)) { - addDummyHeat(); - final OnboardPackage onboardPackage = new OnboardPackage(packageName, packageExtension, - ByteBuffer.wrap(packageFileContent), onboardPackageContentHandler); + ByteBuffer.wrap(packageFileContent), packageContent); return new OnboardPackageInfo(onboardPackage, OnboardingTypesEnum.ZIP); + } else { + errors.forEach(message -> reportError(ErrorLevel.ERROR, message)); + } + } else { + reportError(ErrorLevel.ERROR, + COULD_NOT_READ_MANIFEST_FILE.formatMessage(SdcCommon.MANIFEST_NAME, packageFileName)); + } + return null; + } + + List validateZipPackage(ManifestContent manifest) { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest); + List errors = Collections.emptyList(); + if (analyzer.hasHelmEntries()) { + if (shouldValidateHelmPackage(analyzer)) { + errors = cnfPackageValidator.validateHelmPackage(analyzer.getHelmEntries()); } } + addDummyHeat(manifest); + return errors; + } - reportError(ErrorLevel.ERROR, PACKAGE_INVALID_ERROR.formatMessage(packageFileName)); - return null; + boolean shouldValidateHelmPackage(ManifestAnalyzer analyzer) { + return analyzer.hasHelmEntries() && !analyzer.hasHeatEntries(); } - private void addDummyHeat() { + private ManifestContent getManifest() { + ManifestContent manifest = null; + try (InputStream zipFileManifest = packageContent.getFileContentAsStream(SdcCommon.MANIFEST_NAME)) { + manifest = JsonUtil.json2Object(zipFileManifest, ManifestContent.class); + + } catch (Exception e) { + final String message = COULD_NOT_READ_MANIFEST_FILE.formatMessage(SdcCommon.MANIFEST_NAME, packageFileName); + LOGGER.error(message, e); + } + return manifest; + } + + private void addDummyHeat(ManifestContent manifestContent) { // temporary fix for adding dummy base List newfiledata = new ArrayList<>(); - try (InputStream zipFileManifest = onboardPackageContentHandler.getFileContentAsStream(SdcCommon.MANIFEST_NAME)) { - ManifestContent manifestContent = - JsonUtil.json2Object(zipFileManifest, ManifestContent.class); + try { + boolean heatBase = false; for (FileData fileData : manifestContent.getData()) { if (Objects.nonNull(fileData.getType()) && - fileData.getType().equals(FileData.Type.HELM) && fileData.getBase()) { - helmBase = true; + fileData.getType().equals(FileData.Type.HELM) && fileData.getBase()) { + heatBase = true; fileData.setBase(false); FileData dummyHeat = new FileData(); dummyHeat.setBase(true); @@ -146,27 +217,28 @@ public class OnboardingPackageProcessor { String filePath = new File("").getAbsolutePath() + "/resources"; File envFilePath = new File(filePath + "/base_template.env"); File baseFilePath = new File(filePath + "/base_template.yaml"); - try ( - InputStream envStream = new FileInputStream(envFilePath); - InputStream baseStream = new FileInputStream(baseFilePath);) { - onboardPackageContentHandler.addFile("base_template_dummy_ignore.env", envStream); - onboardPackageContentHandler.addFile("base_template_dummy_ignore.yaml", baseStream); + try (InputStream envStream = new FileInputStream(envFilePath); + InputStream baseStream = new FileInputStream(baseFilePath)) { + packageContent.addFile("base_template_dummy_ignore.env", envStream); + packageContent.addFile("base_template_dummy_ignore.yaml", baseStream); } catch (Exception e) { LOGGER.error("Failed creating input stream {}", e); } } } - if (helmBase) { + if (heatBase) { manifestContent.getData().addAll(newfiledata); - InputStream manifestContentStream = new ByteArrayInputStream((JsonUtil.object2Json(manifestContent)).getBytes(StandardCharsets.UTF_8)); - onboardPackageContentHandler.remove(SdcCommon.MANIFEST_NAME); - onboardPackageContentHandler.addFile(SdcCommon.MANIFEST_NAME, manifestContentStream); + InputStream manifestContentStream = new ByteArrayInputStream( + (JsonUtil.object2Json(manifestContent)).getBytes(StandardCharsets.UTF_8)); + packageContent.remove(SdcCommon.MANIFEST_NAME); + packageContent.addFile(SdcCommon.MANIFEST_NAME, manifestContentStream); } } catch (Exception e) { final String message = PACKAGE_INVALID_ERROR.formatMessage(packageFileName); LOGGER.error(message, e); } } + private boolean hasValidExtension() { final String packageExtension = FilenameUtils.getExtension(packageFileName); return packageExtension.equalsIgnoreCase(CSAR_EXTENSION) || packageExtension.equalsIgnoreCase(ZIP_EXTENSION); @@ -182,12 +254,12 @@ public class OnboardingPackageProcessor { final String certificateFilePath = findCertificateFilePath().orElse(null); final OnboardSignedPackage onboardSignedPackage = new OnboardSignedPackage(packageName, packageExtension, ByteBuffer.wrap(packageFileContent), - onboardPackageContentHandler, signatureFilePath, internalPackagePath, certificateFilePath); + packageContent, signatureFilePath, internalPackagePath, certificateFilePath); final String internalPackageName = FilenameUtils.getName(internalPackagePath); final String internalPackageBaseName = FilenameUtils.getBaseName(internalPackagePath); final String internalPackageExtension = FilenameUtils.getExtension(internalPackagePath); - final byte[] internalPackageContent = onboardPackageContentHandler.getFileContent(internalPackagePath); + final byte[] internalPackageContent = packageContent.getFileContent(internalPackagePath); final OnboardPackage onboardPackage; try { final OnboardingPackageContentHandler fileContentHandler = @@ -205,19 +277,11 @@ public class OnboardingPackageProcessor { } private void reportError(final ErrorLevel errorLevel, final String message) { - errorMessageSet.add(new ErrorMessage(errorLevel, message)); - } - - public boolean hasErrors() { - return !errorMessageSet.isEmpty(); - } - - public Set getErrorMessageSet() { - return errorMessageSet; + errorMessages.add(new ErrorMessage(errorLevel, message)); } private Optional findInternalPackagePath() { - return onboardPackageContentHandler.getFileList().stream() + return packageContent.getFileList().stream() .filter(filePath -> { final String extension = FilenameUtils.getExtension(filePath); return CSAR_EXTENSION.equalsIgnoreCase(extension) || ZIP_EXTENSION.equalsIgnoreCase(extension); @@ -227,24 +291,24 @@ public class OnboardingPackageProcessor { } private boolean isPackageEmpty() { - return MapUtils.isEmpty(onboardPackageContentHandler.getFiles()); + return MapUtils.isEmpty(packageContent.getFiles()); } private boolean hasSignedPackageStructure() { - if (MapUtils.isEmpty(onboardPackageContentHandler.getFiles()) || !CollectionUtils.isEmpty( - onboardPackageContentHandler.getFolderList())) { + if (MapUtils.isEmpty(packageContent.getFiles()) || !CollectionUtils.isEmpty( + packageContent.getFolderList())) { return false; } - final int numberOfFiles = onboardPackageContentHandler.getFileList().size(); + final int numberOfFiles = packageContent.getFileList().size(); if (numberOfFiles == 2) { - return hasOneInternalPackageFile(onboardPackageContentHandler) && - hasOneSignatureFile(onboardPackageContentHandler); + return hasOneInternalPackageFile(packageContent) && + hasOneSignatureFile(packageContent); } if (numberOfFiles == 3) { - return hasOneInternalPackageFile(onboardPackageContentHandler) && - hasOneSignatureFile(onboardPackageContentHandler) && - hasOneCertificateFile(onboardPackageContentHandler); + return hasOneInternalPackageFile(packageContent) && + hasOneSignatureFile(packageContent) && + hasOneCertificateFile(packageContent); } return false; @@ -272,20 +336,19 @@ public class OnboardingPackageProcessor { } private Optional findSignatureFilePath() { - final Map files = onboardPackageContentHandler.getFiles(); + final Map files = packageContent.getFiles(); return files.keySet().stream() - .filter(fileName -> ALLOWED_SIGNATURE_EXTENSIONS.contains(FilenameUtils.getExtension(fileName).toLowerCase())) + .filter( + fileName -> ALLOWED_SIGNATURE_EXTENSIONS.contains(FilenameUtils.getExtension(fileName).toLowerCase())) .findFirst(); } private Optional findCertificateFilePath() { - final Map files = onboardPackageContentHandler.getFiles(); + final Map files = packageContent.getFiles(); return files.keySet().stream() - .filter(fileName -> ALLOWED_CERTIFICATE_EXTENSIONS.contains(FilenameUtils.getExtension(fileName).toLowerCase())) + .filter( + fileName -> ALLOWED_CERTIFICATE_EXTENSIONS.contains(FilenameUtils.getExtension(fileName).toLowerCase())) .findFirst(); } - public Optional getOnboardPackageInfo() { - return Optional.ofNullable(onboardPackageInfo); - } } diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidator.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidator.java new file mode 100644 index 0000000000..8520672cd3 --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidator.java @@ -0,0 +1,77 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nokia + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding.validation; + +import static org.openecomp.sdc.common.errors.Messages.MANIFEST_VALIDATION_HELM_IS_BASE_MISSING; +import static org.openecomp.sdc.common.errors.Messages.MANIFEST_VALIDATION_HELM_IS_BASE_NOT_SET; +import static org.openecomp.sdc.common.errors.Messages.MANIFEST_VALIDATION_HELM_IS_BASE_NOT_UNIQUE; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; + +public class CnfPackageValidator { + + public List validateHelmPackage(List modules) { + List messages = Collections.emptyList(); + + if (modules != null && !modules.isEmpty()) { + Stats stats = calculateStats(modules); + messages = createErrorMessages(stats); + } + + return messages; + } + + private Stats calculateStats(List modules) { + Stats stats = new Stats(); + for (FileData mod : modules) { + if (mod.getBase() == null) { + stats.without++; + } else if (mod.getBase()) { + stats.base++; + } + } + return stats; + } + + private List createErrorMessages(Stats stats) { + List messages = new ArrayList<>(); + + if (stats.without > 0) { + messages.add(MANIFEST_VALIDATION_HELM_IS_BASE_MISSING.formatMessage(stats.without)); + } + + if (stats.base == 0) { + messages.add(MANIFEST_VALIDATION_HELM_IS_BASE_NOT_SET.getErrorMessage()); + } else if (stats.base > 1) { + messages.add(MANIFEST_VALIDATION_HELM_IS_BASE_NOT_UNIQUE.getErrorMessage()); + } + + return messages; + } + + private static class Stats { + + private int base = 0; + private int without = 0; + } +} diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzerTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzerTest.java new file mode 100644 index 0000000000..51b34b6bb4 --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/ManifestAnalyzerTest.java @@ -0,0 +1,152 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nokia + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.manifest.FileData.Type; +import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent; + + +public class ManifestAnalyzerTest { + + @Test + public void shouldAnalyzeManifestWithOnlyHelmEntries() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(helmOnly())); + + assertThat(analyzer.hasHelmEntries(), is(true)); + assertThat(analyzer.hasHeatEntries(), is(false)); + assertThat(analyzer.getHelmEntries().size(), is(3)); + assertThatContainsOnlyHelm(analyzer.getHelmEntries()); + } + + @Test + public void shouldAnalyzeManifestWithoutHelmEntries() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(withoutHelm())); + + assertThat(analyzer.hasHelmEntries(), is(false)); + assertThat(analyzer.hasHeatEntries(), is(true)); + assertThat(analyzer.getHelmEntries().size(), is(0)); + } + + @Test + public void shouldAnalyzeManifestWitoutyHelmAndHeatEntries() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(withoutHelmAndHeat())); + + assertThat(analyzer.hasHelmEntries(), is(false)); + assertThat(analyzer.hasHeatEntries(), is(false)); + assertThat(analyzer.getHelmEntries().size(), is(0)); + } + + @Test + public void shouldAnalyzeManifestWithHelmAndHeatEntries() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(helmAndHeat())); + + assertThat(analyzer.hasHelmEntries(), is(true)); + assertThat(analyzer.hasHeatEntries(), is(true)); + assertThat(analyzer.getHelmEntries().size(), is(2)); + assertThatContainsOnlyHelm(analyzer.getHelmEntries()); + } + + @Test + public void shouldAnalyzeManifestWithMultipleTypeEntries() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(helmAndHeatAndOther())); + + assertThat(analyzer.hasHelmEntries(), is(true)); + assertThat(analyzer.hasHeatEntries(), is(true)); + assertThat(analyzer.getHelmEntries().size(), is(2)); + assertThatContainsOnlyHelm(analyzer.getHelmEntries()); + } + + private void assertThatContainsOnlyHelm(List entries) { + entries.forEach(fileData -> assertThat(fileData.getType(), is(Type.HELM))); + } + + private ManifestContent manifest(List entries) { + ManifestContent manifest = new ManifestContent(); + manifest.setData(entries); + return manifest; + } + + private List withoutHelm() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.HEAT, true)); + entries.add(createFileData(Type.CHEF, false)); + entries.add(createFileData(Type.PM_DICTIONARY, false)); + + return entries; + } + + private List withoutHelmAndHeat() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.PUPPET, true)); + entries.add(createFileData(Type.CHEF, false)); + entries.add(createFileData(Type.PM_DICTIONARY, false)); + + return entries; + } + + private List helmOnly() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.HELM, true)); + entries.add(createFileData(Type.HELM, false)); + entries.add(createFileData(Type.HELM, false)); + + return entries; + } + + private List helmAndHeat() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.HELM, true)); + entries.add(createFileData(Type.HELM, false)); + entries.add(createFileData(Type.HEAT, false)); + + return entries; + } + + private List helmAndHeatAndOther() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.HELM, true)); + entries.add(createFileData(Type.HELM, false)); + entries.add(createFileData(Type.HEAT, false)); + entries.add(createFileData(Type.PUPPET, false)); + entries.add(createFileData(Type.CHEF, false)); + + return entries; + } + + private FileData createFileData(Type type, Boolean base) { + FileData f = new FileData(); + f.setType(type); + f.setBase(base); + return f; + } + +} diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorTest.java index a62aea761a..d6327866f4 100644 --- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorTest.java +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorTest.java @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation + * Copyright (C) 2021 Nokia * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +26,9 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; +import static org.openecomp.sdc.common.errors.Messages.COULD_NOT_READ_MANIFEST_FILE; +import static org.openecomp.sdc.common.errors.Messages.MANIFEST_VALIDATION_HELM_IS_BASE_MISSING; +import static org.openecomp.sdc.common.errors.Messages.MANIFEST_VALIDATION_HELM_IS_BASE_NOT_SET; import static org.openecomp.sdc.common.errors.Messages.PACKAGE_EMPTY_ERROR; import static org.openecomp.sdc.common.errors.Messages.PACKAGE_INVALID_EXTENSION; @@ -49,6 +53,7 @@ import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardPackageInfo; @RunWith(Parameterized.class) public class OnboardingPackageProcessorTest { + private static final String BASE_DIR = "/vspmanager.csar/"; private final String packageName; private final byte[] packageBytes; @@ -56,8 +61,8 @@ public class OnboardingPackageProcessorTest { private final OnboardingTypesEnum expectedPackageType; public OnboardingPackageProcessorTest(final String packageName, final byte[] packageBytes, - final Set expectedErrorSet, - final OnboardingTypesEnum expectedPackageType) { + final Set expectedErrorSet, + final OnboardingTypesEnum expectedPackageType) { this.packageName = packageName; this.packageBytes = packageBytes; this.expectedErrorSet = expectedErrorSet; @@ -87,23 +92,42 @@ public class OnboardingPackageProcessorTest { {"successfulUpload.csar", getFileBytes("successfulUpload.csar"), Collections.emptySet(), OnboardingTypesEnum.CSAR}, - {"fakeNonSignedZipPackage.zip", getFileBytes("signing/fakeNonSignedZipPackage.zip"), Collections.emptySet(), + {"helm-package-valid.zip", getFileBytes("helm-package-valid.zip"), Collections.emptySet(), + OnboardingTypesEnum.ZIP}, + + {"helm-package-invalid.zip", getFileBytes("helm-package-invalid-missing-flag-isbase.zip"), ImmutableSet.of( + new ErrorMessage(ErrorLevel.ERROR, + MANIFEST_VALIDATION_HELM_IS_BASE_NOT_SET.getErrorMessage()), + new ErrorMessage(ErrorLevel.ERROR, + MANIFEST_VALIDATION_HELM_IS_BASE_MISSING.formatMessage(3) + ) + ), + OnboardingTypesEnum.ZIP}, + + {"fakeNonSignedZipPackage.zip", getFileBytes("signing/fakeNonSignedZipPackage.zip"), ImmutableSet.of( + new ErrorMessage(ErrorLevel.ERROR, + COULD_NOT_READ_MANIFEST_FILE.formatMessage("MANIFEST.json", "fakeNonSignedZipPackage.zip") + )), OnboardingTypesEnum.ZIP} }); } @Test public void processPackage() { - final OnboardingPackageProcessor onboardingPackageProcessor = new OnboardingPackageProcessor(packageName, packageBytes); + final OnboardingPackageProcessor onboardingPackageProcessor = new OnboardingPackageProcessor(packageName, + packageBytes); assertThat("Should contains errors", onboardingPackageProcessor.hasErrors(), is(!expectedErrorSet.isEmpty())); - assertThat("Should have the same number of errors", onboardingPackageProcessor.getErrorMessageSet().size(), equalTo(expectedErrorSet.size())); + assertThat("Should have the same number of errors", onboardingPackageProcessor.getErrorMessages().size(), + equalTo(expectedErrorSet.size())); if (expectedErrorSet.size() > 0) { - assertThat("Should have the expected errors", onboardingPackageProcessor.getErrorMessageSet(), containsInAnyOrder(expectedErrorSet.toArray())); + assertThat("Should have the expected errors", onboardingPackageProcessor.getErrorMessages(), + containsInAnyOrder(expectedErrorSet.toArray())); return; } final OnboardPackageInfo onboardPackageInfo = onboardingPackageProcessor.getOnboardPackageInfo().orElse(null); assertThat("Should build onboardPackageInfo", onboardPackageInfo, is(notNullValue())); - assertThat("Should have the expected package type", onboardPackageInfo.getPackageType(), is(equalTo(expectedPackageType))); + assertThat("Should have the expected package type", onboardPackageInfo.getPackageType(), + is(equalTo(expectedPackageType))); } private static byte[] getFileBytes(final String filePath) { @@ -117,4 +141,4 @@ public class OnboardingPackageProcessorTest { return null; } -} \ No newline at end of file +} diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorUnitTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorUnitTest.java new file mode 100644 index 0000000000..a97a0f639a --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/OnboardingPackageProcessorUnitTest.java @@ -0,0 +1,143 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nokia + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.junit.Test; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; +import org.openecomp.sdc.heat.datatypes.manifest.FileData.Type; +import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + + +public class OnboardingPackageProcessorUnitTest { + + private OnboardingPackageProcessor processor = new OnboardingPackageProcessor("unitTestPackage", null); + + @Test + public void shouldValidateZipPackage_helmWithoutHeat() { + assertThat(processor.validateZipPackage(manifest(withHelmWithoutHeat())).size(), is(0)); + } + + @Test + public void shouldValidateZipPackage_withHelmAndHeat() { + assertThat(processor.validateZipPackage(manifest(withHelmAndHeat())).size(), is(0)); + } + + @Test + public void shouldValidateZipPackage_withHelmWithoutHeat() { + assertThat(processor.validateZipPackage(manifest(withoutHelmWithoutHeat())).size(), is(0)); + } + + @Test + public void shouldValidateZipPackage_helmInvalid() { + assertThat(processor.validateZipPackage(manifest(withHelmInvalid())).size(), is(1)); + } + + @Test + public void shouldValidateHelmPackage() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(withHelmWithoutHeat())); + + assertThat(processor.shouldValidateHelmPackage(analyzer), is(true)); + } + + @Test + public void shouldNotValidateHelmPackage_emptyInput() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(empty())); + + assertThat(processor.shouldValidateHelmPackage(analyzer), is(false)); + } + + @Test + public void shouldNotValidateHelmPackage_containsHeatModule() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(withHelmAndHeat())); + + assertThat(processor.shouldValidateHelmPackage(analyzer), is(false)); + } + + @Test + public void shouldNotValidateHelmPackage_noHelmModule() { + ManifestAnalyzer analyzer = new ManifestAnalyzer(manifest(withoutHelmWithoutHeat())); + + assertThat(processor.shouldValidateHelmPackage(analyzer), is(false)); + } + + private ManifestContent manifest(List entries) { + ManifestContent manifest = new ManifestContent(); + manifest.setData(entries); + return manifest; + } + + private List empty() { + return Collections.emptyList(); + } + + private List withHelmAndHeat() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.HEAT, true)); + entries.add(createFileData(Type.HELM, false)); + entries.add(createFileData(Type.PM_DICTIONARY, false)); + + return entries; + } + + private List withHelmWithoutHeat() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.HELM, true)); + entries.add(createFileData(Type.CHEF, false)); + entries.add(createFileData(Type.PM_DICTIONARY, false)); + + return entries; + } + + private List withHelmInvalid() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.HELM, false)); + entries.add(createFileData(Type.CHEF, false)); + entries.add(createFileData(Type.PM_DICTIONARY, false)); + + return entries; + } + + private List withoutHelmWithoutHeat() { + List entries = new ArrayList<>(); + + entries.add(createFileData(Type.CHEF, false)); + entries.add(createFileData(Type.PM_DICTIONARY, false)); + + return entries; + } + + + private FileData createFileData(Type type, Boolean base) { + FileData f = new FileData(); + f.setType(type); + f.setBase(base); + return f; + } + +} diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidatorTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidatorTest.java new file mode 100644 index 0000000000..e969c3d389 --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/onboarding/validation/CnfPackageValidatorTest.java @@ -0,0 +1,137 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nokia + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding.validation; + +import static org.hamcrest.Matchers.emptyIterable; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.junit.Test; +import org.openecomp.sdc.heat.datatypes.manifest.FileData; + +public class CnfPackageValidatorTest { + + private CnfPackageValidator validator = new CnfPackageValidator(); + + @Test + public void shouldBeValidForNullInput() { + List messages = validator.validateHelmPackage(null); + + assertThat(messages, is(emptyIterable())); + } + + @Test + public void shouldBeValidForEmptyInput() { + List messages = validator.validateHelmPackage(Collections.emptyList()); + + assertThat(messages, is(emptyIterable())); + } + + @Test + public void shouldBeValid() { + List messages = validator.validateHelmPackage(createValidInput()); + + assertThat(messages, is(emptyIterable())); + } + + @Test + public void shouldBeInvalidNoneIsMarkedAsBase() { + List messages = validator.validateHelmPackage(noneIsMarkedAsBase()); + + assertThat(messages.size(), is(1)); + assertThat(messages.get(0), is("None of charts is marked as 'isBase'.")); + } + + @Test + public void shouldBeInvalidMultipleAreMarkedAsBase() { + List messages = validator.validateHelmPackage(multipleAreMarkedAsBase()); + + assertThat(messages.size(), is(1)); + assertThat(messages.get(0), is("More than one chart is marked as 'isBase'.")); + } + + @Test + public void shouldBeInvalidIsBaseMissing() { + List messages = validator.validateHelmPackage(isBaseMissing()); + + assertThat(messages.size(), is(1)); + assertThat(messages.get(0), is("Definition of 'isBase' is missing in 2 charts.")); + } + + @Test + public void shouldBeInvalidDueMultipleReasons() { + List messages = validator.validateHelmPackage(invalidMultipleReasons()); + + assertThat(messages.size(), is(2)); + assertThat(messages.get(0), is("Definition of 'isBase' is missing in 1 charts.")); + assertThat(messages.get(1), is("None of charts is marked as 'isBase'.")); + } + + private List createValidInput() { + List files = new ArrayList<>(); + files.add(createFileData(true)); + files.add(createFileData(false)); + files.add(createFileData(false)); + return files; + } + + private List noneIsMarkedAsBase() { + List files = new ArrayList<>(); + files.add(createFileData(false)); + files.add(createFileData(false)); + files.add(createFileData(false)); + return files; + } + + private List multipleAreMarkedAsBase() { + List files = new ArrayList<>(); + files.add(createFileData(true)); + files.add(createFileData(true)); + files.add(createFileData(false)); + return files; + } + + private List isBaseMissing() { + List files = new ArrayList<>(); + files.add(createFileData(true)); + files.add(createFileData(null)); + files.add(createFileData(null)); + files.add(createFileData(false)); + return files; + } + + private List invalidMultipleReasons() { + List files = new ArrayList<>(); + files.add(createFileData(false)); + files.add(createFileData(null)); + files.add(createFileData(false)); + files.add(createFileData(false)); + return files; + } + + private FileData createFileData(Boolean base) { + FileData f = new FileData(); + f.setBase(base); + return f; + } +} diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/helm-package-invalid-missing-flag-isbase.zip b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/helm-package-invalid-missing-flag-isbase.zip new file mode 100644 index 0000000000000000000000000000000000000000..15b0f57554ab3930795bc7541035c12653cb480c GIT binary patch literal 1374 zcmWIWW@Zs#-~hs>F`hvTNPvq$fgw2~v8Y6^GBGzNG=!Id-9Jq!;W!Y3=+X*q21b?_ z%nS@*f|((}o1Fusoe6420NiBuScJ*dKv_?pmpFii*WA3Z(tr>cW@$`};4Nt8|A&;jEB3v*yg7?j*X{%gCs^!@RTGc-rb|++hDalA3J~@(;+>2>K70_IQ_!NB*KiEAz>K` z6g4ogr4hs;K6?guBg_S5N94o}3MClW(ijC~5}i4bjRoZl)h A=>Px# literal 0 HcmV?d00001 diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/helm-package-valid.zip b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/helm-package-valid.zip new file mode 100644 index 0000000000000000000000000000000000000000..397dceeb7992ef234c9338b73855f3edf17b0b96 GIT binary patch literal 1393 zcmWIWW@Zs#-~hs>F`hvTNPvq$fgw2~v8Y6^GBGzNG=!Id-9Jq!;W!kRR&X;gvb0vp^9G}JmBVmO+?lixo} zU|@c>{W;H1K1q%pFUe@SiM{^xtf-_6sk*XMLq{`;8x?)%j@ zJSQGF{@)YM)BesV!@z(6?3Yt)tL~QqT?=wC!Y?66eyL+*VBiJ%#n;i#)6F$FL@%p2 zKM(95MWA0m{sGZw{#pGjC?Fu@C!ICqsapWmO`NK!DfjGmNvRO^XbPSrk4gj`bqz^z%ApUOH^6H8iz+ zT_@|T)M4H54aN9H7*($zY7LTAx5+n6~UW46YC zy|{3B{^Aax_dp&&c##*$iy+T~5<+oma(-S4JicZPnfMYw^9(5Mm1JZVA^fsn(EEjv zNrV|SkHYd8C~9C}OCyLye2xw9MwkoAp~&eS6iP6#r7;S~Bs#w$8w<)T$Y~6eSzusG zqZ%UvX;}x^Xiy?Wb}?#5Z~_B}_#}&LE-1Yqn~NF}*MQ~{oq7ViS=m6oWd*{WK))^m ImX!<)05^iMe*gdg literal 0 HcmV?d00001 diff --git a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java index cf34984fe0..ab088a4dda 100644 --- a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java +++ b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java @@ -33,6 +33,7 @@ public enum Messages { PACKAGE_PROCESS_INTERNAL_PACKAGE_ERROR("Could not process internal package '%s'"), PACKAGE_INVALID_ERROR("Invalid package content '%s'"), PACKAGE_MISSING_INTERNAL_PACKAGE("Missing expected internal package"), + COULD_NOT_READ_MANIFEST_FILE("Could not read manifest file: %s [%s]"), INVALID_ZIP_FILE("Invalid zip file"), INVALID_CSAR_FILE("Invalid csar file"), CSAR_FILE_NOT_FOUND("Each CSAR file must contain %s file."), @@ -71,6 +72,9 @@ public enum Messages { MANIFEST_ERROR_WITH_LINE("%s;%nAt line %s: '%s'."), MANIFEST_PARSER_INTERNAL("Invalid manifest file"), MANIFEST_UNEXPECTED_ERROR("An unexpected error occurred while validating manifest '%s': %s"), + MANIFEST_VALIDATION_HELM_IS_BASE_MISSING("Definition of 'isBase' is missing in %d charts."), + MANIFEST_VALIDATION_HELM_IS_BASE_NOT_UNIQUE("More than one chart is marked as 'isBase'."), + MANIFEST_VALIDATION_HELM_IS_BASE_NOT_SET("None of charts is marked as 'isBase'."), METADATA_PARSER_INTERNAL("Invalid Metadata file"), METADATA_MISSING_OPTIONAL_FOLDERS("Missing folder %s in package"), METADATA_UNSUPPORTED_ENTRY("Following entry not supported in TOSCA.meta %s"), -- 2.16.6