LGTM, thanks! On Thu, Jul 7, 2016 at 12:32 PM, 'Brian Foley' via ganeti-devel < [email protected]> wrote:
> commit 588fa31dd22a1e9320a9bf355c66ca1b837ff586 > Merge: fd55874 20c2aec > Author: Brian Foley <[email protected]> > Date: Thu Jul 7 12:12:35 2016 +0100 > > Merge branch 'stable-2.16' into stable-2.17 > > * stable-2.16 > Fix some trivial pep8/pylint errors > Make executeRpcCall only compute rpcCallData once > Remove storage unit selection from rpcCallData > Only import needed functions from Ganeti.JSON > Special case WaitForJobChange to reduce heap use > > * stable-2.15 > Cleanup more pylint/pep8/apidoc errors > KVM: handle gracefully too old/too new psutil versions > Fix small typo in opcode tests > Fix line-too long errors > > Manually update import lists to fix compile errors, and fix trivial > pep8 whitespace warning. > > Signed-off-by: Brian Foley <[email protected]> > > diff --cc src/Ganeti/Config.hs > index f67aff1,4d0e5a0..5687b54 > --- a/src/Ganeti/Config.hs > +++ b/src/Ganeti/Config.hs > @@@ -101,9 -99,8 +101,9 @@@ import System.I > > import Ganeti.BasicTypes > import qualified Ganeti.Constants as C > +import qualified Ganeti.ConstantUtils as CU > import Ganeti.Errors > - import Ganeti.JSON > + import Ganeti.JSON (fromJResult, fromContainer, GenericContainer(..)) > import Ganeti.Objects > import Ganeti.Types > import qualified Ganeti.Utils.MultiMap as MM > diff --cc src/Ganeti/HTools/Backend/IAlloc.hs > index e431947,3a67c2d..e40c3d7 > --- a/src/Ganeti/HTools/Backend/IAlloc.hs > +++ b/src/Ganeti/HTools/Backend/IAlloc.hs > @@@ -65,7 -65,7 +65,7 @@@ import Ganeti.HTools.AlgorithmParams (A > import Ganeti.HTools.CLI > import Ganeti.HTools.Loader > import Ganeti.HTools.Types > - import Ganeti.JSON > -import Ganeti.JSON (maybeFromObj, JSRecord, tryFromObj, toArray, > asObjectList, readEitherString, fromJResult, fromObj, fromObjWithDefault, > asJSObject) > ++import Ganeti.JSON (maybeFromObj, JSRecord, tryFromObj, toArray, > asObjectList, readEitherString, fromJResult, fromObj, fromObjWithDefault, > asJSObject, emptyContainer) > import Ganeti.Types ( EvacMode(ChangePrimary, ChangeSecondary) > , adminStateFromRaw, AdminState(..)) > import Ganeti.Utils > diff --cc src/Ganeti/HTools/Backend/Luxi.hs > index be81a3c,53b0794..639d74d > --- a/src/Ganeti/HTools/Backend/Luxi.hs > +++ b/src/Ganeti/HTools/Backend/Luxi.hs > @@@ -51,8 -51,7 +51,9 @@@ import Ganeti.HTools.Type > import qualified Ganeti.HTools.Group as Group > import qualified Ganeti.HTools.Node as Node > import qualified Ganeti.HTools.Instance as Instance > - import Ganeti.JSON > - import Ganeti.Objects as O > -import Ganeti.JSON (fromObj, fromJVal, tryFromObj, arrayMaybeFromJVal) > ++import Ganeti.JSON (fromJVal, tryFromObj, arrayMaybeFromJVal, > ++ getKeysFromContainer, Container) > ++import Ganeti.Objects (PartialNicParams) > > {-# ANN module "HLint: ignore Eta reduce" #-} > > diff --cc src/Ganeti/HTools/Backend/Rapi.hs > index 03d158c,7d76751..218411c > --- a/src/Ganeti/HTools/Backend/Rapi.hs > +++ b/src/Ganeti/HTools/Backend/Rapi.hs > @@@ -53,7 -53,7 +53,7 @@@ import System.FilePat > import Ganeti.BasicTypes > import Ganeti.HTools.Loader > import Ganeti.HTools.Types > - import Ganeti.JSON > -import Ganeti.JSON (loadJSArray, JSRecord, tryFromObj, fromJVal, > maybeFromObj, fromJResult, tryArrayMaybeFromObj, readEitherString, > fromObjWithDefault, asJSObject) > ++import Ganeti.JSON (loadJSArray, JSRecord, tryFromObj, fromJVal, > maybeFromObj, fromJResult, tryArrayMaybeFromObj, readEitherString, > fromObjWithDefault, asJSObject, emptyContainer) > import qualified Ganeti.HTools.Group as Group > import qualified Ganeti.HTools.Node as Node > import qualified Ganeti.HTools.Instance as Instance > diff --cc src/Ganeti/Luxi.hs > index 4439cef,f763eee..831e859 > --- a/src/Ganeti/Luxi.hs > +++ b/src/Ganeti/Luxi.hs > @@@ -73,7 -71,7 +73,7 @@@ import Text.JSON.Type > import Ganeti.BasicTypes > import Ganeti.Constants > import Ganeti.Errors > - import Ganeti.JSON > -import Ganeti.JSON (fromJResult, fromJVal, Tuple5(..), MaybeForJSON(..), > TimeAsDoubleJSON(..)) > ++import Ganeti.JSON (fromJResult, fromJVal, fromObj, Tuple5(..), > MaybeForJSON(..), TimeAsDoubleJSON(..)) > import Ganeti.UDSServer > import Ganeti.Objects > import Ganeti.OpParams (pTagsObject) > diff --cc src/Ganeti/Objects.hs > index 4b92561,59abc5c..065aaa8 > --- a/src/Ganeti/Objects.hs > +++ b/src/Ganeti/Objects.hs > @@@ -130,13 -124,11 +130,13 @@@ import qualified Text.JSON as > import qualified AutoConf > import qualified Ganeti.Constants as C > import qualified Ganeti.ConstantUtils as ConstantUtils > - import Ganeti.JSON > + import Ganeti.JSON (DictObject(..), Container, emptyContainer, > GenericContainer) > import Ganeti.Objects.BitArray (BitArray) > import Ganeti.Objects.Disk > +import Ganeti.Objects.Maintenance > import Ganeti.Objects.Nic > import Ganeti.Objects.Instance > +import Ganeti.Objects.HvState > import Ganeti.Query.Language > import Ganeti.PartialParams > import Ganeti.Types > diff --cc src/Ganeti/Query/Node.hs > index 698e209,9d36c74..f431ade > --- a/src/Ganeti/Query/Node.hs > +++ b/src/Ganeti/Query/Node.hs > @@@ -38,12 -38,9 +38,11 @@@ module Ganeti.Query.Nod > , collectLiveData > ) where > > -import Control.Applicative > -import Data.List > +import Prelude () > +import Ganeti.Prelude > + > +import Data.List (intercalate) > import Data.Maybe > - import qualified Data.Map as Map > import qualified Text.JSON as J > > import Ganeti.Config > diff --cc test/py/testutils_ssh.py > index fa3b35d,a38304d..e700e47 > --- a/test/py/testutils_ssh.py > +++ b/test/py/testutils_ssh.py > @@@ -529,47 -508,8 +529,47 @@@ class FakeSshFileManager(object) > if constants.SSHS_SSH_PUBLIC_KEYS in data: > instructions_pub = data[constants.SSHS_SSH_PUBLIC_KEYS] > self._HandlePublicKeys(instructions_pub, node) > + if constants.SSHS_GENERATE in data: > + instructions_generate = data[constants.SSHS_GENERATE] > + self._GenerateNewKey(instructions_generate, node) > # pylint: enable=W0613 > > + def _GenerateNewKey(self, instructions_generate, node): > + """Generates a new key for the given node. > + > + Note that this is a very rudimentary generation of a new key. The > key is > + always generated with the same pattern, starting with 'new_key'. That > + means if you run it twice, it will actually produce the same key. > However, > + for what we want to test, this is sufficient. > + The 'suffix' instruction is also ignored and the key is directly > overriden. > + This works so far, but simplifies the tests a bit. It might be > extended > + in case it becomes necessary. > + > + @type instructions_generate: tuple of (string, integer, string) > + @param instructions_generate: an instructions tuple for generating a > new > + SSH key. This has to comply to the C{_DATA_CHECK} description in > + C{ssh_update.py}. > + @type node: string > + @param node: name of node > + """ > + (key_type, key_bits, suffix) = instructions_generate > + assert key_type in constants.SSHK_ALL > + assert key_bits > 0 > + assert isinstance(suffix, str) > + > + new_key = "new_key_%s" % node > + old_node_data = self._all_node_data[node] > + > + new_node_data = self._NodeInfo( > + uuid=old_node_data.uuid, > + key=new_key, > + is_potential_master_candidate=old_node_data > - .is_potential_master_candidate, > ++ .is_potential_master_candidate, > + is_master_candidate=old_node_data.is_master_candidate, > + is_master=old_node_data.is_master) > + > + self._all_node_data[node] = new_node_data > + > def _EnsureAuthKeyFile(self, file_node_name): > if file_node_name not in self._authorized_keys: > self._authorized_keys[file_node_name] = set() >
