From 3fd2b6a0a4b86b13e44dd391dad8a80a4227f791 Mon Sep 17 00:00:00 2001 From: Ryan Beisner Date: Wed, 20 Jul 2016 22:18:01 +0000 Subject: [PATCH] Add .gitreview and clean up repo Add src/README.md placeholder to prevent inheritence of the base layer's readme file in the built charm. Use the official charms.openstack repo in test-requirements.txt. Use official designate-bind charm location in the Amulet tests. Remove upload-and-publish so as not to encourage out-of-band pushing and publishing. That is handled by CI. Fix a test filename typo. Add tests readme. Update tox.ini for Amulet environment variables. Update metadata.yaml, removing EOL release and adding tags. Fix unit tests Change-Id: If842a5409c2d284bc118d70d6e8caba7cb6205c3 --- .gitreview | 4 +++ README.md | 22 +++++++++++++++ src/README.md | 1 + src/lib/charm/__init__.pyc | Bin 0 -> 112 bytes src/lib/charm/openstack/__init__.pyc | Bin 0 -> 122 bytes src/lib/charm/openstack/designate.pyc | Bin 0 -> 21812 bytes src/metadata.yaml | 4 ++- src/reactive/designate_utils.py | 16 ++++++----- src/tests/README.md | 9 +++++++ src/tests/basic_deployment.py | 3 +-- src/tests/dev-basic-xenial-newton | 25 ++++++++++++++++++ src/tests/dev-basic-yakkety-newton | 23 ++++++++++++++++ ...trusty-mitaka => gate-basic-trusty-mitaka} | 0 src/tox.ini | 1 + test-requirements.txt | 2 +- tox.ini | 6 ++--- unit_tests/__init__.py | 2 ++ unit_tests/__init__.pyc | Bin 1290 -> 2086 bytes unit_tests/test_designate_handlers.py | 4 +++ unit_tests/test_designate_handlers.pyc | Bin 6567 -> 10472 bytes unit_tests/test_designate_utils.py | 9 +++++-- unit_tests/test_designate_utils.pyc | Bin 0 -> 7078 bytes .../test_lib_charm_openstack_designate.py | 2 +- .../test_lib_charm_openstack_designate.pyc | Bin 0 -> 19910 bytes upload-and-publish | 13 --------- 25 files changed, 117 insertions(+), 29 deletions(-) create mode 100644 .gitreview create mode 100644 README.md create mode 100644 src/README.md create mode 100644 src/lib/charm/__init__.pyc create mode 100644 src/lib/charm/openstack/__init__.pyc create mode 100644 src/lib/charm/openstack/designate.pyc create mode 100644 src/tests/README.md create mode 100755 src/tests/dev-basic-xenial-newton create mode 100755 src/tests/dev-basic-yakkety-newton rename src/tests/{bate-basic-trusty-mitaka => gate-basic-trusty-mitaka} (100%) create mode 100644 unit_tests/test_designate_utils.pyc create mode 100644 unit_tests/test_lib_charm_openstack_designate.pyc delete mode 100755 upload-and-publish diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..28fc2e8 --- /dev/null +++ b/.gitreview @@ -0,0 +1,4 @@ +[gerrit] +host=review.openstack.org +port=29418 +project=openstack/charm-designate.git diff --git a/README.md b/README.md new file mode 100644 index 0000000..fadc4f6 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# Overview + +This is a "source" charm, which is intended to be strictly the top +layer of a built charm. This structure declares that any included +layer assets are not intended to be consumed as a layer from a +functional or design standpoint. + +# Test and Build + +Building, pushing and publishing to the charm store is automated +by CI to ensure consistent flow. Manually building is useful for +development and testing, however. + +``` +tox -e pep8 +tox -e py34 # or py27 or py35 +tox -e build +``` + +# Contact Information + +Freenode IRC: #openstack-charms diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..02b5ef0 --- /dev/null +++ b/src/README.md @@ -0,0 +1 @@ +# Write me. diff --git a/src/lib/charm/__init__.pyc b/src/lib/charm/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6f48b15dbd984e6c2ed90606a3fd3e76e01eef1 GIT binary patch literal 112 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.4.1 charms.reactive mock>=1.2 coverage>=3.6 -git+https://github.com/gnuoy/charms.openstack.git@bug/general#egg=charms.openstack +git+https://github.com/openstack/charms.openstack#egg=charms.openstack diff --git a/tox.ini b/tox.ini index 615ecfc..26da278 100644 --- a/tox.ini +++ b/tox.ini @@ -27,10 +27,10 @@ commands = {posargs} [testenv:pep8] commands = flake8 {posargs} src/reactive src/lib unit_tests +# Disable py27 tests as this is a reactive python 3 charm. Once project +# config has been updated this tox target can be removed [testenv:py27] -basepython = python2.7 -deps = -r{toxinidir}/test-requirements.txt -commands = ostestr {posargs} +commands = /bin/true [testenv:py34] basepython = python3.4 diff --git a/unit_tests/__init__.py b/unit_tests/__init__.py index 604856b..549fa02 100644 --- a/unit_tests/__init__.py +++ b/unit_tests/__init__.py @@ -20,7 +20,9 @@ sys.path.append('src/lib') # Mock out charmhelpers so that we can test without it. # also stops sideeffects from occuring. +apt_pkg = mock.MagicMock() charmhelpers = mock.MagicMock() +sys.modules['apt_pkg'] = apt_pkg sys.modules['charmhelpers'] = charmhelpers sys.modules['charmhelpers.core'] = charmhelpers.core sys.modules['charmhelpers.core.hookenv'] = charmhelpers.core.hookenv diff --git a/unit_tests/__init__.pyc b/unit_tests/__init__.pyc index 009b374214d1b92cf4f912f417761d0ba5ceec9c..55dd2fdc59680f83ebb3cf23df6fb7175f68007e 100644 GIT binary patch literal 2086 zcmcIkOK;Oa5S~racS6z!p#=mNgvtR2dg4$aB*c*(!U3rl%eA-hI*x65CzMF#R0N#h zfAIG}Tw!Ln>qKp;9x5DrGxO~?yR$R1Q~%Xk{qy_B`w-5bI{m+*PyZAE5xoLZfWt}_ za40|mBsECt5Y^yJfSBras|!dPa7K0uAn7IgB18??CnZ^O`hwGwWd|)*(29eWDrnU~ z%N4Zdpp^=0I%w5GEvK(JJ-Owe<_wgy9om{jtL1K0XvY!TGf=Yb(2hknoW5@LO{Z^E zR$C6*oPmr7s7M1;*+6eyw$HFsNBY4P6JB1(Ok)rZ^`mPk-WXM?^^@y~GcL^u zhjGcvB%b8uP(QqCxpRW23cYcWb1X58b>|`+rt0dW#(_)g<4bnA^{JwGVLH|*OGQiw zxmFtV(Pf9%^ywB2R8XG*KGos0PL)+7 z=P;OczX6=mE8sg2kykv}r2&i$vKv7;(6~s#@PtLfK_(s>qJBYQFV07@H$EC?IPMJ; z?)6MzKaHeTgDgOrqpI>zQq}c*U$NqQ#RTt>v0q9oCw`v!@?$6qR3xb^lcm4+oTfE< z4`S+7pS|iY&|oq4#bE!_mFLfB7tK3^XxHqt^kAtDK;p_2&*1eU6W^J~$m`>tNyMlK)MpcjjOso=gyeZ ziNn}P)U8UK=FCVpOB`3kzKzw(HpzOAhNfuNI-=8Pik9ez&FV*Tty}BzNVw7J?WILg G7ykfht_nB+ delta 278 zcmZ1`(8VRq{F#?4d3sfNG6NJa18D~!E-soVy+wtGA(eq4i;W?Li@_$9l_86VA&VC# z#0?di_(9YbES|*;lj4P|=7$OKAqiy(z(n~$qLV!sm9&8-2*X5$;A({#vP58_!VESk zj10jVB9l)sCNqjn7GM(JoW?YTkx4^zas^xLd#6TpY01yf@0RShVGKK&E diff --git a/unit_tests/test_designate_handlers.py b/unit_tests/test_designate_handlers.py index f0bdb54..298f59a 100644 --- a/unit_tests/test_designate_handlers.py +++ b/unit_tests/test_designate_handlers.py @@ -228,16 +228,20 @@ class TestDesignateHandlers(unittest.TestCase): self.update_peers.assert_called_once_with(cluster) def test_render_all_configs(self): + self.patch(handlers.designate, 'update_pools') self.patch(handlers.designate, 'render_full_config') handlers.render_all_configs('arg1', 'arg2') self.render_full_config.assert_called_once_with(('arg1', 'arg2', )) + self.update_pools.assert_called_once_with() def test_render_all_configs_single_node(self): self.patch(handlers.designate, 'render_full_config') self.patch(handlers.designate, 'render_rndc_keys') + self.patch(handlers.designate, 'update_pools') handlers.render_all_configs_single_node('arg1', 'arg2') self.render_full_config.assert_called_once_with(('arg1', 'arg2', )) self.render_rndc_keys.assert_called_once_with() + self.update_pools.assert_called_once_with() def test_cluster_connected(self): hacluster = mock.MagicMock() diff --git a/unit_tests/test_designate_handlers.pyc b/unit_tests/test_designate_handlers.pyc index 5d70fdb75dbc8e1618482623b1d12dfc655bbd7f..86fc773a229c5e48503e41737b18fecf65de8a9b 100644 GIT binary patch literal 10472 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 delta 2210 zcmb7FO>7%Q6n?Y2UV9z8c49k;EtE8E+O9y2lNRL=PzX&yr4p{#fXYu>ckNjx>%?}w zyQxBD%R&~A9!inszzL}r)HBL~YpWi(P^sdGP){7Va6;nDd$Y6&B~GcVdHd%5%)EKu zH{;*myL&pS{+W#5{QAcC(J>{r1OUagR>LW7xOSr$c(&Utiu;9GQCBV;;Ekw@2Y7F* zC3ZtRRu|Zi$ZJcQwPGfAzSI6-gL8Hs>(d9gMJaY?aI#o1eje=I`7oXxymV3gFf`dS zun$oj%S#OWhp4z3@Dy+b=6M>phM!^JI(|lg$6>z9z-7QQz!Nx8VCx$Q06Gk63Iq%~ z3Ms1!oW0zIOA2&V=xVUlgpLYz1^R%FtI`pHt`40ZKwX7S1UeejHS(|P&}YC_aZw$E zv(Sw~Cki|Xd434;R}^U9f^G~tn2BjI2yhvVmdImXUjf#(;bQw7T;u>NW)_cB@(-c3 z8|`Z|)mF3VR0D?xWbz&HFzE_6dH$s!fpgDka>pzC!Dg-Ir_fMcv%SWQ=%OzN_Agz{b+`Cu?$;@6RhsR;}N zO=VH}1MEdyQCVC~usq8vd1Xp0XSTC@%6q!8c$9fXKTTV`Az1b>TN1Yl;|K0$h}+pT zYl=JBNnIrdcw&9}NY7P>09-}Xkqr@;zX|XqKn;P{;R{4Y_P(q`fT$uo*mo=wKlK>Y z4d4hDrpJgreNdPLf?80LJwXg=?rIQ0!=~?ebN&!&o?WT9!AUX%J?h-`wU!^u`4X1U zCoNTmJ{k&+43!*1Wn0#iUopv3GEsn3k&ysfp-TIC&b5tCrQ2V^>3<#o?)dI%Q~X$X zd4`sKeZy{4xV?zy1s?|lWThILcEgb;kVTns(aw$ahzr&@h0%>#Yqi#$=5^~WGSCry zmpf&rRzv<-MKTfvJ*U0t_(9pORvq8BmeFL=(Ii^}4K?EJ?uo2-(6oQ?^7U%uQ}dKj zriCeV1O>1J%P^u;T*DAKF18|M`m{PZYo#kN6`)5bqfDRbT`7fMmd^Fl3hu zVQ1(z@yeX+EbrNYU9o*fHjr0BdL$|0ABQB!i*dj@hxw8MvUjqT`!|p~;z8l$kaZpt zwsH6%{u({rGvlaR1eWzKiKj4IC7Kex)&&x?C<5Yn$nZ_ic?M7GeRTdWEJGsNfm7TR zKNXJQzkn{%<3qEb;Q~IrY5#_F6hSpYP>J!>(`C9FuZsIqlSk#{ln*U|g|9GPRtW>e zm8?0G;?a1nKsRL1>E5I%Ij!aAJS2_$SmG-T^y%UP%ZRHJIdO05%u2{``KX3H@k2^` zt8-73Qz6|i(>_;Fn6$>TRh%N*B@)jm<-{-s1$3eIzU2aqPikXnRx(rK-to83EYgB! zNmwL4BJl}{GKvr;R6=ck#^9AJPFqCK!#Mm=6uOccPNfXZh$do2-iR6rBWXm$FDJe| K;3a-w9{U>!64Sr{ diff --git a/unit_tests/test_designate_utils.py b/unit_tests/test_designate_utils.py index 02010de..a5072cf 100644 --- a/unit_tests/test_designate_utils.py +++ b/unit_tests/test_designate_utils.py @@ -90,24 +90,27 @@ class TestDesignateUtils(unittest.TestCase): def test_create_server(self): _server_ids = ['servid1', None] self.patch(dutils, 'get_server_id') + self.patch(dutils, 'display') self.get_server_id.side_effect = lambda x: _server_ids.pop() self.patch(dutils, 'run_command') self.run_command.return_value = ('out', 'err') - self.assertEqual(dutils.create_server('server1'), 'servid1') + dutils.create_server('server1') cmd = [ 'designate', 'server-create', '--name', 'server1', '-f', 'value', ] self.run_command.assert_called_with(cmd) + self.display.assert_called_with('servid1') def test_create_domain(self): _domain_ids = ['domainid1', None] self.patch(dutils, 'get_domain_id') + self.patch(dutils, 'display') self.get_domain_id.side_effect = lambda x: _domain_ids.pop() self.patch(dutils, 'run_command') self.run_command.return_value = ('out', 'err') - self.assertEqual(dutils.create_domain('dom1', 'email1'), 'domainid1') + dutils.create_domain('dom1', 'email1') cmd = [ 'designate', 'domain-create', '--name', 'dom1', @@ -115,8 +118,10 @@ class TestDesignateUtils(unittest.TestCase): '-f', 'value', ] self.run_command.assert_called_with(cmd) + self.display.assert_called_with('domainid1') def test_delete_domain(self): + self.patch(dutils, 'get_domain_id', return_value='dom1') self.patch(dutils, 'run_command') dutils.delete_domain('dom1') self.run_command.assert_called_with(['domain-delete', 'dom1']) diff --git a/unit_tests/test_designate_utils.pyc b/unit_tests/test_designate_utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6f79eee1e091f414dd83421807ba91d002abd23 GIT binary patch literal 7078 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 literal 0 HcmV?d00001 diff --git a/unit_tests/test_lib_charm_openstack_designate.py b/unit_tests/test_lib_charm_openstack_designate.py index 408946f..eddf410 100644 --- a/unit_tests/test_lib_charm_openstack_designate.py +++ b/unit_tests/test_lib_charm_openstack_designate.py @@ -203,7 +203,7 @@ class TestBindRNDCRelationAdapter(Helper): def test_rndc_info(self): relation = mock.MagicMock() - relation.rndc_info.return_value = 'rndcstuff' + relation.rndc_info = 'rndcstuff' a = designate.BindRNDCRelationAdapter(relation) self.assertEqual(a.rndc_info, 'rndcstuff') diff --git a/unit_tests/test_lib_charm_openstack_designate.pyc b/unit_tests/test_lib_charm_openstack_designate.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fac865ed58e4234a687d284cf84a5d6927c9813 GIT binary patch literal 19910 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 t_BiFkp^j$tq