From 614741e6fe06de777f98a95b88d148ba15f4e824 Mon Sep 17 00:00:00 2001 From: Tamar Ben-Shachar Date: Mon, 14 Dec 2015 18:02:07 -0800 Subject: [PATCH] dcos-4107 check that assets don't have same filename in `package bundle` --- cli/dcoscli/package/main.py | 20 +- cli/tests/data/package/cassandra.zip | Bin 27907 -> 27903 bytes .../create-directory/marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- .../assets/uris/cassandra-mesos-tar-gz | 0 .../assets/uris/cassandra-mesos.tar.gz | 0 .../invalid-asset-names-directory/config.json | 229 ++++++++++++++++++ .../images/icon-large.png | Bin 0 -> 17969 bytes .../images/icon-medium.png | Bin 0 -> 5070 bytes .../images/icon-small.png | Bin 0 -> 1920 bytes .../marathon.json.mustache | 74 ++++++ .../package.json | 18 ++ .../marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- .../marathon.json.mustache | 4 +- cli/tests/integrations/test_package_bundle.py | 13 + 21 files changed, 373 insertions(+), 21 deletions(-) create mode 100644 cli/tests/data/package/invalid-asset-names-directory/assets/uris/cassandra-mesos-tar-gz create mode 100644 cli/tests/data/package/invalid-asset-names-directory/assets/uris/cassandra-mesos.tar.gz create mode 100644 cli/tests/data/package/invalid-asset-names-directory/config.json create mode 100644 cli/tests/data/package/invalid-asset-names-directory/images/icon-large.png create mode 100644 cli/tests/data/package/invalid-asset-names-directory/images/icon-medium.png create mode 100644 cli/tests/data/package/invalid-asset-names-directory/images/icon-small.png create mode 100644 cli/tests/data/package/invalid-asset-names-directory/marathon.json.mustache create mode 100644 cli/tests/data/package/invalid-asset-names-directory/package.json diff --git a/cli/dcoscli/package/main.py b/cli/dcoscli/package/main.py index 002315e..16c7ead 100644 --- a/cli/dcoscli/package/main.py +++ b/cli/dcoscli/package/main.py @@ -4,6 +4,7 @@ import os import sys import tempfile import zipfile +from collections import defaultdict import dcoscli import docopt @@ -13,6 +14,7 @@ from dcos import (cmds, emitting, errors, http, marathon, options, package, from dcos.errors import DCOSException from dcoscli import tables from dcoscli.main import decorate_docopt_usage +from six import iteritems logger = util.get_logger(__name__) emitter = emitting.FlatEmitter() @@ -682,7 +684,23 @@ def _bundle_uris(uris_directory, zip_file): :rtype: None """ - for filename in sorted(os.listdir(uris_directory)): + uris = sorted(os.listdir(uris_directory)) + + # these uris will be found through a mustache template from the property + # name so make sure each name is unique. + uri_properties = defaultdict(list) + for name in uris: + uri_properties[name.replace('.', '-')].append(name) + + collisions = [uri_list for (prop, uri_list) in iteritems(uri_properties) + if len(uri_list) > 1] + + if collisions: + raise DCOSException( + 'Error bundling package. Multiple assets map to the same property ' + 'name (periods [.] are replaced with dashes [-]): {}'.format( + collisions)) + for filename in uris: fullpath = os.path.join(uris_directory, filename) zip_file.write(fullpath, arcname='assets/uris/{}'.format(filename)) diff --git a/cli/tests/data/package/cassandra.zip b/cli/tests/data/package/cassandra.zip index 10b47b18a91974d9a21f027a43f25c5c8be94d4d..581ad088667997ecd789bb0c411d2295c8caf975 100644 GIT binary patch delta 1343 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 a9_Uu5CQP0-HU95G2Y{;Ts5B_qM*j~$!JHic literal 0 HcmV?d00001 diff --git a/cli/tests/data/package/invalid-asset-names-directory/images/icon-small.png b/cli/tests/data/package/invalid-asset-names-directory/images/icon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..f072c7775ce4de615a4b9ffcac4b6eac6c2f2b0d GIT binary patch literal 1920 zcmV-`2Y>j9P)Px+I!Q!9RA>e5Sb0#CWf=eM!m_|}?6NF3atm^3NOmBFN2wiVLn^6hrQLTkH8tIb zO@B0H*_5SYj*ezAR9bnYjzuOGffynQsHhwY>;k(B?7_nJJa27bxw^1Q~zJ}(lTx!;aUSfrP*?ZR{qfdAWr9uIgt;3fl}5OR}1x2JnN;5LPBD)4x~ zO#rUpD}b%02FWB0BG8(&gY{#`zugBNLMFxm%j*oI2mg>S(P^0G2im6r`(<3G>gkx`IHfSYbDfGR|djB(?zb<cy8)wr?-?{_s7X zU-~Ah_E#W#!WI7^f(M2Lpi`&A$IIVEWo0F%7R-k&F%$cAW^AoLjpy@H;U$&e?eYfn zFwHF1KA^83>7jvmZAu1`!!&3$+0k_5FiJOnhSG0~VYOJ`CmjQHjc4Fys&q5ih#*7D_1LXdYQ4yBIhKZ}T3$0t{=c4eN zN*I+2Y|T%_^!QM;Q3w^5)FG(XjGVAQd`Ohy)G#nU(_@~+iStHgN;~DAlN{M<9(%G(D=%5Rg?;OaT=ZqipDc! z*QcvdQT7YPe*23c;(qYNa{|~~@&gW0d0e(~_1}yP4o8k*8{t`$odj)<8BgV= zU|T~wHXqX>Srvd3r9WD_Etpq&1p6Cxn59-=?$|_FD9i`j-%wS7;+4yVUEz_Dn3z9F zR3_dx&L>U*=(O#Kh>8-*1}jnfNYFwR#36=0JK|MAxIHT#>#G{kN7W`rrNH13 z%a4{3=sw*4_>-71bCw{jr`rgN*+Tn50Q{-VIF~pDaG?BGQIDk*zg)(8y1QXC8er7x zA@}t~a8w*LV{#A@6EF00MGBHpC87Ho=m5iUYIGU1)vnVcfCgUa<^UyelW>K`M2rx{EnO z0>E+036`3kE*h>@>L!y%r{V}1vHQF22%ttx+t!BT$Bts|9ShM$jaW?VC;^n);~BTi z66JAh_IN=;;i5aSW6QV5y*6KTp}f;G*q~sgFwT{W>rhD>cZ6&_i=V&0FrH)9L~(uJ zV^3i0W!aQ`W<34UE4U&z59&}2QqsmCp5ptqc?-ndMhVLj5giR~m9M|?CIOhoIM;?^ zJkJ>t0G{9w$2QLmSXOqn7*5T|q-0E_#EceUFe*M?9B7h8kH$4qrixfk%lxxErlh8# z@pywUngI@1h7I6s3;tex5H}ah{`(c5wm8ftT%9Y%RFw4oa44~aQLpb1$2-UG;ogUo#KT?WV$Qpu9=Mo>I@9d|;Eb7(8uxf$ zq?mTLj>iMem>H>Yj|WDIX=m$rJm8F(ks9}SV5FFKw$2~Lw6`m}BosdY0000