On Wed, Mar 19, 2014 at 9:55 AM, Hrvoje Ribicic <[email protected]> wrote:
> This patch allows support for multiple patches placed in the "patch"
> directory, which are executed in alphabetical order.
>
> Signed-off-by: Hrvoje Ribicic <[email protected]>
> ---
> qa/qa_config.py | 39 +++++++++++++++++++++++++++++++++++++--
> 1 file changed, 37 insertions(+), 2 deletions(-)
>
> diff --git a/qa/qa_config.py b/qa/qa_config.py
> index 4f93367..0340883 100644
> --- a/qa/qa_config.py
> +++ b/qa/qa_config.py
> @@ -40,10 +40,11 @@ _VCLUSTER_MASTER_KEY = "vcluster-master"
> _VCLUSTER_BASEDIR_KEY = "vcluster-basedir"
> _ENABLED_DISK_TEMPLATES_KEY = "enabled-disk-templates"
>
> -# The path of an optional JSON Patch file (as per RFC6902) that modifies QA's
> +# The constants related to JSON patching (as per RFC6902) that modifies QA's
> # configuration.
> _QA_BASE_PATH = os.path.dirname(__file__)
> _QA_DEFAULT_PATCH = "qa-patch.json"
> +_QA_PATCH_DIR = "patch"
>
> #: QA configuration (L{_QaConfig})
> _config = None
> @@ -284,8 +285,41 @@ class _QaConfig(object):
> """
> patches = {}
> _QaConfig.LoadPatch(patches, _QA_DEFAULT_PATCH)
> + patch_dir_path = os.path.join(_QA_BASE_PATH, _QA_PATCH_DIR)
> + if os.path.exists(patch_dir_path):
> + for filename in os.listdir(patch_dir_path):
> + if filename.endswith(".json"):
> + _QaConfig.LoadPatch(patches, os.path.join(_QA_PATCH_DIR, filename))
> return patches
>
> + @staticmethod
> + def ApplyPatches(data, patch_module, patches):
> + """Applies any patches present, and returns the modified QA
> configuration.
> +
> + First, patches from the patch directory are applied. They are ordered
> + alphabetically, unless there is an ``order`` file present - any patches
> + listed within are applied in that order, and any remaining ones in
> + alphabetical order again.
Either specify in this patch that there is no support for order yet,
but this will be the final state, or don't add any reference to it
until the patch where it will actually be implemented.
> +
> + @type data: dict (deserialized json)
> + @param data: The QA configuration
> + @type patch_module: module
> + @param patch_module: The json patch module, loaded dynamically
> + @type patches: dict of string to dict
> + @param patches: The dictionary of patch path to content
> +
> + @return: The modified configuration data.
> +
> + """
> + for patch in sorted(patches):
> + if patch != _QA_DEFAULT_PATCH:
> + data = patch_module.apply_patch(data, patches[patch])
> +
> + if _QA_DEFAULT_PATCH in patches:
> + data = patch_module.apply_patch(data, patches[_QA_DEFAULT_PATCH])
> +
> + return data
> +
> @classmethod
> def Load(cls, filename):
> """Loads a configuration file and produces a configuration object.
> @@ -302,8 +336,9 @@ class _QaConfig(object):
> try:
> patches = _QaConfig.LoadPatches()
> if patches:
> + print patches
Looks like a residual print statement from testing. I guess it has to
be removed?
> mod = __import__("jsonpatch", fromlist=[])
> - data = mod.apply_patch(data, patches[_QA_DEFAULT_PATCH])
> + data = _QaConfig.ApplyPatches(data, mod, patches)
> except IOError:
> pass
> except ImportError:
> --
> 1.9.0.279.gdc9e3eb
>
Rest LGTM, thanks.
Cheers,
Michele
--
Google Germany GmbH
Dienerstr. 12
80331 München
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Christine Elizabeth Flores