From 0739061246172f70e467255980bb9e679260c3ef Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 20 Jan 2018 18:55:15 +0100 Subject: [PATCH 01/77] rename write task to write_file --- brigade/plugins/tasks/files/__init__.py | 4 +- .../tasks/files/{write.py => write_file.py} | 2 +- tests/inventory_data/nsot/nsot.sqlite3 | Bin 256000 -> 258048 bytes .../{test_write.py => test_write_file.py} | 38 +++++++++--------- 4 files changed, 22 insertions(+), 22 deletions(-) rename brigade/plugins/tasks/files/{write.py => write_file.py} (95%) rename tests/plugins/tasks/files/{test_write.py => test_write_file.py} (71%) diff --git a/brigade/plugins/tasks/files/__init__.py b/brigade/plugins/tasks/files/__init__.py index 5c393eef..babc6aa9 100644 --- a/brigade/plugins/tasks/files/__init__.py +++ b/brigade/plugins/tasks/files/__init__.py @@ -1,8 +1,8 @@ from .sftp import sftp -from .write import write +from .write_file import write_file __all__ = ( "sftp", - "write", + "write_file", ) diff --git a/brigade/plugins/tasks/files/write.py b/brigade/plugins/tasks/files/write_file.py similarity index 95% rename from brigade/plugins/tasks/files/write.py rename to brigade/plugins/tasks/files/write_file.py index 4bc28d4e..edb4da32 100644 --- a/brigade/plugins/tasks/files/write.py +++ b/brigade/plugins/tasks/files/write_file.py @@ -25,7 +25,7 @@ def _generate_diff(filename, content, append): return "\n".join(diff) -def write(task, filename, content, append=False): +def write_file(task, filename, content, append=False): """ Write contents to a file (locally) diff --git a/tests/inventory_data/nsot/nsot.sqlite3 b/tests/inventory_data/nsot/nsot.sqlite3 index 43db53f934b16ceff2c0a1488d9af0c1c8ccb293..8a1fe0ee657643db16d6ef25b4d0530269b0aace 100644 GIT binary patch delta 853 zcmah|Ur19?96rDEn}0IPNirqFE|RIC^W3|8z4y+ClnB-z!`>z5{I|_))23-qZAG-0 z52n!xdMW6kd@_f-;`;XxG$hi8hzbIQke*gAfus-JHb(R$95|eFzVCOw-}$~1UM&f) zl}uIUxdN{3FZ9SQ`}uoVkYoY6}ExI zM6HpDjUp46=5$C-Nw!OxrYer033d9(hzzhS{jBNj+X~&@nQoc*rwj)rImtZn;a}@N^UIGD4l$gb6oV z>ZIPg)D;`Zo(|Az%N=!+wcqRr!hK5e$tP03k5um zgE)l?GotlgrWw}=(^+3{kjdkrpx!(j81hRKeLl%MDhIqw>Ay(kYp|V$`sGUl9fAww-P@(l5~hYAzm%s)$T6 z*puacRD^3n^zPZ*&vGV$lUMNdUD-=uBxCV&F zHMDc~k}MT)sPkuj*d&LgFW~b9{L6ZA$8R2TY@{?4DNTy+k^%)bMX8m$W~A6rL>?1` zDD~7?oiGV{R^b#huG*JI%O(?lddMb<6XYR&n<9nxG^{L>!L&+-wnit6fSyIzh6}ib z53Imu9L8x}$1|2Q}I^n~oy&?O>Yl)!XO|0E1QbR&te HcM9M?xBhew diff --git a/tests/plugins/tasks/files/test_write.py b/tests/plugins/tasks/files/test_write_file.py similarity index 71% rename from tests/plugins/tasks/files/test_write.py rename to tests/plugins/tasks/files/test_write_file.py index 79584369..d85f02f7 100644 --- a/tests/plugins/tasks/files/test_write.py +++ b/tests/plugins/tasks/files/test_write_file.py @@ -20,7 +20,7 @@ """ -diff_new = """--- /tmp/brigade-write/dev3.group_2-f66d9331-3eeb-4912-98b9-37f55ac48deb +diff_new = """--- /tmp/brigade-write_file/dev3.group_2-f66d9331-3eeb-4912-98b9-37f55ac48deb +++ new @@ -33,7 +33,7 @@ +BLOH +BLUH""" -diff_overwrite = """--- /tmp/brigade-write/dev4.group_2-e63969eb-2261-4200-8913-196a12f4d791 +diff_overwrite_file = """--- /tmp/brigade-write_file/dev4.group_2-e63969eb-2261-4200-8913-196a12f4d791 +++ new @@ -49,7 +49,7 @@ -BLUH""" # noqa -diff_append = """--- /tmp/brigade-write/dev4.group_2-36ea350d-6623-4098-a961-fc143504eb42 +diff_append = """--- /tmp/brigade-write_file/dev4.group_2-36ea350d-6623-4098-a961-fc143504eb42 +++ new @@ -65,14 +65,14 @@ +BLIH""" # noqa -BASEPATH = "/tmp/brigade-write" +BASEPATH = "/tmp/brigade-write_file" if not os.path.exists(BASEPATH): os.makedirs(BASEPATH) -def _test_write(task): +def _test_write_file(task): filename = "{}/{}-{}".format(BASEPATH, task.host, str(uuid.uuid4())) - r = task.run(files.write, + r = task.run(files.write_file, dry_run=True, filename=filename, content=content_a) @@ -80,7 +80,7 @@ def _test_write(task): assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write, + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) @@ -88,7 +88,7 @@ def _test_write(task): assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write, + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) @@ -97,10 +97,10 @@ def _test_write(task): assert not r.changed -def _test_overwrite(task): +def _test_overwrite_file(task): filename = "{}/{}-{}".format(BASEPATH, task.host, str(uuid.uuid4())) - r = task.run(files.write, + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) @@ -108,15 +108,15 @@ def _test_overwrite(task): assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write, + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_b) - assert r.diff.splitlines()[1:] == diff_overwrite.splitlines()[1:] + assert r.diff.splitlines()[1:] == diff_overwrite_file.splitlines()[1:] assert r.changed - r = task.run(files.write, + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_b) @@ -128,7 +128,7 @@ def _test_overwrite(task): def _test_append(task): filename = "{}/{}-{}".format(BASEPATH, task.host, str(uuid.uuid4())) - r = task.run(files.write, + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) @@ -136,7 +136,7 @@ def _test_append(task): assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write, + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_b, @@ -148,11 +148,11 @@ def _test_append(task): class Test(object): - def test_write(self, brigade): - brigade.run(_test_write) + def test_write_file(self, brigade): + brigade.run(_test_write_file) - def test_overwrite(self, brigade): - brigade.run(_test_overwrite) + def test_overwrite_file(self, brigade): + brigade.run(_test_overwrite_file) def test_append(self, brigade): brigade.run(_test_append) From dbb32b97bf9632e3bad5baff0c358d8f93b94c97 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 20 Jan 2018 21:14:04 +0100 Subject: [PATCH 02/77] add extra functionality to the config object --- brigade/core/configuration.py | 62 +++++++++++++----- tests/core/test_configuration.py | 76 +++++++++++++++++++++++ tests/core/test_configuration/config.yaml | 6 ++ tests/core/test_configuration/empty.yaml | 0 4 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 tests/core/test_configuration.py create mode 100644 tests/core/test_configuration/config.yaml create mode 100644 tests/core/test_configuration/empty.yaml diff --git a/brigade/core/configuration.py b/brigade/core/configuration.py index 61d8c042..a75924df 100644 --- a/brigade/core/configuration.py +++ b/brigade/core/configuration.py @@ -1,4 +1,3 @@ -import ast import os @@ -42,26 +41,61 @@ class Config: """ def __init__(self, config_file=None, **kwargs): - if config_file: with open(config_file, 'r') as f: - c = yaml.load(f.read()) + data = yaml.load(f.read()) or {} else: - c = {} + data = {} + + for parameter, param_conf in CONF.items(): + self._assign_property(parameter, param_conf, data) - self._assign_properties(c) + for k, v in data.items(): + if k not in CONF: + setattr(self, k, v) for k, v in kwargs.items(): setattr(self, k, v) - def _assign_properties(self, c): + def string_to_bool(self, v): + if v.lower() in ["false", "no", "n", "off", "0"]: + return False + else: + return True + + def _assign_property(self, parameter, param_conf, data): + env = param_conf.get('env') or 'BRIGADE_' + parameter.upper() + v = os.environ.get(env) + if v is None: + v = data.get(parameter, param_conf["default"]) + else: + if param_conf['type'] == 'bool': + v = self.string_to_bool(v) + else: + v = types[param_conf['type']](v) + setattr(self, parameter, v) - for p in CONF: - env = CONF[p].get('env') or 'BRIGADE_' + p.upper() - v = os.environ.get(env) or c.get(p) - v = v if v is not None else CONF[p]['default'] - if CONF[p]['type'] == 'bool': - v = ast.literal_eval(str(v).title()) + def get(self, parameter, env=None, default=None, parameter_type="str", root=""): + """ + Retrieve a custom parameter from the configuration. + + Arguments: + parameter(str): Name of the parameter to retrieve + env(str): Environment variable name to retrieve the object from + default: default value in case no parameter is found + parameter_type(str): if a value is found cast the variable to this type + root(str): parent key in the configuration file where to look for the parameter + """ + value = os.environ.get(env) if env else None + if value is None: + if root: + d = getattr(self, root, {}) + value = d.get(parameter, default) else: - v = types[CONF[p]['type']](v) - setattr(self, p, v) + value = getattr(self, parameter, default) + if parameter_type in [bool, "bool"]: + if not isinstance(value, bool): + value = self.string_to_bool(value) + else: + value = types[str(parameter_type)](value) + return value diff --git a/tests/core/test_configuration.py b/tests/core/test_configuration.py new file mode 100644 index 00000000..8f0389cf --- /dev/null +++ b/tests/core/test_configuration.py @@ -0,0 +1,76 @@ +import os + +from brigade.core.configuration import Config + +# import pytest + + +dir_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test_configuration") + + +class Test(object): + + def test_configuration_empty(self): + config = Config(config_file=os.path.join(dir_path, "empty.yaml"), + arg1=1, arg2=False, arg3=None, arg4="asd") + assert config.num_workers == 20 + assert config.raise_on_error + assert config.arg1 == 1 + assert config.arg2 is False + assert config.arg3 is None + assert config.arg4 == "asd" + + def test_configuration_normal(self): + config = Config(config_file=os.path.join(dir_path, "config.yaml"), + arg1=1, arg2=False, arg3=None, arg4="asd") + assert config.num_workers == 10 + assert not config.raise_on_error + assert config.arg1 == 1 + assert config.arg2 is False + assert config.arg3 is None + assert config.arg4 == "asd" + + def test_configuration_normal_override_argument(self): + config = Config(config_file=os.path.join(dir_path, "config.yaml"), + num_workers=20, raise_on_error=True) + assert config.num_workers == 20 + assert config.raise_on_error + + def test_configuration_normal_override_env(self): + os.environ["BRIGADE_NUM_WORKERS"] = "30" + os.environ["BRIGADE_RAISE_ON_ERROR"] = "1" + config = Config(config_file=os.path.join(dir_path, "config.yaml")) + assert config.num_workers == 30 + assert config.raise_on_error + os.environ.pop("BRIGADE_NUM_WORKERS") + os.environ.pop("BRIGADE_RAISE_ON_ERROR") + + def test_configuration_bool_env(self): + os.environ["BRIGADE_RAISE_ON_ERROR"] = "0" + config = Config() + assert config.num_workers == 20 + assert not config.raise_on_error + + def test_get_user_defined_from_file(self): + config = Config(config_file=os.path.join(dir_path, "config.yaml")) + assert config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "asdasd" + + def test_get_user_defined_from_default(self): + config = Config() + assert config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "qweqwe" + + def test_get_user_defined_from_env(self): + os.environ["USER_DEFINED"] = "zxczxc" + config = Config(config_file=os.path.join(dir_path, "config.yaml")) + assert config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "zxczxc" + os.environ.pop("USER_DEFINED") + + def test_get_user_defined_from_env_bool(self): + os.environ["USER_DEFINED"] = "0" + config = Config() + assert not config.get("user_defined", env="USER_DEFINED", parameter_type="bool") + os.environ.pop("USER_DEFINED") + + def test_get_user_defined_nested(self): + config = Config(config_file=os.path.join(dir_path, "config.yaml")) + assert config.get("user_defined", root="my_root") == "i am nested" diff --git a/tests/core/test_configuration/config.yaml b/tests/core/test_configuration/config.yaml new file mode 100644 index 00000000..164c4f87 --- /dev/null +++ b/tests/core/test_configuration/config.yaml @@ -0,0 +1,6 @@ +--- +num_workers: 10 +raise_on_error: no +user_defined: "asdasd" +my_root: + user_defined: "i am nested" diff --git a/tests/core/test_configuration/empty.yaml b/tests/core/test_configuration/empty.yaml new file mode 100644 index 00000000..e69de29b From 5a32746ec8589fca4bcb447c71de4d59954d8c3b Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 21 Jan 2018 13:28:35 +0100 Subject: [PATCH 03/77] generic mechanism to create brigade object from configuration --- .gitignore | 1 + brigade/core/__init__.py | 28 +++++++++++++++++ brigade/easy.py | 23 -------------- brigade/plugins/inventory/simple.py | 3 +- docs/ref/api/brigade.rst | 5 ++++ docs/ref/api/easy.rst | 6 ---- docs/ref/api/index.rst | 1 - docs/tutorials/intro/brigade.rst | 3 -- tests/core/test_from_conf.py | 38 ++++++++++++++++++++++++ tests/core/test_from_conf/a_config.yaml | 6 ++++ tests/inventory_data/nsot/nsot.sqlite3 | Bin 256000 -> 261120 bytes 11 files changed, 79 insertions(+), 35 deletions(-) delete mode 100644 brigade/easy.py delete mode 100644 docs/ref/api/easy.rst create mode 100644 tests/core/test_from_conf.py create mode 100644 tests/core/test_from_conf/a_config.yaml diff --git a/.gitignore b/.gitignore index 8e0b0df3..25f8125c 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ coverage.xml # Django stuff: *.log +*.log.* local_settings.py # Flask stuff: diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index a02ea1ce..cf1e41d6 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -1,3 +1,4 @@ +import importlib import logging import logging.config import sys @@ -206,3 +207,30 @@ def run_task(host, brigade, dry_run, task): task.results.append(r) r.name = task.name return task.results + + +def from_conf(config_file="", dry_run=False, **kwargs): + """ + Arguments: + config_file(str): Path to the configuration file (optional) + dry_run(bool): Whether to simulate changes or not + **kwargs: Extra information to pass to the + :obj:`brigade.core.configuration.Config` object + + Returns: + :obj:`brigade.core.Brigade`: fully instantiated and configured + """ + conf = Config(config_file=config_file, **kwargs) + + module_path = ".".join(conf.inventory.split(".")[:-1]) + inv_class_name = conf.inventory.split(".")[-1] + module = importlib.import_module(module_path) + inv_class = getattr(module, inv_class_name) + + inv = inv_class(**getattr(conf, inv_class_name, {})) + + return Brigade( + inventory=inv, + dry_run=dry_run, + config=conf, + ) diff --git a/brigade/easy.py b/brigade/easy.py deleted file mode 100644 index 8726e9a5..00000000 --- a/brigade/easy.py +++ /dev/null @@ -1,23 +0,0 @@ -from brigade.core import Brigade -from brigade.core.configuration import Config -from brigade.plugins.inventory.simple import SimpleInventory - - -def easy_brigade(host_file="host.yaml", group_file="groups.yaml", dry_run=False, **kwargs): - """ - Helper function to create easily a :obj:`brigade.core.Brigade` object. - - Arguments: - host_file (str): path to the host file that will be passed to - :obj:`brigade.plugins.inventory.simple.SimpleInventory` - group_file (str): path to the group file that will be passed to - :obj:`brigade.plugins.inventory.simple.SimpleInventory` - dry_run (bool): whether if this is a dry run or not - **kwargs: Configuration parameters, see - :doc:`configuration parameters ` - """ - return Brigade( - inventory=SimpleInventory(host_file, group_file), - dry_run=dry_run, - config=Config(**kwargs), - ) diff --git a/brigade/plugins/inventory/simple.py b/brigade/plugins/inventory/simple.py index e04e733e..67291ce1 100644 --- a/brigade/plugins/inventory/simple.py +++ b/brigade/plugins/inventory/simple.py @@ -102,8 +102,7 @@ class SimpleInventory(Inventory): cmh: group: all """ - - def __init__(self, host_file, group_file=None, **kwargs): + def __init__(self, host_file="hosts.yaml", group_file=None, **kwargs): with open(host_file, "r") as f: hosts = yaml.load(f.read()) diff --git a/docs/ref/api/brigade.rst b/docs/ref/api/brigade.rst index 0ea4f024..31900537 100644 --- a/docs/ref/api/brigade.rst +++ b/docs/ref/api/brigade.rst @@ -11,3 +11,8 @@ Brigade .. autoclass:: brigade.core.Brigade :members: :undoc-members: + +from_conf +######### + +.. automethod:: brigade.core.from_conf diff --git a/docs/ref/api/easy.rst b/docs/ref/api/easy.rst deleted file mode 100644 index 02de78a5..00000000 --- a/docs/ref/api/easy.rst +++ /dev/null @@ -1,6 +0,0 @@ -Easy -==== - -.. automodule:: brigade.easy - :members: - :undoc-members: diff --git a/docs/ref/api/index.rst b/docs/ref/api/index.rst index 7ca6e828..c6175279 100644 --- a/docs/ref/api/index.rst +++ b/docs/ref/api/index.rst @@ -8,6 +8,5 @@ Brigade API Reference brigade configuration inventory - easy task exceptions diff --git a/docs/tutorials/intro/brigade.rst b/docs/tutorials/intro/brigade.rst index 2a5fb807..92ef2685 100644 --- a/docs/tutorials/intro/brigade.rst +++ b/docs/tutorials/intro/brigade.rst @@ -4,7 +4,6 @@ Brigade Now that we know how the inventory works let's create a brigade object we can start working with. There are two ways we can use: 1. Using the :obj:`brigade.core.Brigade` directly, which is quite simple and the most flexible and versatile option. -2. Using :obj:`brigade.easy.easy_brigade`, which is simpler and good enough for most cases. Using the "raw" API ------------------- @@ -30,8 +29,6 @@ Once you have them, you can create the brigade object yourself. For example:: Using ``easy_brigade`` ---------------------- -With :obj:`brigade.easy.easy_brigade` you only need to do:: - >>> from brigade.easy import easy_brigade >>> brigade = easy_brigade( ... host_file="hosts.yaml", group_file="groups.yaml", diff --git a/tests/core/test_from_conf.py b/tests/core/test_from_conf.py new file mode 100644 index 00000000..66ca67be --- /dev/null +++ b/tests/core/test_from_conf.py @@ -0,0 +1,38 @@ +import os + +from brigade.core import from_conf + + +dir_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test_from_conf") + + +class Test(object): + + def test_from_conf_file(self): + brg = from_conf(config_file=os.path.join(dir_path, "a_config.yaml")) + assert not brg.dry_run + assert brg.config.num_workers == 100 + assert len(brg.inventory.hosts) + assert len(brg.inventory.groups) + + def test_from_conf_programmatically(self): + brg = from_conf(num_workers=100, + inventory="brigade.plugins.inventory.simple.SimpleInventory", + SimpleInventory={ + "host_file": "tests/core/inventory_data/hosts.yaml", + "group_file": "tests/core/inventory_data/groups.yaml", + }, + ) + assert not brg.dry_run + assert brg.config.num_workers == 100 + assert len(brg.inventory.hosts) + assert len(brg.inventory.groups) + + def test_from_conf_combined(self): + brg = from_conf(config_file=os.path.join(dir_path, "a_config.yaml"), + num_workers=200, + ) + assert not brg.dry_run + assert brg.config.num_workers == 200 + assert len(brg.inventory.hosts) + assert len(brg.inventory.groups) diff --git a/tests/core/test_from_conf/a_config.yaml b/tests/core/test_from_conf/a_config.yaml new file mode 100644 index 00000000..a71e015a --- /dev/null +++ b/tests/core/test_from_conf/a_config.yaml @@ -0,0 +1,6 @@ +--- +num_workers: 100 +inventory: brigade.plugins.inventory.simple.SimpleInventory +SimpleInventory: + host_file: "tests/core/inventory_data/hosts.yaml" + group_file: "tests/core/inventory_data/groups.yaml" diff --git a/tests/inventory_data/nsot/nsot.sqlite3 b/tests/inventory_data/nsot/nsot.sqlite3 index 43db53f934b16ceff2c0a1488d9af0c1c8ccb293..2e59de91b8953beea6c629625bd544c2e24e858c 100644 GIT binary patch delta 2511 zcmai$Yitx%6vywmXA2cELZoX!t&2*b1eSR}7Nekv5*4FHzbKJ?&+c{~-R|seca75e zh*c!1k9duKL1PdRjZoPsEut|RA<-6%K@(z9qA`8~G-|5i<90^ll1et2OlJ4o`Q7vQ zpL1vM*u{f07mr-lmL-Jz^>pBR$PR@MgyB`I{W{v<|B=7g!W7u;^a%Zc9-@s=agj(n z{u~N%(;q`Rzn>ja`2Dvb(V5J^p_PlpfS`pWDI^;~#n4qlc3yf0td7ntWIo*ieCdz$ zBpt)!_!!E#fbQVL3S}dEU}YO}>x=A!MOUzsd*A^dzD0VT6&I~y!*4(jtm2O=SH8Cb zH`7?ewvwh5D;N5#{$x&)bA3v_BqfUFRIJy|=ZMqT3%-R*=HVKSB){X=IF1Z$yaU&a zE)HCZaGHh3F~IJafJ@o7*YUz0vYjvdstY%QB#6dZL0l^e0l^5#Qb5NXmox6ie$$f+jkzM2y@&owcT5=ym;c?gtpTRHma(V-`=nlG{eo4>ba=e)d zVcNrv%}`&rS}v=WUhl68rls`N(*t!|SE^#U9Mz4im`#!KYj88Ldj$+QyW+G8-Lqk9 z)oL=Sr=?sbme!J$d^TN@EJ;^HLyGr`i2?GCb48LKhDM6|Mpk!{M+m=mlS%RuEQRYJ z2E*_sd=4|Ti{406|GCD3ae6nK+JtQ^{st_cb+Oys&=dv~qpnF-K4Ke|5Q|pi0{1%` zSL|e>6p53A?3Wq(&GKSOAJBDO>r-P!G9N7t#A|j<(+aV2zf~{g$N}ezUulmQL{zEE zk(`*8bup(HMmcNt=WE$mS(OsyN;a7w``919(Swb%)E8#H=jey*)H=MtvA5tlY=qIb zq{~l^5^@?kAOu_CQFt9D;U~I`UQZMBNph40Y<$hl@>P8iEjmyt^=C6VMXd?NXil?w z&5D@rHL|t3D3SfnX&XB(xoR1iBK$f97r`316*BMy?1qowJK9FC;i-z!Ar>6Qu4m0f z+u8kFa6bEfD=ud5KZNtx^j0pTlUuQqjZDCN=eA+|f;OJwZu&dO8Nx-e9>VY#?13rx znO;WDu+E)$+;gv_W(%2$S=1%1&~K$`{dPpNYKE#rA~n^_6iLJJzl^8+3;nQxzy{74 zgqb9!K zgi5^HpGa7lXu6Owie%JT{}CRY7n}{2oN;U7g?o&LyNqt&HQ7%0(c@kRU=~O40G{A( z9A?Khp^uIKPH$opd!U& z9PXNxz(w2K z*S(3W3W_4>Wa3KPNWD2GtreQ=vL*?dLB`K(7X?)}$ie@yiy_4b8megs3K?s*Z~JEh zZ-FR^l0cm11$jk$JF3#md-6(n6$$$|6PWknPXlf2VpzvrI_J%DIRCf{JR zX~DmCw?eY1>ZU>VpV#gdfb4Sy$8pf@vDN;6bJ$#C^7ivD;9cF4Tjy4TX0A{?H@Hw_ z7tpHD&H=cI^5WzG#RarF8a%*aPiZc|%cL8G>LSb*Q+%!uUa`0jnhR((&zb>}s}@fU z9H6^^R>yjC5FWsA<>m%qxQJFGW3CULq`42KmxUHb-Z=pGD@S&Fh66$_pw-cSP7ofz WZOX>Cc!YMZcNwjQ^IV44_uXd&=(4Zi%Y}71@jk{7B4DYWM62; zjx5hjO6A6+PV4z?2b4#TrKd>F*0bSKKhJlSca`Qfg2dY56e)2>6&ri;SuKLBD`l(me#D23CP4m(gGB`pP zDXx>6czx1Zs=h0dbbGK;ibO}M#I0xIn3!ai$D(4nrf1PdlM=EJMiq|Z8WQ-**<8lk zxIz83(rQf28NbB-QY#sm)4jBo40clkU8AS;7AXjz+$3`hm(+Pr3hly^@{G0nlz4Pc z91e|iN_XtES>|%VO>kogqNqn3`tgl(G`mHfk1rWdF8h+acRO<_N>oQJ)J?BJ@TudT z%tO?C*sHJK$rSDTAh~uympq3C7c_VP;eI}dM From d82f567f7d7029707e6fea9e12c3c469f33ff7e1 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 21 Jan 2018 16:05:37 +0100 Subject: [PATCH 04/77] Allow configuring logging --- brigade/core/__init__.py | 57 ++++++++++++++++++++++------------- brigade/core/configuration.py | 34 +++++++++++++++++++++ 2 files changed, 70 insertions(+), 21 deletions(-) diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index cf1e41d6..f618302d 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -92,37 +92,52 @@ def __init__(self, inventory, dry_run, config=None, config_file=None, self.available_connections = connections.available_connections def configure_logging(self): - format = "%(asctime)s - %(name)s - %(levelname)s" - format += " - %(funcName)10s() - %(message)s" - logging.config.dictConfig({ + dictConfig = self.config.logging_dictConfig or { "version": 1, "disable_existing_loggers": False, "formatters": { - "simple": {"format": format} + "simple": {"format": self.config.logging_format} }, - "handlers": { - "info_file_handler": { + "handlers": {}, + "loggers": {}, + "root": { + "level": "CRITICAL" if self.config.logging_loggers else + self.config.logging_level.upper(), + "handlers": [], + "formatter": "simple", + } + } + handlers_list = [] + if self.config.logging_file: + dictConfig["root"]["handlers"].append('info_file_handler') + handlers_list.append('info_file_handler') + dictConfig["handlers"]["info_file_handler"] = { "class": "logging.handlers.RotatingFileHandler", - "level": "INFO", + "level": "NOTSET", "formatter": "simple", - "filename": "brigade.log", + "filename": self.config.logging_file, "maxBytes": 10485760, "backupCount": 20, "encoding": "utf8" - }, - }, - "loggers": { - "brigade": { - "level": "INFO", - "handlers": ["info_file_handler"], - "propagate": "no" - }, - }, - "root": { - "level": "ERROR", - "handlers": ["info_file_handler"] } - }) + if self.config.logging_to_console: + dictConfig["root"]["handlers"].append('info_console') + handlers_list.append('info_console') + dictConfig["handlers"]["info_console"] = { + "class": "logging.StreamHandler", + "level": "NOTSET", + "formatter": "simple", + "stream": "ext://sys.stdout", + } + + for logger in self.config.logging_loggers: + dictConfig["loggers"][logger] = { + "level": self.config.logging_level.upper(), + "handlers": handlers_list, + } + + if dictConfig["root"]["handlers"]: + logging.config.dictConfig(dictConfig) def filter(self, **kwargs): """ diff --git a/brigade/core/configuration.py b/brigade/core/configuration.py index a75924df..bb64dda6 100644 --- a/brigade/core/configuration.py +++ b/brigade/core/configuration.py @@ -24,6 +24,40 @@ 'default': os.path.join(os.path.expanduser("~"), ".ssh", "config"), 'default_doc': '~/.ssh/config' }, + 'logging_dictConfig': { + 'description': 'Configuration dictionary schema supported by the logging subsystem. ' + 'Overrides rest of logging_* parameters.', + 'type': 'dict', + 'default': {}, + }, + 'logging_level': { + 'description': 'Logging level. Can be any supported level by the logging subsystem', + 'type': 'str', + 'default': 'debug', + }, + 'logging_file': { + 'description': 'Logging file. Empty string disables logging to file.', + 'type': 'str', + 'default': 'brigade.log', + }, + 'logging_format': { + 'description': 'Logging format', + 'type': 'str', + 'default': "%(asctime)s - %(name)12s - %(levelname)8s - %(funcName)10s() - %(message)s", + }, + 'logging_to_console': { + 'description': 'Whether to log to stdout or not.', + 'type': 'bool', + 'default': False, + }, + 'logging_loggers': { + 'description': 'List of loggers to configure. This allows you to enable logging for ' + 'multiple loggers. For instance, you could enable logging for both brigade ' + 'and paramiko or just for paramiko. An empty list will enable logging for ' + 'all loggers.', + 'type': 'list', + 'default': ["brigade"], + } } types = { From cde17089069861c2bbddbab851370f2aa9af814f Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 2 Feb 2018 12:20:54 -0800 Subject: [PATCH 05/77] Expand netmiko connection task to add additional arguments from inventory --- .../plugins/tasks/connections/netmiko_connection.py | 12 +++++++++--- .../tasks/networking/test_netmiko_send_command.py | 9 ++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/brigade/plugins/tasks/connections/netmiko_connection.py b/brigade/plugins/tasks/connections/netmiko_connection.py index e4ba0b46..f4c32537 100644 --- a/brigade/plugins/tasks/connections/netmiko_connection.py +++ b/brigade/plugins/tasks/connections/netmiko_connection.py @@ -9,9 +9,11 @@ } -def netmiko_connection(task=None, **netmiko_args): +def netmiko_connection(task, **netmiko_args): """Connect to the host using Netmiko and set the relevant connection in the connection map. + Precedence order: **netmiko_args > discrete inventory attributes > inventory netmiko_options + Arguments: **netmiko_args: All supported Netmiko ConnectHandler arguments """ @@ -22,10 +24,14 @@ def netmiko_connection(task=None, **netmiko_args): "password": host.password, "port": host.ssh_port } + if host.nos is not None: # Look device_type up in corresponding map, if no entry return the host.nos unmodified device_type = napalm_to_netmiko_map.get(host.nos, host.nos) parameters['device_type'] = device_type - parameters.update(**netmiko_args) - host.connections["netmiko"] = ConnectHandler(**parameters) + # Precedence order: **netmiko_args > discrete inventory attributes > inventory netmiko_options + netmiko_connection_args = host.get("netmiko_options", {}) + netmiko_connection_args.update(parameters) + netmiko_connection_args.update(netmiko_args) + host.connections["netmiko"] = ConnectHandler(**netmiko_connection_args) diff --git a/tests/plugins/tasks/networking/test_netmiko_send_command.py b/tests/plugins/tasks/networking/test_netmiko_send_command.py index e3fd69ca..4cdf1581 100644 --- a/tests/plugins/tasks/networking/test_netmiko_send_command.py +++ b/tests/plugins/tasks/networking/test_netmiko_send_command.py @@ -3,7 +3,7 @@ class Test(object): - def test_netmiko_send_command(self, brigade): + def test_explicit_netmiko_connection(self, brigade): brigade.filter(name="dev4.group_2").run(task=connections.netmiko_connection) result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_command, command_string="hostname") @@ -11,6 +11,13 @@ def test_netmiko_send_command(self, brigade): for h, r in result.items(): assert h == r.result.strip() + def test_netmiko_send_command(self, brigade): + result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_command, + command_string="hostname") + assert result + for h, r in result.items(): + assert h == r.result.strip() + result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_command, command_string="hostname", use_timing=True) From 94b85b00b3b72c49f2e60a7de56dd1d72bbc0b71 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 2 Feb 2018 12:34:16 -0800 Subject: [PATCH 06/77] Sphinx annoyance --- brigade/plugins/tasks/connections/netmiko_connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brigade/plugins/tasks/connections/netmiko_connection.py b/brigade/plugins/tasks/connections/netmiko_connection.py index f4c32537..ef03bde4 100644 --- a/brigade/plugins/tasks/connections/netmiko_connection.py +++ b/brigade/plugins/tasks/connections/netmiko_connection.py @@ -15,7 +15,7 @@ def netmiko_connection(task, **netmiko_args): Precedence order: **netmiko_args > discrete inventory attributes > inventory netmiko_options Arguments: - **netmiko_args: All supported Netmiko ConnectHandler arguments + ``**netmiko_args``: All supported Netmiko ConnectHandler arguments """ host = task.host parameters = { From aaf152421592f7fc29609bb6049097b289b9732b Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 2 Feb 2018 13:41:25 -0800 Subject: [PATCH 07/77] Fix Sphinx problems --- brigade/plugins/tasks/connections/netmiko_connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brigade/plugins/tasks/connections/netmiko_connection.py b/brigade/plugins/tasks/connections/netmiko_connection.py index ef03bde4..7c6bef6b 100644 --- a/brigade/plugins/tasks/connections/netmiko_connection.py +++ b/brigade/plugins/tasks/connections/netmiko_connection.py @@ -12,7 +12,7 @@ def netmiko_connection(task, **netmiko_args): """Connect to the host using Netmiko and set the relevant connection in the connection map. - Precedence order: **netmiko_args > discrete inventory attributes > inventory netmiko_options + Precedence: ``**netmiko_args`` > discrete inventory attributes > inventory netmiko_options Arguments: ``**netmiko_args``: All supported Netmiko ConnectHandler arguments From c8dfce2213b6031214f3dc498dc486082505472a Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 23 Feb 2018 12:20:52 -0800 Subject: [PATCH 08/77] Re-add netmiko send_config --- .gitignore | 2 ++ brigade/plugins/tasks/networking/__init__.py | 2 ++ .../tasks/networking/netmiko_send_config.py | 25 +++++++++++++++++++ .../networking/test_netmiko_send_config.py | 19 ++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 brigade/plugins/tasks/networking/netmiko_send_config.py create mode 100644 tests/plugins/tasks/networking/test_netmiko_send_config.py diff --git a/.gitignore b/.gitignore index 8e0b0df3..6591ab8a 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,5 @@ tags output/ .DS_Store + +.pytest_cache/ diff --git a/brigade/plugins/tasks/networking/__init__.py b/brigade/plugins/tasks/networking/__init__.py index 59e33ed9..a8f9b4b7 100644 --- a/brigade/plugins/tasks/networking/__init__.py +++ b/brigade/plugins/tasks/networking/__init__.py @@ -3,6 +3,7 @@ from .napalm_get import napalm_get from .napalm_validate import napalm_validate from .netmiko_send_command import netmiko_send_command +from .netmiko_send_config import netmiko_send_config from .tcp_ping import tcp_ping __all__ = ( @@ -11,5 +12,6 @@ "napalm_get", "napalm_validate", "netmiko_send_command", + "netmiko_send_config", "tcp_ping", ) diff --git a/brigade/plugins/tasks/networking/netmiko_send_config.py b/brigade/plugins/tasks/networking/netmiko_send_config.py new file mode 100644 index 00000000..5d7621c2 --- /dev/null +++ b/brigade/plugins/tasks/networking/netmiko_send_config.py @@ -0,0 +1,25 @@ +from __future__ import unicode_literals + +from brigade.core.task import Result + + +def netmiko_send_config(task, config_commands=None, config_file=None, **kwargs): + """ + Execute Netmiko send_config_set method (or send_config_from_file) + Arguments: + config_commands(list, optional): Commands to configure on the remote network device. + config_file(str, optional): File to read configuration commands from. + + kwargs (dict, optional): Additional arguments to pass to method. + Returns: + :obj:`brigade.core.task.Result`: + * result (``dict``): dictionary with the result of the getter + """ + net_connect = task.host.get_connection("netmiko") + if config_commands: + result = net_connect.send_config_set(config_commands=config_commands, **kwargs) + elif config_file: + result = net_connect.send_config_from_file(config_file=config_file, **kwargs) + else: + raise ValueError("Must specify either config_commands or config_file") + return Result(host=task.host, result=result, changed=True) diff --git a/tests/plugins/tasks/networking/test_netmiko_send_config.py b/tests/plugins/tasks/networking/test_netmiko_send_config.py new file mode 100644 index 00000000..c64efb50 --- /dev/null +++ b/tests/plugins/tasks/networking/test_netmiko_send_config.py @@ -0,0 +1,19 @@ +from brigade.plugins.tasks import connections, networking + + +class Test(object): + + def test_explicit_netmiko_connection(self, brigade): + brigade.filter(name="dev4.group_2").run(task=connections.netmiko_connection) + result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_config, + config_commands="hostname") + assert result + for h, r in result.items(): + assert h == r.result.strip() + + def test_netmiko_send_command(self, brigade): + result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_config, + config_commands="hostname") + assert result + for h, r in result.items(): + assert h == r.result.strip() From bb6e811eab8363891ac0f2f33c01b4761ee077c3 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 23 Feb 2018 12:33:35 -0800 Subject: [PATCH 09/77] Fixing unit tests for config operation --- tests/plugins/tasks/networking/test_netmiko_send_config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/plugins/tasks/networking/test_netmiko_send_config.py b/tests/plugins/tasks/networking/test_netmiko_send_config.py index c64efb50..96844527 100644 --- a/tests/plugins/tasks/networking/test_netmiko_send_config.py +++ b/tests/plugins/tasks/networking/test_netmiko_send_config.py @@ -9,11 +9,11 @@ def test_explicit_netmiko_connection(self, brigade): config_commands="hostname") assert result for h, r in result.items(): - assert h == r.result.strip() + assert h in r.result.strip() def test_netmiko_send_command(self, brigade): result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_config, config_commands="hostname") assert result for h, r in result.items(): - assert h == r.result.strip() + assert h in r.result.strip() From 8b88341675073388276655aa413b743428a55457 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sat, 24 Feb 2018 08:10:29 -0800 Subject: [PATCH 10/77] Minor doc fixes --- brigade/plugins/tasks/networking/netmiko_send_config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/brigade/plugins/tasks/networking/netmiko_send_config.py b/brigade/plugins/tasks/networking/netmiko_send_config.py index 5d7621c2..bc90b9a3 100644 --- a/brigade/plugins/tasks/networking/netmiko_send_config.py +++ b/brigade/plugins/tasks/networking/netmiko_send_config.py @@ -9,11 +9,11 @@ def netmiko_send_config(task, config_commands=None, config_file=None, **kwargs): Arguments: config_commands(list, optional): Commands to configure on the remote network device. config_file(str, optional): File to read configuration commands from. - kwargs (dict, optional): Additional arguments to pass to method. + Returns: :obj:`brigade.core.task.Result`: - * result (``dict``): dictionary with the result of the getter + * result (``dict``): dictionary with the result of the show command. """ net_connect = task.host.get_connection("netmiko") if config_commands: From 5ae6959fb8a60889a0d09b16df9adbda6e7096c7 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sat, 24 Feb 2018 08:25:04 -0800 Subject: [PATCH 11/77] Minor doc fixes --- brigade/plugins/tasks/networking/netmiko_send_command.py | 2 +- brigade/plugins/tasks/networking/netmiko_send_config.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/brigade/plugins/tasks/networking/netmiko_send_command.py b/brigade/plugins/tasks/networking/netmiko_send_command.py index 7bcb7328..ebd5c915 100644 --- a/brigade/plugins/tasks/networking/netmiko_send_command.py +++ b/brigade/plugins/tasks/networking/netmiko_send_command.py @@ -12,7 +12,7 @@ def netmiko_send_command(task, command_string, use_timing=False, **kwargs): Returns: :obj:`brigade.core.task.Result`: - * result (``dict``): dictionary with the result of the getter + * result (``dict``): dictionary with the result of the show command. """ net_connect = task.host.get_connection("netmiko") if use_timing: diff --git a/brigade/plugins/tasks/networking/netmiko_send_config.py b/brigade/plugins/tasks/networking/netmiko_send_config.py index bc90b9a3..16f9aea7 100644 --- a/brigade/plugins/tasks/networking/netmiko_send_config.py +++ b/brigade/plugins/tasks/networking/netmiko_send_config.py @@ -13,7 +13,7 @@ def netmiko_send_config(task, config_commands=None, config_file=None, **kwargs): Returns: :obj:`brigade.core.task.Result`: - * result (``dict``): dictionary with the result of the show command. + * result (``dict``): dictionary showing the CLI from the configuration changes. """ net_connect = task.host.get_connection("netmiko") if config_commands: From e1cb20bd4d9d9838621f2a610a6ed67db57bff47 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 25 Feb 2018 15:55:06 +0100 Subject: [PATCH 12/77] move Brigade to dedicated file for clarity --- .gitignore | 1 + brigade/core/__init__.py | 207 +------------------------------------- brigade/core/brigade.py | 208 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 210 insertions(+), 206 deletions(-) create mode 100644 brigade/core/brigade.py diff --git a/.gitignore b/.gitignore index 25f8125c..8552a450 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ __pycache__/ *.py[cod] *$py.class +.pytest_cache/ # C extensions *.so diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index cf1e41d6..95b702db 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -1,212 +1,7 @@ import importlib -import logging -import logging.config -import sys -import traceback -from multiprocessing.dummy import Pool +from brigade.core.brigade import Brigade from brigade.core.configuration import Config -from brigade.core.task import AggregatedResult, Result, Task -from brigade.plugins.tasks import connections - - -if sys.version_info.major == 2: - import copy_reg - import types - - # multithreading requires objects passed around to be pickable - # following methods allow py2 to know how to pickle methods - def _pickle_method(method): - func_name = method.im_func.__name__ - obj = method.im_self - cls = method.im_class - return _unpickle_method, (func_name, obj, cls) - - def _unpickle_method(func_name, obj, cls): - for cls in cls.mro(): - try: - func = cls.__dict__[func_name] - except KeyError: - pass - else: - break - return func.__get__(obj, cls) - - copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method) - - -class Data(object): - """ - This class is just a placeholder to share data amongsts different - versions of Brigade after running ``filter`` multiple times. - - Attributes: - failed_hosts (list): Hosts that have failed to run a task properly - """ - - def __init__(self): - self.failed_hosts = set() - - -class Brigade(object): - """ - This is the main object to work with. It contains the inventory and it serves - as task dispatcher. - - Arguments: - inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with - data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade - dry_run(``bool``): Whether if we are testing the changes or not - config (:obj:`brigade.core.configuration.Config`): Configuration object - config_file (``str``): Path to Yaml configuration file - available_connections (``dict``): dict of connection types that will be made available. - Defaults to :obj:`brigade.plugins.tasks.connections.available_connections` - - Attributes: - inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with - data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade - dry_run(``bool``): Whether if we are testing the changes or not - config (:obj:`brigade.core.configuration.Config`): Configuration parameters - available_connections (``dict``): dict of connection types are available - """ - - def __init__(self, inventory, dry_run, config=None, config_file=None, - available_connections=None, logger=None, data=None): - self.logger = logger or logging.getLogger("brigade") - - self.data = data or Data() - self.inventory = inventory - self.inventory.brigade = self - - self.dry_run = dry_run - if config_file: - self.config = Config(config_file=config_file) - else: - self.config = config or Config() - - self.configure_logging() - - if available_connections is not None: - self.available_connections = available_connections - else: - self.available_connections = connections.available_connections - - def configure_logging(self): - format = "%(asctime)s - %(name)s - %(levelname)s" - format += " - %(funcName)10s() - %(message)s" - logging.config.dictConfig({ - "version": 1, - "disable_existing_loggers": False, - "formatters": { - "simple": {"format": format} - }, - "handlers": { - "info_file_handler": { - "class": "logging.handlers.RotatingFileHandler", - "level": "INFO", - "formatter": "simple", - "filename": "brigade.log", - "maxBytes": 10485760, - "backupCount": 20, - "encoding": "utf8" - }, - }, - "loggers": { - "brigade": { - "level": "INFO", - "handlers": ["info_file_handler"], - "propagate": "no" - }, - }, - "root": { - "level": "ERROR", - "handlers": ["info_file_handler"] - } - }) - - def filter(self, **kwargs): - """ - See :py:meth:`brigade.core.inventory.Inventory.filter` - - Returns: - :obj:`Brigade`: A new object with same configuration as ``self`` but filtered inventory. - """ - b = Brigade(**self.__dict__) - b.inventory = self.inventory.filter(**kwargs) - return b - - def _run_serial(self, task, dry_run, **kwargs): - result = AggregatedResult(kwargs.get("name") or task.__name__) - for host in self.inventory.hosts.values(): - result[host.name] = run_task(host, self, dry_run, Task(task, **kwargs)) - return result - - def _run_parallel(self, task, num_workers, dry_run, **kwargs): - result = AggregatedResult(kwargs.get("name") or task.__name__) - - pool = Pool(processes=num_workers) - result_pool = [pool.apply_async(run_task, - args=(h, self, dry_run, Task(task, **kwargs))) - for h in self.inventory.hosts.values()] - pool.close() - pool.join() - - for rp in result_pool: - r = rp.get() - result[r.host.name] = r - return result - - def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, **kwargs): - """ - Run task over all the hosts in the inventory. - - Arguments: - task (``callable``): function or callable that will be run against each device in - the inventory - num_workers(``int``): Override for how many hosts to run in paralell for this task - dry_run(``bool``): Whether if we are testing the changes or not - raise_on_error (``bool``): Override raise_on_error behavior - **kwargs: additional argument to pass to ``task`` when calling it - - Raises: - :obj:`brigade.core.exceptions.BrigadeExecutionError`: if at least a task fails - and self.config.raise_on_error is set to ``True`` - - Returns: - :obj:`brigade.core.task.AggregatedResult`: results of each execution - """ - num_workers = num_workers or self.config.num_workers - - self.logger.info("Running task '{}' with num_workers: {}, dry_run: {}".format( - kwargs.get("name") or task.__name__, num_workers, dry_run)) - self.logger.debug(kwargs) - - if num_workers == 1: - result = self._run_serial(task, dry_run, **kwargs) - else: - result = self._run_parallel(task, num_workers, dry_run, **kwargs) - - raise_on_error = raise_on_error if raise_on_error is not None else \ - self.config.raise_on_error - if raise_on_error: - result.raise_on_error() - else: - self.data.failed_hosts.update(result.failed_hosts.keys()) - return result - - -def run_task(host, brigade, dry_run, task): - logger = logging.getLogger("brigade") - try: - logger.info("{}: {}: running task".format(host.name, task.name)) - r = task._start(host=host, brigade=brigade, dry_run=dry_run) - except Exception as e: - tb = traceback.format_exc() - logger.error("{}: {}".format(host, tb)) - r = Result(host, exception=e, result=tb, failed=True) - task.results.append(r) - r.name = task.name - return task.results def from_conf(config_file="", dry_run=False, **kwargs): diff --git a/brigade/core/brigade.py b/brigade/core/brigade.py new file mode 100644 index 00000000..a02ea1ce --- /dev/null +++ b/brigade/core/brigade.py @@ -0,0 +1,208 @@ +import logging +import logging.config +import sys +import traceback +from multiprocessing.dummy import Pool + +from brigade.core.configuration import Config +from brigade.core.task import AggregatedResult, Result, Task +from brigade.plugins.tasks import connections + + +if sys.version_info.major == 2: + import copy_reg + import types + + # multithreading requires objects passed around to be pickable + # following methods allow py2 to know how to pickle methods + def _pickle_method(method): + func_name = method.im_func.__name__ + obj = method.im_self + cls = method.im_class + return _unpickle_method, (func_name, obj, cls) + + def _unpickle_method(func_name, obj, cls): + for cls in cls.mro(): + try: + func = cls.__dict__[func_name] + except KeyError: + pass + else: + break + return func.__get__(obj, cls) + + copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method) + + +class Data(object): + """ + This class is just a placeholder to share data amongsts different + versions of Brigade after running ``filter`` multiple times. + + Attributes: + failed_hosts (list): Hosts that have failed to run a task properly + """ + + def __init__(self): + self.failed_hosts = set() + + +class Brigade(object): + """ + This is the main object to work with. It contains the inventory and it serves + as task dispatcher. + + Arguments: + inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with + data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade + dry_run(``bool``): Whether if we are testing the changes or not + config (:obj:`brigade.core.configuration.Config`): Configuration object + config_file (``str``): Path to Yaml configuration file + available_connections (``dict``): dict of connection types that will be made available. + Defaults to :obj:`brigade.plugins.tasks.connections.available_connections` + + Attributes: + inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with + data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade + dry_run(``bool``): Whether if we are testing the changes or not + config (:obj:`brigade.core.configuration.Config`): Configuration parameters + available_connections (``dict``): dict of connection types are available + """ + + def __init__(self, inventory, dry_run, config=None, config_file=None, + available_connections=None, logger=None, data=None): + self.logger = logger or logging.getLogger("brigade") + + self.data = data or Data() + self.inventory = inventory + self.inventory.brigade = self + + self.dry_run = dry_run + if config_file: + self.config = Config(config_file=config_file) + else: + self.config = config or Config() + + self.configure_logging() + + if available_connections is not None: + self.available_connections = available_connections + else: + self.available_connections = connections.available_connections + + def configure_logging(self): + format = "%(asctime)s - %(name)s - %(levelname)s" + format += " - %(funcName)10s() - %(message)s" + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "simple": {"format": format} + }, + "handlers": { + "info_file_handler": { + "class": "logging.handlers.RotatingFileHandler", + "level": "INFO", + "formatter": "simple", + "filename": "brigade.log", + "maxBytes": 10485760, + "backupCount": 20, + "encoding": "utf8" + }, + }, + "loggers": { + "brigade": { + "level": "INFO", + "handlers": ["info_file_handler"], + "propagate": "no" + }, + }, + "root": { + "level": "ERROR", + "handlers": ["info_file_handler"] + } + }) + + def filter(self, **kwargs): + """ + See :py:meth:`brigade.core.inventory.Inventory.filter` + + Returns: + :obj:`Brigade`: A new object with same configuration as ``self`` but filtered inventory. + """ + b = Brigade(**self.__dict__) + b.inventory = self.inventory.filter(**kwargs) + return b + + def _run_serial(self, task, dry_run, **kwargs): + result = AggregatedResult(kwargs.get("name") or task.__name__) + for host in self.inventory.hosts.values(): + result[host.name] = run_task(host, self, dry_run, Task(task, **kwargs)) + return result + + def _run_parallel(self, task, num_workers, dry_run, **kwargs): + result = AggregatedResult(kwargs.get("name") or task.__name__) + + pool = Pool(processes=num_workers) + result_pool = [pool.apply_async(run_task, + args=(h, self, dry_run, Task(task, **kwargs))) + for h in self.inventory.hosts.values()] + pool.close() + pool.join() + + for rp in result_pool: + r = rp.get() + result[r.host.name] = r + return result + + def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, **kwargs): + """ + Run task over all the hosts in the inventory. + + Arguments: + task (``callable``): function or callable that will be run against each device in + the inventory + num_workers(``int``): Override for how many hosts to run in paralell for this task + dry_run(``bool``): Whether if we are testing the changes or not + raise_on_error (``bool``): Override raise_on_error behavior + **kwargs: additional argument to pass to ``task`` when calling it + + Raises: + :obj:`brigade.core.exceptions.BrigadeExecutionError`: if at least a task fails + and self.config.raise_on_error is set to ``True`` + + Returns: + :obj:`brigade.core.task.AggregatedResult`: results of each execution + """ + num_workers = num_workers or self.config.num_workers + + self.logger.info("Running task '{}' with num_workers: {}, dry_run: {}".format( + kwargs.get("name") or task.__name__, num_workers, dry_run)) + self.logger.debug(kwargs) + + if num_workers == 1: + result = self._run_serial(task, dry_run, **kwargs) + else: + result = self._run_parallel(task, num_workers, dry_run, **kwargs) + + raise_on_error = raise_on_error if raise_on_error is not None else \ + self.config.raise_on_error + if raise_on_error: + result.raise_on_error() + else: + self.data.failed_hosts.update(result.failed_hosts.keys()) + return result + + +def run_task(host, brigade, dry_run, task): + logger = logging.getLogger("brigade") + try: + logger.info("{}: {}: running task".format(host.name, task.name)) + r = task._start(host=host, brigade=brigade, dry_run=dry_run) + except Exception as e: + tb = traceback.format_exc() + logger.error("{}: {}".format(host, tb)) + r = Result(host, exception=e, result=tb, failed=True) + task.results.append(r) + r.name = task.name + return task.results From 0b8ffbeb197350997665873d01582b0e60b0781d Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 25 Feb 2018 15:55:40 +0100 Subject: [PATCH 13/77] Use SimpleInventory by default --- brigade/core/configuration.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/brigade/core/configuration.py b/brigade/core/configuration.py index a75924df..d8071eba 100644 --- a/brigade/core/configuration.py +++ b/brigade/core/configuration.py @@ -5,6 +5,11 @@ CONF = { + 'inventory': { + 'description': 'Path to inventory modules.', + 'type': 'string', + 'default': 'brigade.plugins.inventory.simple.SimpleInventory', + }, 'num_workers': { 'description': 'Number of Brigade worker processes that are run at the same time, ' 'configuration can be overridden on individual tasks by using the ' From bc10d99bd876afc99a184d0bc7ef97ad3967a27a Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 25 Feb 2018 15:56:31 +0100 Subject: [PATCH 14/77] Rename to InitBrigade and minor changes to defaults --- brigade/core/__init__.py | 2 +- brigade/plugins/inventory/simple.py | 2 +- tests/core/test_InitBrigade.py | 49 ++++++++++++++++++ .../a_config.yaml | 0 tests/core/test_from_conf.py | 38 -------------- tests/inventory_data/nsot/nsot.sqlite3 | Bin 261120 -> 294912 bytes 6 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 tests/core/test_InitBrigade.py rename tests/core/{test_from_conf => test_InitBrigade}/a_config.yaml (100%) delete mode 100644 tests/core/test_from_conf.py diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index 95b702db..41b37bb5 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -4,7 +4,7 @@ from brigade.core.configuration import Config -def from_conf(config_file="", dry_run=False, **kwargs): +def InitBrigade(config_file="", dry_run=False, **kwargs): """ Arguments: config_file(str): Path to the configuration file (optional) diff --git a/brigade/plugins/inventory/simple.py b/brigade/plugins/inventory/simple.py index 67291ce1..8748ce2b 100644 --- a/brigade/plugins/inventory/simple.py +++ b/brigade/plugins/inventory/simple.py @@ -102,7 +102,7 @@ class SimpleInventory(Inventory): cmh: group: all """ - def __init__(self, host_file="hosts.yaml", group_file=None, **kwargs): + def __init__(self, host_file="hosts.yaml", group_file="groups.yaml", **kwargs): with open(host_file, "r") as f: hosts = yaml.load(f.read()) diff --git a/tests/core/test_InitBrigade.py b/tests/core/test_InitBrigade.py new file mode 100644 index 00000000..f7455e1e --- /dev/null +++ b/tests/core/test_InitBrigade.py @@ -0,0 +1,49 @@ +import os + +from brigade.core import InitBrigade + + +dir_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test_InitBrigade") + + +class Test(object): + + def test_InitBrigade_defaults(self): + os.chdir("tests/core/inventory_data/") + try: + brg = InitBrigade() + finally: + os.chdir("../../../") + assert not brg.dry_run + assert brg.config.num_workers == 20 + assert len(brg.inventory.hosts) + assert len(brg.inventory.groups) + + def test_InitBrigade_file(self): + brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml")) + assert not brg.dry_run + assert brg.config.num_workers == 100 + assert len(brg.inventory.hosts) + assert len(brg.inventory.groups) + + def test_InitBrigade_programmatically(self): + brg = InitBrigade(num_workers=100, + inventory="brigade.plugins.inventory.simple.SimpleInventory", + SimpleInventory={ + "host_file": "tests/core/inventory_data/hosts.yaml", + "group_file": "tests/core/inventory_data/groups.yaml", + }, + ) + assert not brg.dry_run + assert brg.config.num_workers == 100 + assert len(brg.inventory.hosts) + assert len(brg.inventory.groups) + + def test_InitBrigade_combined(self): + brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), + num_workers=200, + ) + assert not brg.dry_run + assert brg.config.num_workers == 200 + assert len(brg.inventory.hosts) + assert len(brg.inventory.groups) diff --git a/tests/core/test_from_conf/a_config.yaml b/tests/core/test_InitBrigade/a_config.yaml similarity index 100% rename from tests/core/test_from_conf/a_config.yaml rename to tests/core/test_InitBrigade/a_config.yaml diff --git a/tests/core/test_from_conf.py b/tests/core/test_from_conf.py deleted file mode 100644 index 66ca67be..00000000 --- a/tests/core/test_from_conf.py +++ /dev/null @@ -1,38 +0,0 @@ -import os - -from brigade.core import from_conf - - -dir_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test_from_conf") - - -class Test(object): - - def test_from_conf_file(self): - brg = from_conf(config_file=os.path.join(dir_path, "a_config.yaml")) - assert not brg.dry_run - assert brg.config.num_workers == 100 - assert len(brg.inventory.hosts) - assert len(brg.inventory.groups) - - def test_from_conf_programmatically(self): - brg = from_conf(num_workers=100, - inventory="brigade.plugins.inventory.simple.SimpleInventory", - SimpleInventory={ - "host_file": "tests/core/inventory_data/hosts.yaml", - "group_file": "tests/core/inventory_data/groups.yaml", - }, - ) - assert not brg.dry_run - assert brg.config.num_workers == 100 - assert len(brg.inventory.hosts) - assert len(brg.inventory.groups) - - def test_from_conf_combined(self): - brg = from_conf(config_file=os.path.join(dir_path, "a_config.yaml"), - num_workers=200, - ) - assert not brg.dry_run - assert brg.config.num_workers == 200 - assert len(brg.inventory.hosts) - assert len(brg.inventory.groups) diff --git a/tests/inventory_data/nsot/nsot.sqlite3 b/tests/inventory_data/nsot/nsot.sqlite3 index 2e59de91b8953beea6c629625bd544c2e24e858c..0ebe65275b186184b55e3c5a86d2678503b13e8c 100644 GIT binary patch delta 13644 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 delta 10124 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 Y=xY?{`|=XSxP0P!Jc7PE{!KaXzezrfI{*Lx From 4c6a7555c62fbdeb6d3328c4a5dbea1dfee7aade Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 25 Feb 2018 16:33:05 +0100 Subject: [PATCH 15/77] fix tests --- docs/ref/api/brigade.rst | 8 ++++---- tests/inventory_data/nsot/nsot.sqlite3 | Bin 294912 -> 294912 bytes .../plugins/tasks/networking/test_tcp_ping.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/ref/api/brigade.rst b/docs/ref/api/brigade.rst index 31900537..8ed3c38f 100644 --- a/docs/ref/api/brigade.rst +++ b/docs/ref/api/brigade.rst @@ -1,7 +1,7 @@ Data #### -.. autoclass:: brigade.core.Data +.. autoclass:: brigade.core.brigade.Data :members: :undoc-members: @@ -12,7 +12,7 @@ Brigade :members: :undoc-members: -from_conf -######### +InitBrigade +########### -.. automethod:: brigade.core.from_conf +.. automethod:: brigade.core.InitBrigade diff --git a/tests/inventory_data/nsot/nsot.sqlite3 b/tests/inventory_data/nsot/nsot.sqlite3 index 0ebe65275b186184b55e3c5a86d2678503b13e8c..0e3fd180412d55c7b89f966726bb1b053097bcb5 100644 GIT binary patch delta 1693 zcmah~eQXp(6rXu-TQ21gEEd~>VOwnxLhF9-Uc<)~)S!Vx`HR#Lp}qEwUVAO=-L=;U zy#oai5YWhwn2?54zAA_TyI?gfA4bx^K_C*MF~LNW7Lh=yq>4f3_JpdzGI6mz6$v2+_%~t4vnFMU6`!r3oqkt2bn-o7Gk1Wl72qIr9!4{Qk!5w!*%`yn;1bG`3WynQe$K1!C)`B>9wsySWCp#=zPo@$_LVMLH<7LV z9y49KX6mL%_On-d=##Ad5N5a~P1bdlY~}E)?1$HJiv4a6jdsq;Bg+W4HDnJtOMao* z)S}DjdU}8+=`iHMeDJ|0_yoRzd#uz4v)IK&DAmUQ5NO z@PcS>sD|-ST!c%&st!i#nnSHsYK^J;G)Yods)iA&Z}!Rlwpz^~efADNL@lQ_yKQ#| z3{TwYh0J}KBRtp4WAOXa-M8Q@6hEJ_Wc`}*K)A9x+TyFM4`_zothYssNK1W4j+wPB zN?S{)(Y`qZ0)0r5DoLEAee@~_-Pb^vWDCOx{Mcc*k5V34PPnZj`$>}Ap}BM}t)v_2 z$Mg~%fu~@>qwYL2UBitdkcH0uD*e&09Q3r-tdiOcv!zAz$Li}FDx0*B)oR4706A&z zxChOPwOme+$*tn57gRG>$~p|B#G)eTX(s>%rI(QrgJ z+O%j$QyS_u(#!Ib7-bjEVS&9liOCg;fwI-bs=FVO(6-d_3@{Sgofp`7I($5r-)w^2sc zw;6L;T@Q6J?+FyUx1ccFolp7*w`-J8k-3iJk(4jT{@?@#fk{1l(|a8|y1zhSk}H?I zMYwe_*CLELx+@$@3gisi)J2PIE_ws)%!>%Q!h=vH}Bx*oYelHuhWtt zXQpF0D3WZINNR~Ji_!zXqFIvSA*cV(FUyuB%jDD}{BoHpm#V5HYdSeO>Q{IOkxl#= zZ!_^amaqxed26-b#thbb6EoTULCi@nuMYA~J3ff{Z0)by(L2P4-GlfXYl2R+ssG1}Ds$Ykd(Tv}Z2;K%C0 q|3ptSz@sm4(Ec&RKZB`x6i7X!Gf8B$jR~EH zAclxEEitRP(pdTs1Tjpu7X{f%l#`)0MU+_A>LoZAzO#JaIp^N%^`?5gss2f0YXHy! zfGheW*Jmxl8lUHu2QO9FmQkCI!5y*h!Ri}6`y7h@bpi?)-Syd$dW-OE5U1Ui@3+BWMHw&Y9;wn87ho_( zhLM#HwV}JgzV3KE9_onxS=fl25YhxLosAsxx(*$H9|q zI63O1OJxXcN+T}?JK0EaI^Y4o0H$FfdhjSVV-J3% ziR7koct9uUIz6Xhp31AalKp&(U+d>SCj$XCB+^b6>7RDEnAgi-F~5^7Z+MDKDB)6d zri8Om-mc-Pa=is-27B0+E>;I;W{z^O7rQZlUft1+76SA_Hw3_|wcX Date: Sun, 25 Feb 2018 16:41:50 +0100 Subject: [PATCH 16/77] undo moving things around --- brigade/core/__init__.py | 222 +++++++++++++++++++++++- brigade/core/brigade.py | 223 ------------------------- brigade/core/init_brigade.py | 0 tests/inventory_data/nsot/nsot.sqlite3 | Bin 294912 -> 294912 bytes 4 files changed, 221 insertions(+), 224 deletions(-) delete mode 100644 brigade/core/brigade.py create mode 100644 brigade/core/init_brigade.py diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index 41b37bb5..02c0d76f 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -1,7 +1,227 @@ import importlib +import logging +import logging.config +import sys +import traceback +from multiprocessing.dummy import Pool -from brigade.core.brigade import Brigade from brigade.core.configuration import Config +from brigade.core.task import AggregatedResult, Result, Task +from brigade.plugins.tasks import connections + + +if sys.version_info.major == 2: + import copy_reg + import types + + # multithreading requires objects passed around to be pickable + # following methods allow py2 to know how to pickle methods + def _pickle_method(method): + func_name = method.im_func.__name__ + obj = method.im_self + cls = method.im_class + return _unpickle_method, (func_name, obj, cls) + + def _unpickle_method(func_name, obj, cls): + for cls in cls.mro(): + try: + func = cls.__dict__[func_name] + except KeyError: + pass + else: + break + return func.__get__(obj, cls) + + copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method) + + +class Data(object): + """ + This class is just a placeholder to share data amongsts different + versions of Brigade after running ``filter`` multiple times. + + Attributes: + failed_hosts (list): Hosts that have failed to run a task properly + """ + + def __init__(self): + self.failed_hosts = set() + + +class Brigade(object): + """ + This is the main object to work with. It contains the inventory and it serves + as task dispatcher. + + Arguments: + inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with + data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade + dry_run(``bool``): Whether if we are testing the changes or not + config (:obj:`brigade.core.configuration.Config`): Configuration object + config_file (``str``): Path to Yaml configuration file + available_connections (``dict``): dict of connection types that will be made available. + Defaults to :obj:`brigade.plugins.tasks.connections.available_connections` + + Attributes: + inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with + data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade + dry_run(``bool``): Whether if we are testing the changes or not + config (:obj:`brigade.core.configuration.Config`): Configuration parameters + available_connections (``dict``): dict of connection types are available + """ + + def __init__(self, inventory, dry_run, config=None, config_file=None, + available_connections=None, logger=None, data=None): + self.logger = logger or logging.getLogger("brigade") + + self.data = data or Data() + self.inventory = inventory + self.inventory.brigade = self + + self.dry_run = dry_run + if config_file: + self.config = Config(config_file=config_file) + else: + self.config = config or Config() + + self.configure_logging() + + if available_connections is not None: + self.available_connections = available_connections + else: + self.available_connections = connections.available_connections + + def configure_logging(self): + dictConfig = self.config.logging_dictConfig or { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "simple": {"format": self.config.logging_format} + }, + "handlers": {}, + "loggers": {}, + "root": { + "level": "CRITICAL" if self.config.logging_loggers else + self.config.logging_level.upper(), + "handlers": [], + "formatter": "simple", + } + } + handlers_list = [] + if self.config.logging_file: + dictConfig["root"]["handlers"].append('info_file_handler') + handlers_list.append('info_file_handler') + dictConfig["handlers"]["info_file_handler"] = { + "class": "logging.handlers.RotatingFileHandler", + "level": "NOTSET", + "formatter": "simple", + "filename": self.config.logging_file, + "maxBytes": 10485760, + "backupCount": 20, + "encoding": "utf8" + } + if self.config.logging_to_console: + dictConfig["root"]["handlers"].append('info_console') + handlers_list.append('info_console') + dictConfig["handlers"]["info_console"] = { + "class": "logging.StreamHandler", + "level": "NOTSET", + "formatter": "simple", + "stream": "ext://sys.stdout", + } + + for logger in self.config.logging_loggers: + dictConfig["loggers"][logger] = { + "level": self.config.logging_level.upper(), + "handlers": handlers_list, + } + + if dictConfig["root"]["handlers"]: + logging.config.dictConfig(dictConfig) + + def filter(self, **kwargs): + """ + See :py:meth:`brigade.core.inventory.Inventory.filter` + + Returns: + :obj:`Brigade`: A new object with same configuration as ``self`` but filtered inventory. + """ + b = Brigade(**self.__dict__) + b.inventory = self.inventory.filter(**kwargs) + return b + + def _run_serial(self, task, dry_run, **kwargs): + result = AggregatedResult(kwargs.get("name") or task.__name__) + for host in self.inventory.hosts.values(): + result[host.name] = run_task(host, self, dry_run, Task(task, **kwargs)) + return result + + def _run_parallel(self, task, num_workers, dry_run, **kwargs): + result = AggregatedResult(kwargs.get("name") or task.__name__) + + pool = Pool(processes=num_workers) + result_pool = [pool.apply_async(run_task, + args=(h, self, dry_run, Task(task, **kwargs))) + for h in self.inventory.hosts.values()] + pool.close() + pool.join() + + for rp in result_pool: + r = rp.get() + result[r.host.name] = r + return result + + def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, **kwargs): + """ + Run task over all the hosts in the inventory. + + Arguments: + task (``callable``): function or callable that will be run against each device in + the inventory + num_workers(``int``): Override for how many hosts to run in paralell for this task + dry_run(``bool``): Whether if we are testing the changes or not + raise_on_error (``bool``): Override raise_on_error behavior + **kwargs: additional argument to pass to ``task`` when calling it + + Raises: + :obj:`brigade.core.exceptions.BrigadeExecutionError`: if at least a task fails + and self.config.raise_on_error is set to ``True`` + + Returns: + :obj:`brigade.core.task.AggregatedResult`: results of each execution + """ + num_workers = num_workers or self.config.num_workers + + self.logger.info("Running task '{}' with num_workers: {}, dry_run: {}".format( + kwargs.get("name") or task.__name__, num_workers, dry_run)) + self.logger.debug(kwargs) + + if num_workers == 1: + result = self._run_serial(task, dry_run, **kwargs) + else: + result = self._run_parallel(task, num_workers, dry_run, **kwargs) + + raise_on_error = raise_on_error if raise_on_error is not None else \ + self.config.raise_on_error + if raise_on_error: + result.raise_on_error() + else: + self.data.failed_hosts.update(result.failed_hosts.keys()) + return result + + +def run_task(host, brigade, dry_run, task): + logger = logging.getLogger("brigade") + try: + logger.info("{}: {}: running task".format(host.name, task.name)) + r = task._start(host=host, brigade=brigade, dry_run=dry_run) + except Exception as e: + tb = traceback.format_exc() + logger.error("{}: {}".format(host, tb)) + r = Result(host, exception=e, result=tb, failed=True) + task.results.append(r) + r.name = task.name + return task.results def InitBrigade(config_file="", dry_run=False, **kwargs): diff --git a/brigade/core/brigade.py b/brigade/core/brigade.py deleted file mode 100644 index cdee5aa6..00000000 --- a/brigade/core/brigade.py +++ /dev/null @@ -1,223 +0,0 @@ -import logging -import logging.config -import sys -import traceback -from multiprocessing.dummy import Pool - -from brigade.core.configuration import Config -from brigade.core.task import AggregatedResult, Result, Task -from brigade.plugins.tasks import connections - - -if sys.version_info.major == 2: - import copy_reg - import types - - # multithreading requires objects passed around to be pickable - # following methods allow py2 to know how to pickle methods - def _pickle_method(method): - func_name = method.im_func.__name__ - obj = method.im_self - cls = method.im_class - return _unpickle_method, (func_name, obj, cls) - - def _unpickle_method(func_name, obj, cls): - for cls in cls.mro(): - try: - func = cls.__dict__[func_name] - except KeyError: - pass - else: - break - return func.__get__(obj, cls) - - copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method) - - -class Data(object): - """ - This class is just a placeholder to share data amongsts different - versions of Brigade after running ``filter`` multiple times. - - Attributes: - failed_hosts (list): Hosts that have failed to run a task properly - """ - - def __init__(self): - self.failed_hosts = set() - - -class Brigade(object): - """ - This is the main object to work with. It contains the inventory and it serves - as task dispatcher. - - Arguments: - inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with - data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade - dry_run(``bool``): Whether if we are testing the changes or not - config (:obj:`brigade.core.configuration.Config`): Configuration object - config_file (``str``): Path to Yaml configuration file - available_connections (``dict``): dict of connection types that will be made available. - Defaults to :obj:`brigade.plugins.tasks.connections.available_connections` - - Attributes: - inventory (:obj:`brigade.core.inventory.Inventory`): Inventory to work with - data(:obj:`brigade.core.Data`): shared data amongst different iterations of brigade - dry_run(``bool``): Whether if we are testing the changes or not - config (:obj:`brigade.core.configuration.Config`): Configuration parameters - available_connections (``dict``): dict of connection types are available - """ - - def __init__(self, inventory, dry_run, config=None, config_file=None, - available_connections=None, logger=None, data=None): - self.logger = logger or logging.getLogger("brigade") - - self.data = data or Data() - self.inventory = inventory - self.inventory.brigade = self - - self.dry_run = dry_run - if config_file: - self.config = Config(config_file=config_file) - else: - self.config = config or Config() - - self.configure_logging() - - if available_connections is not None: - self.available_connections = available_connections - else: - self.available_connections = connections.available_connections - - def configure_logging(self): - dictConfig = self.config.logging_dictConfig or { - "version": 1, - "disable_existing_loggers": False, - "formatters": { - "simple": {"format": self.config.logging_format} - }, - "handlers": {}, - "loggers": {}, - "root": { - "level": "CRITICAL" if self.config.logging_loggers else - self.config.logging_level.upper(), - "handlers": [], - "formatter": "simple", - } - } - handlers_list = [] - if self.config.logging_file: - dictConfig["root"]["handlers"].append('info_file_handler') - handlers_list.append('info_file_handler') - dictConfig["handlers"]["info_file_handler"] = { - "class": "logging.handlers.RotatingFileHandler", - "level": "NOTSET", - "formatter": "simple", - "filename": self.config.logging_file, - "maxBytes": 10485760, - "backupCount": 20, - "encoding": "utf8" - } - if self.config.logging_to_console: - dictConfig["root"]["handlers"].append('info_console') - handlers_list.append('info_console') - dictConfig["handlers"]["info_console"] = { - "class": "logging.StreamHandler", - "level": "NOTSET", - "formatter": "simple", - "stream": "ext://sys.stdout", - } - - for logger in self.config.logging_loggers: - dictConfig["loggers"][logger] = { - "level": self.config.logging_level.upper(), - "handlers": handlers_list, - } - - if dictConfig["root"]["handlers"]: - logging.config.dictConfig(dictConfig) - - def filter(self, **kwargs): - """ - See :py:meth:`brigade.core.inventory.Inventory.filter` - - Returns: - :obj:`Brigade`: A new object with same configuration as ``self`` but filtered inventory. - """ - b = Brigade(**self.__dict__) - b.inventory = self.inventory.filter(**kwargs) - return b - - def _run_serial(self, task, dry_run, **kwargs): - result = AggregatedResult(kwargs.get("name") or task.__name__) - for host in self.inventory.hosts.values(): - result[host.name] = run_task(host, self, dry_run, Task(task, **kwargs)) - return result - - def _run_parallel(self, task, num_workers, dry_run, **kwargs): - result = AggregatedResult(kwargs.get("name") or task.__name__) - - pool = Pool(processes=num_workers) - result_pool = [pool.apply_async(run_task, - args=(h, self, dry_run, Task(task, **kwargs))) - for h in self.inventory.hosts.values()] - pool.close() - pool.join() - - for rp in result_pool: - r = rp.get() - result[r.host.name] = r - return result - - def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, **kwargs): - """ - Run task over all the hosts in the inventory. - - Arguments: - task (``callable``): function or callable that will be run against each device in - the inventory - num_workers(``int``): Override for how many hosts to run in paralell for this task - dry_run(``bool``): Whether if we are testing the changes or not - raise_on_error (``bool``): Override raise_on_error behavior - **kwargs: additional argument to pass to ``task`` when calling it - - Raises: - :obj:`brigade.core.exceptions.BrigadeExecutionError`: if at least a task fails - and self.config.raise_on_error is set to ``True`` - - Returns: - :obj:`brigade.core.task.AggregatedResult`: results of each execution - """ - num_workers = num_workers or self.config.num_workers - - self.logger.info("Running task '{}' with num_workers: {}, dry_run: {}".format( - kwargs.get("name") or task.__name__, num_workers, dry_run)) - self.logger.debug(kwargs) - - if num_workers == 1: - result = self._run_serial(task, dry_run, **kwargs) - else: - result = self._run_parallel(task, num_workers, dry_run, **kwargs) - - raise_on_error = raise_on_error if raise_on_error is not None else \ - self.config.raise_on_error - if raise_on_error: - result.raise_on_error() - else: - self.data.failed_hosts.update(result.failed_hosts.keys()) - return result - - -def run_task(host, brigade, dry_run, task): - logger = logging.getLogger("brigade") - try: - logger.info("{}: {}: running task".format(host.name, task.name)) - r = task._start(host=host, brigade=brigade, dry_run=dry_run) - except Exception as e: - tb = traceback.format_exc() - logger.error("{}: {}".format(host, tb)) - r = Result(host, exception=e, result=tb, failed=True) - task.results.append(r) - r.name = task.name - return task.results diff --git a/brigade/core/init_brigade.py b/brigade/core/init_brigade.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/inventory_data/nsot/nsot.sqlite3 b/tests/inventory_data/nsot/nsot.sqlite3 index 0e3fd180412d55c7b89f966726bb1b053097bcb5..8da6069f66365b398c20899eae0ca952c56462d1 100644 GIT binary patch delta 1036 zcmah{ZETZO6u#%2ccnrHuBh1%^@X@nh>-WAec!kI5YRXwVF{9u7!zfmZ0$;Cp)DIp zL%R{<7XvYRHHKwjd`bBjne;Z!AO090nlXtc3mJ)F;ZKQ3jO+(SGQDdd(La!!dvkNn zdCoo0b517X&1Ad>o~;~Y3{=M0*YbEi@!K$%Z8+ZmN7~%4V88USe(q_99>o6PtfvYq z|H;-#=S=ohc?)qS0#nO80e!V*uX2K#sX5}SgV6SLwaMn-K9D(o;uIEWf=*E{&BcAg zRcZ?Pfs>GiX+A#(e%SPB*5ijaywCUd}=E_Bl<>QN8zAf5y~|jMc?Zc^}XqJ;bz-T zX~|HmIhG0}tq!fDX(EB^JL*e!ZU#PY@tlk zeL7whMJ0a&m3FI!y~(7d*-GPPRz&p?jCtw_=u?E**D}IDSIDvoD5~`yJ?Wgl} zU6OrXq}NMH__-X^<~Ne!_tvnjOxj*{lKsS{VG*q1PmR$Ao*ScD->edkBfu{4t7G)p zirL(V5l?nDh7yj^-5!Z=)8oxfaC^{lqGm@V5DvGn3uUQ)Mpb-ph0-WoT{N>`>2s`; zN$X>$*%L1NxR8H)hUSTx0wHm21k}%O(c1iX4qD^quc^#99+Oy4#w%nj%)%?A+b5t6OW{8DkgAw04uq zuO#Uv{~K9r(bJ}6&GIrCzUkOQPWx z4IsZ!q!s+fA}!~`MOpESA}v}~PP8q@2^#Fe3$zXmO?Osm=1N^xwb1GZh4i2vGT6oZ zZQAS>oA1###9c$UQCyxx2bT5N+1E-t`slG8Kldd8zkMCu!T)|M(RC&C78 IcAxhC3nJx14gdfE delta 685 zcmYLFT}YE*6n@V+pWDdK|1>o(K1RzG5$ZO#yeOq#si1^FBGU^)>4zv*bTi#D$s~VD z;sikqmHfjYXnRMC>Y|83hZKnvg+dp?jG{EO!g|9XI0v3{&U4Q5aQyyszdyZmeG&@+ zh7e*vWzr418#qvNzXp2iEM?fMdP1^Z50^&+dJdX@2X?B?iVU5E*?hgwQQ|1xTI4C- z=5fk9H=!;w`ELnG|k(PYD*6)9rG*ML!>kLY`jWEOfaXqD^g1^K3O` z$@VCmkMtR*QR}X>g#Bn)|w1-Yn2aVBN6@fk9q1ghZ* z3_uJPFc){=32YTFa76U5eVmSTb?SEh5+sdBV`Syp7;R+VI6aV66J!Q%jgd`TeaTTW z!fYb za>WzDdW5`cu#5c>%HYOfN<`5vRbf#0A(>K>n}ui=Lt;`aLN1hYmY2%^I~^MWD_48T z#)DqE_0QfbG~~4l)pKbrmki9gsA From 3df31dbce8a8d1ecd14d00e2f38de1d42aacfaca Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 25 Feb 2018 16:47:50 +0100 Subject: [PATCH 17/77] fix tests --- docs/ref/api/brigade.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref/api/brigade.rst b/docs/ref/api/brigade.rst index 8ed3c38f..7e8710bd 100644 --- a/docs/ref/api/brigade.rst +++ b/docs/ref/api/brigade.rst @@ -1,7 +1,7 @@ Data #### -.. autoclass:: brigade.core.brigade.Data +.. autoclass:: brigade.core.Data :members: :undoc-members: From 39eb43bbde285567fe09a22b96acaf5c75ebe392 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Thu, 1 Mar 2018 10:01:54 -0800 Subject: [PATCH 18/77] Incorrect entry for IOS-XR in netmiko map (#84) --- brigade/plugins/tasks/connections/netmiko_connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brigade/plugins/tasks/connections/netmiko_connection.py b/brigade/plugins/tasks/connections/netmiko_connection.py index 7c6bef6b..ef46a98c 100644 --- a/brigade/plugins/tasks/connections/netmiko_connection.py +++ b/brigade/plugins/tasks/connections/netmiko_connection.py @@ -5,7 +5,7 @@ 'nxos': 'cisco_nxos', 'eos': 'arista_eos', 'junos': 'juniper_junos', - 'iosxr': 'cisco_iosxr' + 'iosxr': 'cisco_xr' } From ae84d11c4461334e35fab07c3b06f0b5100fab0f Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 3 Mar 2018 09:16:59 +0100 Subject: [PATCH 19/77] log warning if group file doesn't exist --- brigade/core/init_brigade.py | 0 brigade/plugins/inventory/simple.py | 10 ++++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) delete mode 100644 brigade/core/init_brigade.py diff --git a/brigade/core/init_brigade.py b/brigade/core/init_brigade.py deleted file mode 100644 index e69de29b..00000000 diff --git a/brigade/plugins/inventory/simple.py b/brigade/plugins/inventory/simple.py index 8748ce2b..572b57c0 100644 --- a/brigade/plugins/inventory/simple.py +++ b/brigade/plugins/inventory/simple.py @@ -1,3 +1,5 @@ +import logging +import os from builtins import super from brigade.core.inventory import Inventory @@ -107,8 +109,12 @@ def __init__(self, host_file="hosts.yaml", group_file="groups.yaml", **kwargs): hosts = yaml.load(f.read()) if group_file: - with open(group_file, "r") as f: - groups = yaml.load(f.read()) + if os.path.exists(group_file): + with open(group_file, "r") as f: + groups = yaml.load(f.read()) + else: + logging.warning("{}: doesn't exist".format(group_file)) + groups = {} else: groups = {} From 37798cac7094d7ca31e9cfdb82bd919bc461e89d Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Wed, 7 Mar 2018 20:41:58 +0100 Subject: [PATCH 20/77] Only allow int, str and bool environment variables The previous PR's introduced configuration types where the values can be a list or a dictionary, this commit restricts the environment variables so that only int, str and bool type settings can be configured using environment variables. --- brigade/core/configuration.py | 8 +++++--- docs/_data_templates/configuration-parameters.j2 | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/brigade/core/configuration.py b/brigade/core/configuration.py index 0d4bd7aa..1180e5f8 100644 --- a/brigade/core/configuration.py +++ b/brigade/core/configuration.py @@ -7,7 +7,7 @@ CONF = { 'inventory': { 'description': 'Path to inventory modules.', - 'type': 'string', + 'type': 'str', 'default': 'brigade.plugins.inventory.simple.SimpleInventory', }, 'num_workers': { @@ -103,8 +103,10 @@ def string_to_bool(self, v): return True def _assign_property(self, parameter, param_conf, data): - env = param_conf.get('env') or 'BRIGADE_' + parameter.upper() - v = os.environ.get(env) + v = None + if param_conf['type'] in ('bool', 'int', 'str'): + env = param_conf.get('env') or 'BRIGADE_' + parameter.upper() + v = os.environ.get(env) if v is None: v = data.get(parameter, param_conf["default"]) else: diff --git a/docs/_data_templates/configuration-parameters.j2 b/docs/_data_templates/configuration-parameters.j2 index 0f06931a..842b919f 100644 --- a/docs/_data_templates/configuration-parameters.j2 +++ b/docs/_data_templates/configuration-parameters.j2 @@ -14,7 +14,11 @@ The configuration parameters will be set by the :doc:`Brigade.core.configuration Type Default + {% if v['type'] in ('str', 'int', 'bool') %} {{ v['env'] or 'BRIGADE_' + k|upper }} + {% else %} + N/A + {% endif %} {{ v['type'] }} {{ v['default_doc'] or v['default'] }} From 621e55e46ad5b083e92f917a21df6966a8b56a2e Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 11 Mar 2018 13:46:41 +0100 Subject: [PATCH 21/77] inventory now support defaults and inheriting from multiple groups (#86) --- brigade/core/inventory.py | 91 ++++++++++++++-------- brigade/plugins/inventory/simple.py | 7 +- tests/core/inventory_data/groups.yaml | 12 --- tests/core/inventory_data/hosts.yaml | 20 ----- tests/core/test_InitBrigade.py | 8 +- tests/core/test_InitBrigade/a_config.yaml | 4 +- tests/core/test_inventory.py | 79 ++++++++++++++++++- tests/inventory_data/groups.yaml | 6 +- tests/inventory_data/hosts.yaml | 12 ++- tests/inventory_data/nsot/nsot.sqlite3 | Bin 294912 -> 299008 bytes 10 files changed, 156 insertions(+), 83 deletions(-) delete mode 100644 tests/core/inventory_data/groups.yaml delete mode 100644 tests/core/inventory_data/hosts.yaml diff --git a/brigade/core/inventory.py b/brigade/core/inventory.py index da7af8fe..30161257 100644 --- a/brigade/core/inventory.py +++ b/brigade/core/inventory.py @@ -1,7 +1,5 @@ import getpass -from brigade.core import helpers - class Host(object): """ @@ -15,7 +13,8 @@ class Host(object): Attributes: name (str): Name of the host - group (:obj:`Group`): Group the host belongs to + groups (list of :obj:`Group`): Groups the host belongs to + defaults (``dict``): Default values for host/group data data (dict): data about the device connections (``dict``): Already established connections @@ -36,13 +35,13 @@ class Host(object): # hosts my_host: ip: 1.2.3.4 - group: bma + groups: [bma] --- # groups bma: site: bma - group: all + group: [all] all: domain: acme.com @@ -57,25 +56,40 @@ class Host(object): * ``my_host.group.group.data["domain"]`` will return ``acme.com`` """ - def __init__(self, name, group=None, brigade=None, **kwargs): + def __init__(self, name, groups=None, brigade=None, defaults=None, **kwargs): self.brigade = brigade self.name = name - self.group = group + self.groups = groups or [] self.data = {} self.data["name"] = name self.connections = {} + self.defaults = defaults or {} - if isinstance(group, str): - self.data["group"] = group - else: - self.data["group"] = group.name if group else None + if len(self.groups): + if isinstance(groups[0], str): + self.data["groups"] = groups + else: + self.data["groups"] = [g.name for g in groups] for k, v in kwargs.items(): self.data[k] = v def _resolve_data(self): - d = self.group if self.group else {} - return helpers.merge_two_dicts(d, self.data) + processed = [] + result = {} + for k, v in self.data.items(): + processed.append(k) + result[k] = v + for g in self.groups: + for k, v in g.items(): + if k not in processed: + processed.append(k) + result[k] = v + for k, v in self.defaults.items(): + if k not in processed: + processed.append(k) + result[k] = v + return result def keys(self): """Returns the keys of the attribute ``data`` and of the parent(s) groups.""" @@ -85,12 +99,24 @@ def values(self): """Returns the values of the attribute ``data`` and of the parent(s) groups.""" return self._resolve_data().values() + def items(self): + """ + Returns all the data accessible from a device, including + the one inherited from parent groups + """ + return self._resolve_data().items() + def __getitem__(self, item): try: return self.data[item] except KeyError: - if self.group: - return self.group[item] + for g in self.groups: + r = g.get(item) + if r: + return r + r = self.defaults.get(item) + if r: + return r raise def __setitem__(self, item, value): @@ -121,13 +147,6 @@ def get(self, item, default=None): except KeyError: return default - def items(self): - """ - Returns all the data accessible from a device, including - the one inherited from parent groups - """ - return self._resolve_data().items() - @property def brigade(self): """Reference to the parent :obj:`brigade.core.Brigade` object""" @@ -236,32 +255,40 @@ class Inventory(object): groups (dict): keys are group names and the values are :obj:`Group`. """ - def __init__(self, hosts, groups=None, transform_function=None, brigade=None): + def __init__(self, hosts, groups=None, defaults=None, transform_function=None, brigade=None): self._brigade = brigade - groups = groups or {} - self.groups = {} - for n, g in groups.items(): + self.defaults = defaults or {} + + self.groups = groups or {} + for n, g in self.groups.items(): if isinstance(g, dict): g = Group(name=n, brigade=brigade, **g) self.groups[n] = g - for g in self.groups.values(): - if g.group is not None and not isinstance(g.group, Group): - g.group = self.groups[g.group] + for group in self.groups.values(): + group.groups = self._resolve_groups(group.groups) self.hosts = {} for n, h in hosts.items(): if isinstance(h, dict): - h = Host(name=n, brigade=brigade, **h) + h = Host(name=n, brigade=brigade, defaults=self.defaults, **h) if transform_function: transform_function(h) - if h.group is not None and not isinstance(h.group, Group): - h.group = self.groups[h.group] + h.groups = self._resolve_groups(h.groups) self.hosts[n] = h + def _resolve_groups(self, groups): + r = [] + if len(groups): + if not isinstance(groups[0], Group): + r = [self.groups[g] for g in groups] + else: + r = groups + return r + def filter(self, filter_func=None, **kwargs): """ Returns a new inventory after filtering the hosts by matching the data passed to the diff --git a/brigade/plugins/inventory/simple.py b/brigade/plugins/inventory/simple.py index 572b57c0..aee4bbb2 100644 --- a/brigade/plugins/inventory/simple.py +++ b/brigade/plugins/inventory/simple.py @@ -82,7 +82,7 @@ class SimpleInventory(Inventory): * group file:: --- - all: + defaults: group: null domain: acme.com @@ -93,7 +93,6 @@ class SimpleInventory(Inventory): group: bma bma: - group: all cmh-leaf: group: cmh @@ -102,7 +101,6 @@ class SimpleInventory(Inventory): group: cmh cmh: - group: all """ def __init__(self, host_file="hosts.yaml", group_file="groups.yaml", **kwargs): with open(host_file, "r") as f: @@ -118,4 +116,5 @@ def __init__(self, host_file="hosts.yaml", group_file="groups.yaml", **kwargs): else: groups = {} - super().__init__(hosts, groups, **kwargs) + defaults = groups.pop("defaults", {}) + super().__init__(hosts, groups, defaults, **kwargs) diff --git a/tests/core/inventory_data/groups.yaml b/tests/core/inventory_data/groups.yaml deleted file mode 100644 index 4d48fc78..00000000 --- a/tests/core/inventory_data/groups.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -all: - my_var: comes_from_all - -group_1: - group: all - my_var: comes_from_group_1 - site: site1 - -group_2: - group: all - site: site2 diff --git a/tests/core/inventory_data/hosts.yaml b/tests/core/inventory_data/hosts.yaml deleted file mode 100644 index 4b20c208..00000000 --- a/tests/core/inventory_data/hosts.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -host1.group_1: - group: group_1 - my_var: comes_from_host1.group_1 - www_server: nginx - role: www - -host2.group_1: - group: group_1 - role: db - -host3.group_2: - group: group_2 - www_server: apache - role: www - -host4.group_2: - group: group_2 - my_var: comes_from_host4.group_2 - role: db diff --git a/tests/core/test_InitBrigade.py b/tests/core/test_InitBrigade.py index f7455e1e..5938b151 100644 --- a/tests/core/test_InitBrigade.py +++ b/tests/core/test_InitBrigade.py @@ -9,11 +9,11 @@ class Test(object): def test_InitBrigade_defaults(self): - os.chdir("tests/core/inventory_data/") + os.chdir("tests/inventory_data/") try: brg = InitBrigade() finally: - os.chdir("../../../") + os.chdir("../../") assert not brg.dry_run assert brg.config.num_workers == 20 assert len(brg.inventory.hosts) @@ -30,8 +30,8 @@ def test_InitBrigade_programmatically(self): brg = InitBrigade(num_workers=100, inventory="brigade.plugins.inventory.simple.SimpleInventory", SimpleInventory={ - "host_file": "tests/core/inventory_data/hosts.yaml", - "group_file": "tests/core/inventory_data/groups.yaml", + "host_file": "tests/inventory_data/hosts.yaml", + "group_file": "tests/inventory_data/groups.yaml", }, ) assert not brg.dry_run diff --git a/tests/core/test_InitBrigade/a_config.yaml b/tests/core/test_InitBrigade/a_config.yaml index a71e015a..9047b4a9 100644 --- a/tests/core/test_InitBrigade/a_config.yaml +++ b/tests/core/test_InitBrigade/a_config.yaml @@ -2,5 +2,5 @@ num_workers: 100 inventory: brigade.plugins.inventory.simple.SimpleInventory SimpleInventory: - host_file: "tests/core/inventory_data/hosts.yaml" - group_file: "tests/core/inventory_data/groups.yaml" + host_file: "tests/inventory_data/hosts.yaml" + group_file: "tests/inventory_data/groups.yaml" diff --git a/tests/core/test_inventory.py b/tests/core/test_inventory.py index 267dd6ac..902b0ccf 100644 --- a/tests/core/test_inventory.py +++ b/tests/core/test_inventory.py @@ -1,5 +1,6 @@ import os +from brigade.core.inventory import Group, Host from brigade.plugins.inventory.simple import SimpleInventory import pytest @@ -10,8 +11,84 @@ "{}/../inventory_data/groups.yaml".format(dir_path)) +def compare_lists(left, right): + result = len(left) == len(right) + if not result: + return result + + def to_sets(l): + if isinstance(l, str): + return l + r = set() + for x in l: + if isinstance(x, list) or isinstance(x, tuple): + x = frozenset(to_sets(x)) + r.add(x) + return r + + left = to_sets(left) + right = to_sets(right) + return left == right + + class Test(object): + def test_hosts(self): + defaults = {"var4": "ALL"} + g1 = Group(name="g1", var1="1", var2="2", var3="3") + g2 = Group(name="g2", var1="a", var2="b") + g3 = Group(name="g3", var1="A", var4="Z") + g4 = Group(name="g4", groups=[g2, g1], var3="q") + + h1 = Host(name="host1", groups=[g1, g2], defaults=defaults) + assert h1["var1"] == "1" + assert h1["var2"] == "2" + assert h1["var3"] == "3" + assert h1["var4"] == "ALL" + assert compare_lists(list(h1.keys()), + ['name', 'groups', 'var1', 'var2', 'var3', 'var4']) + assert compare_lists(list(h1.values()), + ['host1', ['g1', 'g2'], '1', '2', '3', 'ALL']) + assert compare_lists(list(h1.items()), + [('name', 'host1'), ('groups', ['g1', 'g2']), + ('var1', '1'), ('var2', '2'), ('var3', '3'), ('var4', 'ALL')]) + + h2 = Host(name="host2", groups=[g2, g1], defaults=defaults) + assert h2["var1"] == "a" + assert h2["var2"] == "b" + assert h2["var3"] == "3" + assert h2["var4"] == "ALL" + assert compare_lists(list(h2.keys()), ['name', 'groups', 'var1', 'var2', 'var3', 'var4']) + assert compare_lists(list(h2.values()), ['host2', ['g2', 'g1'], 'a', 'b', '3', 'ALL']) + assert compare_lists(list(h2.items()), + [('name', 'host2'), ('groups', ['g2', 'g1']), ('var1', 'a'), + ('var2', 'b'), ('var3', '3'), ('var4', 'ALL')]) + + h3 = Host(name="host3", groups=[g4, g3], defaults=defaults) + assert h3["var1"] == "a" + assert h3["var2"] == "b" + assert h3["var3"] == "q" + assert h3["var4"] == "Z" + assert compare_lists(list(h3.keys()), ['name', 'groups', 'var3', 'var1', 'var2', 'var4']) + assert compare_lists(list(h3.values()), ['host3', ['g4', 'g3'], 'q', 'a', 'b', 'Z']) + assert compare_lists(list(h3.items()), + [('name', 'host3'), ('groups', ['g4', 'g3']), ('var3', 'q'), + ('var1', 'a'), ('var2', 'b'), ('var4', 'Z')]) + + h4 = Host(name="host4", groups=[g3, g4], defaults=defaults) + assert h4["var1"] == "A" + assert h4["var2"] == "b" + assert h4["var3"] == "q" + assert h4["var4"] == "Z" + assert compare_lists(list(h4.keys()), ['name', 'groups', 'var1', 'var4', 'var3', 'var2']) + assert compare_lists(list(h4.values()), ['host4', ['g3', 'g4'], 'A', 'Z', 'q', 'b']) + assert compare_lists(list(h4.items()), + [('name', 'host4'), ('groups', ['g3', 'g4']), ('var1', 'A'), + ('var4', 'Z'), ('var3', 'q'), ('var2', 'b')]) + + with pytest.raises(KeyError): + assert h2["asdasd"] + def test_filtering(self): unfiltered = sorted(list(inventory.hosts.keys())) assert unfiltered == ['dev1.group_1', 'dev2.group_1', 'dev3.group_2', 'dev4.group_2'] @@ -44,7 +121,7 @@ def test_filter_unique_keys(self): def test_var_resolution(self): assert inventory.hosts["dev1.group_1"]["my_var"] == "comes_from_dev1.group_1" assert inventory.hosts["dev2.group_1"]["my_var"] == "comes_from_group_1" - assert inventory.hosts["dev3.group_2"]["my_var"] == "comes_from_all" + assert inventory.hosts["dev3.group_2"]["my_var"] == "comes_from_defaults" assert inventory.hosts["dev4.group_2"]["my_var"] == "comes_from_dev4.group_2" assert inventory.hosts["dev1.group_1"].data["my_var"] == "comes_from_dev1.group_1" diff --git a/tests/inventory_data/groups.yaml b/tests/inventory_data/groups.yaml index c43ef530..f10df87a 100644 --- a/tests/inventory_data/groups.yaml +++ b/tests/inventory_data/groups.yaml @@ -1,16 +1,14 @@ --- -all: - my_var: comes_from_all +defaults: + my_var: comes_from_defaults brigade_host: 127.0.0.1 brigade_username: root brigade_password: docker brigade_os: linux group_1: - group: all my_var: comes_from_group_1 site: site1 group_2: - group: all site: site2 diff --git a/tests/inventory_data/hosts.yaml b/tests/inventory_data/hosts.yaml index 53f24116..76126566 100644 --- a/tests/inventory_data/hosts.yaml +++ b/tests/inventory_data/hosts.yaml @@ -1,6 +1,7 @@ --- dev1.group_1: - group: group_1 + groups: + - group_1 my_var: comes_from_dev1.group_1 www_server: nginx role: www @@ -8,13 +9,15 @@ dev1.group_1: brigade_nos: eos dev2.group_1: - group: group_1 + groups: + - group_1 role: db brigade_ssh_port: 65002 brigade_nos: junos dev3.group_2: - group: group_2 + groups: + - group_2 www_server: apache role: www brigade_ssh_port: 65003 @@ -25,7 +28,8 @@ dev3.group_2: # brigade_password: vagrant dev4.group_2: - group: group_2 + groups: + - group_2 my_var: comes_from_dev4.group_2 role: db brigade_ssh_port: 65004 diff --git a/tests/inventory_data/nsot/nsot.sqlite3 b/tests/inventory_data/nsot/nsot.sqlite3 index 8da6069f66365b398c20899eae0ca952c56462d1..111ae9702c18a5e183d9516fac0265606941035f 100644 GIT binary patch delta 6505 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 Date: Mon, 12 Mar 2018 14:11:18 +0100 Subject: [PATCH 22/77] add mechanism to get childrens of a group --- brigade/core/inventory.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/brigade/core/inventory.py b/brigade/core/inventory.py index 30161257..04afb1ec 100644 --- a/brigade/core/inventory.py +++ b/brigade/core/inventory.py @@ -106,6 +106,13 @@ def items(self): """ return self._resolve_data().items() + def has_parent_group(self, group): + """Retuns whether the object is a child of the :obj:`Group` ``group``""" + for g in self.groups: + if g is group or g.has_parent_group(group): + return True + return False + def __getitem__(self, item): try: return self.data[item] @@ -234,7 +241,9 @@ def get_connection(self, connection): class Group(Host): """Same as :obj:`Host`""" - pass + + def children(self): + return {n: h for n, h in self.brigade.inventory.hosts.items() if h.has_parent_group(self)} class Inventory(object): From c6d4f825ec1ce5efade9da5e3f4ad6df9737a1eb Mon Sep 17 00:00:00 2001 From: David Barroso Date: Mon, 12 Mar 2018 14:11:53 +0100 Subject: [PATCH 23/77] update tutorial WIP --- docs/tutorials/intro/brigade.rst | 71 -- docs/tutorials/intro/config.yaml | 7 + docs/tutorials/intro/executing_tasks.ipynb | 381 ++++++ docs/tutorials/intro/index.rst | 5 +- .../intro/initializing_brigade.ipynb | 232 ++++ docs/tutorials/intro/inventory.ipynb | 1058 +++++++++++++++++ docs/tutorials/intro/inventory.rst | 135 --- examples/highlighter.py | 10 +- examples/inventory/Vagrantfile | 12 + examples/inventory/groups.yaml | 16 +- examples/inventory/hosts.yaml | 44 +- 11 files changed, 1745 insertions(+), 226 deletions(-) delete mode 100644 docs/tutorials/intro/brigade.rst create mode 100644 docs/tutorials/intro/config.yaml create mode 100644 docs/tutorials/intro/executing_tasks.ipynb create mode 100644 docs/tutorials/intro/initializing_brigade.ipynb create mode 100644 docs/tutorials/intro/inventory.ipynb delete mode 100644 docs/tutorials/intro/inventory.rst diff --git a/docs/tutorials/intro/brigade.rst b/docs/tutorials/intro/brigade.rst deleted file mode 100644 index 92ef2685..00000000 --- a/docs/tutorials/intro/brigade.rst +++ /dev/null @@ -1,71 +0,0 @@ -Brigade -======= - -Now that we know how the inventory works let's create a brigade object we can start working with. There are two ways we can use: - -1. Using the :obj:`brigade.core.Brigade` directly, which is quite simple and the most flexible and versatile option. - -Using the "raw" API -------------------- - -If you want to use the "raw" API you need two things: - -1. A :obj:`brigade.core.configuration.Config` object. -2. An :doc:`inventory ` object. - -Once you have them, you can create the brigade object yourself. For example:: - - >>> from brigade.core import Brigade - >>> from brigade.core.configuration import Config - >>> from brigade.plugins.inventory.simple import SimpleInventory - >>> - >>> brigade = Brigade( - ... inventory=SimpleInventory("hosts.yaml", "groups.yaml"), - ... dry_run=False, - ... config=Config(raise_on_error=False), - ... ) - >>> - -Using ``easy_brigade`` ----------------------- - - >>> from brigade.easy import easy_brigade - >>> brigade = easy_brigade( - ... host_file="hosts.yaml", group_file="groups.yaml", - ... dry_run=True, - ... raise_on_error=False, - ... ) - >>> - -As you can see is not that different from above but you save a few imports. - -Brigade's Inventory -------------------- - -Brigade's object will always have a reference to the inventory you can inspect and work with if you have the need. For instance:: - - >>> brigade.inventory - - >>> brigade.inventory.hosts - {'host1.cmh': Host: host1.cmh, 'host2.cmh': Host: host2.cmh, 'spine00.cmh': Host: spine00.cmh, 'spine01.cmh': Host: spine01.cmh, 'leaf00.cmh': Host: leaf00.cmh, 'leaf01.cmh': Host: leaf01.cmh, 'host1.bma': Host: host1.bma, 'host2.bma': Host: host2.bma, 'spine00.bma': Host: spine00.bma, 'spine01.bma': Host: spine01.bma, 'leaf00.bma': Host: leaf00.bma, 'leaf01.bma': Host: leaf01.bma} - >>> brigade.inventory.groups - {'all': Group: all, 'bma': Group: bma, 'cmh': Group: cmh} - -As you will see further on in the tutorial you will rarely need to work with the inventory yourself as brigade will take care of it for you automatically but it's always good to know you have it there if you need to. - -Filtering the hosts -___________________ - -As we could see in the :doc:`Inventory ` section we could filter hosts based on data and attributes. The brigade object can leverage on that feature to "replicate" itself with subsets of devices allowing you to group your devices and perform actions on them as you see fit:: - - >>> switches = brigade.filter(type="network_device") - >>> switches.inventory.hosts - {'spine00.cmh': Host: spine00.cmh, 'spine01.cmh': Host: spine01.cmh, 'leaf00.cmh': Host: leaf00.cmh, 'leaf01.cmh': Host: leaf01.cmh, 'spine00.bma': Host: spine00.bma, 'spine01.bma': Host: spine01.bma, 'leaf00.bma': Host: leaf00.bma, 'leaf01.bma': Host: leaf01.bma} - >>> switches_in_bma = switches.filter(site="bma") - >>> switches_in_bma.inventory.hosts - {'spine00.bma': Host: spine00.bma, 'spine01.bma': Host: spine01.bma, 'leaf00.bma': Host: leaf00.bma, 'leaf01.bma': Host: leaf01.bma} - >>> hosts = brigade.filter(type="host") - >>> hosts.inventory.hosts - {'host1.cmh': Host: host1.cmh, 'host2.cmh': Host: host2.cmh, 'host1.bma': Host: host1.bma, 'host2.bma': Host: host2.bma} - -All of the "replicas" of brigade will contain the same data and configuration, only the hosts will differ. diff --git a/docs/tutorials/intro/config.yaml b/docs/tutorials/intro/config.yaml new file mode 100644 index 00000000..bb7bf3db --- /dev/null +++ b/docs/tutorials/intro/config.yaml @@ -0,0 +1,7 @@ +--- +num_workers: 100 +inventory: brigade.plugins.inventory.simple.SimpleInventory +SimpleInventory: + host_file: "../../../examples/inventory/hosts.yaml" + group_file: "../../../examples/inventory/groups.yaml" + diff --git a/docs/tutorials/intro/executing_tasks.ipynb b/docs/tutorials/intro/executing_tasks.ipynb new file mode 100644 index 00000000..1e1e104f --- /dev/null +++ b/docs/tutorials/intro/executing_tasks.ipynb @@ -0,0 +1,381 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from brigade.core import InitBrigade\n", + "brg = InitBrigade(config_file=\"config.yaml\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Executing tasks\n", + "\n", + "Now that you know how to initialize brigade and work with the inventory let's see how we can leverage it to run tasks on groups of hosts.\n", + "\n", + "Brigade ships a bunch of tasks you can use directly without having to code them yourself. You can check them out [here](../../ref/tasks/index.rst).\n", + "\n", + "Let's start by executing the `ls -la /tmp` command on all the device in `cmh` of type `host`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m\u001b[34m* host1.cmh ** changed : False *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- remote_command ** changed : False ----------------------------------------\u001b[0m\n", + "\u001b[0mtotal 8\n", + "drwxrwxrwt 2 root root 4096 Mar 11 19:17 .\n", + "drwxr-xr-x 24 root root 4096 Mar 11 17:28 ..\n", + "\u001b[0m\n", + "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* host2.cmh ** changed : False *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- remote_command ** changed : False ----------------------------------------\u001b[0m\n", + "\u001b[0mtotal 8\n", + "drwxrwxrwt 2 root root 4096 Mar 11 19:17 .\n", + "drwxr-xr-x 24 root root 4096 Mar 11 17:29 ..\n", + "\u001b[0m\n", + "\u001b[0m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/plain": [ + "AggregatedResult: print_result" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from brigade.plugins.tasks import commands, text\n", + "\n", + "cmh_hosts = brg.filter(site=\"cmh\", role=\"host\")\n", + "\n", + "result = cmh_hosts.run(commands.remote_command,\n", + " command=\"ls -la /tmp\")\n", + "\n", + "cmh_hosts.run(text.print_result,\n", + " num_workers=1,\n", + " data=result,\n", + " vars=[\"stdout\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So what have we done here? First we have imported the `commands` and `text` modules. Then we have narrowed down brigade to the hosts we want to operate on. Once we have selected the devices we wanted to operate on we have run two tasks:\n", + "\n", + "1. The task `commands.remote_command` which runs the specified `command` in the remote device.\n", + "2. The task `text.print_result` which just prints on screen the result of an executed task (note this task needs to be serialized to avoid mangling the output so `num_workers=1` is specified).\n", + "\n", + "Let's try with another example:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m\u001b[34m* spine00.bma ** changed : False ***********************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", + "\u001b[0m{\u001b[0m \u001b[0m'facts'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'fqdn'\u001b[0m: \u001b[0m'localhost'\u001b[0m,\n", + " \u001b[0m'hostname'\u001b[0m: \u001b[0m'localhost'\u001b[0m,\n", + " \u001b[0m'interface_list'\u001b[0m: \u001b[0m['Ethernet1', 'Ethernet2', 'Management1']\u001b[0m,\n", + " \u001b[0m'model'\u001b[0m: \u001b[0m'vEOS'\u001b[0m,\n", + " \u001b[0m'os_version'\u001b[0m: \u001b[0m'4.17.5M-4414219.4175M'\u001b[0m,\n", + " \u001b[0m'serial_number'\u001b[0m: \u001b[0m''\u001b[0m,\n", + " \u001b[0m'uptime'\u001b[0m: \u001b[0m66816\u001b[0m,\n", + " \u001b[0m'vendor'\u001b[0m: \u001b[0m'Arista'\u001b[0m}\u001b[0m}\u001b[0m\n", + "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine01.bma ** changed : False ***********************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", + "\u001b[0m{\u001b[0m \u001b[0m'facts'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'fqdn'\u001b[0m: \u001b[0m'vsrx'\u001b[0m,\n", + " \u001b[0m'hostname'\u001b[0m: \u001b[0m'vsrx'\u001b[0m,\n", + " \u001b[0m'interface_list'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m'ge-0/0/0'\u001b[0m,\n", + " \u001b[0m'gr-0/0/0'\u001b[0m,\n", + " \u001b[0m'ip-0/0/0'\u001b[0m,\n", + " \u001b[0m'lsq-0/0/0'\u001b[0m,\n", + " \u001b[0m'lt-0/0/0'\u001b[0m,\n", + " \u001b[0m'mt-0/0/0'\u001b[0m,\n", + " \u001b[0m'sp-0/0/0'\u001b[0m,\n", + " \u001b[0m'ge-0/0/1'\u001b[0m,\n", + " \u001b[0m'ge-0/0/2'\u001b[0m,\n", + " \u001b[0m'.local.'\u001b[0m,\n", + " \u001b[0m'dsc'\u001b[0m,\n", + " \u001b[0m'gre'\u001b[0m,\n", + " \u001b[0m'ipip'\u001b[0m,\n", + " \u001b[0m'irb'\u001b[0m,\n", + " \u001b[0m'lo0'\u001b[0m,\n", + " \u001b[0m'lsi'\u001b[0m,\n", + " \u001b[0m'mtun'\u001b[0m,\n", + " \u001b[0m'pimd'\u001b[0m,\n", + " \u001b[0m'pime'\u001b[0m,\n", + " \u001b[0m'pp0'\u001b[0m,\n", + " \u001b[0m'ppd0'\u001b[0m,\n", + " \u001b[0m'ppe0'\u001b[0m,\n", + " \u001b[0m'st0'\u001b[0m,\n", + " \u001b[0m'tap'\u001b[0m,\n", + " \u001b[0m'vlan'\u001b[0m]\u001b[0m,\n", + " \u001b[0m'model'\u001b[0m: \u001b[0m'FIREFLY-PERIMETER'\u001b[0m,\n", + " \u001b[0m'os_version'\u001b[0m: \u001b[0m'12.1X47-D20.7'\u001b[0m,\n", + " \u001b[0m'serial_number'\u001b[0m: \u001b[0m'bcc9ff721778'\u001b[0m,\n", + " \u001b[0m'uptime'\u001b[0m: \u001b[0m10477\u001b[0m,\n", + " \u001b[0m'vendor'\u001b[0m: \u001b[0m'Juniper'\u001b[0m}\u001b[0m}\u001b[0m\n", + "\u001b[0m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/plain": [ + "AggregatedResult: print_result" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from brigade.plugins.tasks import networking\n", + "\n", + "cmh_spines = brg.filter(site=\"bma\", role=\"spine\")\n", + "result = cmh_spines.run(networking.napalm_get,\n", + " getters=[\"facts\"]) \n", + "cmh_spines.run(text.print_result,\n", + " num_workers=1,\n", + " data=result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pretty much the same pattern, just different task on different devices.\n", + "\n", + "## What is a task\n", + "\n", + "Let's take a look at what a task is. In it's simplest form a task is a function that takes at least a [Task](../../ref/api/task.html#brigade.core.task.Task) object as argument. For instance:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hi! My name is host1.cmh and I live in cmh\u001b[0m\n", + "\u001b[0mhi! My name is host2.cmh and I live in cmh\u001b[0m\n", + "\u001b[0mhi! My name is spine00.cmh and I live in cmh\u001b[0m\n", + "\u001b[0mhi! My name is spine01.cmh and I live in cmh\u001b[0m\n", + "\u001b[0mhi! My name is leaf00.cmh and I live in cmh\u001b[0m\n", + "\u001b[0mhi! My name is leaf01.cmh and I live in cmh\u001b[0m\n", + "\u001b[0mhi! My name is host1.bma and I live in bma\u001b[0m\n", + "\u001b[0mhi! My name is host2.bma and I live in bma\u001b[0m\n", + "\u001b[0mhi! My name is spine00.bma and I live in bma\u001b[0m\n", + "\u001b[0mhi! My name is spine01.bma and I live in bma\u001b[0m\n", + "\u001b[0mhi! My name is leaf00.bma and I live in bma\u001b[0m\n", + "\u001b[0mhi! My name is leaf01.bma and I live in bma\u001b[0m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/plain": [ + "AggregatedResult: hi" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def hi(task):\n", + " print(f\"hi! My name is {task.host.name} and I live in {task.host['site']}\")\n", + " \n", + "brg.run(hi, num_workers=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The task object has access to `brigade`, `host` and `dry_run` attributes.\n", + "\n", + "You can call other tasks from within a task:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m\u001b[34m* host1.cmh ** changed : False *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- available_resources ** changed : False -----------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- Available disk ** changed : False ----------------------------------------\u001b[0m\n", + "\u001b[0mFilesystem Size Used Avail Use% Mounted on\n", + "/dev/mapper/precise64-root 79G 2.2G 73G 3% /\n", + "udev 174M 4.0K 174M 1% /dev\n", + "tmpfs 74M 284K 73M 1% /run\n", + "none 5.0M 0 5.0M 0% /run/lock\n", + "none 183M 0 183M 0% /run/shm\n", + "/dev/sda1 228M 25M 192M 12% /boot\n", + "vagrant 373G 200G 173G 54% /vagrant\n", + "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- Available memory ** changed : False --------------------------------------\u001b[0m\n", + "\u001b[0m total used free shared buffers cached\n", + "Mem: 365 87 277 0 8 36\n", + "-/+ buffers/cache: 42 323\n", + "Swap: 767 0 767\n", + "\u001b[0m\n", + "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* host2.cmh ** changed : False *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- available_resources ** changed : False -----------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- Available disk ** changed : False ----------------------------------------\u001b[0m\n", + "\u001b[0mFilesystem Size Used Avail Use% Mounted on\n", + "/dev/mapper/precise64-root 79G 2.2G 73G 3% /\n", + "udev 174M 4.0K 174M 1% /dev\n", + "tmpfs 74M 284K 73M 1% /run\n", + "none 5.0M 0 5.0M 0% /run/lock\n", + "none 183M 0 183M 0% /run/shm\n", + "/dev/sda1 228M 25M 192M 12% /boot\n", + "vagrant 373G 200G 173G 54% /vagrant\n", + "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[36m---- Available memory ** changed : False --------------------------------------\u001b[0m\n", + "\u001b[0m total used free shared buffers cached\n", + "Mem: 365 87 277 0 8 36\n", + "-/+ buffers/cache: 42 323\n", + "Swap: 767 0 767\n", + "\u001b[0m\n", + "\u001b[0m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/plain": [ + "AggregatedResult: print_result" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def available_resources(task):\n", + " task.run(commands.remote_command,\n", + " name=\"Available disk\",\n", + " command=\"df -h\")\n", + " task.run(commands.remote_command,\n", + " name=\"Available memory\",\n", + " command=\"free -m\")\n", + " \n", + "result = cmh_hosts.run(available_resources)\n", + "\n", + "cmh_hosts.run(text.print_result,\n", + " num_workers=1,\n", + " data=result,\n", + " vars=[\"stdout\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You probably noticed in your previous example that you can name your tasks.\n", + "\n", + "Your task can also accept any extra arguments you may need:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "host1.cmh: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\u001b[0m\n", + "\u001b[0mhost2.cmh: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\u001b[0m\n", + "\u001b[0mhost1.cmh: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\u001b[0m\n", + "\u001b[0mhost2.cmh: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\u001b[0m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/plain": [ + "AggregatedResult: count" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def count(task, to):\n", + " print(f\"{task.host.name}: {list(range(0, to))}\")\n", + " \n", + "cmh_hosts.run(count,\n", + " num_workers=1,\n", + " to=10)\n", + "cmh_hosts.run(count,\n", + " num_workers=1,\n", + " to=20)" + ] + } + ], + "metadata": { + "celltoolbar": "Edit Metadata", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/tutorials/intro/index.rst b/docs/tutorials/intro/index.rst index 850a458e..413627d7 100644 --- a/docs/tutorials/intro/index.rst +++ b/docs/tutorials/intro/index.rst @@ -13,8 +13,9 @@ We're glad you made it here! This is a great place to learn the basics of Brigad Brigade at a glance 100% Python Installation guide - inventory - brigade + initializing_brigade.ipynb + inventory.ipynb + executing_tasks.ipynb running_tasks running_tasks_different_hosts running_tasks_grouping diff --git a/docs/tutorials/intro/initializing_brigade.ipynb b/docs/tutorials/intro/initializing_brigade.ipynb new file mode 100644 index 00000000..6b1001ce --- /dev/null +++ b/docs/tutorials/intro/initializing_brigade.ipynb @@ -0,0 +1,232 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "nbsphinx": "hidden" + }, + "outputs": [], + "source": [ + "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", + "%run ../../../examples/highlighter.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initializing Brigade\n", + "\n", + "Easiest way of initializing brigade is with the function [InitBrigade](../../ref/api/brigade.rst#initbrigade).\n", + "\n", + "With `InitBrigade` you can initialize brigade with a configuration file, with code or with a combination of both.\n", + "\n", + "Let's start with [a configuration file](../../ref/configuration/index.rst):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
1 ---\n",
+       "2 num_workers: 100\n",
+       "3 inventory: brigade.plugins.inventory.simple.SimpleInventory\n",
+       "4 SimpleInventory:\n",
+       "5     host_file: "../../../examples/inventory/hosts.yaml"\n",
+       "6     group_file: "../../../examples/inventory/groups.yaml"\n",
+       "
\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%highlight_file config.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "**Note:** You can also use environment variables.\n", + "
\n", + "\n", + "Now to create the [brigade](../../ref/api/brigade.rst#brigade) object:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from brigade.core import InitBrigade\n", + "brg = InitBrigade(config_file=\"config.yaml\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also initialize brigade programmatically without a configuration file:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from brigade.core import InitBrigade\n", + "brg = InitBrigade(num_workers=100,\n", + " inventory=\"brigade.plugins.inventory.simple.SimpleInventory\",\n", + " SimpleInventory={\"host_file\": \"../../../examples/inventory/hosts.yaml\",\n", + " \"group_file\": \"../../../examples/inventory/groups.yaml\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or with a combination of both methods:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from brigade.core import InitBrigade\n", + "brg = InitBrigade(num_workers=50, config_file=\"config.yaml\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "50" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.config.num_workers" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/tutorials/intro/inventory.ipynb b/docs/tutorials/intro/inventory.ipynb new file mode 100644 index 00000000..6091995d --- /dev/null +++ b/docs/tutorials/intro/inventory.ipynb @@ -0,0 +1,1058 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "nbsphinx": "hidden" + }, + "outputs": [], + "source": [ + "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", + "%run ../../../examples/highlighter.py" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from brigade.core import InitBrigade\n", + "brg = InitBrigade(config_file=\"config.yaml\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inventory\n", + "\n", + "The Inventory is arguably the most important piece of brigade. Let's see how it works. To begin with the [inventory](../../ref/api/inventory.rst#brigade.core.inventory.Inventory) is comprised of [hosts](../../ref/api/inventory.rst#brigade.core.inventory.Host) and [groups](../../ref/api/inventory.rst#brigade.core.inventory.Group).\n", + "\n", + "In this tutorial we are using the [SimpleInventory](../../ref/inventory/simple.rst#brigade.plugins.inventory.simple.SimpleInventory) plugin. This inventory plugin stores all the relevant data in two files. Let's start by checking them:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
  1 ---\n",
+       "  2 host1.cmh:\n",
+       "  3     site: cmh\n",
+       "  4     role: host\n",
+       "  5     groups:\n",
+       "  6         - cmh\n",
+       "  7     brigade_nos: linux\n",
+       "  8     type: host\n",
+       "  9 \n",
+       " 10 host2.cmh:\n",
+       " 11     site: cmh\n",
+       " 12     role: host\n",
+       " 13     groups:\n",
+       " 14         - cmh\n",
+       " 15     brigade_nos: linux\n",
+       " 16     type: host\n",
+       " 17 \n",
+       " 18 spine00.cmh:\n",
+       " 19     brigade_host: 127.0.0.1\n",
+       " 20     brigade_username: vagrant\n",
+       " 21     brigade_password: vagrant\n",
+       " 22     brigade_network_api_port: 12444\n",
+       " 23     site: cmh\n",
+       " 24     role: spine\n",
+       " 25     groups:\n",
+       " 26         - cmh\n",
+       " 27     brigade_nos: eos\n",
+       " 28     type: network_device\n",
+       " 29 \n",
+       " 30 spine01.cmh:\n",
+       " 31     brigade_host: 127.0.0.1\n",
+       " 32     brigade_username: vagrant\n",
+       " 33     brigade_password: ""\n",
+       " 34     brigade_network_api_port: 12204\n",
+       " 35     site: cmh\n",
+       " 36     role: spine\n",
+       " 37     groups:\n",
+       " 38         - cmh\n",
+       " 39     brigade_nos: junos\n",
+       " 40     type: network_device\n",
+       " 41 \n",
+       " 42 leaf00.cmh:\n",
+       " 43     brigade_host: 127.0.0.1\n",
+       " 44     brigade_username: vagrant\n",
+       " 45     brigade_password: vagrant\n",
+       " 46     brigade_network_api_port: 12443\n",
+       " 47     site: cmh\n",
+       " 48     role: leaf\n",
+       " 49     groups:\n",
+       " 50         - cmh\n",
+       " 51     brigade_nos: eos\n",
+       " 52     type: network_device\n",
+       " 53     asn: 65100\n",
+       " 54 \n",
+       " 55 leaf01.cmh:\n",
+       " 56     brigade_host: 127.0.0.1\n",
+       " 57     brigade_username: vagrant\n",
+       " 58     brigade_password: ""\n",
+       " 59     brigade_network_api_port: 12203\n",
+       " 60     site: cmh\n",
+       " 61     role: leaf\n",
+       " 62     groups:\n",
+       " 63         - cmh\n",
+       " 64     brigade_nos: junos\n",
+       " 65     type: network_device\n",
+       " 66     asn: 65101\n",
+       " 67 \n",
+       " 68 host1.bma:\n",
+       " 69     site: bma\n",
+       " 70     role: host\n",
+       " 71     groups:\n",
+       " 72         - bma\n",
+       " 73     brigade_nos: linux\n",
+       " 74     type: host\n",
+       " 75 \n",
+       " 76 host2.bma:\n",
+       " 77     site: bma\n",
+       " 78     role: host\n",
+       " 79     groups:\n",
+       " 80         - bma\n",
+       " 81     brigade_nos: linux\n",
+       " 82     type: host\n",
+       " 83 \n",
+       " 84 spine00.bma:\n",
+       " 85     brigade_host: 127.0.0.1\n",
+       " 86     brigade_username: vagrant\n",
+       " 87     brigade_password: vagrant\n",
+       " 88     brigade_network_api_port: 12444\n",
+       " 89     site: bma\n",
+       " 90     role: spine\n",
+       " 91     groups:\n",
+       " 92         - bma\n",
+       " 93     brigade_nos: eos\n",
+       " 94     type: network_device\n",
+       " 95 \n",
+       " 96 spine01.bma:\n",
+       " 97     brigade_host: 127.0.0.1\n",
+       " 98     brigade_username: vagrant\n",
+       " 99     brigade_password: ""\n",
+       "100     brigade_network_api_port: 12204\n",
+       "101     site: bma\n",
+       "102     role: spine\n",
+       "103     groups:\n",
+       "104         - bma\n",
+       "105     brigade_nos: junos\n",
+       "106     type: network_device\n",
+       "107 \n",
+       "108 leaf00.bma:\n",
+       "109     brigade_host: 127.0.0.1\n",
+       "110     brigade_username: vagrant\n",
+       "111     brigade_password: vagrant\n",
+       "112     brigade_network_api_port: 12443\n",
+       "113     site: bma\n",
+       "114     role: leaf\n",
+       "115     groups:\n",
+       "116         - bma\n",
+       "117     brigade_nos: eos\n",
+       "118     type: network_device\n",
+       "119 \n",
+       "120 leaf01.bma:\n",
+       "121     brigade_host: 127.0.0.1\n",
+       "122     brigade_username: vagrant\n",
+       "123     brigade_password: wrong_password\n",
+       "124     brigade_network_api_port: 12203\n",
+       "125     site: bma\n",
+       "126     role: leaf\n",
+       "127     groups:\n",
+       "128         - bma\n",
+       "129     brigade_nos: junos\n",
+       "130     type: network_device\n",
+       "
\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# hosts file\n", + "%highlight_file ../../../examples/inventory/hosts.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The hosts file is basically a map where the outermost key is the hostname and then any arbitrary `` pair you want inside. Usually `brigade_*` keys have special meaning, you can investigate the [hosts](../../ref/api/inventory.rst#brigade.core.inventory.Host) class for details on those. In addition, the `groups` key is a list of groups you can inherite data from. We will inspect soon how the inheritance model works.\n", + "\n", + "Now, let's look at the groups file:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
 1 ---\n",
+       " 2 defaults:\n",
+       " 3     domain: acme.local\n",
+       " 4 \n",
+       " 5 global:\n",
+       " 6     domain: global.local\n",
+       " 7     asn: 1\n",
+       " 8 \n",
+       " 9 eu:\n",
+       "10     asn: 65100\n",
+       "11 \n",
+       "12 bma:\n",
+       "13     groups:\n",
+       "14         - eu\n",
+       "15         - global\n",
+       "16 \n",
+       "17 cmh:\n",
+       "18     asn: 65000\n",
+       "19     vlans:\n",
+       "20       100: frontend\n",
+       "21       200: backend\n",
+       "
\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# groups file\n", + "%highlight_file ../../../examples/inventory/groups.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pretty similar to the hosts file.\n", + "\n", + "### Accessing the inventory\n", + "\n", + "You can access the [inventory](../../ref/api/inventory.rst#brigade.core.inventory.Inventory) with the `inventory` attribute:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.inventory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The inventory has two dict-like attributes `hosts` and `groups` that you can use to access the hosts and groups respectively:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'host1.bma': Host: host1.bma,\n", + " 'host1.cmh': Host: host1.cmh,\n", + " 'host2.bma': Host: host2.bma,\n", + " 'host2.cmh': Host: host2.cmh,\n", + " 'leaf00.bma': Host: leaf00.bma,\n", + " 'leaf00.cmh': Host: leaf00.cmh,\n", + " 'leaf01.bma': Host: leaf01.bma,\n", + " 'leaf01.cmh': Host: leaf01.cmh,\n", + " 'spine00.bma': Host: spine00.bma,\n", + " 'spine00.cmh': Host: spine00.cmh,\n", + " 'spine01.bma': Host: spine01.bma,\n", + " 'spine01.cmh': Host: spine01.cmh}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.inventory.hosts" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'bma': Group: bma,\n", + " 'cmh': Group: cmh,\n", + " 'eu': Group: eu,\n", + " 'global': Group: global}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.inventory.groups" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Host: leaf01.bma" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.inventory.hosts[\"leaf01.bma\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hosts and groups are also dict-like objects:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['name', 'groups', 'brigade_host', 'brigade_username', 'brigade_password', 'brigade_network_api_port', 'site', 'role', 'brigade_nos', 'type', 'asn', 'domain'])" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "host = brg.inventory.hosts[\"leaf01.bma\"]\n", + "host.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'bma'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "host[\"site\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inheritance model\n", + "\n", + "Let's see how the inheritance models works by example. Let's start by looking again at the groups file:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
 1 ---\n",
+       " 2 defaults:\n",
+       " 3     domain: acme.local\n",
+       " 4 \n",
+       " 5 global:\n",
+       " 6     domain: global.local\n",
+       " 7     asn: 1\n",
+       " 8 \n",
+       " 9 eu:\n",
+       "10     asn: 65100\n",
+       "11 \n",
+       "12 bma:\n",
+       "13     groups:\n",
+       "14         - eu\n",
+       "15         - global\n",
+       "16 \n",
+       "17 cmh:\n",
+       "18     asn: 65000\n",
+       "19     vlans:\n",
+       "20       100: frontend\n",
+       "21       200: backend\n",
+       "
\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# groups file\n", + "%highlight_file ../../../examples/inventory/groups.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The host `leaf01.bma` belongs to the group `bma` which in turn belongs to the groups `eu` and `global`. The host `spine00.cmh` belings to the group `cmh` which doesn't belong to any other group.\n", + "\n", + "Data resolution works by iterating recursively over all the parent groups and trying to see if that parent group (or any of it's parents) contains the data. For instance:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'global.local'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "leaf01_bma = brg.inventory.hosts[\"leaf01.bma\"]\n", + "leaf01_bma[\"domain\"] # comes from the group `global`" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "65100" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "leaf01_bma[\"asn\"] # comes from group `eu`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The group `defaults` is special. This group contains data that will be returned if neither the host nor the parents have a specific value for it." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'acme.local'" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "leaf01_cmh = brg.inventory.hosts[\"leaf01.cmh\"]\n", + "leaf01_cmh[\"domain\"] # comes from defaults" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If brigade can't resolve the data you should get a KeyError as usual:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Couldn't find key: 'non_existent'\n" + ] + } + ], + "source": [ + "try:\n", + " leaf01_cmh[\"non_existent\"]\n", + "except KeyError as e:\n", + " print(f\"Couldn't find key: {e}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also try to access data without recursive resolution by using the `data` attribute. For example, if we try to access `leaf01_cmh.data[\"domain\"]` we should get an error as the host itself doesn't have that data:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Couldn't find key: 'domain'\n" + ] + } + ], + "source": [ + "try:\n", + " leaf01_cmh.data[\"domain\"]\n", + "except KeyError as e:\n", + " print(f\"Couldn't find key: {e}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Filtering the inventory\n", + "\n", + "So far we have seen that `brg.inventory.hosts` and `brg.inventory.groups` are dict-like objects that we can use to iterate over all the hosts and groups or to access any particular one directly. Now we are going to see how we can do some fancy filtering that will enable us to operate on groups of hosts based on their properties.\n", + "\n", + "The simpler way of filtering hosts is by `` pairs. For instance:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['host1.cmh', 'host2.cmh', 'spine00.cmh', 'spine01.cmh', 'leaf00.cmh', 'leaf01.cmh'])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.filter(site=\"cmh\").inventory.hosts.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also filter using multiple `` pairs:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['spine00.cmh', 'spine01.cmh'])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.filter(site=\"cmh\", role=\"spine\").inventory.hosts.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Filter is cumulative:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['spine00.cmh', 'spine01.cmh'])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.filter(site=\"cmh\").filter(role=\"spine\").inventory.hosts.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['spine00.cmh', 'spine01.cmh'])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cmh = brg.filter(site=\"cmh\")\n", + "cmh.filter(role=\"spine\").inventory.hosts.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['leaf00.cmh', 'leaf01.cmh'])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cmh.filter(role=\"leaf\").inventory.hosts.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also grab the children of a group:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'host1.bma': Host: host1.bma,\n", + " 'host2.bma': Host: host2.bma,\n", + " 'leaf00.bma': Host: leaf00.bma,\n", + " 'leaf01.bma': Host: leaf01.bma,\n", + " 'spine00.bma': Host: spine00.bma,\n", + " 'spine01.bma': Host: spine01.bma}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brg.inventory.groups[\"eu\"].children()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Advanced filtering\n", + "\n", + "Sometimes you need more fancy filtering. For those cases you can use a filter function:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['spine00.cmh', 'spine01.cmh', 'spine00.bma', 'spine01.bma'])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def has_long_name(host):\n", + " return len(host.name) == 11\n", + "\n", + "brg.filter(filter_func=has_long_name).inventory.hosts.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['host1.cmh', 'host2.cmh', 'host1.bma', 'host2.bma'])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Or a lambda function\n", + "brg.filter(filter_func=lambda h: len(h.name) == 9).inventory.hosts.keys()" + ] + } + ], + "metadata": { + "celltoolbar": "Edit Metadata", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/tutorials/intro/inventory.rst b/docs/tutorials/intro/inventory.rst deleted file mode 100644 index a8f089cb..00000000 --- a/docs/tutorials/intro/inventory.rst +++ /dev/null @@ -1,135 +0,0 @@ -The Inventory -============= - -The inventory is arguably the most important piece of Brigade. The inventory organizes hosts and makes sure tasks have the correct data for each host. - - -Inventory data --------------- - -Before we start let's take a look at the inventory data: - -* ``hosts.yaml`` - -.. literalinclude:: ../../../examples/inventory/hosts.yaml - -* ``groups.yaml`` - -.. literalinclude:: ../../../examples/inventory/groups.yaml - -Loading the inventory ---------------------- - -You can create the inventory in different ways, depending on your data source. To see the available plugins you can use go to the :ref:`ref-inventory` reference guide. - -.. note:: For this and the subsequent sections of this tutorial we are going to use the :obj:`SimpleInventory ` with the data located in ``/examples/inventory/``. We will also use the ``Vagrantfile`` located there so you should be able to reproduce everything. - -First, let's load the inventory:: - - >>> from brigade.plugins.inventory.simple import SimpleInventory - >>> inventory = SimpleInventory(host_file="hosts.yaml", group_file="groups.yaml") - -Now let's inspect the hosts and groups we have:: - - >>> inventory.hosts - {'host1.cmh': Host: host1.cmh, 'host2.cmh': Host: host2.cmh, 'spine00.cmh': Host: spine00.cmh, 'spine01.cmh': Host: spine01.cmh, 'leaf00.cmh': Host: leaf00.cmh, 'leaf01.cmh': Host: leaf01.cmh, 'host1.bma': Host: host1.bma, 'host2.bma': Host: host2.bma, 'spine00.bma': Host: spine00.bma, 'spine01.bma': Host: spine01.bma, 'leaf00.bma': Host: leaf00.bma, 'leaf01.bma': Host: leaf01.bma} - >>> inventory.groups - {'all': Group: all, 'bma': Group: bma, 'cmh': Group: cmh} - -As you probably noticed both ``hosts`` and ``groups`` are dictionaries so you can iterate over them if you want to. - -Data ----- - -Let's start by grabbing a host: - - >>> h = inventory.hosts['host1.cmh'] - >>> print(h) - host1.cmh - -Now, let's check some attributes:: - - >>> h["site"] - 'cmh' - >>> h.data["role"] - 'host' - >>> h["domain"] - 'acme.com' - >>> h.data["domain"] - Traceback (most recent call last): - File "", line 1, in - KeyError: 'domain' - >>> h.group["domain"] - 'acme.com' - -What does this mean? You can access host data in two ways: - -1. As if the host was a dictionary, i.e., ``h["domain"]`` in which case the inventory will resolve the groups and use data inherited from them (in our example ``domain`` is coming from the parent group). -2. Via the ``data`` attribute in which case there is no group resolution going on so ``h["domain"]`` fails is that piece of data is not directly assigned to the host. - -Most of the time you will care about the first option but if you ever need to get data only from the host you can do it without a hassle. - -Finally, the host behaves like a python dictionary so you can iterate over the data as such:: - - >>> h.keys() - dict_keys(['name', 'group', 'asn', 'vlans', 'site', 'role', 'brigade_nos', 'type']) - >>> h.values() - dict_values(['host1.cmh', 'cmh', 65000, {100: 'frontend', 200: 'backend'}, 'cmh', 'host', 'linux', 'host']) - >>> h.items() - dict_items([('name', 'host1.cmh'), ('group', 'cmh'), ('asn', 65000), ('vlans', {100: 'frontend', 200: 'backend'}), ('site', 'cmh'), ('role', 'host'), ('brigade_nos', 'linux'), ('type', 'host')]) - >>> for k, v in h.items(): - ... print(k, v) - ... - name host1.cmh - group cmh - asn 65000 - vlans {100: 'frontend', 200: 'backend'} - site cmh - role host - brigade_nos linux - type host - >>> - -.. note:: You can head to :obj:`brigade.core.inventory.Host` and :obj:`brigade.core.inventory.Group` for details on all the available attributes and functions for each ``host`` and ``group``. - -Filtering the inventory ------------------------ - -You won't always want to operate over all hosts, sometimes you will want to operate over some of them based on some attributes. In order to do so the inventory can help you filtering based on it's attributes. For instance:: - - >>> inventory.hosts.keys() - dict_keys(['host1.cmh', 'host2.cmh', 'spine00.cmh', 'spine01.cmh', 'leaf00.cmh', 'leaf01.cmh', 'host1.bma', 'host2.bma', 'spine00.bma', 'spine01.bma', 'leaf00.bma', 'leaf01.bma']) - >>> inventory.filter(site="bma").hosts.keys() - dict_keys(['host1.bma', 'host2.bma', 'spine00.bma', 'spine01.bma', 'leaf00.bma', 'leaf01.bma']) - >>> inventory.filter(site="bma", role="spine").hosts.keys() - dict_keys(['spine00.bma', 'spine01.bma']) - >>> inventory.filter(site="bma").filter(role="spine").hosts.keys() - dict_keys(['spine00.bma', 'spine01.bma']) - -Note in the last line that the filter is cumulative so you can do things like this: - - >>> cmh = inventory.filter(site="cmh") - >>> cmh.hosts.keys() - dict_keys(['host1.cmh', 'host2.cmh', 'spine00.cmh', 'spine01.cmh', 'leaf00.cmh', 'leaf01.cmh']) - >>> cmh_eos = cmh.filter(brigade_nos="eos") - >>> cmh_eos.hosts.keys() - dict_keys(['spine00.cmh', 'leaf00.cmh']) - >>> cmh_eos.filter(role="spine").hosts.keys() - dict_keys(['spine00.cmh']) - -This should give you enough room to build groups in any way you want. - -Advanced filtering -__________________ - -You can also do more complex filtering by using functions or lambdas:: - - >>> def has_long_name(host): - ... return len(host.name) == 11 - ... - >>> inventory.filter(filter_func=has_long_name).hosts.keys() - dict_keys(['spine00.cmh', 'spine01.cmh', 'spine00.bma', 'spine01.bma']) - >>> inventory.filter(filter_func=lambda h: len(h.name) == 9).hosts.keys() - dict_keys(['host1.cmh', 'host2.cmh', 'host1.bma', 'host2.bma']) - -Not the most useful example but it should be enough to illustrate how it works. diff --git a/examples/highlighter.py b/examples/highlighter.py index ebe31b33..ea59ceee 100644 --- a/examples/highlighter.py +++ b/examples/highlighter.py @@ -5,7 +5,7 @@ from pygments import highlight from pygments.formatters import HtmlFormatter -from pygments.lexers import get_lexer_by_name +from pygments.lexers import get_lexer_for_filename HTML_TEMPLATE = """\n", "
  1 ---\n",
        "  2 host1.cmh:\n",
-       "  3     site: cmh\n",
-       "  4     role: host\n",
-       "  5     groups:\n",
-       "  6         - cmh\n",
-       "  7     brigade_nos: linux\n",
-       "  8     type: host\n",
-       "  9 \n",
-       " 10 host2.cmh:\n",
-       " 11     site: cmh\n",
-       " 12     role: host\n",
-       " 13     groups:\n",
-       " 14         - cmh\n",
-       " 15     brigade_nos: linux\n",
-       " 16     type: host\n",
-       " 17 \n",
-       " 18 spine00.cmh:\n",
-       " 19     brigade_host: 127.0.0.1\n",
-       " 20     brigade_username: vagrant\n",
-       " 21     brigade_password: vagrant\n",
-       " 22     brigade_network_api_port: 12444\n",
-       " 23     site: cmh\n",
-       " 24     role: spine\n",
-       " 25     groups:\n",
-       " 26         - cmh\n",
-       " 27     brigade_nos: eos\n",
-       " 28     type: network_device\n",
-       " 29 \n",
-       " 30 spine01.cmh:\n",
-       " 31     brigade_host: 127.0.0.1\n",
-       " 32     brigade_username: vagrant\n",
-       " 33     brigade_password: ""\n",
-       " 34     brigade_network_api_port: 12204\n",
-       " 35     site: cmh\n",
-       " 36     role: spine\n",
-       " 37     groups:\n",
-       " 38         - cmh\n",
-       " 39     brigade_nos: junos\n",
-       " 40     type: network_device\n",
-       " 41 \n",
-       " 42 leaf00.cmh:\n",
-       " 43     brigade_host: 127.0.0.1\n",
-       " 44     brigade_username: vagrant\n",
-       " 45     brigade_password: vagrant\n",
-       " 46     brigade_network_api_port: 12443\n",
-       " 47     site: cmh\n",
-       " 48     role: leaf\n",
-       " 49     groups:\n",
-       " 50         - cmh\n",
-       " 51     brigade_nos: eos\n",
-       " 52     type: network_device\n",
-       " 53     asn: 65100\n",
-       " 54 \n",
-       " 55 leaf01.cmh:\n",
-       " 56     brigade_host: 127.0.0.1\n",
-       " 57     brigade_username: vagrant\n",
-       " 58     brigade_password: ""\n",
-       " 59     brigade_network_api_port: 12203\n",
-       " 60     site: cmh\n",
-       " 61     role: leaf\n",
-       " 62     groups:\n",
-       " 63         - cmh\n",
-       " 64     brigade_nos: junos\n",
-       " 65     type: network_device\n",
-       " 66     asn: 65101\n",
-       " 67 \n",
-       " 68 host1.bma:\n",
-       " 69     site: bma\n",
-       " 70     role: host\n",
-       " 71     groups:\n",
-       " 72         - bma\n",
-       " 73     brigade_nos: linux\n",
-       " 74     type: host\n",
+       "  3     brigade_host: 127.0.0.1\n",
+       "  4     brigade_ssh_port: 2201\n",
+       "  5     brigade_username: vagrant\n",
+       "  6     brigade_password: vagrant\n",
+       "  7     site: cmh\n",
+       "  8     role: host\n",
+       "  9     groups:\n",
+       " 10         - cmh\n",
+       " 11     brigade_nos: linux\n",
+       " 12     type: host\n",
+       " 13 \n",
+       " 14 host2.cmh:\n",
+       " 15     brigade_host: 127.0.0.1\n",
+       " 16     brigade_ssh_port: 2202\n",
+       " 17     brigade_username: vagrant\n",
+       " 18     brigade_password: vagrant\n",
+       " 19     site: cmh\n",
+       " 20     role: host\n",
+       " 21     groups:\n",
+       " 22         - cmh\n",
+       " 23     brigade_nos: linux\n",
+       " 24     type: host\n",
+       " 25 \n",
+       " 26 spine00.cmh:\n",
+       " 27     brigade_host: 127.0.0.1\n",
+       " 28     brigade_username: vagrant\n",
+       " 29     brigade_password: vagrant\n",
+       " 30     brigade_network_api_port: 12444\n",
+       " 31     site: cmh\n",
+       " 32     role: spine\n",
+       " 33     groups:\n",
+       " 34         - cmh\n",
+       " 35     brigade_nos: eos\n",
+       " 36     type: network_device\n",
+       " 37 \n",
+       " 38 spine01.cmh:\n",
+       " 39     brigade_host: 127.0.0.1\n",
+       " 40     brigade_username: vagrant\n",
+       " 41     brigade_password: ""\n",
+       " 42     brigade_network_api_port: 12204\n",
+       " 43     site: cmh\n",
+       " 44     role: spine\n",
+       " 45     groups:\n",
+       " 46         - cmh\n",
+       " 47     brigade_nos: junos\n",
+       " 48     type: network_device\n",
+       " 49 \n",
+       " 50 leaf00.cmh:\n",
+       " 51     brigade_host: 127.0.0.1\n",
+       " 52     brigade_username: vagrant\n",
+       " 53     brigade_password: vagrant\n",
+       " 54     brigade_network_api_port: 12443\n",
+       " 55     site: cmh\n",
+       " 56     role: leaf\n",
+       " 57     groups:\n",
+       " 58         - cmh\n",
+       " 59     brigade_nos: eos\n",
+       " 60     type: network_device\n",
+       " 61     asn: 65100\n",
+       " 62 \n",
+       " 63 leaf01.cmh:\n",
+       " 64     brigade_host: 127.0.0.1\n",
+       " 65     brigade_username: vagrant\n",
+       " 66     brigade_password: ""\n",
+       " 67     brigade_network_api_port: 12203\n",
+       " 68     site: cmh\n",
+       " 69     role: leaf\n",
+       " 70     groups:\n",
+       " 71         - cmh\n",
+       " 72     brigade_nos: junos\n",
+       " 73     type: network_device\n",
+       " 74     asn: 65101\n",
        " 75 \n",
-       " 76 host2.bma:\n",
+       " 76 host1.bma:\n",
        " 77     site: bma\n",
        " 78     role: host\n",
        " 79     groups:\n",
@@ -198,53 +188,61 @@
        " 81     brigade_nos: linux\n",
        " 82     type: host\n",
        " 83 \n",
-       " 84 spine00.bma:\n",
-       " 85     brigade_host: 127.0.0.1\n",
-       " 86     brigade_username: vagrant\n",
-       " 87     brigade_password: vagrant\n",
-       " 88     brigade_network_api_port: 12444\n",
-       " 89     site: bma\n",
-       " 90     role: spine\n",
-       " 91     groups:\n",
-       " 92         - bma\n",
-       " 93     brigade_nos: eos\n",
-       " 94     type: network_device\n",
-       " 95 \n",
-       " 96 spine01.bma:\n",
-       " 97     brigade_host: 127.0.0.1\n",
-       " 98     brigade_username: vagrant\n",
-       " 99     brigade_password: ""\n",
-       "100     brigade_network_api_port: 12204\n",
-       "101     site: bma\n",
-       "102     role: spine\n",
-       "103     groups:\n",
-       "104         - bma\n",
-       "105     brigade_nos: junos\n",
-       "106     type: network_device\n",
-       "107 \n",
-       "108 leaf00.bma:\n",
-       "109     brigade_host: 127.0.0.1\n",
-       "110     brigade_username: vagrant\n",
-       "111     brigade_password: vagrant\n",
-       "112     brigade_network_api_port: 12443\n",
-       "113     site: bma\n",
-       "114     role: leaf\n",
-       "115     groups:\n",
-       "116         - bma\n",
-       "117     brigade_nos: eos\n",
-       "118     type: network_device\n",
-       "119 \n",
-       "120 leaf01.bma:\n",
-       "121     brigade_host: 127.0.0.1\n",
-       "122     brigade_username: vagrant\n",
-       "123     brigade_password: wrong_password\n",
-       "124     brigade_network_api_port: 12203\n",
-       "125     site: bma\n",
-       "126     role: leaf\n",
-       "127     groups:\n",
-       "128         - bma\n",
-       "129     brigade_nos: junos\n",
-       "130     type: network_device\n",
+       " 84 host2.bma:\n",
+       " 85     site: bma\n",
+       " 86     role: host\n",
+       " 87     groups:\n",
+       " 88         - bma\n",
+       " 89     brigade_nos: linux\n",
+       " 90     type: host\n",
+       " 91 \n",
+       " 92 spine00.bma:\n",
+       " 93     brigade_host: 127.0.0.1\n",
+       " 94     brigade_username: vagrant\n",
+       " 95     brigade_password: vagrant\n",
+       " 96     brigade_network_api_port: 12444\n",
+       " 97     site: bma\n",
+       " 98     role: spine\n",
+       " 99     groups:\n",
+       "100         - bma\n",
+       "101     brigade_nos: eos\n",
+       "102     type: network_device\n",
+       "103 \n",
+       "104 spine01.bma:\n",
+       "105     brigade_host: 127.0.0.1\n",
+       "106     brigade_username: vagrant\n",
+       "107     brigade_password: ""\n",
+       "108     brigade_network_api_port: 12204\n",
+       "109     site: bma\n",
+       "110     role: spine\n",
+       "111     groups:\n",
+       "112         - bma\n",
+       "113     brigade_nos: junos\n",
+       "114     type: network_device\n",
+       "115 \n",
+       "116 leaf00.bma:\n",
+       "117     brigade_host: 127.0.0.1\n",
+       "118     brigade_username: vagrant\n",
+       "119     brigade_password: vagrant\n",
+       "120     brigade_network_api_port: 12443\n",
+       "121     site: bma\n",
+       "122     role: leaf\n",
+       "123     groups:\n",
+       "124         - bma\n",
+       "125     brigade_nos: eos\n",
+       "126     type: network_device\n",
+       "127 \n",
+       "128 leaf01.bma:\n",
+       "129     brigade_host: 127.0.0.1\n",
+       "130     brigade_username: vagrant\n",
+       "131     brigade_password: wrong_password\n",
+       "132     brigade_network_api_port: 12203\n",
+       "133     site: bma\n",
+       "134     role: leaf\n",
+       "135     groups:\n",
+       "136         - bma\n",
+       "137     brigade_nos: junos\n",
+       "138     type: network_device\n",
        "
\n", "\n" ], @@ -252,7 +250,7 @@ "" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -273,7 +271,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -381,7 +379,7 @@ "" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -404,21 +402,24 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "from brigade.core import InitBrigade\n", + "brg = InitBrigade(config_file=\"config.yaml\")\n", + "\n", "brg.inventory" ] }, @@ -431,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -451,7 +452,7 @@ " 'spine01.cmh': Host: spine01.cmh}" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -462,7 +463,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -474,7 +475,7 @@ " 'global': Group: global}" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -485,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -494,7 +495,7 @@ "Host: leaf01.bma" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -512,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -521,7 +522,7 @@ "dict_keys(['name', 'groups', 'brigade_host', 'brigade_username', 'brigade_password', 'brigade_network_api_port', 'site', 'role', 'brigade_nos', 'type', 'asn', 'domain'])" ] }, - "execution_count": 9, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -533,7 +534,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": { "scrolled": true }, @@ -544,7 +545,7 @@ "'bma'" ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -564,7 +565,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -672,7 +673,7 @@ "" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -686,14 +687,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The host `leaf01.bma` belongs to the group `bma` which in turn belongs to the groups `eu` and `global`. The host `spine00.cmh` belings to the group `cmh` which doesn't belong to any other group.\n", + "The host `leaf01.bma` belongs to the group `bma` which in turn belongs to the groups `eu` and `global`. The host `spine00.cmh` belongs to the group `cmh` which doesn't belong to any other group.\n", "\n", "Data resolution works by iterating recursively over all the parent groups and trying to see if that parent group (or any of it's parents) contains the data. For instance:" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -702,7 +703,7 @@ "'global.local'" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -714,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -723,7 +724,7 @@ "65100" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -741,7 +742,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -750,7 +751,7 @@ "'acme.local'" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -769,7 +770,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -796,7 +797,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -827,7 +828,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -836,7 +837,7 @@ "dict_keys(['host1.cmh', 'host2.cmh', 'spine00.cmh', 'spine01.cmh', 'leaf00.cmh', 'leaf01.cmh'])" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -854,7 +855,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -863,7 +864,7 @@ "dict_keys(['spine00.cmh', 'spine01.cmh'])" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -881,7 +882,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -890,7 +891,7 @@ "dict_keys(['spine00.cmh', 'spine01.cmh'])" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -908,7 +909,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -917,7 +918,7 @@ "dict_keys(['spine00.cmh', 'spine01.cmh'])" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -929,7 +930,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -938,7 +939,7 @@ "dict_keys(['leaf00.cmh', 'leaf01.cmh'])" ] }, - "execution_count": 21, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -956,7 +957,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -970,7 +971,7 @@ " 'spine01.bma': Host: spine01.bma}" ] }, - "execution_count": 22, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -990,7 +991,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -999,7 +1000,7 @@ "dict_keys(['spine00.cmh', 'spine01.cmh', 'spine00.bma', 'spine01.bma'])" ] }, - "execution_count": 23, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -1013,7 +1014,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1022,7 +1023,7 @@ "dict_keys(['host1.cmh', 'host2.cmh', 'host1.bma', 'host2.bma'])" ] }, - "execution_count": 24, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } diff --git a/docs/tutorials/intro/task_results.ipynb b/docs/tutorials/intro/task_results.ipynb index dd14dccd..21aa4448 100644 --- a/docs/tutorials/intro/task_results.ipynb +++ b/docs/tutorials/intro/task_results.ipynb @@ -76,65 +76,37 @@ "output_type": "stream", "text": [ "\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", "\u001b[0mhostname spine00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.local\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", "\u001b[0msystem {\n", " host-name spine01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", "\u001b[0mhostname leaf00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.local\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", "\u001b[0msystem {\n", " host-name leaf01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name leaf01.cmh;\n", - "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", "\u001b[0m" ] @@ -166,17 +138,7 @@ "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", "\u001b[0mhostname spine00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.local\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", "\u001b[0m" ] @@ -202,17 +164,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.local\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", + "\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m" ] } @@ -238,45 +190,17 @@ "output_type": "stream", "text": [ "\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.local\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.local\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name leaf01.cmh;\n", - "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", "\u001b[0m\n", "\u001b[0m" ] @@ -398,7 +322,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "changed: \u001b[0m \u001b[0mTrue\u001b[0m\n", + "changed: \u001b[0m \u001b[0mFalse\u001b[0m\n", "\u001b[0mfailed: \u001b[0m \u001b[0mFalse\u001b[0m\n", "\u001b[0m" ] @@ -445,16 +369,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.local\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", + "\u001b[0m\n", "\u001b[0m" ] } From 9ede26020347a4180f9ef9fa6036d4155653665a Mon Sep 17 00:00:00 2001 From: David Barroso Date: Fri, 30 Mar 2018 10:42:13 +0200 Subject: [PATCH 38/77] rename tutorial filename --- .../intro/{advanced_tasks.ipynb => grouping_tasks.ipynb} | 0 docs/tutorials/intro/index.rst | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/tutorials/intro/{advanced_tasks.ipynb => grouping_tasks.ipynb} (100%) diff --git a/docs/tutorials/intro/advanced_tasks.ipynb b/docs/tutorials/intro/grouping_tasks.ipynb similarity index 100% rename from docs/tutorials/intro/advanced_tasks.ipynb rename to docs/tutorials/intro/grouping_tasks.ipynb diff --git a/docs/tutorials/intro/index.rst b/docs/tutorials/intro/index.rst index 66e1b7ac..384a3971 100644 --- a/docs/tutorials/intro/index.rst +++ b/docs/tutorials/intro/index.rst @@ -13,6 +13,6 @@ We're glad you made it here! This is a great place to learn the basics of Brigad initializing_brigade.ipynb inventory.ipynb executing_tasks.ipynb - advanced_tasks.ipynb + grouping_tasks.ipynb task_results.ipynb failed_tasks.ipynb From bf69ef15e9f8561663f0a4ac8537738a178466ad Mon Sep 17 00:00:00 2001 From: David Barroso Date: Fri, 30 Mar 2018 15:47:39 +0200 Subject: [PATCH 39/77] added http_method task --- brigade/plugins/tasks/apis/__init__.py | 5 ++ brigade/plugins/tasks/apis/http_method.py | 38 +++++++++++++ docs/ref/tasks/apis.rst | 6 ++ docs/ref/tasks/index.rst | 3 +- tests/plugins/tasks/apis/__init__.py | 0 tests/plugins/tasks/apis/test_http_method.py | 58 ++++++++++++++++++++ 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 brigade/plugins/tasks/apis/__init__.py create mode 100644 brigade/plugins/tasks/apis/http_method.py create mode 100644 docs/ref/tasks/apis.rst create mode 100644 tests/plugins/tasks/apis/__init__.py create mode 100644 tests/plugins/tasks/apis/test_http_method.py diff --git a/brigade/plugins/tasks/apis/__init__.py b/brigade/plugins/tasks/apis/__init__.py new file mode 100644 index 00000000..784a54f9 --- /dev/null +++ b/brigade/plugins/tasks/apis/__init__.py @@ -0,0 +1,5 @@ +from .http_method import http_method + +__all__ = ( + "http_method", +) diff --git a/brigade/plugins/tasks/apis/http_method.py b/brigade/plugins/tasks/apis/http_method.py new file mode 100644 index 00000000..5e9125db --- /dev/null +++ b/brigade/plugins/tasks/apis/http_method.py @@ -0,0 +1,38 @@ +from brigade.core.task import Result + +import requests + + +def http_method(task=None, method="get", url="", raise_for_status=True, **kwargs): + """ + This is a convenience task that uses `requests `_ to + interact with an HTTP server. + + Arguments: + method (string): HTTP method to call + url (string): URL to connect to + raise_for_status (bool): Whether to call `raise_for_status + `_ + method automatically or not + **kwargs: Keyword arguments will be passed to the `request + `_ + method + + Returns: + :obj:`brigade.core.task.Result`: + * result (``string/dict``): Body of the response. Either text or a dict if the + response was a json object + * reponse (object): Original `Response + `_ + """ + r = requests.request(method, url, **kwargs) + + if raise_for_status: + r.raise_for_status() + + if r.headers["Content-type"] == "application/json": + result = r.json() + else: + result = r.text + + return Result(host=task.host if task else None, response=r, result=result) diff --git a/docs/ref/tasks/apis.rst b/docs/ref/tasks/apis.rst new file mode 100644 index 00000000..9aec70f8 --- /dev/null +++ b/docs/ref/tasks/apis.rst @@ -0,0 +1,6 @@ +APIs +==== + +.. automodule:: brigade.plugins.tasks.apis + :members: + :undoc-members: diff --git a/docs/ref/tasks/index.rst b/docs/ref/tasks/index.rst index 96558306..1c4704ce 100644 --- a/docs/ref/tasks/index.rst +++ b/docs/ref/tasks/index.rst @@ -5,8 +5,9 @@ Tasks :maxdepth: 2 :caption: Categories: - connections + apis commands + connections data files networking diff --git a/tests/plugins/tasks/apis/__init__.py b/tests/plugins/tasks/apis/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/tasks/apis/test_http_method.py b/tests/plugins/tasks/apis/test_http_method.py new file mode 100644 index 00000000..ab947f28 --- /dev/null +++ b/tests/plugins/tasks/apis/test_http_method.py @@ -0,0 +1,58 @@ +import json + +from brigade.plugins.tasks.apis import http_method + +import pytest + +from requests.exceptions import HTTPError + + +class Test(object): + + def test_simple_get_text(self): + url = "http://httpbin.org/encoding/utf8" + result = http_method(method="get", url=url) + assert result.response.status_code + assert result.result.startswith("

Unicode Demo

") + assert result.result == result.response.text + + def test_simple_get_json(self): + url = "http://httpbin.org/get" + result = http_method(method="get", url=url) + assert result.response.status_code + assert result.response.json()["args"] == {} + assert json.loads(result.response.text)["args"] == {} + assert result.result == result.response.json() + + def test_headers(self): + url = "http://httpbin.org/headers" + headers = {"X-Test": "a test"} + result = http_method(method="get", url=url, headers=headers) + assert result.result["headers"]["X-Test"] == "a test" + + def test_params(self): + url = "http://httpbin.org/get" + params = {"my_param": "my_value"} + result = http_method(method="get", url=url, params=params) + assert result.result["args"]["my_param"] == "my_value" + + def test_post_data(self): + url = "http://httpbin.org/post" + data = {"my_param": "my_value"} + result = http_method(method="post", url=url, data=data) + assert result.result["form"]["my_param"] == "my_value" + + def test_post_json(self): + url = "http://httpbin.org/post" + json = {"my_param": "my_value"} + result = http_method(method="post", url=url, json=json) + assert result.result["data"] == '{"my_param": "my_value"}' + + def test_raise_for_status(self): + url = "http://httpbin.org/status/418" + + with pytest.raises(HTTPError): + http_method(method="post", url=url) + + result = http_method(method="post", url=url, raise_for_status=False) + assert result.response.status_code From 06e85b8ee624ed66c182f0bec46a35b52c1722ed Mon Sep 17 00:00:00 2001 From: David Barroso Date: Fri, 30 Mar 2018 16:32:45 +0200 Subject: [PATCH 40/77] added test with brigade --- brigade/plugins/tasks/apis/http_method.py | 10 ++++++---- tests/plugins/tasks/apis/test_http_method.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/brigade/plugins/tasks/apis/http_method.py b/brigade/plugins/tasks/apis/http_method.py index 5e9125db..fab2d22a 100644 --- a/brigade/plugins/tasks/apis/http_method.py +++ b/brigade/plugins/tasks/apis/http_method.py @@ -30,9 +30,11 @@ def http_method(task=None, method="get", url="", raise_for_status=True, **kwargs if raise_for_status: r.raise_for_status() - if r.headers["Content-type"] == "application/json": - result = r.json() - else: - result = r.text + try: + content_type = r.headers["Content-type"] + except KeyError: + content_type = "text" + + result = r.json() if "application/json" == content_type else r.text return Result(host=task.host if task else None, response=r, result=result) diff --git a/tests/plugins/tasks/apis/test_http_method.py b/tests/plugins/tasks/apis/test_http_method.py index ab947f28..ed821d6e 100644 --- a/tests/plugins/tasks/apis/test_http_method.py +++ b/tests/plugins/tasks/apis/test_http_method.py @@ -56,3 +56,18 @@ def test_raise_for_status(self): result = http_method(method="post", url=url, raise_for_status=False) assert result.response.status_code + + def test_with_brigade(self, brigade): + url = "http://httpbin.org/get" + params = {"my_param": "my_value"} + + r = brigade.run(http_method, + method="get", + url=url, + params=params) + + processed = False + for host, result in r.items(): + processed = True + assert result[0].result["args"]["my_param"] == "my_value" + assert processed From 71d7e1edf6dfc5d745654001247f918999159e42 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 31 Mar 2018 17:13:57 +0200 Subject: [PATCH 41/77] clean task logic and introduce severity levels --- brigade/core/__init__.py | 23 ++++------------------- brigade/core/task.py | 39 ++++++++++++++++++++++++++++++++++----- tests/core/test_tasks.py | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 25 deletions(-) diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index 44657d19..a8825018 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -1,11 +1,10 @@ import logging import logging.config import sys -import traceback from multiprocessing.dummy import Pool from brigade.core.configuration import Config -from brigade.core.task import AggregatedResult, Result, Task +from brigade.core.task import AggregatedResult, Task from brigade.plugins.tasks import connections @@ -160,15 +159,15 @@ def filter(self, **kwargs): def _run_serial(self, task, hosts, dry_run, **kwargs): result = AggregatedResult(kwargs.get("name") or task.__name__) for host in hosts: - result[host.name] = run_task(host, self, dry_run, Task(task, **kwargs)) + result[host.name] = Task(task, **kwargs).start(host, self, dry_run) return result def _run_parallel(self, task, hosts, num_workers, dry_run, **kwargs): result = AggregatedResult(kwargs.get("name") or task.__name__) pool = Pool(processes=num_workers) - result_pool = [pool.apply_async(run_task, - args=(h, self, dry_run, Task(task, **kwargs))) + result_pool = [pool.apply_async(Task(task, **kwargs).start, + args=(h, self, dry_run)) for h in hosts] pool.close() pool.join() @@ -230,20 +229,6 @@ def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, on_good return result -def run_task(host, brigade, dry_run, task): - logger = logging.getLogger("brigade") - try: - logger.info("{}: {}: running task".format(host.name, task.name)) - r = task._start(host=host, brigade=brigade, dry_run=dry_run) - except Exception as e: - tb = traceback.format_exc() - logger.error("{}: {}".format(host, tb)) - r = Result(host, exception=e, result=tb, failed=True) - task.results.append(r) - r.name = task.name - return task.results - - def InitBrigade(config_file="", dry_run=False, **kwargs): """ Arguments: diff --git a/brigade/core/task.py b/brigade/core/task.py index b133c072..c24b71c1 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -1,8 +1,21 @@ +import logging +import traceback from builtins import super +from functools import wraps from brigade.core.exceptions import BrigadeExecutionError +def task(): + def real_decorator(func): + @wraps(func) + def wrapper(task=None, **kwargs): + result = func(task=task, **kwargs) + return result + return wrapper + return real_decorator + + class Task(object): """ A task is basically a wrapper around a function that has to be run against multiple devices. @@ -26,22 +39,35 @@ class Task(object): dry_run(``bool``): Populated right before calling the ``task`` """ - def __init__(self, task, name=None, **kwargs): + def __init__(self, task, name=None, severity=logging.INFO, **kwargs): self.name = name or task.__name__ self.task = task self.params = kwargs self.results = MultiResult(self.name) self.dry_run = None + self.severity = severity def __repr__(self): return self.name - def _start(self, host, brigade, dry_run, sub_task=False): + def start(self, host, brigade, dry_run, sub_task=False): self.host = host self.brigade = brigade self.dry_run = dry_run if dry_run is not None else brigade.dry_run - r = self.task(self, **self.params) or Result(host) + + logger = logging.getLogger("brigade") + try: + logger.info("{}: {}: running task".format(self.host.name, self.name)) + r = self.task(self, **self.params) + if not isinstance(r, Result): + r = Result(host=host, result=r) + except Exception as e: + tb = traceback.format_exc() + logger.error("{}: {}".format(self.host, tb)) + r = Result(host, exception=e, result=tb, failed=True) + self.results.append(r) r.name = self.name + r.severity = logging.ERROR if r.failed else self.severity if sub_task: return r @@ -69,7 +95,9 @@ def grouped_tasks(task): # we want the subtask to receive self.dry_run in the case it was overriden in the parent dry_run = dry_run if dry_run is not None else self.dry_run - r = Task(task, **kwargs)._start(self.host, self.brigade, dry_run, sub_task=True) + if "severity" not in kwargs: + kwargs["severity"] = self.severity + r = Task(task, **kwargs).start(self.host, self.brigade, dry_run, sub_task=True) if isinstance(r, MultiResult): self.results.extend(r) @@ -100,7 +128,7 @@ class Result(object): """ def __init__(self, host, result=None, changed=False, diff="", failed=False, exception=None, - **kwargs): + severity=logging.INFO, **kwargs): self.result = result self.host = host self.changed = changed @@ -108,6 +136,7 @@ def __init__(self, host, result=None, changed=False, diff="", failed=False, exce self.failed = failed self.exception = exception self.name = None + self.severity = severity for k, v in kwargs.items(): setattr(self, k, v) diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index 6df428fe..8389f4d4 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -1,3 +1,5 @@ +import logging + from brigade.plugins.tasks import commands @@ -8,7 +10,8 @@ def task_fails_for_some(task): command="sasdasdasd") else: task.run(commands.command, - command="echo {}".format(task.host)) + command="echo {}".format(task.host), + severity=logging.DEBUG) def sub_task(task): @@ -73,3 +76,31 @@ def test_run_on(self, brigade): assert "dev1.group_1" in result brigade.data.reset_failed_hosts() + + def test_severity(self, brigade): + r = brigade.run(commands.command, + command="echo blah") + for host, result in r.items(): + assert result[0].severity == logging.INFO + + r = brigade.run(commands.command, + command="echo blah", + severity=logging.WARN) + for host, result in r.items(): + assert result[0].severity == logging.WARN + + r = brigade.run(sub_task, severity=logging.WARN) + for host, result in r.items(): + for sr in result: + assert sr.severity == logging.WARN + + r = brigade.run(task_fails_for_some, severity=logging.WARN, num_workers=1) + for host, result in r.items(): + if host == "dev3.group_2": + assert result[0].severity == logging.WARN + assert result[1].severity == logging.ERROR + else: + assert result[0].severity == logging.WARN + assert result[1].severity == logging.DEBUG + + brigade.data.reset_failed_hosts() From ec1bea77b8145fcbe02da0a50d14aab7d8073cbc Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 31 Mar 2018 17:39:39 +0200 Subject: [PATCH 42/77] replace task_id with severity_level --- brigade/plugins/functions/text/__init__.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/brigade/plugins/functions/text/__init__.py b/brigade/plugins/functions/text/__init__.py index 7ffc6abc..aacf5b1a 100644 --- a/brigade/plugins/functions/text/__init__.py +++ b/brigade/plugins/functions/text/__init__.py @@ -1,3 +1,4 @@ +import logging import pprint from brigade.core.task import AggregatedResult, MultiResult, Result @@ -16,7 +17,7 @@ def print_title(title): print("{}{}{}{}".format(Style.BRIGHT, Fore.GREEN, msg, "*" * (80 - len(msg)))) -def print_result(result, host=None, vars=None, failed=None, task_id=None): +def print_result(result, host=None, vars=None, failed=None, severity_level=logging.INFO): """ Prints on screen the :obj:`brigade.core.task.Result` from a previous task @@ -47,17 +48,14 @@ def print_result(result, host=None, vars=None, failed=None, task_id=None): " ** changed : {} ".format(host_data.changed) msg = "* {}{}".format(host, title) print("{}{}{}{}".format(Style.BRIGHT, Fore.BLUE, msg, "*" * (80 - len(msg)))) - print_result(host_data, host, vars, failed, task_id) + print_result(host_data, host, vars, failed, severity_level) elif isinstance(result, MultiResult): - if task_id is not None: - r = result[task_id] - result = MultiResult(result.name) - result.append(r) - for r in result: - print_result(r, host, vars, failed, task_id) + print_result(r, host, vars, failed, severity_level) print() elif isinstance(result, Result): + if result.severity < severity_level: + return if result.failed or failed: color = Fore.RED elif result.changed: @@ -65,8 +63,9 @@ def print_result(result, host=None, vars=None, failed=None, task_id=None): else: color = Fore.GREEN subtitle = "" if result.changed is None else " ** changed : {} ".format(result.changed) - msg = "---- {}{} ".format(result.name, subtitle) - print("{}{}{}{}".format(Style.BRIGHT, color, msg, "-" * (80 - len(msg)))) + level_name = logging.getLevelName(result.severity) + msg = "---- {}{}".format(result.name, subtitle) + print("{}{}{}{}- {}".format(Style.BRIGHT, color, msg, "-" * (80 - len(msg)), level_name)) for v in vars: x = getattr(result, v, "") if x and not isinstance(x, str): From 4ae53524bef3273ef084416f177b4760398ee24c Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 31 Mar 2018 17:41:08 +0200 Subject: [PATCH 43/77] remove unused code --- brigade/core/task.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/brigade/core/task.py b/brigade/core/task.py index c24b71c1..88839ad8 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -1,21 +1,10 @@ import logging import traceback from builtins import super -from functools import wraps from brigade.core.exceptions import BrigadeExecutionError -def task(): - def real_decorator(func): - @wraps(func) - def wrapper(task=None, **kwargs): - result = func(task=task, **kwargs) - return result - return wrapper - return real_decorator - - class Task(object): """ A task is basically a wrapper around a function that has to be run against multiple devices. From eeb8e76cd74c3546126ee2076c6bb1eac151442d Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 31 Mar 2018 18:25:10 +0200 Subject: [PATCH 44/77] more logic cleaning --- brigade/core/task.py | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/brigade/core/task.py b/brigade/core/task.py index 88839ad8..0be6701d 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -39,7 +39,25 @@ def __init__(self, task, name=None, severity=logging.INFO, **kwargs): def __repr__(self): return self.name - def start(self, host, brigade, dry_run, sub_task=False): + def start(self, host, brigade, dry_run): + """ + This methods contains the logic to call the underlying function in the task. + + Arguments: + host (:obj:`brigade.core.inventory.Host`): Host we are operating with. Populated right + before calling the ``task`` + brigade(:obj:`brigade.core.Brigade`): Populated right before calling + the ``task`` + dry_run(bool): Populated right before calling the ``task`` + + Returns: + host (:obj:`brigade.core.task.MultiResult`): Results of the tasks ran + """ + r = self._start(host, brigade, dry_run) + self.results.insert(0, r) + return self.results + + def _start(self, host, brigade, dry_run): self.host = host self.brigade = brigade self.dry_run = dry_run if dry_run is not None else brigade.dry_run @@ -54,15 +72,9 @@ def start(self, host, brigade, dry_run, sub_task=False): tb = traceback.format_exc() logger.error("{}: {}".format(self.host, tb)) r = Result(host, exception=e, result=tb, failed=True) - self.results.append(r) r.name = self.name r.severity = logging.ERROR if r.failed else self.severity - - if sub_task: - return r - else: - self.results.insert(0, r) - return self.results + return r def run(self, task, dry_run=None, **kwargs): """ @@ -86,12 +98,8 @@ def grouped_tasks(task): if "severity" not in kwargs: kwargs["severity"] = self.severity - r = Task(task, **kwargs).start(self.host, self.brigade, dry_run, sub_task=True) - - if isinstance(r, MultiResult): - self.results.extend(r) - else: - self.results.append(r) + r = Task(task, **kwargs).start(self.host, self.brigade, dry_run) + self.results.append(r[0] if len(r) == 1 else r) return r From 382029fc114bf00ef092e99ec6a3e7a8e3706f40 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 31 Mar 2018 18:25:28 +0200 Subject: [PATCH 45/77] add support for nested subgroups and severity_levels --- brigade/plugins/functions/text/__init__.py | 53 ++++++++++++++-------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/brigade/plugins/functions/text/__init__.py b/brigade/plugins/functions/text/__init__.py index aacf5b1a..d2578ca4 100644 --- a/brigade/plugins/functions/text/__init__.py +++ b/brigade/plugins/functions/text/__init__.py @@ -17,6 +17,33 @@ def print_title(title): print("{}{}{}{}".format(Style.BRIGHT, Fore.GREEN, msg, "*" * (80 - len(msg)))) +def _get_color(result, failed): + if result.failed or failed: + color = Fore.RED + elif result.changed: + color = Fore.YELLOW + else: + color = Fore.GREEN + return color + + +def _print_individual_result(result, host, vars, failed, severity_level, task_group=False): + if result.severity < severity_level: + return + color = _get_color(result, failed) + subtitle = "" if result.changed is None else " ** changed : {} ".format(result.changed) + level_name = logging.getLevelName(result.severity) + symbol = "v" if task_group else "-" + msg = "{} {}{}".format(symbol * 4, result.name, subtitle) + print("{}{}{}{} {}".format(Style.BRIGHT, color, msg, symbol * (80 - len(msg)), level_name)) + for v in vars: + x = getattr(result, v, "") + if x and not isinstance(x, str): + pprint.pprint(x, indent=2) + elif x: + print(x) + + def print_result(result, host=None, vars=None, failed=None, severity_level=logging.INFO): """ Prints on screen the :obj:`brigade.core.task.Result` from a previous task @@ -50,25 +77,11 @@ def print_result(result, host=None, vars=None, failed=None, severity_level=loggi print("{}{}{}{}".format(Style.BRIGHT, Fore.BLUE, msg, "*" * (80 - len(msg)))) print_result(host_data, host, vars, failed, severity_level) elif isinstance(result, MultiResult): - for r in result: + _print_individual_result(result[0], host, vars, failed, severity_level, task_group=True) + for r in result[1:]: print_result(r, host, vars, failed, severity_level) - print() + color = _get_color(result[0], failed) + msg = "^^^^ END {} ".format(result[0].name) + print("{}{}{}{}".format(Style.BRIGHT, color, msg, "^" * (80 - len(msg)))) elif isinstance(result, Result): - if result.severity < severity_level: - return - if result.failed or failed: - color = Fore.RED - elif result.changed: - color = Fore.YELLOW - else: - color = Fore.GREEN - subtitle = "" if result.changed is None else " ** changed : {} ".format(result.changed) - level_name = logging.getLevelName(result.severity) - msg = "---- {}{}".format(result.name, subtitle) - print("{}{}{}{}- {}".format(Style.BRIGHT, color, msg, "-" * (80 - len(msg)), level_name)) - for v in vars: - x = getattr(result, v, "") - if x and not isinstance(x, str): - pprint.pprint(x, indent=2) - elif x: - print(x) + _print_individual_result(result, host, vars, failed, severity_level) From 97a97e3593ecf1294fa688139942db20a2958af0 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 31 Mar 2018 18:30:07 +0200 Subject: [PATCH 46/77] more cleaning --- brigade/core/task.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/brigade/core/task.py b/brigade/core/task.py index 0be6701d..0a9597b2 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -41,7 +41,7 @@ def __repr__(self): def start(self, host, brigade, dry_run): """ - This methods contains the logic to call the underlying function in the task. + Run the task for the given host. Arguments: host (:obj:`brigade.core.inventory.Host`): Host we are operating with. Populated right @@ -51,13 +51,8 @@ def start(self, host, brigade, dry_run): dry_run(bool): Populated right before calling the ``task`` Returns: - host (:obj:`brigade.core.task.MultiResult`): Results of the tasks ran + host (:obj:`brigade.core.task.MultiResult`): Results of the task and its subtasks """ - r = self._start(host, brigade, dry_run) - self.results.insert(0, r) - return self.results - - def _start(self, host, brigade, dry_run): self.host = host self.brigade = brigade self.dry_run = dry_run if dry_run is not None else brigade.dry_run @@ -74,7 +69,9 @@ def _start(self, host, brigade, dry_run): r = Result(host, exception=e, result=tb, failed=True) r.name = self.name r.severity = logging.ERROR if r.failed else self.severity - return r + + self.results.insert(0, r) + return self.results def run(self, task, dry_run=None, **kwargs): """ From 6281e88261e0df53841bbe84df352c4c1f690831 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Sun, 1 Apr 2018 10:22:32 +0200 Subject: [PATCH 47/77] Change repo links to brigade-automation --- docs/index.rst | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 3653c7c6..30e876e1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,7 +25,7 @@ How the documentation is structured - :doc:`How-to guides ` aim to solve a specific use case or answer key problems. These guides can be more advanced than the tutorial and can assume some knowledge about how Brigade and related technologies work. - :doc:`Reference guides ` contains the API reference for Brigade and describe the core functions and plugins. -Is something missing from the documentation? Please open an issue and `tell us what you are missing `_ or `open a pull request `_ and suggest an improvement. +Is something missing from the documentation? Please open an issue and `tell us what you are missing `_ or `open a pull request `_ and suggest an improvement. A first glance ============== diff --git a/setup.py b/setup.py index 2f383cf0..d1b9e44d 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ version=__version__, description="Fighting fire with fire", author=__author__, - url='https://github.com/napalm-automation/brigade', + url='https://github.com/brigade-automation/brigade', include_package_data=True, install_requires=reqs, packages=find_packages(exclude=("test*", )), From 368a3332cef1c035570da82f48b09208fa58b004 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 1 Apr 2018 10:30:20 +0200 Subject: [PATCH 48/77] Move dry_run logic to the task --- brigade/core/__init__.py | 23 +++++++++---------- brigade/core/task.py | 21 +++++++++-------- brigade/plugins/tasks/files/sftp.py | 14 ++++++----- brigade/plugins/tasks/files/write_file.py | 5 ++-- .../tasks/networking/napalm_configure.py | 7 ++++-- 5 files changed, 39 insertions(+), 31 deletions(-) diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index 44657d19..d57b74a9 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -157,18 +157,18 @@ def filter(self, **kwargs): b.inventory = self.inventory.filter(**kwargs) return b - def _run_serial(self, task, hosts, dry_run, **kwargs): + def _run_serial(self, task, hosts, **kwargs): result = AggregatedResult(kwargs.get("name") or task.__name__) for host in hosts: - result[host.name] = run_task(host, self, dry_run, Task(task, **kwargs)) + result[host.name] = run_task(host, self, Task(task, **kwargs)) return result - def _run_parallel(self, task, hosts, num_workers, dry_run, **kwargs): + def _run_parallel(self, task, hosts, num_workers, **kwargs): result = AggregatedResult(kwargs.get("name") or task.__name__) pool = Pool(processes=num_workers) result_pool = [pool.apply_async(run_task, - args=(h, self, dry_run, Task(task, **kwargs))) + args=(h, self, Task(task, **kwargs))) for h in hosts] pool.close() pool.join() @@ -178,7 +178,7 @@ def _run_parallel(self, task, hosts, num_workers, dry_run, **kwargs): result[r.host.name] = r return result - def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, on_good=True, + def run(self, task, num_workers=None, raise_on_error=None, on_good=True, on_failed=False, **kwargs): """ Run task over all the hosts in the inventory. @@ -187,7 +187,6 @@ def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, on_good task (``callable``): function or callable that will be run against each device in the inventory num_workers(``int``): Override for how many hosts to run in paralell for this task - dry_run(``bool``): Whether if we are testing the changes or not raise_on_error (``bool``): Override raise_on_error behavior on_good(``bool``): Whether to run or not this task on hosts marked as good on_failed(``bool``): Whether to run or not this task on hosts marked as failed @@ -212,14 +211,14 @@ def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, on_good if name in self.data.failed_hosts: run_on.append(host) - self.logger.info("Running task '{}' with num_workers: {}, dry_run: {}".format( - kwargs.get("name") or task.__name__, num_workers, dry_run)) + self.logger.info("Running task '{}' with num_workers: {}".format( + kwargs.get("name") or task.__name__, num_workers)) self.logger.debug(kwargs) if num_workers == 1: - result = self._run_serial(task, run_on, dry_run, **kwargs) + result = self._run_serial(task, run_on, **kwargs) else: - result = self._run_parallel(task, run_on, num_workers, dry_run, **kwargs) + result = self._run_parallel(task, run_on, num_workers, **kwargs) raise_on_error = raise_on_error if raise_on_error is not None else \ self.config.raise_on_error @@ -230,11 +229,11 @@ def run(self, task, num_workers=None, dry_run=None, raise_on_error=None, on_good return result -def run_task(host, brigade, dry_run, task): +def run_task(host, brigade, task): logger = logging.getLogger("brigade") try: logger.info("{}: {}: running task".format(host.name, task.name)) - r = task._start(host=host, brigade=brigade, dry_run=dry_run) + r = task._start(host=host, brigade=brigade) except Exception as e: tb = traceback.format_exc() logger.error("{}: {}".format(host, tb)) diff --git a/brigade/core/task.py b/brigade/core/task.py index b133c072..ddc806cd 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -23,7 +23,6 @@ class Task(object): before calling the ``task`` brigade(:obj:`brigade.core.Brigade`): Populated right before calling the ``task`` - dry_run(``bool``): Populated right before calling the ``task`` """ def __init__(self, task, name=None, **kwargs): @@ -31,15 +30,13 @@ def __init__(self, task, name=None, **kwargs): self.task = task self.params = kwargs self.results = MultiResult(self.name) - self.dry_run = None def __repr__(self): return self.name - def _start(self, host, brigade, dry_run, sub_task=False): + def _start(self, host, brigade, sub_task=False): self.host = host self.brigade = brigade - self.dry_run = dry_run if dry_run is not None else brigade.dry_run r = self.task(self, **self.params) or Result(host) r.name = self.name @@ -49,7 +46,7 @@ def _start(self, host, brigade, dry_run, sub_task=False): self.results.insert(0, r) return self.results - def run(self, task, dry_run=None, **kwargs): + def run(self, task, **kwargs): """ This is a utility method to call a task from within a task. For instance: @@ -66,10 +63,7 @@ def grouped_tasks(task): "You probably called this from outside a nested task") raise Exception(msg) - # we want the subtask to receive self.dry_run in the case it was overriden in the parent - dry_run = dry_run if dry_run is not None else self.dry_run - - r = Task(task, **kwargs)._start(self.host, self.brigade, dry_run, sub_task=True) + r = Task(task, **kwargs)._start(self.host, self.brigade, sub_task=True) if isinstance(r, MultiResult): self.results.extend(r) @@ -77,6 +71,15 @@ def grouped_tasks(task): self.results.append(r) return r + def is_dry_run(self, override=None): + """ + Returns whether current task is a dry_run or not. + + Arguments: + override (bool): Override for current task + """ + return override if override is not None else self.brigade.dry_run + class Result(object): """ diff --git a/brigade/plugins/tasks/files/sftp.py b/brigade/plugins/tasks/files/sftp.py index 4a51f39d..53c315ca 100644 --- a/brigade/plugins/tasks/files/sftp.py +++ b/brigade/plugins/tasks/files/sftp.py @@ -85,21 +85,21 @@ def compare_get_files(task, sftp_client, src, dst): return changed -def get(task, scp_client, sftp_client, src, dst, *args, **kwargs): +def get(task, scp_client, sftp_client, src, dst, dry_run, *args, **kwargs): changed = compare_get_files(task, sftp_client, src, dst) - if changed and not task.dry_run: + if changed and not dry_run: scp_client.get(src, dst, recursive=True) return changed -def put(task, scp_client, sftp_client, src, dst, *args, **kwargs): +def put(task, scp_client, sftp_client, src, dst, dry_run, *args, **kwargs): changed = compare_put_files(task, sftp_client, src, dst) - if changed and not task.dry_run: + if changed and not dry_run: scp_client.put(src, dst, recursive=True) return changed -def sftp(task, src, dst, action): +def sftp(task, src, dst, action, dry_run=None): """ Transfer files from/to the device using sftp protocol @@ -111,6 +111,7 @@ def sftp(task, src, dst, action): dst="/tmp/README.md") Arguments: + dry_run (bool): Whether to apply changes or not src (``str``): source file dst (``str``): destination action (``str``): ``put``, ``get``. @@ -122,6 +123,7 @@ def sftp(task, src, dst, action): """ src = format_string(src, task, **task.host) dst = format_string(dst, task, **task.host) + dry_run = task.is_dry_run(dry_run) actions = { "put": put, "get": get, @@ -129,5 +131,5 @@ def sftp(task, src, dst, action): client = task.host.get_connection("paramiko") scp_client = SCPClient(client.get_transport()) sftp_client = paramiko.SFTPClient.from_transport(client.get_transport()) - files_changed = actions[action](task, scp_client, sftp_client, src, dst) + files_changed = actions[action](task, scp_client, sftp_client, src, dst, dry_run) return Result(host=task.host, changed=bool(files_changed), files_changed=files_changed) diff --git a/brigade/plugins/tasks/files/write_file.py b/brigade/plugins/tasks/files/write_file.py index edb4da32..c8119bd6 100644 --- a/brigade/plugins/tasks/files/write_file.py +++ b/brigade/plugins/tasks/files/write_file.py @@ -25,11 +25,12 @@ def _generate_diff(filename, content, append): return "\n".join(diff) -def write_file(task, filename, content, append=False): +def write_file(task, filename, content, append=False, dry_run=None): """ Write contents to a file (locally) Arguments: + dry_run (bool): Whether to apply changes or not filename (``str``): file you want to write into conteint (``str``): content you want to write append (``bool``): whether you want to replace the contents or append to it @@ -40,7 +41,7 @@ def write_file(task, filename, content, append=False): """ diff = _generate_diff(filename, content, append) - if not task.dry_run: + if not task.is_dry_run(dry_run): mode = "a+" if append else "w+" with open(filename, mode=mode) as f: f.write(content) diff --git a/brigade/plugins/tasks/networking/napalm_configure.py b/brigade/plugins/tasks/networking/napalm_configure.py index 663c8404..eb09699a 100644 --- a/brigade/plugins/tasks/networking/napalm_configure.py +++ b/brigade/plugins/tasks/networking/napalm_configure.py @@ -2,12 +2,14 @@ from brigade.core.task import Result -def napalm_configure(task, filename=None, configuration=None, replace=False): +def napalm_configure(task, dry_run=None, filename=None, configuration=None, replace=False): """ Loads configuration into a network devices using napalm Arguments: + dry_run (bool): Whether to apply changes or not configuration (str): configuration to load into the device + filename (str): filename containing the configuration to load into the device replace (bool): whether to replace or merge the configuration Returns: @@ -24,7 +26,8 @@ def napalm_configure(task, filename=None, configuration=None, replace=False): device.load_merge_candidate(filename=filename, config=configuration) diff = device.compare_config() - if not task.dry_run and diff: + dry_run = task.is_dry_run(dry_run) + if not dry_run and diff: device.commit_config() else: device.discard_config() From 7cfee6b8f047ad2caa48a6c895e20d95b1956970 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Sun, 1 Apr 2018 20:07:55 +0200 Subject: [PATCH 49/77] Rename TestInventory to StringInventory Pytest is raising a warning because the name of the Inventory class within the tests. This fix renames the class to remove the warning: ========= warnings summary =========================== tests/core/test_InitBrigade.py::TestInventory cannot collect test class 'TestInventory' because it has a __init__ constructor -- Docs: http://doc.pytest.org/en/latest/warnings.html ============== 78 passed, 92 skipped, 1 warnings in 65.69 seconds ==== --- tests/core/test_InitBrigade.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/core/test_InitBrigade.py b/tests/core/test_InitBrigade.py index daa33317..eb47b3aa 100644 --- a/tests/core/test_InitBrigade.py +++ b/tests/core/test_InitBrigade.py @@ -1,6 +1,7 @@ import os - from builtins import super + + from brigade.core import InitBrigade from brigade.core.inventory import Inventory @@ -12,7 +13,7 @@ def transform_func(host): host.processed_by_transform_function = True -class TestInventory(Inventory): +class StringInventory(Inventory): def __init__(self, *args, **kwargs): hosts = {"host1": {}, "host2": {}} @@ -62,15 +63,15 @@ def test_InitBrigade_combined(self): def test_InitBrigade_different_inventory_by_string(self): brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), - inventory="tests.core.test_InitBrigade.TestInventory", + inventory="tests.core.test_InitBrigade.StringInventory", ) - assert isinstance(brg.inventory, TestInventory) + assert isinstance(brg.inventory, StringInventory) def test_InitBrigade_different_inventory_imported(self): brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), - inventory=TestInventory, + inventory=StringInventory, ) - assert isinstance(brg.inventory, TestInventory) + assert isinstance(brg.inventory, StringInventory) def test_InitBrigade_different_transform_function_by_string(self): brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), From 5492dcabbe74c9fa79e66cd3f9f400711f72bd5e Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Mon, 2 Apr 2018 10:55:32 +0200 Subject: [PATCH 50/77] Add README file for the first version --- README.md | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 72344946..6f38b788 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,37 @@ +[![Build Status](https://travis-ci.org/brigade-automation/brigade.svg?branch=master)](https://travis-ci.org/brigade-automation/brigade) + + Brigade ======= +Brigade is a pure Python automation framework intented to be used directly from Python. While most automation frameworks use their own DSL which you use to describe what you want to have done, Brigade lets you control everything from Python. + +One of the benefits we want to highlight with this approach is the ease of troubleshooting, if something goes wrong you can just use your existing debug tools directly from Python (just add a line of `import pdb` & `pdb.set_trace()` and you're good to go). Doing the same using a DSL can be quite time consuming. + +What Brigade brings to the table is that it takes care of dealing with your inventory and manages the job of dispatching the tasks you want to run against your nodes and devices. The framework provides a very simple way to write plugins if you aren't happy with the ones we ship. Of course if you have written a plugin you think can be useful to others, please send us your code and test cases as a [pull request](https://github.com/brigade-automation/brigade/pulls). + + +Install +======= + +While Brigade still supports Python 2.7 the recommended version is 3.6. Install it with pip. + +``` +pip install brigade +``` + +Documentation +============= + +Read the [Brigade documentation](https://brigade.readthedocs.io/en/latest/) online or review it's [code here](https://github.com/brigade-automation/brigade/tree/develop/docs) + + +Bugs & New features +=================== + +If you think you have bug or would like to request a new feature, please register a GitHub account and [open an issue](https://github.com/brigade-automation/brigade/issues). + + +Contact +======= -See [docs](https://brigade.readthedocs.io). +Slack is probably the easiest way to get help with Brigade. You can find us in the `brigade` channel on the [networktoCode()](https://networktocode.herokuapp.com/) team. \ No newline at end of file From 090b00f1bef81f7ff94e7c72d0caf2707d493280 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Mon, 2 Apr 2018 11:43:37 +0200 Subject: [PATCH 51/77] Use Python 3.6 as default in the tutorial. --- docs/tutorials/intro/install.rst | 34 +++++++------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/docs/tutorials/intro/install.rst b/docs/tutorials/intro/install.rst index 7d1b042d..c2586301 100644 --- a/docs/tutorials/intro/install.rst +++ b/docs/tutorials/intro/install.rst @@ -13,42 +13,22 @@ Brigade is published to `PyPI `_ and can be i pip --version - pip 1.5.4 from /home/vagrant/brigade/local/lib/python2.7/site-packages (python 2.7) + pip 9.0.3 from /Users/patrick/brigade/lib/python3.6/site-packages (python 3.6) -It could be that you need to use the pip3 binary instead of pip as pip3 is for Python 3 on some systems. +It could be that you need to use the pip3 binary instead of pip as pip3 is for Python 3 on some systems. Speaking of Python 3, this tutorial is written with Python 3.6 in mind. This has mostly to do with the use of f-strings, you should however be able to follow along even if you are still at Python 2.7. However, if you are starting something new don't use Python 2.7. If you have to make sure that you're pip is up to date as you might have trouble installing some of the Brigade dependencies if you have a very old pip if you are on version 9.0 or later you should be find. -So above we can see that we have pip installed. However the version 1.5.4 is pretty old. To save ourselves from trouble when installing packages we start by upgrading pip. - -.. code-block:: bash - - pip install "pip>=9.0.1" - - pip --version - - pip 9.0.1 from /home/vagrant/brigade/local/lib/python2.7/site-packages (python 2.7) - -That's more like it! The next step is to install Brigade. +As you would assume, the installation is then very easy. .. code-block:: bash pip install brigade Collecting brigade + Collecting colorama (from brigade) [...] - Successfully installed MarkupSafe-1.0 - asn1crypto-0.23.0 bcrypt-3.1.4 brigade-0.0.5 - certifi-2017.11.5 cffi-1.11.2 chardet-3.0.4 - cryptography-2.1.4 enum34-1.1.6 future-0.16.0 - idna-2.6 ipaddress-1.0.18 jinja2-2.10 - jtextfsm-0.3.1 junos-eznc-2.1.7 lxml-4.1.1 - napalm-2.2.0 ncclient-0.5.3 netaddr-0.7.19 - netmiko-1.4.3 paramiko-2.4.0 pyIOSXR-0.52 - pyasn1-0.4.2 pycparser-2.18 pyeapi-0.8.1 - pynacl-1.2.1 pynxos-0.0.3 pyserial-3.4 - pyyaml-3.12 requests-2.18.4 scp-0.10.2 - six-1.11.0 urllib3-1.22 - -Please note that the above output has been abbreviated for readability. Your output will probably be longer. You should see that `brigade` is successfully installed. + Successfully installed MarkupSafe-1.0 asn1crypto-0.24.0 bcrypt-3.1.4 brigade-0.0.6 + +Please note that the above output has been abbreviated for readability. Your output will be quite a bit longer. You should see that `brigade` is successfully installed. Now we can verify that Brigade is installed and that you are able to import the package from Python. From 962fdaeceea8aa70c8decbb1b29f475fa52db693 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Tue, 3 Apr 2018 09:33:27 +0200 Subject: [PATCH 52/77] update docstrings --- brigade/core/task.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/brigade/core/task.py b/brigade/core/task.py index 207648fa..02442ab1 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -14,6 +14,7 @@ class Task(object): Arguments: task (callable): function or callable we will be calling name (``string``): name of task, defaults to ``task.__name__`` + severity (logging.LEVEL): Severity level associated to the task **kwargs: Parameters that will be passed to the ``task`` Attributes: @@ -25,6 +26,7 @@ class Task(object): before calling the ``task`` brigade(:obj:`brigade.core.Brigade`): Populated right before calling the ``task`` + severity (logging.LEVEL): Severity level associated to the task """ def __init__(self, task, name=None, severity=logging.INFO, **kwargs): @@ -112,6 +114,7 @@ class Result(object): result (obj): Result of the task execution, see task's documentation for details host (:obj:`brigade.core.inventory.Host`): Reference to the host that lead ot this result failed (bool): Whether the execution failed or not + severity (logging.LEVEL): Severity level associated to the result of the excecution exception (Exception): uncaught exception thrown during the exection of the task (if any) Attributes: @@ -120,6 +123,7 @@ class Result(object): result (obj): Result of the task execution, see task's documentation for details host (:obj:`brigade.core.inventory.Host`): Reference to the host that lead ot this result failed (bool): Whether the execution failed or not + severity (logging.LEVEL): Severity level associated to the result of the excecution exception (Exception): uncaught exception thrown during the exection of the task (if any) """ From 6fc05c981ce796c3ca8e0ccd9f518054ccb0a849 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Tue, 3 Apr 2018 10:09:47 +0200 Subject: [PATCH 53/77] add clarification on raise_for_status --- brigade/plugins/tasks/apis/http_method.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/brigade/plugins/tasks/apis/http_method.py b/brigade/plugins/tasks/apis/http_method.py index fab2d22a..55e9fd3e 100644 --- a/brigade/plugins/tasks/apis/http_method.py +++ b/brigade/plugins/tasks/apis/http_method.py @@ -13,7 +13,8 @@ def http_method(task=None, method="get", url="", raise_for_status=True, **kwargs url (string): URL to connect to raise_for_status (bool): Whether to call `raise_for_status `_ - method automatically or not + method automatically or not. For quick reference, raise_for_status will consider an + error if the return code is any of 4xx or 5xx **kwargs: Keyword arguments will be passed to the `request `_ method From 39b852654dc60404b18e0ffa3a85f683b7315c86 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Tue, 3 Apr 2018 14:03:10 +0200 Subject: [PATCH 54/77] Move test file out from root of repo (#103) * Move test file out from root of repo * Use consistent path convention --- .../plugins/tasks/networking/data/test_file.txt | 0 .../plugins/tasks/networking/test_netmiko_file_transfer.py | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) rename test_file.txt => tests/plugins/tasks/networking/data/test_file.txt (100%) diff --git a/test_file.txt b/tests/plugins/tasks/networking/data/test_file.txt similarity index 100% rename from test_file.txt rename to tests/plugins/tasks/networking/data/test_file.txt diff --git a/tests/plugins/tasks/networking/test_netmiko_file_transfer.py b/tests/plugins/tasks/networking/test_netmiko_file_transfer.py index 6d38551e..874ff53c 100644 --- a/tests/plugins/tasks/networking/test_netmiko_file_transfer.py +++ b/tests/plugins/tasks/networking/test_netmiko_file_transfer.py @@ -1,9 +1,13 @@ +import os + from brigade.plugins.tasks import networking +THIS_DIR = os.path.dirname(os.path.realpath(__file__)) + class Test(object): def test_netmiko_file_transfer(self, brigade): - source_file = 'test_file.txt' + source_file = os.path.join(THIS_DIR, 'data', 'test_file.txt') dest_file = 'test_file.txt' result = brigade.filter(name="dev4.group_2").run(networking.netmiko_file_transfer, source_file=source_file, From 502985e5be5e68adca8d168401d072041208df07 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Tue, 3 Apr 2018 16:53:43 +0200 Subject: [PATCH 55/77] Use "ambv/black" code formatter to end all discussions about style (#108) * integrate black; The Uncompromising Code Formatter * reformat with black * disable pylama from tests --- .flake8 | 8 + .travis.yml | 1 + README.md | 4 +- brigade/__init__.py | 2 +- brigade/core/__init__.py | 69 +++++---- brigade/core/configuration.py | 131 ++++++++-------- brigade/core/exceptions.py | 1 + brigade/core/helpers/__init__.py | 3 +- brigade/core/helpers/jinja_helper.py | 9 +- brigade/core/inventory.py | 32 +++- brigade/core/task.py | 26 +++- brigade/plugins/functions/text/__init__.py | 32 +++- brigade/plugins/inventory/nsot.py | 51 +++--- brigade/plugins/inventory/simple.py | 1 + brigade/plugins/tasks/apis/__init__.py | 4 +- brigade/plugins/tasks/commands/__init__.py | 5 +- brigade/plugins/tasks/commands/command.py | 10 +- brigade/plugins/tasks/connections/__init__.py | 6 +- .../tasks/connections/netmiko_connection.py | 14 +- .../tasks/connections/paramiko_connection.py | 10 +- brigade/plugins/tasks/data/__init__.py | 5 +- brigade/plugins/tasks/data/load_json.py | 2 +- brigade/plugins/tasks/data/load_yaml.py | 2 +- brigade/plugins/tasks/files/__init__.py | 5 +- brigade/plugins/tasks/files/sftp.py | 24 +-- brigade/plugins/tasks/files/write_file.py | 1 + .../tasks/networking/napalm_configure.py | 8 +- .../tasks/networking/napalm_validate.py | 4 +- .../tasks/networking/netmiko_file_transfer.py | 16 +- .../tasks/networking/netmiko_send_config.py | 1 + brigade/plugins/tasks/networking/tcp_ping.py | 1 + brigade/plugins/tasks/text/__init__.py | 5 +- brigade/plugins/tasks/text/template_file.py | 5 +- brigade/plugins/tasks/text/template_string.py | 3 +- docs/conf.py | 65 ++++---- examples/1_simple_runbooks/backup.py | 38 ++--- examples/1_simple_runbooks/configure.py | 77 ++++++---- examples/1_simple_runbooks/get_facts.py | 18 +-- examples/1_simple_runbooks/rollback.py | 35 +++-- examples/1_simple_runbooks/validate.py | 59 ++++--- examples/2_simple_tooling/backup.py | 51 +++--- examples/2_simple_tooling/configure.py | 88 ++++++----- examples/2_simple_tooling/get_facts.py | 25 ++- examples/2_simple_tooling/rollback.py | 43 +++--- examples/2_simple_tooling/validate.py | 62 ++++---- examples/3_advanced_tooling/mate.py | 6 +- examples/3_advanced_tooling/tasks/backup.py | 20 ++- .../3_advanced_tooling/tasks/configure.py | 59 +++---- .../3_advanced_tooling/tasks/get_facts.py | 14 +- examples/3_advanced_tooling/tasks/validate.py | 46 +++--- examples/highlighter.py | 4 +- setup.cfg | 2 +- setup.py | 47 +++--- tests/conftest.py | 24 ++- tests/core/test_InitBrigade.py | 48 +++--- tests/core/test_configuration.py | 41 +++-- tests/core/test_inventory.py | 145 +++++++++++++----- tests/core/test_multithreading.py | 4 +- tests/core/test_tasks.py | 24 ++- tests/plugins/inventory/test_nsot.py | 9 +- tests/plugins/tasks/apis/test_http_method.py | 5 +- tests/plugins/tasks/commands/test_command.py | 9 +- .../tasks/commands/test_remote_command.py | 6 +- tests/plugins/tasks/data/test_load_json.py | 23 ++- tests/plugins/tasks/data/test_load_yaml.py | 23 ++- tests/plugins/tasks/files/test_sftp.py | 108 ++++++------- tests/plugins/tasks/files/test_write_file.py | 47 ++---- .../tasks/networking/test_napalm_cli.py | 31 ++-- .../tasks/networking/test_napalm_configure.py | 12 +- .../tasks/networking/test_napalm_get.py | 8 +- .../tasks/networking/test_napalm_validate.py | 17 +- .../networking/test_netmiko_file_transfer.py | 15 +- .../networking/test_netmiko_send_command.py | 16 +- .../networking/test_netmiko_send_config.py | 10 +- .../plugins/tasks/networking/test_tcp_ping.py | 10 +- .../plugins/tasks/text/test_template_file.py | 18 +-- .../tasks/text/test_template_string.py | 26 ++-- 77 files changed, 1044 insertions(+), 895 deletions(-) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..58383906 --- /dev/null +++ b/.flake8 @@ -0,0 +1,8 @@ +# This is an example .flake8 config, used when developing *Black* itself. +# Keep in sync with setup.cfg which is used for source packages. + +[flake8] +ignore = E266, E501, W503 +max-line-length = 80 +max-complexity = 15 +select = B,C,E,F,W,T4,B9 diff --git a/.travis.yml b/.travis.yml index 4c2dfcd8..792ea1b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ install: - pip install coveralls script: + - if [ $TRAVIS_PYTHON_VERSION == "3.6" ]; then pip install black && black --check . 2>&1 | grep reformatted; test $? -eq 1; fi - tox deploy: diff --git a/README.md b/README.md index 6f38b788..76ed025f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/brigade-automation/brigade.svg?branch=master)](https://travis-ci.org/brigade-automation/brigade) +[![Build Status](https://travis-ci.org/brigade-automation/brigade.svg?branch=master)](https://travis-ci.org/brigade-automation/brigade) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) Brigade @@ -34,4 +34,4 @@ If you think you have bug or would like to request a new feature, please registe Contact ======= -Slack is probably the easiest way to get help with Brigade. You can find us in the `brigade` channel on the [networktoCode()](https://networktocode.herokuapp.com/) team. \ No newline at end of file +Slack is probably the easiest way to get help with Brigade. You can find us in the `brigade` channel on the [networktoCode()](https://networktocode.herokuapp.com/) team. diff --git a/brigade/__init__.py b/brigade/__init__.py index 4e5de560..7adb471d 100644 --- a/brigade/__init__.py +++ b/brigade/__init__.py @@ -1,6 +1,6 @@ import pkg_resources try: - __version__ = pkg_resources.get_distribution('brigade').version + __version__ = pkg_resources.get_distribution("brigade").version except pkg_resources.DistributionNotFound: __version__ = "Not installed" diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index 26cd542b..b15a5043 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -14,6 +14,7 @@ # multithreading requires objects passed around to be pickable # following methods allow py2 to know how to pickle methods + def _pickle_method(method): func_name = method.im_func.__name__ obj = method.im_self @@ -28,6 +29,7 @@ def _unpickle_method(func_name, obj, cls): pass else: break + return func.__get__(obj, cls) copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method) @@ -76,8 +78,16 @@ class Brigade(object): available_connections (``dict``): dict of connection types are available """ - def __init__(self, inventory, dry_run, config=None, config_file=None, - available_connections=None, logger=None, data=None): + def __init__( + self, + inventory, + dry_run, + config=None, + config_file=None, + available_connections=None, + logger=None, + data=None, + ): self.logger = logger or logging.getLogger("brigade") self.data = data or Data() @@ -101,22 +111,19 @@ def configure_logging(self): dictConfig = self.config.logging_dictConfig or { "version": 1, "disable_existing_loggers": False, - "formatters": { - "simple": {"format": self.config.logging_format} - }, + "formatters": {"simple": {"format": self.config.logging_format}}, "handlers": {}, "loggers": {}, "root": { - "level": "CRITICAL" if self.config.logging_loggers else - self.config.logging_level.upper(), + "level": "CRITICAL" if self.config.logging_loggers else self.config.logging_level.upper(), "handlers": [], "formatter": "simple", - } + }, } handlers_list = [] if self.config.logging_file: - dictConfig["root"]["handlers"].append('info_file_handler') - handlers_list.append('info_file_handler') + dictConfig["root"]["handlers"].append("info_file_handler") + handlers_list.append("info_file_handler") dictConfig["handlers"]["info_file_handler"] = { "class": "logging.handlers.RotatingFileHandler", "level": "NOTSET", @@ -124,11 +131,11 @@ def configure_logging(self): "filename": self.config.logging_file, "maxBytes": 10485760, "backupCount": 20, - "encoding": "utf8" + "encoding": "utf8", } if self.config.logging_to_console: - dictConfig["root"]["handlers"].append('info_console') - handlers_list.append('info_console') + dictConfig["root"]["handlers"].append("info_console") + handlers_list.append("info_console") dictConfig["handlers"]["info_console"] = { "class": "logging.StreamHandler", "level": "NOTSET", @@ -138,8 +145,7 @@ def configure_logging(self): for logger in self.config.logging_loggers: dictConfig["loggers"][logger] = { - "level": self.config.logging_level.upper(), - "handlers": handlers_list, + "level": self.config.logging_level.upper(), "handlers": handlers_list } if dictConfig["root"]["handlers"]: @@ -166,9 +172,9 @@ def _run_parallel(self, task, hosts, num_workers, **kwargs): result = AggregatedResult(kwargs.get("name") or task.__name__) pool = Pool(processes=num_workers) - result_pool = [pool.apply_async(Task(task, **kwargs).start, - args=(h, self)) - for h in hosts] + result_pool = [ + pool.apply_async(Task(task, **kwargs).start, args=(h, self)) for h in hosts + ] pool.close() pool.join() @@ -177,8 +183,15 @@ def _run_parallel(self, task, hosts, num_workers, **kwargs): result[r.host.name] = r return result - def run(self, task, num_workers=None, raise_on_error=None, on_good=True, - on_failed=False, **kwargs): + def run( + self, + task, + num_workers=None, + raise_on_error=None, + on_good=True, + on_failed=False, + **kwargs + ): """ Run task over all the hosts in the inventory. @@ -210,8 +223,11 @@ def run(self, task, num_workers=None, raise_on_error=None, on_good=True, if name in self.data.failed_hosts: run_on.append(host) - self.logger.info("Running task '{}' with num_workers: {}".format( - kwargs.get("name") or task.__name__, num_workers)) + self.logger.info( + "Running task '{}' with num_workers: {}".format( + kwargs.get("name") or task.__name__, num_workers + ) + ) self.logger.debug(kwargs) if num_workers == 1: @@ -219,8 +235,7 @@ def run(self, task, num_workers=None, raise_on_error=None, on_good=True, else: result = self._run_parallel(task, run_on, num_workers, **kwargs) - raise_on_error = raise_on_error if raise_on_error is not None else \ - self.config.raise_on_error + raise_on_error = raise_on_error if raise_on_error is not None else self.config.raise_on_error if raise_on_error: result.raise_on_error() else: @@ -246,8 +261,4 @@ def InitBrigade(config_file="", dry_run=False, **kwargs): transform_function = conf.transform_function inv = inv_class(transform_function=transform_function, **inv_args) - return Brigade( - inventory=inv, - dry_run=dry_run, - config=conf, - ) + return Brigade(inventory=inv, dry_run=dry_run, config=conf) diff --git a/brigade/core/configuration.py b/brigade/core/configuration.py index cecc550c..440ac2c3 100644 --- a/brigade/core/configuration.py +++ b/brigade/core/configuration.py @@ -6,75 +6,70 @@ CONF = { - 'inventory': { - 'description': 'Path to inventory modules.', - 'type': 'str', - 'default': 'brigade.plugins.inventory.simple.SimpleInventory', + "inventory": { + "description": "Path to inventory modules.", + "type": "str", + "default": "brigade.plugins.inventory.simple.SimpleInventory", }, - 'transform_function': { - 'description': 'Path to transform function.', - 'type': 'str', - 'default': {} + "transform_function": { + "description": "Path to transform function.", "type": "str", "default": {} }, - 'num_workers': { - 'description': 'Number of Brigade worker processes that are run at the same time, ' - 'configuration can be overridden on individual tasks by using the ' - '`num_workers` argument to (:obj:`brigade.core.Brigade.run`)', - 'type': 'int', - 'default': 20, + "num_workers": { + "description": "Number of Brigade worker processes that are run at the same time, " + "configuration can be overridden on individual tasks by using the " + "`num_workers` argument to (:obj:`brigade.core.Brigade.run`)", + "type": "int", + "default": 20, }, - 'raise_on_error': { - 'description': "If set to ``True``, (:obj:`brigade.core.Brigade.run`) method of will raise " - "an exception if at least a host failed.", - 'type': 'bool', - 'default': False, + "raise_on_error": { + "description": "If set to ``True``, (:obj:`brigade.core.Brigade.run`) method of will raise " + "an exception if at least a host failed.", + "type": "bool", + "default": False, }, - 'ssh_config_file': { - 'description': 'User ssh_config_file', - 'type': 'str', - 'default': os.path.join(os.path.expanduser("~"), ".ssh", "config"), - 'default_doc': '~/.ssh/config' + "ssh_config_file": { + "description": "User ssh_config_file", + "type": "str", + "default": os.path.join(os.path.expanduser("~"), ".ssh", "config"), + "default_doc": "~/.ssh/config", }, - 'logging_dictConfig': { - 'description': 'Configuration dictionary schema supported by the logging subsystem. ' - 'Overrides rest of logging_* parameters.', - 'type': 'dict', - 'default': {}, + "logging_dictConfig": { + "description": "Configuration dictionary schema supported by the logging subsystem. " + "Overrides rest of logging_* parameters.", + "type": "dict", + "default": {}, }, - 'logging_level': { - 'description': 'Logging level. Can be any supported level by the logging subsystem', - 'type': 'str', - 'default': 'debug', + "logging_level": { + "description": "Logging level. Can be any supported level by the logging subsystem", + "type": "str", + "default": "debug", }, - 'logging_file': { - 'description': 'Logging file. Empty string disables logging to file.', - 'type': 'str', - 'default': 'brigade.log', + "logging_file": { + "description": "Logging file. Empty string disables logging to file.", + "type": "str", + "default": "brigade.log", }, - 'logging_format': { - 'description': 'Logging format', - 'type': 'str', - 'default': "%(asctime)s - %(name)12s - %(levelname)8s - %(funcName)10s() - %(message)s", + "logging_format": { + "description": "Logging format", + "type": "str", + "default": "%(asctime)s - %(name)12s - %(levelname)8s - %(funcName)10s() - %(message)s", }, - 'logging_to_console': { - 'description': 'Whether to log to stdout or not.', - 'type': 'bool', - 'default': False, + "logging_to_console": { + "description": "Whether to log to stdout or not.", + "type": "bool", + "default": False, + }, + "logging_loggers": { + "description": "List of loggers to configure. This allows you to enable logging for " + "multiple loggers. For instance, you could enable logging for both brigade " + "and paramiko or just for paramiko. An empty list will enable logging for " + "all loggers.", + "type": "list", + "default": ["brigade"], }, - 'logging_loggers': { - 'description': 'List of loggers to configure. This allows you to enable logging for ' - 'multiple loggers. For instance, you could enable logging for both brigade ' - 'and paramiko or just for paramiko. An empty list will enable logging for ' - 'all loggers.', - 'type': 'list', - 'default': ["brigade"], - } } -types = { - 'int': int, - 'str': str, -} +types = {"int": int, "str": str} class Config: @@ -87,7 +82,7 @@ class Config: def __init__(self, config_file=None, **kwargs): if config_file: - with open(config_file, 'r') as f: + with open(config_file, "r") as f: data = yaml.load(f.read()) or {} else: data = {} @@ -102,32 +97,35 @@ def __init__(self, config_file=None, **kwargs): for k, v in kwargs.items(): setattr(self, k, v) - inventory = self._resolve_import_from_string(kwargs.get("inventory", self.inventory)) + inventory = self._resolve_import_from_string( + kwargs.get("inventory", self.inventory) + ) self.inventory = inventory - transform_function = self._resolve_import_from_string(kwargs.get("transform_function", - self.transform_function, - )) + transform_function = self._resolve_import_from_string( + kwargs.get("transform_function", self.transform_function) + ) self.transform_function = transform_function def string_to_bool(self, v): if v.lower() in ["false", "no", "n", "off", "0"]: return False + else: return True def _assign_property(self, parameter, param_conf, data): v = None - if param_conf['type'] in ('bool', 'int', 'str'): - env = param_conf.get('env') or 'BRIGADE_' + parameter.upper() + if param_conf["type"] in ("bool", "int", "str"): + env = param_conf.get("env") or "BRIGADE_" + parameter.upper() v = os.environ.get(env) if v is None: v = data.get(parameter, param_conf["default"]) else: - if param_conf['type'] == 'bool': + if param_conf["type"] == "bool": v = self.string_to_bool(v) else: - v = types[param_conf['type']](v) + v = types[param_conf["type"]](v) setattr(self, parameter, v) def get(self, parameter, env=None, default=None, parameter_type="str", root=""): @@ -164,6 +162,7 @@ def _resolve_import_from_string(self, import_path): """ if not import_path or callable(import_path): return import_path + module_name = ".".join(import_path.split(".")[:-1]) obj_name = import_path.split(".")[-1] module = importlib.import_module(module_name) diff --git a/brigade/core/exceptions.py b/brigade/core/exceptions.py index 1a6f0000..a07e5d85 100644 --- a/brigade/core/exceptions.py +++ b/brigade/core/exceptions.py @@ -30,6 +30,7 @@ class BrigadeExecutionError(Exception): Attributes: result (:obj:`brigade.core.task.AggregatedResult`): """ + def __init__(self, result): self.result = result diff --git a/brigade/core/helpers/__init__.py b/brigade/core/helpers/__init__.py index 67514857..4cca086d 100644 --- a/brigade/core/helpers/__init__.py +++ b/brigade/core/helpers/__init__.py @@ -8,5 +8,4 @@ def merge_two_dicts(x, y): def format_string(text, task, **kwargs): - return text.format(host=task.host, - **merge_two_dicts(task.host.items(), kwargs)) + return text.format(host=task.host, **merge_two_dicts(task.host.items(), kwargs)) diff --git a/brigade/core/helpers/jinja_helper.py b/brigade/core/helpers/jinja_helper.py index c584066d..8993aa49 100644 --- a/brigade/core/helpers/jinja_helper.py +++ b/brigade/core/helpers/jinja_helper.py @@ -2,16 +2,15 @@ def render_from_file(path, template, **kwargs): - env = Environment(loader=FileSystemLoader(path), - undefined=StrictUndefined, - trim_blocks=True) + env = Environment( + loader=FileSystemLoader(path), undefined=StrictUndefined, trim_blocks=True + ) # env.filters.update(jinja_filters.filters()) template = env.get_template(template) return template.render(**kwargs) def render_from_string(template, **kwargs): - env = Environment(undefined=StrictUndefined, - trim_blocks=True) + env = Environment(undefined=StrictUndefined, trim_blocks=True) template = env.from_string(template) return template.render(**kwargs) diff --git a/brigade/core/inventory.py b/brigade/core/inventory.py index 04afb1ec..fcfcf227 100644 --- a/brigade/core/inventory.py +++ b/brigade/core/inventory.py @@ -111,19 +111,23 @@ def has_parent_group(self, group): for g in self.groups: if g is group or g.has_parent_group(group): return True + return False def __getitem__(self, item): try: return self.data[item] + except KeyError: for g in self.groups: r = g.get(item) if r: return r + r = self.defaults.get(item) if r: return r + raise def __setitem__(self, item, value): @@ -151,6 +155,7 @@ def get(self, item, default=None): """ try: return self.__getitem__(item) + except KeyError: return default @@ -227,8 +232,10 @@ def get_connection(self, connection): try: conn_task = self.brigade.available_connections[connection] except KeyError: - raise AttributeError("not sure how to establish a connection for {}".format( - connection)) + raise AttributeError( + "not sure how to establish a connection for {}".format(connection) + ) + # We use `filter(name=self.name)` to call the connection task for only # the given host. We also have to set `num_workers=1` because chances are # we are already inside a thread @@ -236,6 +243,7 @@ def get_connection(self, connection): r = self.brigade.filter(name=self.name).run(conn_task, num_workers=1) if r[self.name].exception: raise r[self.name].exception + return self.connections[connection] @@ -243,7 +251,11 @@ class Group(Host): """Same as :obj:`Host`""" def children(self): - return {n: h for n, h in self.brigade.inventory.hosts.items() if h.has_parent_group(self)} + return { + n: h + for n, h in self.brigade.inventory.hosts.items() + if h.has_parent_group(self) + } class Inventory(object): @@ -264,7 +276,9 @@ class Inventory(object): groups (dict): keys are group names and the values are :obj:`Group`. """ - def __init__(self, hosts, groups=None, defaults=None, transform_function=None, brigade=None): + def __init__( + self, hosts, groups=None, defaults=None, transform_function=None, brigade=None + ): self._brigade = brigade self.defaults = defaults or {} @@ -322,11 +336,13 @@ def filter(self, filter_func=None, **kwargs): device. If the call returns ``True`` the device will be kept in the inventory """ if filter_func: - filtered = {n: h for n, h in self.hosts.items() - if filter_func(h, **kwargs)} + filtered = {n: h for n, h in self.hosts.items() if filter_func(h, **kwargs)} else: - filtered = {n: h for n, h in self.hosts.items() - if all(h.get(k) == v for k, v in kwargs.items())} + filtered = { + n: h + for n, h in self.hosts.items() + if all(h.get(k) == v for k, v in kwargs.items()) + } return Inventory(hosts=filtered, groups=self.groups, brigade=self.brigade) def __len__(self): diff --git a/brigade/core/task.py b/brigade/core/task.py index 02442ab1..d802a722 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -84,8 +84,10 @@ def grouped_tasks(task): This method will ensure the subtask is run only for the host in the current thread. """ if not self.host or not self.brigade: - msg = ("You have to call this after setting host and brigade attributes. ", - "You probably called this from outside a nested task") + msg = ( + "You have to call this after setting host and brigade attributes. ", + "You probably called this from outside a nested task", + ) raise Exception(msg) if "severity" not in kwargs: @@ -127,8 +129,17 @@ class Result(object): exception (Exception): uncaught exception thrown during the exection of the task (if any) """ - def __init__(self, host, result=None, changed=False, diff="", failed=False, exception=None, - severity=logging.INFO, **kwargs): + def __init__( + self, + host, + result=None, + changed=False, + diff="", + failed=False, + exception=None, + severity=logging.INFO, + **kwargs + ): self.result = result self.host = host self.changed = changed @@ -147,6 +158,7 @@ def __repr__(self): def __str__(self): if self.exception: return str(self.exception) + else: return str(self.result) @@ -156,12 +168,15 @@ class AggregatedResult(dict): It basically is a dict-like object that aggregates the results for all devices. You can access each individual result by doing ``my_aggr_result["hostname_of_device"]``. """ + def __init__(self, name, **kwargs): self.name = name super().__init__(**kwargs) def __repr__(self): - return '{} ({}): {}'.format(self.__class__.__name__, self.name, super().__repr__()) + return "{} ({}): {}".format( + self.__class__.__name__, self.name, super().__repr__() + ) @property def failed(self): @@ -187,6 +202,7 @@ class MultiResult(list): It is basically is a list-like object that gives you access to the results of all subtasks for a particular device/task. """ + def __init__(self, name): self.name = name diff --git a/brigade/plugins/functions/text/__init__.py b/brigade/plugins/functions/text/__init__.py index d2578ca4..34ecb9fa 100644 --- a/brigade/plugins/functions/text/__init__.py +++ b/brigade/plugins/functions/text/__init__.py @@ -27,15 +27,24 @@ def _get_color(result, failed): return color -def _print_individual_result(result, host, vars, failed, severity_level, task_group=False): +def _print_individual_result( + result, host, vars, failed, severity_level, task_group=False +): if result.severity < severity_level: return + color = _get_color(result, failed) - subtitle = "" if result.changed is None else " ** changed : {} ".format(result.changed) + subtitle = "" if result.changed is None else " ** changed : {} ".format( + result.changed + ) level_name = logging.getLevelName(result.severity) symbol = "v" if task_group else "-" msg = "{} {}{}".format(symbol * 4, result.name, subtitle) - print("{}{}{}{} {}".format(Style.BRIGHT, color, msg, symbol * (80 - len(msg)), level_name)) + print( + "{}{}{}{} {}".format( + Style.BRIGHT, color, msg, symbol * (80 - len(msg)), level_name + ) + ) for v in vars: x = getattr(result, v, "") if x and not isinstance(x, str): @@ -44,7 +53,9 @@ def _print_individual_result(result, host, vars, failed, severity_level, task_gr print(x) -def print_result(result, host=None, vars=None, failed=None, severity_level=logging.INFO): +def print_result( + result, host=None, vars=None, failed=None, severity_level=logging.INFO +): """ Prints on screen the :obj:`brigade.core.task.Result` from a previous task @@ -71,13 +82,18 @@ def print_result(result, host=None, vars=None, failed=None, severity_level=loggi msg = result.name print("{}{}{}{}".format(Style.BRIGHT, Fore.CYAN, msg, "*" * (80 - len(msg)))) for host, host_data in result.items(): - title = "" if host_data.changed is None else \ - " ** changed : {} ".format(host_data.changed) + title = "" if host_data.changed is None else " ** changed : {} ".format( + host_data.changed + ) msg = "* {}{}".format(host, title) - print("{}{}{}{}".format(Style.BRIGHT, Fore.BLUE, msg, "*" * (80 - len(msg)))) + print( + "{}{}{}{}".format(Style.BRIGHT, Fore.BLUE, msg, "*" * (80 - len(msg))) + ) print_result(host_data, host, vars, failed, severity_level) elif isinstance(result, MultiResult): - _print_individual_result(result[0], host, vars, failed, severity_level, task_group=True) + _print_individual_result( + result[0], host, vars, failed, severity_level, task_group=True + ) for r in result[1:]: print_result(r, host, vars, failed, severity_level) color = _get_color(result[0], failed) diff --git a/brigade/plugins/inventory/nsot.py b/brigade/plugins/inventory/nsot.py index d7ed9700..54429bb0 100644 --- a/brigade/plugins/inventory/nsot.py +++ b/brigade/plugins/inventory/nsot.py @@ -30,42 +30,55 @@ class NSOTInventory(Inventory): will be used as auth_method. """ - def __init__(self, nsot_url="", nsot_email="", nsot_auth_method="", - nsot_secret_key="", nsot_auth_header="", flatten_attributes=True, **kwargs): - nsot_url = nsot_url or os.environ.get('NSOT_URL', 'http://localhost:8990/api') - nsot_email = nsot_email or os.environ.get('NSOT_EMAIL', 'admin@acme.com') - nsot_secret_key = nsot_secret_key or os.environ.get('NSOT_SECRET_KEY') + def __init__( + self, + nsot_url="", + nsot_email="", + nsot_auth_method="", + nsot_secret_key="", + nsot_auth_header="", + flatten_attributes=True, + **kwargs + ): + nsot_url = nsot_url or os.environ.get("NSOT_URL", "http://localhost:8990/api") + nsot_email = nsot_email or os.environ.get("NSOT_EMAIL", "admin@acme.com") + nsot_secret_key = nsot_secret_key or os.environ.get("NSOT_SECRET_KEY") if nsot_secret_key: - data = {'email': nsot_email, 'secret_key': nsot_secret_key} - res = requests.post('{}/authenticate/'.format(nsot_url), data=data) - auth_token = res.json().get('auth_token') - headers = {'Authorization': 'AuthToken {}:{}'.format(nsot_email, auth_token)} + data = {"email": nsot_email, "secret_key": nsot_secret_key} + res = requests.post("{}/authenticate/".format(nsot_url), data=data) + auth_token = res.json().get("auth_token") + headers = { + "Authorization": "AuthToken {}:{}".format(nsot_email, auth_token) + } else: - nsot_auth_header = nsot_auth_header or os.environ.get('NSOT_AUTH_HEADER', - 'X-NSoT-Email') + nsot_auth_header = nsot_auth_header or os.environ.get( + "NSOT_AUTH_HEADER", "X-NSoT-Email" + ) headers = {nsot_auth_header: nsot_email} - devices = requests.get('{}/devices'.format(nsot_url), headers=headers).json() - sites = requests.get('{}/sites'.format(nsot_url), headers=headers).json() - interfaces = requests.get('{}/interfaces'.format(nsot_url), headers=headers).json() + devices = requests.get("{}/devices".format(nsot_url), headers=headers).json() + sites = requests.get("{}/sites".format(nsot_url), headers=headers).json() + interfaces = requests.get( + "{}/interfaces".format(nsot_url), headers=headers + ).json() # We resolve site_id and assign "site" variable with the name of the site for d in devices: - d['site'] = sites[d['site_id'] - 1]['name'] - d['interfaces'] = {} + d["site"] = sites[d["site_id"] - 1]["name"] + d["interfaces"] = {} if flatten_attributes: # We assign attributes to the root - for k, v in d.pop('attributes').items(): + for k, v in d.pop("attributes").items(): d[k] = v # We assign the interfaces to the hosts for i in interfaces: - devices[i['device'] - 1]['interfaces'][i['name']] = i + devices[i["device"] - 1]["interfaces"][i["name"]] = i # Finally the inventory expects a dict of hosts where the key is the hostname - devices = {d['hostname']: d for d in devices} + devices = {d["hostname"]: d for d in devices} super().__init__(devices, None, **kwargs) diff --git a/brigade/plugins/inventory/simple.py b/brigade/plugins/inventory/simple.py index aee4bbb2..67a220a2 100644 --- a/brigade/plugins/inventory/simple.py +++ b/brigade/plugins/inventory/simple.py @@ -102,6 +102,7 @@ class SimpleInventory(Inventory): cmh: """ + def __init__(self, host_file="hosts.yaml", group_file="groups.yaml", **kwargs): with open(host_file, "r") as f: hosts = yaml.load(f.read()) diff --git a/brigade/plugins/tasks/apis/__init__.py b/brigade/plugins/tasks/apis/__init__.py index 784a54f9..0395d12a 100644 --- a/brigade/plugins/tasks/apis/__init__.py +++ b/brigade/plugins/tasks/apis/__init__.py @@ -1,5 +1,3 @@ from .http_method import http_method -__all__ = ( - "http_method", -) +__all__ = ("http_method",) diff --git a/brigade/plugins/tasks/commands/__init__.py b/brigade/plugins/tasks/commands/__init__.py index 26faddc7..967b129b 100644 --- a/brigade/plugins/tasks/commands/__init__.py +++ b/brigade/plugins/tasks/commands/__init__.py @@ -2,7 +2,4 @@ from .remote_command import remote_command -__all__ = ( - "command", - "remote_command", -) +__all__ = ("command", "remote_command") diff --git a/brigade/plugins/tasks/commands/command.py b/brigade/plugins/tasks/commands/command.py index 718bed4e..293798e8 100644 --- a/brigade/plugins/tasks/commands/command.py +++ b/brigade/plugins/tasks/commands/command.py @@ -23,10 +23,12 @@ def command(task, command): :obj:`brigade.core.exceptions.CommandError`: when there is a command error """ command = format_string(command, task, **task.host) - cmd = subprocess.Popen(shlex.split(command), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - shell=False) + cmd = subprocess.Popen( + shlex.split(command), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=False, + ) stdout, stderr = cmd.communicate() stdout = stdout.decode() diff --git a/brigade/plugins/tasks/connections/__init__.py b/brigade/plugins/tasks/connections/__init__.py index d504f6e7..b4a8240e 100644 --- a/brigade/plugins/tasks/connections/__init__.py +++ b/brigade/plugins/tasks/connections/__init__.py @@ -9,8 +9,4 @@ "paramiko": paramiko_connection, } -__all__ = ( - "napalm_connection", - "netmiko_connection", - "paramiko_connection", -) +__all__ = ("napalm_connection", "netmiko_connection", "paramiko_connection") diff --git a/brigade/plugins/tasks/connections/netmiko_connection.py b/brigade/plugins/tasks/connections/netmiko_connection.py index ef46a98c..45639717 100644 --- a/brigade/plugins/tasks/connections/netmiko_connection.py +++ b/brigade/plugins/tasks/connections/netmiko_connection.py @@ -1,11 +1,11 @@ from netmiko import ConnectHandler napalm_to_netmiko_map = { - 'ios': 'cisco_ios', - 'nxos': 'cisco_nxos', - 'eos': 'arista_eos', - 'junos': 'juniper_junos', - 'iosxr': 'cisco_xr' + "ios": "cisco_ios", + "nxos": "cisco_nxos", + "eos": "arista_eos", + "junos": "juniper_junos", + "iosxr": "cisco_xr", } @@ -22,13 +22,13 @@ def netmiko_connection(task, **netmiko_args): "host": host.host, "username": host.username, "password": host.password, - "port": host.ssh_port + "port": host.ssh_port, } if host.nos is not None: # Look device_type up in corresponding map, if no entry return the host.nos unmodified device_type = napalm_to_netmiko_map.get(host.nos, host.nos) - parameters['device_type'] = device_type + parameters["device_type"] = device_type # Precedence order: **netmiko_args > discrete inventory attributes > inventory netmiko_options netmiko_connection_args = host.get("netmiko_options", {}) diff --git a/brigade/plugins/tasks/connections/paramiko_connection.py b/brigade/plugins/tasks/connections/paramiko_connection.py index 6486a1ca..2fcf40b2 100644 --- a/brigade/plugins/tasks/connections/paramiko_connection.py +++ b/brigade/plugins/tasks/connections/paramiko_connection.py @@ -28,18 +28,18 @@ def paramiko_connection(task=None): } user_config = ssh_config.lookup(host.host) - for k in ('hostname', 'username', 'port'): + for k in ("hostname", "username", "port"): if k in user_config: parameters[k] = user_config[k] - if 'proxycommand' in user_config: - parameters['sock'] = paramiko.ProxyCommand(user_config['proxycommand']) + if "proxycommand" in user_config: + parameters["sock"] = paramiko.ProxyCommand(user_config["proxycommand"]) # TODO configurable # if ssh_key_file: # parameters['key_filename'] = ssh_key_file - if 'identityfile' in user_config: - parameters['key_filename'] = user_config['identityfile'] + if "identityfile" in user_config: + parameters["key_filename"] = user_config["identityfile"] client.connect(**parameters) host.connections["paramiko"] = client diff --git a/brigade/plugins/tasks/data/__init__.py b/brigade/plugins/tasks/data/__init__.py index e3c0c62a..2dbc5c33 100644 --- a/brigade/plugins/tasks/data/__init__.py +++ b/brigade/plugins/tasks/data/__init__.py @@ -2,7 +2,4 @@ from .load_yaml import load_yaml -__all__ = ( - "load_json", - "load_yaml", -) +__all__ = ("load_json", "load_yaml") diff --git a/brigade/plugins/tasks/data/load_json.py b/brigade/plugins/tasks/data/load_json.py index c1298bc6..656d9a02 100644 --- a/brigade/plugins/tasks/data/load_json.py +++ b/brigade/plugins/tasks/data/load_json.py @@ -16,7 +16,7 @@ def load_json(task, file): * result (``dict``): dictionary with the contents of the file """ file = format_string(file, task) - with open(file, 'r') as f: + with open(file, "r") as f: data = json.loads(f.read()) return Result(host=task.host, result=data) diff --git a/brigade/plugins/tasks/data/load_yaml.py b/brigade/plugins/tasks/data/load_yaml.py index 7b342a29..1df12562 100644 --- a/brigade/plugins/tasks/data/load_yaml.py +++ b/brigade/plugins/tasks/data/load_yaml.py @@ -17,7 +17,7 @@ def load_yaml(task, file): * result (``dict``): dictionary with the contents of the file """ file = format_string(file, task) - with open(file, 'r') as f: + with open(file, "r") as f: data = yaml.load(f.read()) return Result(host=task.host, result=data) diff --git a/brigade/plugins/tasks/files/__init__.py b/brigade/plugins/tasks/files/__init__.py index babc6aa9..2b8533f2 100644 --- a/brigade/plugins/tasks/files/__init__.py +++ b/brigade/plugins/tasks/files/__init__.py @@ -2,7 +2,4 @@ from .write_file import write_file -__all__ = ( - "sftp", - "write_file", -) +__all__ = ("sftp", "write_file") diff --git a/brigade/plugins/tasks/files/sftp.py b/brigade/plugins/tasks/files/sftp.py index 53c315ca..27671842 100644 --- a/brigade/plugins/tasks/files/sftp.py +++ b/brigade/plugins/tasks/files/sftp.py @@ -15,11 +15,11 @@ def get_src_hash(filename): sha1sum = hashlib.sha1() - with open(filename, 'rb') as f: - block = f.read(2**16) + with open(filename, "rb") as f: + block = f.read(2 ** 16) while len(block) != 0: sha1sum.update(block) - block = f.read(2**16) + block = f.read(2 ** 16) return sha1sum.hexdigest() @@ -28,9 +28,11 @@ def get_dst_hash(task, filename): try: result = commands.remote_command(task, command) return result.stdout.split()[0] + except CommandError as e: if "No such file or directory" in e.stderr: - return '' + return "" + raise @@ -38,6 +40,7 @@ def remote_exists(sftp_client, f): try: sftp_client.stat(f) return True + except IOError: return False @@ -49,7 +52,7 @@ def compare_put_files(task, sftp_client, src, dst): try: dst_hash = get_dst_hash(task, dst) except IOError: - dst_hash = '' + dst_hash = "" if src_hash != dst_hash: changed.append(dst) else: @@ -71,7 +74,7 @@ def compare_get_files(task, sftp_client, src, dst): try: dst_hash = get_src_hash(dst) except IOError: - dst_hash = '' + dst_hash = "" if src_hash != dst_hash: changed.append(dst) else: @@ -124,12 +127,11 @@ def sftp(task, src, dst, action, dry_run=None): src = format_string(src, task, **task.host) dst = format_string(dst, task, **task.host) dry_run = task.is_dry_run(dry_run) - actions = { - "put": put, - "get": get, - } + actions = {"put": put, "get": get} client = task.host.get_connection("paramiko") scp_client = SCPClient(client.get_transport()) sftp_client = paramiko.SFTPClient.from_transport(client.get_transport()) files_changed = actions[action](task, scp_client, sftp_client, src, dst, dry_run) - return Result(host=task.host, changed=bool(files_changed), files_changed=files_changed) + return Result( + host=task.host, changed=bool(files_changed), files_changed=files_changed + ) diff --git a/brigade/plugins/tasks/files/write_file.py b/brigade/plugins/tasks/files/write_file.py index c8119bd6..c88646eb 100644 --- a/brigade/plugins/tasks/files/write_file.py +++ b/brigade/plugins/tasks/files/write_file.py @@ -7,6 +7,7 @@ def _read_file(file): if not os.path.exists(file): return [] + with open(file, "r") as f: return f.read().splitlines() diff --git a/brigade/plugins/tasks/networking/napalm_configure.py b/brigade/plugins/tasks/networking/napalm_configure.py index eb09699a..6945fa93 100644 --- a/brigade/plugins/tasks/networking/napalm_configure.py +++ b/brigade/plugins/tasks/networking/napalm_configure.py @@ -2,7 +2,9 @@ from brigade.core.task import Result -def napalm_configure(task, dry_run=None, filename=None, configuration=None, replace=False): +def napalm_configure( + task, dry_run=None, filename=None, configuration=None, replace=False +): """ Loads configuration into a network devices using napalm @@ -18,7 +20,9 @@ def napalm_configure(task, dry_run=None, filename=None, configuration=None, repl * diff (``string``): change in the system """ device = task.host.get_connection("napalm") - filename = format_string(filename, task, **task.host) if filename is not None else None + filename = format_string( + filename, task, **task.host + ) if filename is not None else None if replace: device.load_replace_candidate(filename=filename, config=configuration) diff --git a/brigade/plugins/tasks/networking/napalm_validate.py b/brigade/plugins/tasks/networking/napalm_validate.py index e156b9e8..3e9f4db6 100644 --- a/brigade/plugins/tasks/networking/napalm_validate.py +++ b/brigade/plugins/tasks/networking/napalm_validate.py @@ -17,5 +17,7 @@ def napalm_validate(task, src=None, validation_source=None): * complies (``bool``): Whether the device complies or not """ device = task.host.get_connection("napalm") - r = device.compliance_report(validation_file=src, validation_source=validation_source) + r = device.compliance_report( + validation_file=src, validation_source=validation_source + ) return Result(host=task.host, result=r) diff --git a/brigade/plugins/tasks/networking/netmiko_file_transfer.py b/brigade/plugins/tasks/networking/netmiko_file_transfer.py index 3bddad16..0561e7d1 100644 --- a/brigade/plugins/tasks/networking/netmiko_file_transfer.py +++ b/brigade/plugins/tasks/networking/netmiko_file_transfer.py @@ -19,10 +19,14 @@ def netmiko_file_transfer(task, source_file, dest_file, **kwargs): """ net_connect = task.host.get_connection("netmiko") - kwargs.setdefault('direction', 'put') - scp_result = file_transfer(net_connect, source_file=source_file, dest_file=dest_file, **kwargs) - if kwargs.get('disable_md5') is True: - file_valid = scp_result['file_exists'] + kwargs.setdefault("direction", "put") + scp_result = file_transfer( + net_connect, source_file=source_file, dest_file=dest_file, **kwargs + ) + if kwargs.get("disable_md5") is True: + file_valid = scp_result["file_exists"] else: - file_valid = scp_result['file_exists'] and scp_result['file_verified'] - return Result(host=task.host, result=file_valid, changed=scp_result['file_transferred']) + file_valid = scp_result["file_exists"] and scp_result["file_verified"] + return Result( + host=task.host, result=file_valid, changed=scp_result["file_transferred"] + ) diff --git a/brigade/plugins/tasks/networking/netmiko_send_config.py b/brigade/plugins/tasks/networking/netmiko_send_config.py index 16f9aea7..63c9366a 100644 --- a/brigade/plugins/tasks/networking/netmiko_send_config.py +++ b/brigade/plugins/tasks/networking/netmiko_send_config.py @@ -22,4 +22,5 @@ def netmiko_send_config(task, config_commands=None, config_file=None, **kwargs): result = net_connect.send_config_from_file(config_file=config_file, **kwargs) else: raise ValueError("Must specify either config_commands or config_file") + return Result(host=task.host, result=result, changed=True) diff --git a/brigade/plugins/tasks/networking/tcp_ping.py b/brigade/plugins/tasks/networking/tcp_ping.py index 9cf68dfc..5c3d4301 100644 --- a/brigade/plugins/tasks/networking/tcp_ping.py +++ b/brigade/plugins/tasks/networking/tcp_ping.py @@ -26,6 +26,7 @@ def tcp_ping(task, ports, timeout=2, host=None): if isinstance(ports, list): if not all(isinstance(port, int) for port in ports): raise ValueError("Invalid value for 'ports'") + else: raise ValueError("Invalid value for 'ports'") diff --git a/brigade/plugins/tasks/text/__init__.py b/brigade/plugins/tasks/text/__init__.py index dfc5efa3..0c8d088a 100644 --- a/brigade/plugins/tasks/text/__init__.py +++ b/brigade/plugins/tasks/text/__init__.py @@ -1,7 +1,4 @@ from .template_file import template_file from .template_string import template_string -__all__ = ( - "template_file", - "template_string", -) +__all__ = ("template_file", "template_string") diff --git a/brigade/plugins/tasks/text/template_file.py b/brigade/plugins/tasks/text/template_file.py index 9b8d8a78..8284cc34 100644 --- a/brigade/plugins/tasks/text/template_file.py +++ b/brigade/plugins/tasks/text/template_file.py @@ -18,6 +18,7 @@ def template_file(task, template, path, **kwargs): merged = merge_two_dicts(task.host, kwargs) path = format_string(path, task, **kwargs) template = format_string(template, task, **kwargs) - text = jinja_helper.render_from_file(template=template, path=path, - host=task.host, **merged) + text = jinja_helper.render_from_file( + template=template, path=path, host=task.host, **merged + ) return Result(host=task.host, result=text) diff --git a/brigade/plugins/tasks/text/template_string.py b/brigade/plugins/tasks/text/template_string.py index cb4b842f..fc531504 100644 --- a/brigade/plugins/tasks/text/template_string.py +++ b/brigade/plugins/tasks/text/template_string.py @@ -15,6 +15,5 @@ def template_string(task, template, **kwargs): * result (``string``): rendered string """ merged = merge_two_dicts(task.host, kwargs) - text = jinja_helper.render_from_string(template=template, - host=task.host, **merged) + text = jinja_helper.render_from_string(template=template, host=task.host, **merged) return Result(host=task.host, result=text) diff --git a/docs/conf.py b/docs/conf.py index 77bde96b..a1ac31c6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,10 +23,10 @@ from jinja2 import Environment from jinja2 import FileSystemLoader -sys.path.insert(0, os.path.abspath('../')) +sys.path.insert(0, os.path.abspath("../")) -from brigade.core.configuration import CONF # noqa +from brigade.core.configuration import CONF # noqa # -- General configuration ------------------------------------------------ BASEPATH = os.path.dirname(__file__) @@ -38,33 +38,33 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'nbsphinx'] +extensions = ["sphinx.ext.autodoc", "sphinx.ext.napoleon", "nbsphinx"] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = 'brigade' -copyright = '2017, David Barroso' -author = 'David Barroso' +project = "brigade" +copyright = "2017, David Barroso" +author = "David Barroso" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '0.0.1' +version = "0.0.1" # The full version, including alpha/beta/rc tags. -release = '0.0.1' +release = "0.0.1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -76,10 +76,10 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -90,7 +90,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' +html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -101,7 +101,7 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # Custom sidebar templates, must be a dictionary that maps document names # to template names. @@ -120,7 +120,7 @@ # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. -htmlhelp_basename = 'brigadedoc' +htmlhelp_basename = "brigadedoc" # -- Options for LaTeX output --------------------------------------------- @@ -129,15 +129,12 @@ # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # # 'preamble': '', - # Latex figure (float) alignment # # 'figure_align': 'htbp', @@ -147,8 +144,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'brigade.tex', 'brigade Documentation', - 'David Barroso', 'manual'), + (master_doc, "brigade.tex", "brigade Documentation", "David Barroso", "manual") ] @@ -156,10 +152,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'brigade', 'brigade Documentation', - [author], 1) -] +man_pages = [(master_doc, "brigade", "brigade Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- @@ -168,9 +161,15 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'brigade', 'brigade Documentation', - author, 'brigade', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "brigade", + "brigade Documentation", + author, + "brigade", + "One line description of project.", + "Miscellaneous", + ) ] @@ -180,17 +179,17 @@ def build_configuration_parameters(app): env = Environment(loader=FileSystemLoader("{0}/_data_templates".format(BASEPATH))) template_file = env.get_template("configuration-parameters.j2") data = {} - data['params'] = CONF + data["params"] = CONF rendered_template = template_file.render(**data) - output_dir = '{0}/ref/configuration/generated'.format(BASEPATH) - with open('{}/parameters.rst'.format(output_dir), 'w') as f: + output_dir = "{0}/ref/configuration/generated".format(BASEPATH) + with open("{}/parameters.rst".format(output_dir), "w") as f: f.write(rendered_template) def setup(app): """Map methods to states of the documentation build.""" - app.connect('builder-inited', build_configuration_parameters) - app.add_stylesheet('css/custom.css') + app.connect("builder-inited", build_configuration_parameters) + app.add_stylesheet("css/custom.css") build_configuration_parameters(None) diff --git a/examples/1_simple_runbooks/backup.py b/examples/1_simple_runbooks/backup.py index baec0417..22b4c5e3 100755 --- a/examples/1_simple_runbooks/backup.py +++ b/examples/1_simple_runbooks/backup.py @@ -13,21 +13,23 @@ def backup(task): 1. Download configuration from the device 2. Store to disk """ - result = task.run(networking.napalm_get, - name="Gathering configuration", - getters="config") + result = task.run( + networking.napalm_get, name="Gathering configuration", getters="config" + ) - task.run(files.write, - name="Saving Configuration to disk", - content=result.result["config"]["running"], - filename="./backups/{}".format(task.host)) + task.run( + files.write, + name="Saving Configuration to disk", + content=result.result["config"]["running"], + filename="./backups/{}".format(task.host), + ) brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=True, ) # select which devices we want to work with @@ -35,12 +37,12 @@ def backup(task): # Run the ``backup`` function that groups the tasks to # download/store devices' configuration -results = filtered.run(backup, - name="Backing up configurations") +results = filtered.run(backup, name="Backing up configurations") # Let's print the result on screen -filtered.run(text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - ) +filtered.run( + text.print_result, + num_workers=1, # task should be done synchronously + data=results, + task_id=-1, # we only want to print the last task +) diff --git a/examples/1_simple_runbooks/configure.py b/examples/1_simple_runbooks/configure.py index d120a723..fce3b876 100755 --- a/examples/1_simple_runbooks/configure.py +++ b/examples/1_simple_runbooks/configure.py @@ -16,54 +16,64 @@ def configure(task): 2. Templates to build configuration 3. Deploy configuration on the device """ - r = task.run(text.template_file, - name="Base Configuration", - template="base.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Base Configuration", + template="base.j2", + path="../templates/{brigade_nos}", + ) # r.result holds the result of rendering the template # we store in the host itself so we can keep updating # it as we render other templates task.host["config"] = r.result - r = task.run(data.load_yaml, - name="Loading extra data", - file="../extra_data/{host}/l3.yaml") + r = task.run( + data.load_yaml, name="Loading extra data", file="../extra_data/{host}/l3.yaml" + ) # r.result holds the data contained in the yaml files # we load the data inside the host itself for further use task.host["l3"] = r.result - r = task.run(text.template_file, - name="Interfaces Configuration", - template="interfaces.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Interfaces Configuration", + template="interfaces.j2", + path="../templates/{brigade_nos}", + ) # we update our hosts' config task.host["config"] += r.result - r = task.run(text.template_file, - name="Routing Configuration", - template="routing.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Routing Configuration", + template="routing.j2", + path="../templates/{brigade_nos}", + ) # we update our hosts' config task.host["config"] += r.result - r = task.run(text.template_file, - name="Role-specific Configuration", - template="{role}.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Role-specific Configuration", + template="{role}.j2", + path="../templates/{brigade_nos}", + ) # we update our hosts' config task.host["config"] += r.result - task.run(networking.napalm_configure, - name="Loading Configuration on the device", - replace=False, - configuration=task.host["config"]) + task.run( + networking.napalm_configure, + name="Loading Configuration on the device", + replace=False, + configuration=task.host["config"], + ) brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=True, ) @@ -73,9 +83,10 @@ def configure(task): results = filtered.run(task=configure) print_title("Playbook to configure the network") -filtered.run(text.print_result, - name="Configure device", - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - ) +filtered.run( + text.print_result, + name="Configure device", + num_workers=1, # task should be done synchronously + data=results, + task_id=-1, # we only want to print the last task +) diff --git a/examples/1_simple_runbooks/get_facts.py b/examples/1_simple_runbooks/get_facts.py index 5b308998..bbe302b6 100755 --- a/examples/1_simple_runbooks/get_facts.py +++ b/examples/1_simple_runbooks/get_facts.py @@ -9,10 +9,10 @@ brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=False, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=False, ) print_title("Getting interfaces and facts") @@ -22,11 +22,9 @@ # we are going to gather "interfaces" and "facts" # information with napalm -results = filtered.run(networking.napalm_get, - getters=["interfaces", "facts"]) +results = filtered.run(networking.napalm_get, getters=["interfaces", "facts"]) # Let's print the result on screen -filtered.run(text.print_result, - num_workers=1, # task should be done synchronously - data=results, - ) +filtered.run( + text.print_result, num_workers=1, data=results # task should be done synchronously +) diff --git a/examples/1_simple_runbooks/rollback.py b/examples/1_simple_runbooks/rollback.py index 2c219cc7..ee7fbe81 100755 --- a/examples/1_simple_runbooks/rollback.py +++ b/examples/1_simple_runbooks/rollback.py @@ -13,23 +13,23 @@ def rollback(task): This function loads the backup from ./backups/$hostname and deploys it. """ - task.run(networking.napalm_configure, - name="Loading Configuration on the device", - replace=True, - filename="backups/{host}") + task.run( + networking.napalm_configure, + name="Loading Configuration on the device", + replace=True, + filename="backups/{host}", + ) @click.command() -@click.option('--filter', '-f', multiple=True, - help="k=v pairs to filter the devices") -@click.option('--get', '-g', multiple=True, - help="getters you want to use") +@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") +@click.option("--get", "-g", multiple=True, help="getters you want to use") def main(filter, get): brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=True, ) # select which devices we want to work with @@ -37,11 +37,12 @@ def main(filter, get): results = filtered.run(task=rollback) - filtered.run(text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - ) + filtered.run( + text.print_result, + num_workers=1, # task should be done synchronously + data=results, + task_id=-1, # we only want to print the last task + ) if __name__ == "__main__": diff --git a/examples/1_simple_runbooks/validate.py b/examples/1_simple_runbooks/validate.py index 4453babd..f7762b3c 100755 --- a/examples/1_simple_runbooks/validate.py +++ b/examples/1_simple_runbooks/validate.py @@ -9,26 +9,22 @@ def validate(task): task.host["config"] = "" - r = task.run(name="read data", - task=data.load_yaml, - file="../extra_data/{host}/l3.yaml") - - validation_rules = [{ - 'get_bgp_neighbors': { - 'global': { - 'peers': { - '_mode': 'strict', - } - } - } - }] - peers = validation_rules[0]['get_bgp_neighbors']['global']['peers'] - for session in r.result['sessions']: - peers[session['ipv4']] = {'is_up': True} - - task.run(name="validating data", - task=networking.napalm_validate, - validation_source=validation_rules) + r = task.run( + name="read data", task=data.load_yaml, file="../extra_data/{host}/l3.yaml" + ) + + validation_rules = [ + {"get_bgp_neighbors": {"global": {"peers": {"_mode": "strict"}}}} + ] + peers = validation_rules[0]["get_bgp_neighbors"]["global"]["peers"] + for session in r.result["sessions"]: + peers[session["ipv4"]] = {"is_up": True} + + task.run( + name="validating data", + task=networking.napalm_validate, + validation_source=validation_rules, + ) def print_compliance(task, results): @@ -37,18 +33,19 @@ def print_compliance(task, results): for each specific host and see if the task complies or not and pass it to print_result. """ - task.run(text.print_result, - name="print result", - data=results[task.host.name], - failed=not results[task.host.name][2].result['complies'], - ) + task.run( + text.print_result, + name="print result", + data=results[task.host.name], + failed=not results[task.host.name][2].result["complies"], + ) brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=True, ) @@ -56,6 +53,4 @@ def print_compliance(task, results): results = filtered.run(task=validate) -filtered.run(print_compliance, - results=results, - num_workers=1) +filtered.run(print_compliance, results=results, num_workers=1) diff --git a/examples/2_simple_tooling/backup.py b/examples/2_simple_tooling/backup.py index ba3d79b3..db15534a 100755 --- a/examples/2_simple_tooling/backup.py +++ b/examples/2_simple_tooling/backup.py @@ -15,30 +15,34 @@ def backup(task, path): 1. Download configuration from the device 2. Store to disk """ - result = task.run(networking.napalm_get, - name="Gathering configuration from the device", - getters="config") + result = task.run( + networking.napalm_get, + name="Gathering configuration from the device", + getters="config", + ) - task.run(files.write, - name="Saving Configuration to disk", - content=result.result["config"]["running"], - filename="{}/{}".format(path, task.host)) + task.run( + files.write, + name="Saving Configuration to disk", + content=result.result["config"]["running"], + filename="{}/{}".format(path, task.host), + ) @click.command() -@click.option('--filter', '-f', multiple=True, - help="filters to apply. For instance site=cmh") -@click.option('--path', '-p', default=".", - help="Where to save the backup files") +@click.option( + "--filter", "-f", multiple=True, help="filters to apply. For instance site=cmh" +) +@click.option("--path", "-p", default=".", help="Where to save the backup files") def main(filter, path): """ Backups running configuration of devices into a file """ brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=False, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=False, ) # filter is going to be a list of key=value so we clean that first @@ -52,17 +56,16 @@ def main(filter, path): # Run the ``backup`` function that groups the tasks to # download/store devices' configuration - results = filtered.run(backup, - name="Backing up configurations", - path=path) + results = filtered.run(backup, name="Backing up configurations", path=path) # Let's print the result on screen - filtered.run(text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - skipped=True, - ) + filtered.run( + text.print_result, + num_workers=1, # task should be done synchronously + data=results, + task_id=-1, # we only want to print the last task + skipped=True, + ) if __name__ == "__main__": diff --git a/examples/2_simple_tooling/configure.py b/examples/2_simple_tooling/configure.py index 82b75744..e4f03520 100755 --- a/examples/2_simple_tooling/configure.py +++ b/examples/2_simple_tooling/configure.py @@ -17,60 +17,73 @@ def configure(task): 2. Templates to build configuration 3. Deploy configuration on the device """ - r = task.run(text.template_file, - name="Base Configuration", - template="base.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Base Configuration", + template="base.j2", + path="../templates/{brigade_nos}", + ) # r.result holds the result of rendering the template # we store in the host itself so we can keep updating # it as we render other templates task.host["config"] = r.result - r = task.run(data.load_yaml, - name="Loading extra data", - file="../extra_data/{host}/l3.yaml") + r = task.run( + data.load_yaml, name="Loading extra data", file="../extra_data/{host}/l3.yaml" + ) # r.result holds the data contained in the yaml files # we load the data inside the host itself for further use task.host["l3"] = r.result - r = task.run(text.template_file, - name="Interfaces Configuration", - template="interfaces.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Interfaces Configuration", + template="interfaces.j2", + path="../templates/{brigade_nos}", + ) # we update our hosts' config task.host["config"] += r.result - r = task.run(text.template_file, - name="Routing Configuration", - template="routing.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Routing Configuration", + template="routing.j2", + path="../templates/{brigade_nos}", + ) # we update our hosts' config task.host["config"] += r.result - r = task.run(text.template_file, - name="Role-specific Configuration", - template="{role}.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, + name="Role-specific Configuration", + template="{role}.j2", + path="../templates/{brigade_nos}", + ) # we update our hosts' config task.host["config"] += r.result - task.run(networking.napalm_configure, - name="Loading Configuration on the device", - replace=False, - configuration=task.host["config"]) + task.run( + networking.napalm_configure, + name="Loading Configuration on the device", + replace=False, + configuration=task.host["config"], + ) @click.command() -@click.option('--filter', '-f', multiple=True, - help="k=v pairs to filter the devices") -@click.option('--commit/--no-commit', '-c', default=False, - help="whether you want to commit the changes or not") +@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") +@click.option( + "--commit/--no-commit", + "-c", + default=False, + help="whether you want to commit the changes or not", +) def main(filter, commit): brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=not commit, - raise_on_error=False, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=not commit, + raise_on_error=False, ) # filter is going to be a list of key=value so we clean that first @@ -84,12 +97,13 @@ def main(filter, commit): results = filtered.run(task=configure) - filtered.run(text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - skipped=True, - ) + filtered.run( + text.print_result, + num_workers=1, # task should be done synchronously + data=results, + task_id=-1, # we only want to print the last task + skipped=True, + ) if __name__ == "__main__": diff --git a/examples/2_simple_tooling/get_facts.py b/examples/2_simple_tooling/get_facts.py index 8bbe60e0..2552ac93 100755 --- a/examples/2_simple_tooling/get_facts.py +++ b/examples/2_simple_tooling/get_facts.py @@ -9,19 +9,17 @@ @click.command() -@click.option('--filter', '-f', multiple=True, - help="k=v pairs to filter the devices") -@click.option('--get', '-g', multiple=True, - help="getters you want to use") +@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") +@click.option("--get", "-g", multiple=True, help="getters you want to use") def main(filter, get): """ Retrieve information from network devices using napalm """ brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=False, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=False, ) # filter is going to be a list of key=value so we clean that first @@ -32,13 +30,14 @@ def main(filter, get): # select which devices we want to work with filtered = brg.filter(**filter_dict) - results = filtered.run(networking.napalm_get, - getters=get) + results = filtered.run(networking.napalm_get, getters=get) # Let's print the result on screen - filtered.run(text.print_result, - num_workers=1, # task should be done synchronously - data=results) + filtered.run( + text.print_result, + num_workers=1, # task should be done synchronously + data=results, + ) if __name__ == "__main__": diff --git a/examples/2_simple_tooling/rollback.py b/examples/2_simple_tooling/rollback.py index 175d7dd5..81538bcc 100755 --- a/examples/2_simple_tooling/rollback.py +++ b/examples/2_simple_tooling/rollback.py @@ -13,25 +13,29 @@ def rollback(task, path): This function loads the backup from ./$path/$hostname and deploys it. """ - task.run(networking.napalm_configure, - name="Loading Configuration on the device", - replace=True, - filename="{}/{}".format(path, task.host)) + task.run( + networking.napalm_configure, + name="Loading Configuration on the device", + replace=True, + filename="{}/{}".format(path, task.host), + ) @click.command() -@click.option('--filter', '-f', multiple=True, - help="k=v pairs to filter the devices") -@click.option('--commit/--no-commit', '-c', default=False, - help="whether you want to commit the changes or not") -@click.option('--path', '-p', default=".", - help="Where to save the backup files") +@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") +@click.option( + "--commit/--no-commit", + "-c", + default=False, + help="whether you want to commit the changes or not", +) +@click.option("--path", "-p", default=".", help="Where to save the backup files") def main(filter, commit, path): brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=not commit, - raise_on_error=True, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=not commit, + raise_on_error=True, ) # filter is going to be a list of key=value so we clean that first @@ -45,11 +49,12 @@ def main(filter, commit, path): results = filtered.run(task=rollback, path=path) - filtered.run(text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - ) + filtered.run( + text.print_result, + num_workers=1, # task should be done synchronously + data=results, + task_id=-1, # we only want to print the last task + ) if __name__ == "__main__": diff --git a/examples/2_simple_tooling/validate.py b/examples/2_simple_tooling/validate.py index 04597074..d186a99a 100755 --- a/examples/2_simple_tooling/validate.py +++ b/examples/2_simple_tooling/validate.py @@ -11,26 +11,22 @@ def validate(task): task.host["config"] = "" - r = task.run(name="read data", - task=data.load_yaml, - file="../extra_data/{host}/l3.yaml") - - validation_rules = [{ - 'get_bgp_neighbors': { - 'global': { - 'peers': { - '_mode': 'strict', - } - } - } - }] - peers = validation_rules[0]['get_bgp_neighbors']['global']['peers'] - for session in r.result['sessions']: - peers[session['ipv4']] = {'is_up': True} - - task.run(name="validating data", - task=networking.napalm_validate, - validation_source=validation_rules) + r = task.run( + name="read data", task=data.load_yaml, file="../extra_data/{host}/l3.yaml" + ) + + validation_rules = [ + {"get_bgp_neighbors": {"global": {"peers": {"_mode": "strict"}}}} + ] + peers = validation_rules[0]["get_bgp_neighbors"]["global"]["peers"] + for session in r.result["sessions"]: + peers[session["ipv4"]] = {"is_up": True} + + task.run( + name="validating data", + task=networking.napalm_validate, + validation_source=validation_rules, + ) def print_compliance(task, results): @@ -39,22 +35,22 @@ def print_compliance(task, results): for each specific host and see if the task complies or not and pass it to print_result. """ - task.run(name="print result", - task=text.print_result, - data=results[task.host.name], - failed=not results[task.host.name][2].result['complies'], - ) + task.run( + name="print result", + task=text.print_result, + data=results[task.host.name], + failed=not results[task.host.name][2].result["complies"], + ) @click.command() -@click.option('--filter', '-f', multiple=True, - help="k=v pairs to filter the devices") +@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") def main(filter): brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, + host_file="../inventory/hosts.yaml", + group_file="../inventory/groups.yaml", + dry_run=False, + raise_on_error=True, ) # filter is going to be a list of key=value so we clean that first @@ -68,9 +64,7 @@ def main(filter): results = filtered.run(task=validate) - filtered.run(print_compliance, - results=results, - num_workers=1) + filtered.run(print_compliance, results=results, num_workers=1) if __name__ == "__main__": diff --git a/examples/3_advanced_tooling/mate.py b/examples/3_advanced_tooling/mate.py index e78acd91..d23562ea 100755 --- a/examples/3_advanced_tooling/mate.py +++ b/examples/3_advanced_tooling/mate.py @@ -13,8 +13,8 @@ @click.group() -@click.option('--filter', '-f', multiple=True) -@click.option('--commit/--no-commit', '-c', default=False) +@click.option("--filter", "-f", multiple=True) +@click.option("--commit/--no-commit", "-c", default=False) @click.pass_context def run(ctx, filter, commit): brigade = Brigade( @@ -29,7 +29,7 @@ def run(ctx, filter, commit): k, v = f.split("=") filter_dict[k] = v - filtered = brigade.filter(**filter_dict) # let's filter the devices + filtered = brigade.filter(**filter_dict) # let's filter the devices ctx.obj["filtered"] = filtered diff --git a/examples/3_advanced_tooling/tasks/backup.py b/examples/3_advanced_tooling/tasks/backup.py index 67262c38..58d367b8 100755 --- a/examples/3_advanced_tooling/tasks/backup.py +++ b/examples/3_advanced_tooling/tasks/backup.py @@ -14,24 +14,22 @@ def backup_task(task, path): - result = task.run(networking.napalm_get, - getters="config") + result = task.run(networking.napalm_get, getters="config") - return task.run(files.write, - content=result.result["config"]["running"], - filename="{}/{}".format(path, task.host)) + return task.run( + files.write, + content=result.result["config"]["running"], + filename="{}/{}".format(path, task.host), + ) @click.command() -@click.option('--backup-path', default=".") +@click.option("--backup-path", default=".") @click.pass_context def backup(ctx, backup_path, **kwargs): functions.text.print_title("Backing up configurations") filtered = ctx.obj["filtered"] - results = filtered.run(backup_task, - path=backup_path) + results = filtered.run(backup_task, path=backup_path) # Let's print the result on screen - return filtered.run(text.print_result, - num_workers=1, - data=results) + return filtered.run(text.print_result, num_workers=1, data=results) diff --git a/examples/3_advanced_tooling/tasks/configure.py b/examples/3_advanced_tooling/tasks/configure.py index 6ef6c512..2ca12bc0 100755 --- a/examples/3_advanced_tooling/tasks/configure.py +++ b/examples/3_advanced_tooling/tasks/configure.py @@ -14,40 +14,39 @@ def configure_task(task): - r = task.run(text.template_file, - template="base.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, template="base.j2", path="../templates/{brigade_nos}" + ) task.host["config"] = r.result - r = task.run(data.load_yaml, - file="../extra_data/{host}/l3.yaml") + r = task.run(data.load_yaml, file="../extra_data/{host}/l3.yaml") task.host["l3"] = r.result - r = task.run(text.template_file, - template="interfaces.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, template="interfaces.j2", path="../templates/{brigade_nos}" + ) task.host["config"] += r.result - r = task.run(text.template_file, - template="routing.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, template="routing.j2", path="../templates/{brigade_nos}" + ) task.host["config"] += r.result - r = task.run(text.template_file, - template="{role}.j2", - path="../templates/{brigade_nos}") + r = task.run( + text.template_file, template="{role}.j2", path="../templates/{brigade_nos}" + ) task.host["config"] += r.result - return task.run(networking.napalm_configure, - replace=False, - configuration=task.host["config"]) + return task.run( + networking.napalm_configure, replace=False, configuration=task.host["config"] + ) @click.command() @click.option("--validate/--no-validate", default=False) @click.option("--rollback/--no-rollback", default=False) @click.option("--backup/--no-backup", default=False) -@click.option('--backup-path', default=".") +@click.option("--backup-path", default=".") @click.pass_context def configure(ctx, validate, backup, backup_path, rollback): filtered = ctx.obj["filtered"] @@ -58,9 +57,11 @@ def configure(ctx, validate, backup, backup_path, rollback): functions.text.print_title("Configure Network") results = filtered.run(task=configure_task) - filtered.run(text.print_result, - num_workers=1, # we are printing on screen so we want to do this synchronously - data=results) + filtered.run( + text.print_result, + num_workers=1, # we are printing on screen so we want to do this synchronously + data=results, + ) if validate: time.sleep(10) @@ -68,10 +69,12 @@ def configure(ctx, validate, backup, backup_path, rollback): if r.failed and rollback: functions.text.print_title("Rolling back configuration!!!") - r = filtered.run(networking.napalm_configure, - replace=True, - filename=backup_path + "/{host}") - filtered.run(text.print_result, - num_workers=1, - data=r) - import pdb; pdb.set_trace() # noqa + r = filtered.run( + networking.napalm_configure, + replace=True, + filename=backup_path + "/{host}", + ) + filtered.run(text.print_result, num_workers=1, data=r) + import pdb + + pdb.set_trace() # noqa diff --git a/examples/3_advanced_tooling/tasks/get_facts.py b/examples/3_advanced_tooling/tasks/get_facts.py index e31dcdd9..f918e225 100755 --- a/examples/3_advanced_tooling/tasks/get_facts.py +++ b/examples/3_advanced_tooling/tasks/get_facts.py @@ -4,18 +4,18 @@ @click.command() -@click.option('--get', '-g', multiple=True, - help="getters you want to use") +@click.option("--get", "-g", multiple=True, help="getters you want to use") @click.pass_context def get(ctx, get): """ Retrieve information from network devices using napalm """ filtered = ctx.obj["filtered"] - results = filtered.run(networking.napalm_get, - getters=get) + results = filtered.run(networking.napalm_get, getters=get) # Let's print the result on screen - filtered.run(text.print_result, - num_workers=1, # we are printing on screen so we want to do this synchronously - data=results) + filtered.run( + text.print_result, + num_workers=1, # we are printing on screen so we want to do this synchronously + data=results, + ) diff --git a/examples/3_advanced_tooling/tasks/validate.py b/examples/3_advanced_tooling/tasks/validate.py index a22bf30b..e4dd471c 100755 --- a/examples/3_advanced_tooling/tasks/validate.py +++ b/examples/3_advanced_tooling/tasks/validate.py @@ -11,26 +11,22 @@ def validate_task(task): task.host["config"] = "" - r = task.run(name="read data", - task=data.load_yaml, - file="../extra_data/{host}/l3.yaml") - - validation_rules = [{ - 'get_bgp_neighbors': { - 'global': { - 'peers': { - '_mode': 'strict', - } - } - } - }] - peers = validation_rules[0]['get_bgp_neighbors']['global']['peers'] - for session in r.result['sessions']: - peers[session['ipv4']] = {'is_up': True} - - return task.run(name="validating data", - task=networking.napalm_validate, - validation_source=validation_rules) + r = task.run( + name="read data", task=data.load_yaml, file="../extra_data/{host}/l3.yaml" + ) + + validation_rules = [ + {"get_bgp_neighbors": {"global": {"peers": {"_mode": "strict"}}}} + ] + peers = validation_rules[0]["get_bgp_neighbors"]["global"]["peers"] + for session in r.result["sessions"]: + peers[session["ipv4"]] = {"is_up": True} + + return task.run( + name="validating data", + task=networking.napalm_validate, + validation_source=validation_rules, + ) @click.command() @@ -41,9 +37,11 @@ def validate(ctx, **kwargs): results = filtered.run(task=validate_task) - filtered.run(name="print validate result", - num_workers=1, - task=text.print_result, - data=results) + filtered.run( + name="print validate result", + num_workers=1, + task=text.print_result, + data=results, + ) return results diff --git a/examples/highlighter.py b/examples/highlighter.py index ea59ceee..26a46377 100644 --- a/examples/highlighter.py +++ b/examples/highlighter.py @@ -26,9 +26,7 @@ def highlight_file(filename): linenos = "inline" - formatter = HtmlFormatter(style='default', - cssclass='pygments', - linenos=linenos) + formatter = HtmlFormatter(style="default", cssclass="pygments", linenos=linenos) with open(filename) as f: code = f.read() diff --git a/setup.cfg b/setup.cfg index 10aae871..579d83f4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,5 +18,5 @@ skip = .tox/* max_line_length = 100 [tool:pytest] -addopts = --cov=brigade --cov-report=term-missing -vs --pylama +addopts = --cov=brigade --cov-report=term-missing -vs python_paths = ./ diff --git a/setup.py b/setup.py index d1b9e44d..dc1ba49c 100644 --- a/setup.py +++ b/setup.py @@ -8,30 +8,33 @@ from pip.req import parse_requirements -install_reqs = parse_requirements('requirements.txt', session=uuid.uuid1()) +install_reqs = parse_requirements("requirements.txt", session=uuid.uuid1()) reqs = [str(ir.req) for ir in install_reqs] -__author__ = 'dbarrosop@dravetech.com' -__license__ = 'Apache License, version 2' +__author__ = "dbarrosop@dravetech.com" +__license__ = "Apache License, version 2" -__version__ = '0.0.6' +__version__ = "0.0.6" -setup(name='brigade', - version=__version__, - description="Fighting fire with fire", - author=__author__, - url='https://github.com/brigade-automation/brigade', - include_package_data=True, - install_requires=reqs, - packages=find_packages(exclude=("test*", )), - license=__license__, - test_suite='tests', - platforms='any', - classifiers=['Development Status :: 4 - Beta', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - ]) +setup( + name="brigade", + version=__version__, + description="Fighting fire with fire", + author=__author__, + url="https://github.com/brigade-automation/brigade", + include_package_data=True, + install_requires=reqs, + packages=find_packages(exclude=("test*",)), + license=__license__, + test_suite="tests", + platforms="any", + classifiers=[ + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + ], +) diff --git a/tests/conftest.py b/tests/conftest.py index abe65897..f47fade2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,19 +10,24 @@ logging.basicConfig( filename="tests.log", - filemode='w', + filemode="w", level=logging.DEBUG, - format='%(asctime)s - %(name)s - %(levelname)s - %(funcName)20s() - %(message)s', + format="%(asctime)s - %(name)s - %(levelname)s - %(funcName)20s() - %(message)s", ) @pytest.fixture(scope="session", autouse=True) def containers(request): """Start/Stop containers needed for the tests.""" + def fin(): logging.info("Stopping containers") - subprocess.check_call(["./tests/inventory_data/containers.sh", "stop"], - stderr=subprocess.PIPE, stdout=subprocess.PIPE) + subprocess.check_call( + ["./tests/inventory_data/containers.sh", "stop"], + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + ) + request.addfinalizer(fin) try: @@ -30,8 +35,9 @@ def fin(): except Exception: pass logging.info("Starting containers") - subprocess.check_call(["./tests/inventory_data/containers.sh", "start"], - stdout=subprocess.PIPE) + subprocess.check_call( + ["./tests/inventory_data/containers.sh", "start"], stdout=subprocess.PIPE + ) @pytest.fixture(scope="session", autouse=True) @@ -40,8 +46,10 @@ def brigade(request): dir_path = os.path.dirname(os.path.realpath(__file__)) brigade = Brigade( - inventory=SimpleInventory("{}/inventory_data/hosts.yaml".format(dir_path), - "{}/inventory_data/groups.yaml".format(dir_path)), + inventory=SimpleInventory( + "{}/inventory_data/hosts.yaml".format(dir_path), + "{}/inventory_data/groups.yaml".format(dir_path), + ), dry_run=True, ) return brigade diff --git a/tests/core/test_InitBrigade.py b/tests/core/test_InitBrigade.py index eb47b3aa..d6a3d9fc 100644 --- a/tests/core/test_InitBrigade.py +++ b/tests/core/test_InitBrigade.py @@ -41,48 +41,54 @@ def test_InitBrigade_file(self): assert len(brg.inventory.groups) def test_InitBrigade_programmatically(self): - brg = InitBrigade(num_workers=100, - inventory="brigade.plugins.inventory.simple.SimpleInventory", - SimpleInventory={"host_file": "tests/inventory_data/hosts.yaml", - "group_file": "tests/inventory_data/groups.yaml", - }, - ) + brg = InitBrigade( + num_workers=100, + inventory="brigade.plugins.inventory.simple.SimpleInventory", + SimpleInventory={ + "host_file": "tests/inventory_data/hosts.yaml", + "group_file": "tests/inventory_data/groups.yaml", + }, + ) assert not brg.dry_run assert brg.config.num_workers == 100 assert len(brg.inventory.hosts) assert len(brg.inventory.groups) def test_InitBrigade_combined(self): - brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), - num_workers=200, - ) + brg = InitBrigade( + config_file=os.path.join(dir_path, "a_config.yaml"), num_workers=200 + ) assert not brg.dry_run assert brg.config.num_workers == 200 assert len(brg.inventory.hosts) assert len(brg.inventory.groups) def test_InitBrigade_different_inventory_by_string(self): - brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), - inventory="tests.core.test_InitBrigade.StringInventory", - ) + brg = InitBrigade( + config_file=os.path.join(dir_path, "a_config.yaml"), + inventory="tests.core.test_InitBrigade.StringInventory", + ) assert isinstance(brg.inventory, StringInventory) def test_InitBrigade_different_inventory_imported(self): - brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), - inventory=StringInventory, - ) + brg = InitBrigade( + config_file=os.path.join(dir_path, "a_config.yaml"), + inventory=StringInventory, + ) assert isinstance(brg.inventory, StringInventory) def test_InitBrigade_different_transform_function_by_string(self): - brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), - transform_function="tests.core.test_InitBrigade.transform_func", - ) + brg = InitBrigade( + config_file=os.path.join(dir_path, "a_config.yaml"), + transform_function="tests.core.test_InitBrigade.transform_func", + ) for value in brg.inventory.hosts.values(): assert value.processed_by_transform_function def test_InitBrigade_different_transform_function_imported(self): - brg = InitBrigade(config_file=os.path.join(dir_path, "a_config.yaml"), - transform_function=transform_func, - ) + brg = InitBrigade( + config_file=os.path.join(dir_path, "a_config.yaml"), + transform_function=transform_func, + ) for value in brg.inventory.hosts.values(): assert value.processed_by_transform_function diff --git a/tests/core/test_configuration.py b/tests/core/test_configuration.py index 56966765..eb51f9b6 100644 --- a/tests/core/test_configuration.py +++ b/tests/core/test_configuration.py @@ -5,14 +5,21 @@ # import pytest -dir_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test_configuration") +dir_path = os.path.join( + os.path.dirname(os.path.realpath(__file__)), "test_configuration" +) class Test(object): def test_configuration_empty(self): - config = Config(config_file=os.path.join(dir_path, "empty.yaml"), - arg1=1, arg2=False, arg3=None, arg4="asd") + config = Config( + config_file=os.path.join(dir_path, "empty.yaml"), + arg1=1, + arg2=False, + arg3=None, + arg4="asd", + ) assert config.num_workers == 20 assert not config.raise_on_error assert config.arg1 == 1 @@ -21,8 +28,13 @@ def test_configuration_empty(self): assert config.arg4 == "asd" def test_configuration_normal(self): - config = Config(config_file=os.path.join(dir_path, "config.yaml"), - arg1=1, arg2=False, arg3=None, arg4="asd") + config = Config( + config_file=os.path.join(dir_path, "config.yaml"), + arg1=1, + arg2=False, + arg3=None, + arg4="asd", + ) assert config.num_workers == 10 assert not config.raise_on_error assert config.arg1 == 1 @@ -31,8 +43,11 @@ def test_configuration_normal(self): assert config.arg4 == "asd" def test_configuration_normal_override_argument(self): - config = Config(config_file=os.path.join(dir_path, "config.yaml"), - num_workers=20, raise_on_error=True) + config = Config( + config_file=os.path.join(dir_path, "config.yaml"), + num_workers=20, + raise_on_error=True, + ) assert config.num_workers == 20 assert config.raise_on_error @@ -53,16 +68,22 @@ def test_configuration_bool_env(self): def test_get_user_defined_from_file(self): config = Config(config_file=os.path.join(dir_path, "config.yaml")) - assert config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "asdasd" + assert config.get( + "user_defined", env="USER_DEFINED", default="qweqwe" + ) == "asdasd" def test_get_user_defined_from_default(self): config = Config() - assert config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "qweqwe" + assert config.get( + "user_defined", env="USER_DEFINED", default="qweqwe" + ) == "qweqwe" def test_get_user_defined_from_env(self): os.environ["USER_DEFINED"] = "zxczxc" config = Config(config_file=os.path.join(dir_path, "config.yaml")) - assert config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "zxczxc" + assert config.get( + "user_defined", env="USER_DEFINED", default="qweqwe" + ) == "zxczxc" os.environ.pop("USER_DEFINED") def test_get_user_defined_from_env_bool(self): diff --git a/tests/core/test_inventory.py b/tests/core/test_inventory.py index 902b0ccf..7a34202b 100644 --- a/tests/core/test_inventory.py +++ b/tests/core/test_inventory.py @@ -7,8 +7,10 @@ dir_path = os.path.dirname(os.path.realpath(__file__)) -inventory = SimpleInventory("{}/../inventory_data/hosts.yaml".format(dir_path), - "{}/../inventory_data/groups.yaml".format(dir_path)) +inventory = SimpleInventory( + "{}/../inventory_data/hosts.yaml".format(dir_path), + "{}/../inventory_data/groups.yaml".format(dir_path), +) def compare_lists(left, right): @@ -19,6 +21,7 @@ def compare_lists(left, right): def to_sets(l): if isinstance(l, str): return l + r = set() for x in l: if isinstance(x, list) or isinstance(x, tuple): @@ -45,78 +48,136 @@ def test_hosts(self): assert h1["var2"] == "2" assert h1["var3"] == "3" assert h1["var4"] == "ALL" - assert compare_lists(list(h1.keys()), - ['name', 'groups', 'var1', 'var2', 'var3', 'var4']) - assert compare_lists(list(h1.values()), - ['host1', ['g1', 'g2'], '1', '2', '3', 'ALL']) - assert compare_lists(list(h1.items()), - [('name', 'host1'), ('groups', ['g1', 'g2']), - ('var1', '1'), ('var2', '2'), ('var3', '3'), ('var4', 'ALL')]) + assert compare_lists( + list(h1.keys()), ["name", "groups", "var1", "var2", "var3", "var4"] + ) + assert compare_lists( + list(h1.values()), ["host1", ["g1", "g2"], "1", "2", "3", "ALL"] + ) + assert compare_lists( + list(h1.items()), + [ + ("name", "host1"), + ("groups", ["g1", "g2"]), + ("var1", "1"), + ("var2", "2"), + ("var3", "3"), + ("var4", "ALL"), + ], + ) h2 = Host(name="host2", groups=[g2, g1], defaults=defaults) assert h2["var1"] == "a" assert h2["var2"] == "b" assert h2["var3"] == "3" assert h2["var4"] == "ALL" - assert compare_lists(list(h2.keys()), ['name', 'groups', 'var1', 'var2', 'var3', 'var4']) - assert compare_lists(list(h2.values()), ['host2', ['g2', 'g1'], 'a', 'b', '3', 'ALL']) - assert compare_lists(list(h2.items()), - [('name', 'host2'), ('groups', ['g2', 'g1']), ('var1', 'a'), - ('var2', 'b'), ('var3', '3'), ('var4', 'ALL')]) + assert compare_lists( + list(h2.keys()), ["name", "groups", "var1", "var2", "var3", "var4"] + ) + assert compare_lists( + list(h2.values()), ["host2", ["g2", "g1"], "a", "b", "3", "ALL"] + ) + assert compare_lists( + list(h2.items()), + [ + ("name", "host2"), + ("groups", ["g2", "g1"]), + ("var1", "a"), + ("var2", "b"), + ("var3", "3"), + ("var4", "ALL"), + ], + ) h3 = Host(name="host3", groups=[g4, g3], defaults=defaults) assert h3["var1"] == "a" assert h3["var2"] == "b" assert h3["var3"] == "q" assert h3["var4"] == "Z" - assert compare_lists(list(h3.keys()), ['name', 'groups', 'var3', 'var1', 'var2', 'var4']) - assert compare_lists(list(h3.values()), ['host3', ['g4', 'g3'], 'q', 'a', 'b', 'Z']) - assert compare_lists(list(h3.items()), - [('name', 'host3'), ('groups', ['g4', 'g3']), ('var3', 'q'), - ('var1', 'a'), ('var2', 'b'), ('var4', 'Z')]) + assert compare_lists( + list(h3.keys()), ["name", "groups", "var3", "var1", "var2", "var4"] + ) + assert compare_lists( + list(h3.values()), ["host3", ["g4", "g3"], "q", "a", "b", "Z"] + ) + assert compare_lists( + list(h3.items()), + [ + ("name", "host3"), + ("groups", ["g4", "g3"]), + ("var3", "q"), + ("var1", "a"), + ("var2", "b"), + ("var4", "Z"), + ], + ) h4 = Host(name="host4", groups=[g3, g4], defaults=defaults) assert h4["var1"] == "A" assert h4["var2"] == "b" assert h4["var3"] == "q" assert h4["var4"] == "Z" - assert compare_lists(list(h4.keys()), ['name', 'groups', 'var1', 'var4', 'var3', 'var2']) - assert compare_lists(list(h4.values()), ['host4', ['g3', 'g4'], 'A', 'Z', 'q', 'b']) - assert compare_lists(list(h4.items()), - [('name', 'host4'), ('groups', ['g3', 'g4']), ('var1', 'A'), - ('var4', 'Z'), ('var3', 'q'), ('var2', 'b')]) + assert compare_lists( + list(h4.keys()), ["name", "groups", "var1", "var4", "var3", "var2"] + ) + assert compare_lists( + list(h4.values()), ["host4", ["g3", "g4"], "A", "Z", "q", "b"] + ) + assert compare_lists( + list(h4.items()), + [ + ("name", "host4"), + ("groups", ["g3", "g4"]), + ("var1", "A"), + ("var4", "Z"), + ("var3", "q"), + ("var2", "b"), + ], + ) with pytest.raises(KeyError): assert h2["asdasd"] def test_filtering(self): unfiltered = sorted(list(inventory.hosts.keys())) - assert unfiltered == ['dev1.group_1', 'dev2.group_1', 'dev3.group_2', 'dev4.group_2'] + assert unfiltered == [ + "dev1.group_1", "dev2.group_1", "dev3.group_2", "dev4.group_2" + ] www = sorted(list(inventory.filter(role="www").hosts.keys())) - assert www == ['dev1.group_1', 'dev3.group_2'] + assert www == ["dev1.group_1", "dev3.group_2"] - www_site1 = sorted(list(inventory.filter(role="www", site="site1").hosts.keys())) - assert www_site1 == ['dev1.group_1'] + www_site1 = sorted( + list(inventory.filter(role="www", site="site1").hosts.keys()) + ) + assert www_site1 == ["dev1.group_1"] - www_site1 = sorted(list(inventory.filter(role="www").filter(site="site1").hosts.keys())) - assert www_site1 == ['dev1.group_1'] + www_site1 = sorted( + list(inventory.filter(role="www").filter(site="site1").hosts.keys()) + ) + assert www_site1 == ["dev1.group_1"] def test_filtering_func(self): - long_names = sorted(list(inventory.filter( - filter_func=lambda x: len(x["my_var"]) > 20).hosts.keys())) - assert long_names == ['dev1.group_1', 'dev4.group_2'] + long_names = sorted( + list( + inventory.filter( + filter_func=lambda x: len(x["my_var"]) > 20 + ).hosts.keys() + ) + ) + assert long_names == ["dev1.group_1", "dev4.group_2"] def longer_than(dev, length): return len(dev["my_var"]) > length - long_names = sorted(list(inventory.filter( - filter_func=longer_than, length=20).hosts.keys())) - assert long_names == ['dev1.group_1', 'dev4.group_2'] + long_names = sorted( + list(inventory.filter(filter_func=longer_than, length=20).hosts.keys()) + ) + assert long_names == ["dev1.group_1", "dev4.group_2"] def test_filter_unique_keys(self): - filtered = sorted(list(inventory.filter(www_server='nginx').hosts.keys())) - assert filtered == ['dev1.group_1'] + filtered = sorted(list(inventory.filter(www_server="nginx").hosts.keys())) + assert filtered == ["dev1.group_1"] def test_var_resolution(self): assert inventory.hosts["dev1.group_1"]["my_var"] == "comes_from_dev1.group_1" @@ -124,9 +185,13 @@ def test_var_resolution(self): assert inventory.hosts["dev3.group_2"]["my_var"] == "comes_from_defaults" assert inventory.hosts["dev4.group_2"]["my_var"] == "comes_from_dev4.group_2" - assert inventory.hosts["dev1.group_1"].data["my_var"] == "comes_from_dev1.group_1" + assert inventory.hosts["dev1.group_1"].data[ + "my_var" + ] == "comes_from_dev1.group_1" with pytest.raises(KeyError): inventory.hosts["dev2.group_1"].data["my_var"] with pytest.raises(KeyError): inventory.hosts["dev3.group_2"].data["my_var"] - assert inventory.hosts["dev4.group_2"].data["my_var"] == "comes_from_dev4.group_2" + assert inventory.hosts["dev4.group_2"].data[ + "my_var" + ] == "comes_from_dev4.group_2" diff --git a/tests/core/test_multithreading.py b/tests/core/test_multithreading.py index f23ae808..2c9f1bcf 100644 --- a/tests/core/test_multithreading.py +++ b/tests/core/test_multithreading.py @@ -88,7 +88,9 @@ def test_failing_task_complex_multithread(self, brigade): def test_failing_task_complex_multithread_raise_on_error(self, brigade): with pytest.raises(BrigadeExecutionError) as e: - brigade.run(failing_task_complex, num_workers=NUM_WORKERS, raise_on_error=True) + brigade.run( + failing_task_complex, num_workers=NUM_WORKERS, raise_on_error=True + ) for k, v in e.value.result.items(): assert isinstance(k, str), k assert isinstance(v.exception, CommandError), v diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index 8389f4d4..13290164 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -6,24 +6,23 @@ def task_fails_for_some(task): if task.host.name == "dev3.group_2": # let's hardcode a failure - task.run(commands.command, - command="sasdasdasd") + task.run(commands.command, command="sasdasdasd") else: - task.run(commands.command, - command="echo {}".format(task.host), - severity=logging.DEBUG) + task.run( + commands.command, + command="echo {}".format(task.host), + severity=logging.DEBUG, + ) def sub_task(task): - task.run(commands.command, - command="echo {}".format(task.host)) + task.run(commands.command, command="echo {}".format(task.host)) class Test(object): def test_task(self, brigade): - result = brigade.run(commands.command, - command="echo hi") + result = brigade.run(commands.command, command="echo hi") assert result for h, r in result.items(): assert r.stdout.strip() == "hi" @@ -78,14 +77,11 @@ def test_run_on(self, brigade): brigade.data.reset_failed_hosts() def test_severity(self, brigade): - r = brigade.run(commands.command, - command="echo blah") + r = brigade.run(commands.command, command="echo blah") for host, result in r.items(): assert result[0].severity == logging.INFO - r = brigade.run(commands.command, - command="echo blah", - severity=logging.WARN) + r = brigade.run(commands.command, command="echo blah", severity=logging.WARN) for host, result in r.items(): assert result[0].severity == logging.WARN diff --git a/tests/plugins/inventory/test_nsot.py b/tests/plugins/inventory/test_nsot.py index 0c1cbc11..ce1740e0 100644 --- a/tests/plugins/inventory/test_nsot.py +++ b/tests/plugins/inventory/test_nsot.py @@ -17,14 +17,15 @@ def transform_function(host): @pytest.fixture(scope="module") def inv(request): """Start/Stop containers needed for the tests.""" + def fin(): - subprocess.check_call(["make", "stop_nsot"], - stderr=subprocess.PIPE, stdout=subprocess.PIPE) + subprocess.check_call( + ["make", "stop_nsot"], stderr=subprocess.PIPE, stdout=subprocess.PIPE + ) request.addfinalizer(fin) - subprocess.check_call(["make", "start_nsot"], - stdout=subprocess.PIPE) + subprocess.check_call(["make", "start_nsot"], stdout=subprocess.PIPE) if os.getenv("TRAVIS"): time.sleep(10) diff --git a/tests/plugins/tasks/apis/test_http_method.py b/tests/plugins/tasks/apis/test_http_method.py index ed821d6e..ad39061d 100644 --- a/tests/plugins/tasks/apis/test_http_method.py +++ b/tests/plugins/tasks/apis/test_http_method.py @@ -61,10 +61,7 @@ def test_with_brigade(self, brigade): url = "http://httpbin.org/get" params = {"my_param": "my_value"} - r = brigade.run(http_method, - method="get", - url=url, - params=params) + r = brigade.run(http_method, method="get", url=url, params=params) processed = False for host, result in r.items(): diff --git a/tests/plugins/tasks/commands/test_command.py b/tests/plugins/tasks/commands/test_command.py index 0497cafb..dac59e19 100644 --- a/tests/plugins/tasks/commands/test_command.py +++ b/tests/plugins/tasks/commands/test_command.py @@ -5,15 +5,13 @@ class Test(object): def test_command(self, brigade): - result = brigade.run(commands.command, - command="echo {host.name}") + result = brigade.run(commands.command, command="echo {host.name}") assert result for h, r in result.items(): assert h == r.stdout.strip() def test_command_error(self, brigade): - result = brigade.run(commands.command, - command="ech") + result = brigade.run(commands.command, command="ech") processed = False for r in result.values(): processed = True @@ -22,8 +20,7 @@ def test_command_error(self, brigade): brigade.data.reset_failed_hosts() def test_command_error_generic(self, brigade): - result = brigade.run(commands.command, - command="ls /asdadsd") + result = brigade.run(commands.command, command="ls /asdadsd") processed = False for r in result.values(): processed = True diff --git a/tests/plugins/tasks/commands/test_remote_command.py b/tests/plugins/tasks/commands/test_remote_command.py index cbc9b054..7f2b89d8 100644 --- a/tests/plugins/tasks/commands/test_remote_command.py +++ b/tests/plugins/tasks/commands/test_remote_command.py @@ -5,15 +5,13 @@ class Test(object): def test_remote_command(self, brigade): - result = brigade.run(commands.remote_command, - command="hostname") + result = brigade.run(commands.remote_command, command="hostname") assert result for h, r in result.items(): assert h == r.stdout.strip() def test_remote_command_error_generic(self, brigade): - result = brigade.run(commands.remote_command, - command="ls /asdadsd") + result = brigade.run(commands.remote_command, command="ls /asdadsd") processed = False for r in result.values(): processed = True diff --git a/tests/plugins/tasks/data/test_load_json.py b/tests/plugins/tasks/data/test_load_json.py index 03352091..a381f25e 100644 --- a/tests/plugins/tasks/data/test_load_json.py +++ b/tests/plugins/tasks/data/test_load_json.py @@ -4,25 +4,23 @@ from brigade.plugins.tasks import data -data_dir = '{}/test_data'.format(os.path.dirname(os.path.realpath(__file__))) +data_dir = "{}/test_data".format(os.path.dirname(os.path.realpath(__file__))) class Test(object): def test_load_json(self, brigade): - test_file = '{}/simple.json'.format(data_dir) - result = brigade.run(data.load_json, - file=test_file) + test_file = "{}/simple.json".format(data_dir) + result = brigade.run(data.load_json, file=test_file) for h, r in result.items(): d = r.result - assert d['env'] == 'test' - assert d['services'] == ['dhcp', 'dns'] + assert d["env"] == "test" + assert d["services"] == ["dhcp", "dns"] def test_load_json_error_broken_file(self, brigade): - test_file = '{}/broken.json'.format(data_dir) - results = brigade.run(data.load_json, - file=test_file) + test_file = "{}/broken.json".format(data_dir) + results = brigade.run(data.load_json, file=test_file) processed = False for result in results.values(): processed = True @@ -31,14 +29,13 @@ def test_load_json_error_broken_file(self, brigade): brigade.data.reset_failed_hosts() def test_load_json_error_missing_file(self, brigade): - test_file = '{}/missing.json'.format(data_dir) + test_file = "{}/missing.json".format(data_dir) if sys.version_info.major == 2: not_found = IOError else: - not_found = FileNotFoundError # noqa + not_found = FileNotFoundError # noqa - results = brigade.run(data.load_json, - file=test_file) + results = brigade.run(data.load_json, file=test_file) processed = False for result in results.values(): processed = True diff --git a/tests/plugins/tasks/data/test_load_yaml.py b/tests/plugins/tasks/data/test_load_yaml.py index c80e69c2..d6c931d6 100644 --- a/tests/plugins/tasks/data/test_load_yaml.py +++ b/tests/plugins/tasks/data/test_load_yaml.py @@ -8,25 +8,23 @@ from yaml.scanner import ScannerError -data_dir = '{}/test_data'.format(os.path.dirname(os.path.realpath(__file__))) +data_dir = "{}/test_data".format(os.path.dirname(os.path.realpath(__file__))) class Test(object): def test_load_yaml(self, brigade): - test_file = '{}/simple.yaml'.format(data_dir) - result = brigade.run(data.load_yaml, - file=test_file) + test_file = "{}/simple.yaml".format(data_dir) + result = brigade.run(data.load_yaml, file=test_file) for h, r in result.items(): d = r.result - assert d['env'] == 'test' - assert d['services'] == ['dhcp', 'dns'] + assert d["env"] == "test" + assert d["services"] == ["dhcp", "dns"] def test_load_yaml_error_broken_file(self, brigade): - test_file = '{}/broken.yaml'.format(data_dir) - results = brigade.run(data.load_yaml, - file=test_file) + test_file = "{}/broken.yaml".format(data_dir) + results = brigade.run(data.load_yaml, file=test_file) processed = False for result in results.values(): processed = True @@ -35,15 +33,14 @@ def test_load_yaml_error_broken_file(self, brigade): brigade.data.reset_failed_hosts() def test_load_yaml_error_missing_file(self, brigade): - test_file = '{}/missing.yaml'.format(data_dir) + test_file = "{}/missing.yaml".format(data_dir) if sys.version_info.major == 2: not_found = IOError else: - not_found = FileNotFoundError # noqa + not_found = FileNotFoundError # noqa - results = brigade.run(data.load_yaml, - file=test_file) + results = brigade.run(data.load_yaml, file=test_file) processed = False for result in results.values(): processed = True diff --git a/tests/plugins/tasks/files/test_sftp.py b/tests/plugins/tasks/files/test_sftp.py index 0e7e4450..ce921300 100644 --- a/tests/plugins/tasks/files/test_sftp.py +++ b/tests/plugins/tasks/files/test_sftp.py @@ -9,31 +9,37 @@ class Test(object): def test_sftp_put(self, brigade): - result = brigade.run(files.sftp, - dry_run=True, - action="put", - src="README.md", - dst="/tmp/README.md") + result = brigade.run( + files.sftp, + dry_run=True, + action="put", + src="README.md", + dst="/tmp/README.md", + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=False, - action="put", - src="README.md", - dst="/tmp/README.md") + result = brigade.run( + files.sftp, + dry_run=False, + action="put", + src="README.md", + dst="/tmp/README.md", + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=True, - action="put", - src="README.md", - dst="/tmp/README.md") + result = brigade.run( + files.sftp, + dry_run=True, + action="put", + src="README.md", + dst="/tmp/README.md", + ) assert result for h, r in result.items(): @@ -41,62 +47,50 @@ def test_sftp_put(self, brigade): def test_sftp_get(self, brigade): filename = "/tmp/" + str(uuid.uuid4()) + "-{host}" - result = brigade.run(files.sftp, - dry_run=True, - action="get", - src="/etc/hostname", - dst=filename) + result = brigade.run( + files.sftp, dry_run=True, action="get", src="/etc/hostname", dst=filename + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=False, - action="get", - src="/etc/hostname", - dst=filename) + result = brigade.run( + files.sftp, dry_run=False, action="get", src="/etc/hostname", dst=filename + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=False, - action="get", - src="/etc/hostname", - dst=filename) + result = brigade.run( + files.sftp, dry_run=False, action="get", src="/etc/hostname", dst=filename + ) assert result for h, r in result.items(): assert not r.changed def test_sftp_put_directory(self, brigade): - result = brigade.run(files.sftp, - dry_run=True, - action="put", - src="./brigade", - dst="/tmp/asd") + result = brigade.run( + files.sftp, dry_run=True, action="put", src="./brigade", dst="/tmp/asd" + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=False, - action="put", - src="./brigade", - dst="/tmp/asd") + result = brigade.run( + files.sftp, dry_run=False, action="put", src="./brigade", dst="/tmp/asd" + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=True, - action="put", - src="./brigade", - dst="/tmp/asd") + result = brigade.run( + files.sftp, dry_run=True, action="put", src="./brigade", dst="/tmp/asd" + ) assert result for h, r in result.items(): @@ -104,31 +98,25 @@ def test_sftp_put_directory(self, brigade): def test_sftp_get_directory(self, brigade): filename = "/tmp/" + str(uuid.uuid4()) + "-{host}" - result = brigade.run(files.sftp, - dry_run=True, - action="get", - src="/etc/terminfo/", - dst=filename) + result = brigade.run( + files.sftp, dry_run=True, action="get", src="/etc/terminfo/", dst=filename + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=False, - action="get", - src="/etc/terminfo/", - dst=filename) + result = brigade.run( + files.sftp, dry_run=False, action="get", src="/etc/terminfo/", dst=filename + ) assert result for h, r in result.items(): assert r.changed, r.files_changed - result = brigade.run(files.sftp, - dry_run=True, - action="get", - src="/etc/terminfo/", - dst=filename) + result = brigade.run( + files.sftp, dry_run=True, action="get", src="/etc/terminfo/", dst=filename + ) assert result for h, r in result.items(): diff --git a/tests/plugins/tasks/files/test_write_file.py b/tests/plugins/tasks/files/test_write_file.py index d85f02f7..b2251cf8 100644 --- a/tests/plugins/tasks/files/test_write_file.py +++ b/tests/plugins/tasks/files/test_write_file.py @@ -72,26 +72,17 @@ def _test_write_file(task): filename = "{}/{}-{}".format(BASEPATH, task.host, str(uuid.uuid4())) - r = task.run(files.write_file, - dry_run=True, - filename=filename, - content=content_a) + r = task.run(files.write_file, dry_run=True, filename=filename, content=content_a) assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write_file, - dry_run=False, - filename=filename, - content=content_a) + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write_file, - dry_run=False, - filename=filename, - content=content_a) + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) assert not r.diff assert not r.changed @@ -100,26 +91,17 @@ def _test_write_file(task): def _test_overwrite_file(task): filename = "{}/{}-{}".format(BASEPATH, task.host, str(uuid.uuid4())) - r = task.run(files.write_file, - dry_run=False, - filename=filename, - content=content_a) + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write_file, - dry_run=False, - filename=filename, - content=content_b) + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_b) assert r.diff.splitlines()[1:] == diff_overwrite_file.splitlines()[1:] assert r.changed - r = task.run(files.write_file, - dry_run=False, - filename=filename, - content=content_b) + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_b) assert not r.diff assert not r.changed @@ -128,19 +110,18 @@ def _test_overwrite_file(task): def _test_append(task): filename = "{}/{}-{}".format(BASEPATH, task.host, str(uuid.uuid4())) - r = task.run(files.write_file, - dry_run=False, - filename=filename, - content=content_a) + r = task.run(files.write_file, dry_run=False, filename=filename, content=content_a) assert r.diff.splitlines()[1:] == diff_new.splitlines()[1:] assert r.changed - r = task.run(files.write_file, - dry_run=False, - filename=filename, - content=content_b, - append=True) + r = task.run( + files.write_file, + dry_run=False, + filename=filename, + content=content_b, + append=True, + ) assert r.diff.splitlines()[1:] == diff_append.splitlines()[1:] assert r.changed diff --git a/tests/plugins/tasks/networking/test_napalm_cli.py b/tests/plugins/tasks/networking/test_napalm_cli.py index 7bc712ff..98a28128 100644 --- a/tests/plugins/tasks/networking/test_napalm_cli.py +++ b/tests/plugins/tasks/networking/test_napalm_cli.py @@ -17,23 +17,24 @@ def test_napalm_cli(self, brigade): opt = {"path": THIS_DIR + "/test_napalm_cli"} d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) - result = d.run(networking.napalm_cli, - commands=["show version", - "show interfaces"]) + result = d.run( + networking.napalm_cli, commands=["show version", "show interfaces"] + ) assert result for h, r in result.items(): assert r.result["show version"] assert r.result["show interfaces"] - # def test_napalm_cli_error(self, brigade): - # opt = {"path": THIS_DIR + "/test_napalm_cli_error"} - # with pytest.raises(BrigadeExecutionError) as e: - # brigade.filter(name="dev3.group_2").run(networking.napalm_cli, - # num_workers=1, - # commands=["show version", - # "show interfacesa"], - # optional_args=opt) - # assert len(e.value.failed_hosts) - # for result in e.value.failed_hosts.values(): - # assert isinstance(result.exception, exceptions.CommandErrorException) - # print(exc) + +# def test_napalm_cli_error(self, brigade): +# opt = {"path": THIS_DIR + "/test_napalm_cli_error"} +# with pytest.raises(BrigadeExecutionError) as e: +# brigade.filter(name="dev3.group_2").run(networking.napalm_cli, +# num_workers=1, +# commands=["show version", +# "show interfacesa"], +# optional_args=opt) +# assert len(e.value.failed_hosts) +# for result in e.value.failed_hosts.values(): +# assert isinstance(result.exception, exceptions.CommandErrorException) +# print(exc) diff --git a/tests/plugins/tasks/networking/test_napalm_configure.py b/tests/plugins/tasks/networking/test_napalm_configure.py index 4d734f1b..8ab1bc75 100644 --- a/tests/plugins/tasks/networking/test_napalm_configure.py +++ b/tests/plugins/tasks/networking/test_napalm_configure.py @@ -26,18 +26,18 @@ def test_napalm_configure_change_commit(self, brigade): configuration = "hostname changed-hostname" d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) - result = d.run(networking.napalm_configure, - dry_run=False, - configuration=configuration) + result = d.run( + networking.napalm_configure, dry_run=False, configuration=configuration + ) assert result for h, r in result.items(): assert "+hostname changed-hostname" in r.diff assert r.changed opt = {"path": THIS_DIR + "/test_napalm_configure_change_commit/step2"} d.run(connections.napalm_connection, optional_args=opt) - result = d.run(networking.napalm_configure, - dry_run=True, - configuration=configuration) + result = d.run( + networking.napalm_configure, dry_run=True, configuration=configuration + ) assert result for h, r in result.items(): assert "+hostname changed-hostname" not in r.diff diff --git a/tests/plugins/tasks/networking/test_napalm_get.py b/tests/plugins/tasks/networking/test_napalm_get.py index 9a826f13..e8dea302 100644 --- a/tests/plugins/tasks/networking/test_napalm_get.py +++ b/tests/plugins/tasks/networking/test_napalm_get.py @@ -12,9 +12,7 @@ def test_napalm_getters(self, brigade): opt = {"path": THIS_DIR + "/test_napalm_getters"} d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) - result = d.run(networking.napalm_get, - getters=["facts", - "interfaces"]) + result = d.run(networking.napalm_get, getters=["facts", "interfaces"]) assert result for h, r in result.items(): assert r.result["facts"] @@ -25,9 +23,7 @@ def test_napalm_getters_error(self, brigade): d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) - results = d.run(networking.napalm_get, - getters=["facts", - "interfaces"]) + results = d.run(networking.napalm_get, getters=["facts", "interfaces"]) processed = False for result in results.values(): processed = True diff --git a/tests/plugins/tasks/networking/test_napalm_validate.py b/tests/plugins/tasks/networking/test_napalm_validate.py index 5a6c3b0a..0a33dbc7 100644 --- a/tests/plugins/tasks/networking/test_napalm_validate.py +++ b/tests/plugins/tasks/networking/test_napalm_validate.py @@ -13,8 +13,9 @@ def test_napalm_validate_src_ok(self, brigade): print(opt["path"]) d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) - result = d.run(networking.napalm_validate, - src=THIS_DIR + "/data/validate_ok.yaml") + result = d.run( + networking.napalm_validate, src=THIS_DIR + "/data/validate_ok.yaml" + ) assert result for h, r in result.items(): assert not r.failed @@ -25,8 +26,9 @@ def test_napalm_validate_src_error(self, brigade): d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) - result = d.run(networking.napalm_validate, - src=THIS_DIR + "/data/validate_error.yaml") + result = d.run( + networking.napalm_validate, src=THIS_DIR + "/data/validate_error.yaml" + ) assert result for h, r in result.items(): assert not r.failed @@ -38,12 +40,9 @@ def test_napalm_validate_src_validate_source(self, brigade): d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) - validation_dict = [ - {"get_interfaces": {"Ethernet1": {"description": ""}}} - ] + validation_dict = [{"get_interfaces": {"Ethernet1": {"description": ""}}}] - result = d.run(networking.napalm_validate, - validation_source=validation_dict) + result = d.run(networking.napalm_validate, validation_source=validation_dict) assert result for h, r in result.items(): diff --git a/tests/plugins/tasks/networking/test_netmiko_file_transfer.py b/tests/plugins/tasks/networking/test_netmiko_file_transfer.py index 874ff53c..ef67c407 100644 --- a/tests/plugins/tasks/networking/test_netmiko_file_transfer.py +++ b/tests/plugins/tasks/networking/test_netmiko_file_transfer.py @@ -6,13 +6,16 @@ class Test(object): + def test_netmiko_file_transfer(self, brigade): - source_file = os.path.join(THIS_DIR, 'data', 'test_file.txt') - dest_file = 'test_file.txt' - result = brigade.filter(name="dev4.group_2").run(networking.netmiko_file_transfer, - source_file=source_file, - dest_file=dest_file, - direction='put') + source_file = os.path.join(THIS_DIR, "data", "test_file.txt") + dest_file = "test_file.txt" + result = brigade.filter(name="dev4.group_2").run( + networking.netmiko_file_transfer, + source_file=source_file, + dest_file=dest_file, + direction="put", + ) assert result for h, r in result.items(): assert r.result diff --git a/tests/plugins/tasks/networking/test_netmiko_send_command.py b/tests/plugins/tasks/networking/test_netmiko_send_command.py index 4cdf1581..8c0021ae 100644 --- a/tests/plugins/tasks/networking/test_netmiko_send_command.py +++ b/tests/plugins/tasks/networking/test_netmiko_send_command.py @@ -5,22 +5,24 @@ class Test(object): def test_explicit_netmiko_connection(self, brigade): brigade.filter(name="dev4.group_2").run(task=connections.netmiko_connection) - result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_command, - command_string="hostname") + result = brigade.filter(name="dev4.group_2").run( + networking.netmiko_send_command, command_string="hostname" + ) assert result for h, r in result.items(): assert h == r.result.strip() def test_netmiko_send_command(self, brigade): - result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_command, - command_string="hostname") + result = brigade.filter(name="dev4.group_2").run( + networking.netmiko_send_command, command_string="hostname" + ) assert result for h, r in result.items(): assert h == r.result.strip() - result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_command, - command_string="hostname", - use_timing=True) + result = brigade.filter(name="dev4.group_2").run( + networking.netmiko_send_command, command_string="hostname", use_timing=True + ) assert result for h, r in result.items(): assert h == r.result.strip() diff --git a/tests/plugins/tasks/networking/test_netmiko_send_config.py b/tests/plugins/tasks/networking/test_netmiko_send_config.py index 96844527..42be8e53 100644 --- a/tests/plugins/tasks/networking/test_netmiko_send_config.py +++ b/tests/plugins/tasks/networking/test_netmiko_send_config.py @@ -5,15 +5,17 @@ class Test(object): def test_explicit_netmiko_connection(self, brigade): brigade.filter(name="dev4.group_2").run(task=connections.netmiko_connection) - result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_config, - config_commands="hostname") + result = brigade.filter(name="dev4.group_2").run( + networking.netmiko_send_config, config_commands="hostname" + ) assert result for h, r in result.items(): assert h in r.result.strip() def test_netmiko_send_command(self, brigade): - result = brigade.filter(name="dev4.group_2").run(networking.netmiko_send_config, - config_commands="hostname") + result = brigade.filter(name="dev4.group_2").run( + networking.netmiko_send_config, config_commands="hostname" + ) assert result for h, r in result.items(): assert h in r.result.strip() diff --git a/tests/plugins/tasks/networking/test_tcp_ping.py b/tests/plugins/tasks/networking/test_tcp_ping.py index 2a33e3d9..b220496e 100644 --- a/tests/plugins/tasks/networking/test_tcp_ping.py +++ b/tests/plugins/tasks/networking/test_tcp_ping.py @@ -7,7 +7,7 @@ cur_dir = os.path.dirname(os.path.realpath(__file__)) -ext_inv_file = '{}/../../../inventory_data/external_hosts.yaml'.format(cur_dir) +ext_inv_file = "{}/../../../inventory_data/external_hosts.yaml".format(cur_dir) class Test(object): @@ -30,8 +30,7 @@ def test_tcp_ping_ports(self, brigade): assert r.tcp_port[65004] def test_tcp_ping_invalid_port(self, brigade): - results = brigade.run(networking.tcp_ping, - ports='web') + results = brigade.run(networking.tcp_ping, ports="web") processed = False for result in results.values(): processed = True @@ -40,8 +39,7 @@ def test_tcp_ping_invalid_port(self, brigade): brigade.data.reset_failed_hosts() def test_tcp_ping_invalid_ports(self, brigade): - results = brigade.run(networking.tcp_ping, - ports=[22, 'web', 443]) + results = brigade.run(networking.tcp_ping, ports=[22, "web", 443]) processed = False for result in results.values(): processed = True @@ -56,7 +54,7 @@ def test_tcp_ping_external_hosts(): assert result for h, r in result.items(): - if h == 'www.github.com': + if h == "www.github.com": assert r.tcp_port[23] is False assert r.tcp_port[443] else: diff --git a/tests/plugins/tasks/text/test_template_file.py b/tests/plugins/tasks/text/test_template_file.py index f8b6fc21..83384ddf 100644 --- a/tests/plugins/tasks/text/test_template_file.py +++ b/tests/plugins/tasks/text/test_template_file.py @@ -6,28 +6,24 @@ from jinja2 import TemplateSyntaxError -data_dir = '{}/test_data'.format(os.path.dirname(os.path.realpath(__file__))) +data_dir = "{}/test_data".format(os.path.dirname(os.path.realpath(__file__))) class Test(object): def test_template_file(self, brigade): - result = brigade.run(text.template_file, - template='simple.j2', - path=data_dir) + result = brigade.run(text.template_file, template="simple.j2", path=data_dir) assert result for h, r in result.items(): assert h in r.result - if h == 'host3.group_2': - assert 'my_var: comes_from_all' in r.result - if h == 'host4.group_2': - assert 'my_var: comes_from_host4.group_2' in r.result + if h == "host3.group_2": + assert "my_var: comes_from_all" in r.result + if h == "host4.group_2": + assert "my_var: comes_from_host4.group_2" in r.result def test_template_file_error_broken_file(self, brigade): - results = brigade.run(text.template_file, - template='broken.j2', - path=data_dir) + results = brigade.run(text.template_file, template="broken.j2", path=data_dir) processed = False for result in results.values(): processed = True diff --git a/tests/plugins/tasks/text/test_template_string.py b/tests/plugins/tasks/text/test_template_string.py index 2707792a..9716d7ef 100644 --- a/tests/plugins/tasks/text/test_template_string.py +++ b/tests/plugins/tasks/text/test_template_string.py @@ -5,43 +5,41 @@ from jinja2 import TemplateSyntaxError -data_dir = '{}/test_data'.format(os.path.dirname(os.path.realpath(__file__))) +data_dir = "{}/test_data".format(os.path.dirname(os.path.realpath(__file__))) -simple_j2 = ''' +simple_j2 = """ host-name: {{ host }} my_var: {{ my_var}} -''' +""" -broken_j2 = ''' +broken_j2 = """ #Broken template host-name {{ host my_var: {{ my_var}} -''' +""" class Test(object): def test_template_string(self, brigade): - result = brigade.run(text.template_string, - template=simple_j2) + result = brigade.run(text.template_string, template=simple_j2) assert result for h, r in result.items(): - assert 'host-name: {}'.format(h) in r.result - if h == 'host1.group_1': - assert 'my_var: comes_from_host1.group_1' in r.result - if h == 'host2.group_1': - assert 'my_var: comes_from_group_1' in r.result + assert "host-name: {}".format(h) in r.result + if h == "host1.group_1": + assert "my_var: comes_from_host1.group_1" in r.result + if h == "host2.group_1": + assert "my_var: comes_from_group_1" in r.result def test_template_string_error_broken_string(self, brigade): - results = brigade.run(text.template_string, - template=broken_j2) + results = brigade.run(text.template_string, template=broken_j2) processed = False for result in results.values(): processed = True From 73f9b94643affcedd0ff969cadf7e84463e28b76 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Thu, 5 Apr 2018 14:58:20 +0200 Subject: [PATCH 56/77] Fix setup.py in preparation for pip10 Remove: try: from setuptools import find_packages, setup except ImportError: from distutils.core import setup As find_packages is used regardless later in the script this section didn't make sense. --- setup.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index dc1ba49c..6d4f34ec 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,8 @@ #!/usr/bin/env python -import uuid - -try: - from setuptools import find_packages, setup -except ImportError: - from distutils.core import setup - -from pip.req import parse_requirements - -install_reqs = parse_requirements("requirements.txt", session=uuid.uuid1()) -reqs = [str(ir.req) for ir in install_reqs] +from setuptools import find_packages, setup +with open('requirements.txt', 'r') as fs: + reqs = [r for r in fs.read().splitlines() if (len(r) > 0 and not r.startswith("#"))] __author__ = "dbarrosop@dravetech.com" __license__ = "Apache License, version 2" From 164caf00f33135e2580149f03a5fea0834fec137 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Thu, 5 Apr 2018 15:26:39 +0200 Subject: [PATCH 57/77] =?UTF-8?q?Swap=20'=20to=20"=20to=20make=20Black=20?= =?UTF-8?q?=E2=9C=A8=20=F0=9F=8D=B0=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 6d4f34ec..13867764 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from setuptools import find_packages, setup -with open('requirements.txt', 'r') as fs: +with open("requirements.txt", "r") as fs: reqs = [r for r in fs.read().splitlines() if (len(r) > 0 and not r.startswith("#"))] __author__ = "dbarrosop@dravetech.com" From 2d4af2d511df07b72e1b37d1d2904b0b28e52245 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Sun, 8 Apr 2018 10:46:09 +0200 Subject: [PATCH 58/77] Contribution guidelines (#106) --- CONTRIBUTING.rst | 96 +++++++++++++++++++++++++++++++++++++ Makefile | 9 ++++ README.md | 12 +++-- docs/contributing/index.rst | 1 + docs/index.rst | 1 + requirements-dev.txt | 1 + 6 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 CONTRIBUTING.rst create mode 120000 docs/contributing/index.rst diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 00000000..a4d9db54 --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,96 @@ +How to contribute to Brigade +============================ + +First of all, thank you for conidering to contribute to this project! + +Several ways to contribute +-------------------------- + +There are several things you can do to help the project. + +- Spread the word about Brigade +- Suggest great features +- Report bugs +- Fix typos +- Write documentation +- Contribute your plugins +- Improve the Brigade core + +Spread the word about Brigade +----------------------------- + +Even if you aren't in the position that you can contribute your time to this project, it still helps us if you spread the word about the project. It could be just a short notice in social media or a discussion you have with your friends. As more people become aware of the project there's a better chance that we reach people who are able to contribute. So, even if you can't directly contribute yourself, someone you refer to us might. + +Suggesting new features +----------------------- + +It could be that you are aware of something that would be great to have in Brigade and we are always welcoming feature requests. Make sure you explain in what scenario your suggested feature would be useful. + +Reporting bugs +-------------- + +When you are `reporting bugs `_, make sure that you give a explaination about the outcome that you expect and what you are seeing. The bugs which are hardest to fix are the ones which we are unable to reproduce. For this reason it's important that you describe what you did and show us how we can reproduce the bug in another environment. + +Fix typos +--------- + +While we try to take care, getting all the works correct can be.. differcult. Typos are the easiest things to fix and if you find any you can help us from looking silly. You can find more typos to fix by looking in the `Brigade source code `_ or by visiting the `Brigade documentation `_. + +Writing documentation +--------------------- + +Documentation is another great way to help if you don't want to contribute actual code. The documentation of Brigade is divided into different sections. + +- Tutorials: Aims to help people learn Brigade with a lot of handholding, the user might not end up with something useful after following the tutorial. The goal is for people to learn how to use Brigade. +- How-to guides: This sections goal is to help people solve a specific task with Brigade +- Reference guides: This section describe the Brigade API and plugins. Most of the content in this area is generated from the source code itself. + +Contributions to the documentation can be small fixes such as changing scentences to make the text more clear, or it could be new guides. + +Contributing plugins +-------------------- + +If you have written your custom plugin for Brigade there's a good chance that it can be useful for others as well. General guidelines when writing plugins are: + +- Make them as generic as possible, it doesn't help others if they only work in your environment +- Make sure that it's possible to have unit tests which automatically test that the plugins are working + + +Contributing to the Brigade core +-------------------------------- + +When you are contributing code to the core of Brigade make sure that the existing tests are passing, and add tests to the code you have added. Having your tests in place ensures that other won't accidentally brake it in the future. + +Before you make any significant code changes to the core it's recommended that you open an issue to discuss your ideas before writing the code. + +Setting up your environment +--------------------------- + +In order to run tests locally you need to have `Docker `_ and `Pandoc `_ installed. Docker is used to test the Brigade plugins and Pandoc is required for building the documentation provided by `Sphinx `_. After those are installed you can go ahead and install the needed Python dependencies. + +.. code-block:: bash + + pip -r requirements-dev.txt + +Running tests +------------- + +While the automated tests will be triggered when you submit a new pull request it can still save you time to run the tests locally first. + +.. code-block:: bash + + make tests + +The test above will run the tests against the Brigade code and documentation. + + +Coding style +------------ + +Brigade uses `Black `_, the the uncompromising Python code formatter. Black makes it easy for you to format your code as you can do so automatically after installing it. Note that Python 3.6 is required to run Black. + +.. code-block:: bash + + make format + +The Black GitHub repo has information about how you can integrate Black in your editor. diff --git a/Makefile b/Makefile index 0bda571b..493bf02b 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,8 @@ + +.PHONY: format +format: + black . + .PHONY: start_nsot start_nsot: cp $(PWD)/tests/inventory_data/nsot/nsot.sqlite3 $(PWD)/tests/inventory_data/nsot/nsot-docker.sqlite3 @@ -6,3 +11,7 @@ start_nsot: .PHONY: stop_nsot stop_nsot: docker rm -f nsot + +.PHONY: tests +tests: + tox diff --git a/README.md b/README.md index 76ed025f..6f69a953 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,13 @@ Bugs & New features If you think you have bug or would like to request a new feature, please register a GitHub account and [open an issue](https://github.com/brigade-automation/brigade/issues). -Contact -======= +Contact & Support +================= + +While we are happy to help, the [GitHub issues]() are intended for bugs and discussions about new features. If are struggling to get something to work but don't believe its due to a bug in Brigade, the place to ask questions is in the #brigade channel in the [networktoCode Slack team](https://networktocode.herokuapp.com/). + + +Contributing to Brigade +======================= -Slack is probably the easiest way to get help with Brigade. You can find us in the `brigade` channel on the [networktoCode()](https://networktocode.herokuapp.com/) team. +If you want to help the project, the [Contribution Guidelines](CONTRIBUTING.rst) is the best place to start. diff --git a/docs/contributing/index.rst b/docs/contributing/index.rst new file mode 120000 index 00000000..e9a8ba64 --- /dev/null +++ b/docs/contributing/index.rst @@ -0,0 +1 @@ +../../CONTRIBUTING.rst \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 30e876e1..dec62677 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -99,6 +99,7 @@ Contents Tutorials Howto ref/index + Contribute Indices and tables diff --git a/requirements-dev.txt b/requirements-dev.txt index cb638680..0e4ede4d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -3,4 +3,5 @@ pytest-cov pylama flake8-import-order tox +black; python_version >= '3.6' -r requirements.txt From 98e3acdb9d09c3937e22c5bf5c5cd10732552b30 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sun, 8 Apr 2018 10:47:05 +0200 Subject: [PATCH 59/77] Added AnsibleInventory (#101) --- brigade/plugins/inventory/ansible.py | 194 ++++++++++++++++++ docs/ref/inventory/ansible.rst | 6 + docs/ref/inventory/index.rst | 1 + requirements.txt | 1 + .../ansible/ini/expected/groups.yaml | 19 ++ .../inventory/ansible/ini/expected/hosts.yaml | 21 ++ .../ansible/ini/source/group_vars/all | 3 + .../ansible/ini/source/group_vars/dbservers | 3 + .../ini/source/host_vars/one.example.com | 2 + .../ini/source/host_vars/two.example.com | 2 + .../inventory/ansible/ini/source/hosts | 21 ++ .../ansible/parse_error/source/hosts | 6 + .../ansible/yaml/expected/groups.yaml | 19 ++ .../ansible/yaml/expected/hosts.yaml | 21 ++ .../ansible/yaml/source/group_vars/all | 3 + .../ansible/yaml/source/group_vars/dbservers | 3 + .../yaml/source/host_vars/one.example.com | 2 + .../yaml/source/host_vars/two.example.com | 2 + .../inventory/ansible/yaml/source/hosts | 24 +++ .../ansible/yaml2/expected/groups.yaml | 1 + .../ansible/yaml2/expected/hosts.yaml | 9 + .../inventory/ansible/yaml2/source/hosts | 8 + tests/plugins/inventory/test_ansible.py | 50 +++++ 23 files changed, 421 insertions(+) create mode 100644 brigade/plugins/inventory/ansible.py create mode 100644 docs/ref/inventory/ansible.rst create mode 100644 tests/plugins/inventory/ansible/ini/expected/groups.yaml create mode 100644 tests/plugins/inventory/ansible/ini/expected/hosts.yaml create mode 100644 tests/plugins/inventory/ansible/ini/source/group_vars/all create mode 100644 tests/plugins/inventory/ansible/ini/source/group_vars/dbservers create mode 100644 tests/plugins/inventory/ansible/ini/source/host_vars/one.example.com create mode 100644 tests/plugins/inventory/ansible/ini/source/host_vars/two.example.com create mode 100644 tests/plugins/inventory/ansible/ini/source/hosts create mode 100644 tests/plugins/inventory/ansible/parse_error/source/hosts create mode 100644 tests/plugins/inventory/ansible/yaml/expected/groups.yaml create mode 100644 tests/plugins/inventory/ansible/yaml/expected/hosts.yaml create mode 100644 tests/plugins/inventory/ansible/yaml/source/group_vars/all create mode 100644 tests/plugins/inventory/ansible/yaml/source/group_vars/dbservers create mode 100644 tests/plugins/inventory/ansible/yaml/source/host_vars/one.example.com create mode 100644 tests/plugins/inventory/ansible/yaml/source/host_vars/two.example.com create mode 100644 tests/plugins/inventory/ansible/yaml/source/hosts create mode 100644 tests/plugins/inventory/ansible/yaml2/expected/groups.yaml create mode 100644 tests/plugins/inventory/ansible/yaml2/expected/hosts.yaml create mode 100644 tests/plugins/inventory/ansible/yaml2/source/hosts create mode 100644 tests/plugins/inventory/test_ansible.py diff --git a/brigade/plugins/inventory/ansible.py b/brigade/plugins/inventory/ansible.py new file mode 100644 index 00000000..6f3594ad --- /dev/null +++ b/brigade/plugins/inventory/ansible.py @@ -0,0 +1,194 @@ +try: + import configparser as cp +except ImportError: + import ConfigParser as cp +import logging +import os +from builtins import super + +from brigade.core.inventory import Inventory + +import ruamel.yaml + + +logger = logging.getLogger("brigade") + + +class AnsibleParser(object): + + def __init__(self, hostsfile): + self.hostsfile = hostsfile + self.path = os.path.dirname(hostsfile) + self.hosts = {} + self.groups = {} + self.original_data = None + self.load_hosts_file() + + def parse_group(self, group, data, parent=None): + data = data or {} + if group == "defaults": + self.groups[group] = {} + group_file = "all" + else: + self.add(group, self.groups) + group_file = group + + if parent and parent != "defaults": + self.groups[group]["groups"].append(parent) + + self.groups[group].update(data.get("vars", {})) + self.groups[group].update(self.read_vars_file(group_file, self.path, False)) + self.groups[group] = self.map_brigade_vars(self.groups[group]) + + self.parse_hosts(data.get("hosts", {}), parent=group) + + for children, children_data in data.get("children", {}).items(): + self.parse_group(children, children_data, parent=group) + + def parse(self): + self.parse_group("defaults", self.original_data["all"]) + self.sort_groups() + + def parse_hosts(self, hosts, parent=None): + for host, data in hosts.items(): + data = data or {} + self.add(host, self.hosts) + if parent and parent != "defaults": + self.hosts[host]["groups"].append(parent) + self.hosts[host].update(data) + self.hosts[host].update(self.read_vars_file(host, self.path, True)) + self.hosts[host] = self.map_brigade_vars(self.hosts[host]) + + def sort_groups(self): + for host in self.hosts.values(): + host["groups"].sort() + + for name, group in self.groups.items(): + if name == "defaults": + continue + + group["groups"].sort() + + def read_vars_file(self, element, path, is_host=True): + subdir = "host_vars" if is_host else "group_vars" + filepath = os.path.join(path, subdir, element) + + if not os.path.exists(filepath): + logger.debug( + "AnsibleInventory: var file doesn't exist: {}".format(filepath) + ) + return {} + + with open(filepath, "r") as f: + logger.debug("AnsibleInventory: reading var file: {}".format(filepath)) + yml = ruamel.yaml.YAML(typ="rt", pure=True) + return yml.load(f) + + def map_brigade_vars(self, obj): + mappings = { + "ansible_host": "brigade_host", + "ansible_port": "brigade_ssh_port", + "ansible_user": "brigade_username", + "ansible_password": "brigade_password", + } + result = {} + for k, v in obj.items(): + if k in mappings: + result[mappings[k]] = v + else: + result[k] = v + return result + + def add(self, element, element_dict): + if element not in element_dict: + element_dict[element] = {"groups": []} + + +class INIParser(AnsibleParser): + + def normalize_content(self, content): + result = {} + + if not content: + return result + + for option in content.split(): + k, v = option.split("=") + try: + v = int(v) + except Exception: + pass + result[k] = v + + return result + + def normalize(self, data): + result = {} + for k, v in data.items(): + meta = None + if ":" in k: + k, meta = k.split(":") + if k not in result: + result[k] = {} + + if meta not in result[k]: + result[k][meta] = {} + + if meta == "vars": + for data, _ in v.items(): + result[k][meta].update(self.normalize_content(data)) + elif meta == "children": + result[k][meta] = {k: {} for k, _ in v.items()} + else: + result[k]["hosts"] = { + host: self.normalize_content(data) for host, data in v.items() + } + return result + + def load_hosts_file(self): + original_data = cp.ConfigParser( + interpolation=None, allow_no_value=True, delimiters=" " + ) + original_data.read(self.hostsfile) + data = self.normalize(original_data) + data.pop("DEFAULT") + if "all" not in data: + self.original_data = {"all": {"children": data}} + + +class YAMLParser(AnsibleParser): + + def load_hosts_file(self): + with open(self.hostsfile, "r") as f: + yml = ruamel.yaml.YAML(typ="rt", pure=True) + self.original_data = yml.load(f.read()) + + +def parse(hostsfile): + try: + parser = INIParser(hostsfile) + except cp.Error: + try: + parser = YAMLParser(hostsfile) + except ruamel.yaml.scanner.ScannerError: + logger.error( + "couldn't parse '{}' as neither a ini nor yaml file".format(hostsfile) + ) + raise + + parser.parse() + return parser.hosts, parser.groups + + +class AnsibleInventory(Inventory): + """ + Inventory plugin that is capable of reading an ansible inventory. + + Arguments: + hostsfile (string): Path to the hostsfile + """ + + def __init__(self, hostsfile="hosts", **kwargs): + host_vars, group_vars = parse(hostsfile) + defaults = group_vars.pop("defaults") + super().__init__(host_vars, group_vars, defaults, **kwargs) diff --git a/docs/ref/inventory/ansible.rst b/docs/ref/inventory/ansible.rst new file mode 100644 index 00000000..1ac77b8b --- /dev/null +++ b/docs/ref/inventory/ansible.rst @@ -0,0 +1,6 @@ +Ansible +======= + +.. automodule:: brigade.plugins.inventory.ansible + :members: + :undoc-members: diff --git a/docs/ref/inventory/index.rst b/docs/ref/inventory/index.rst index cf659aea..7dce44fa 100644 --- a/docs/ref/inventory/index.rst +++ b/docs/ref/inventory/index.rst @@ -8,4 +8,5 @@ Inventory :caption: Categories: simple + ansible nsot diff --git a/requirements.txt b/requirements.txt index ae0028a5..12396b0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,4 @@ netmiko>=2.1.1 paramiko future requests +ruamel.yaml diff --git a/tests/plugins/inventory/ansible/ini/expected/groups.yaml b/tests/plugins/inventory/ansible/ini/expected/groups.yaml new file mode 100644 index 00000000..c0d2d5e4 --- /dev/null +++ b/tests/plugins/inventory/ansible/ini/expected/groups.yaml @@ -0,0 +1,19 @@ +dbservers: + groups: + - servers + my_var: from_dbservers + my_yet_another_var: from_dbservers +defaults: + my_other_var: from_all + my_var: from_all +frontend: + groups: [] +servers: + escape_pods: 2 + groups: [] + halon_system_timeout: 30 + self_destruct_countdown: 60 + some_server: foo.southeast.example.com +webservers: + groups: + - servers diff --git a/tests/plugins/inventory/ansible/ini/expected/hosts.yaml b/tests/plugins/inventory/ansible/ini/expected/hosts.yaml new file mode 100644 index 00000000..cf9682ef --- /dev/null +++ b/tests/plugins/inventory/ansible/ini/expected/hosts.yaml @@ -0,0 +1,21 @@ +bar.example.com: + groups: + - webservers +foo.example.com: + groups: + - frontend + - webservers +one.example.com: + groups: + - dbservers + my_var: from_one.example.com +three.example.com: + brigade_host: 192.0.2.50 + brigade_ssh_port: 5555 + groups: + - dbservers +two.example.com: + groups: + - dbservers + my_var: from_hostfile + whatever: asdasd diff --git a/tests/plugins/inventory/ansible/ini/source/group_vars/all b/tests/plugins/inventory/ansible/ini/source/group_vars/all new file mode 100644 index 00000000..13cb84ea --- /dev/null +++ b/tests/plugins/inventory/ansible/ini/source/group_vars/all @@ -0,0 +1,3 @@ +--- +my_var: from_all +my_other_var: from_all diff --git a/tests/plugins/inventory/ansible/ini/source/group_vars/dbservers b/tests/plugins/inventory/ansible/ini/source/group_vars/dbservers new file mode 100644 index 00000000..443b50c8 --- /dev/null +++ b/tests/plugins/inventory/ansible/ini/source/group_vars/dbservers @@ -0,0 +1,3 @@ +--- +my_var: from_dbservers +my_yet_another_var: from_dbservers diff --git a/tests/plugins/inventory/ansible/ini/source/host_vars/one.example.com b/tests/plugins/inventory/ansible/ini/source/host_vars/one.example.com new file mode 100644 index 00000000..a011cd08 --- /dev/null +++ b/tests/plugins/inventory/ansible/ini/source/host_vars/one.example.com @@ -0,0 +1,2 @@ +--- +my_var: from_one.example.com diff --git a/tests/plugins/inventory/ansible/ini/source/host_vars/two.example.com b/tests/plugins/inventory/ansible/ini/source/host_vars/two.example.com new file mode 100644 index 00000000..9d27cf13 --- /dev/null +++ b/tests/plugins/inventory/ansible/ini/source/host_vars/two.example.com @@ -0,0 +1,2 @@ +--- +whatever: asdasd diff --git a/tests/plugins/inventory/ansible/ini/source/hosts b/tests/plugins/inventory/ansible/ini/source/hosts new file mode 100644 index 00000000..4eeea252 --- /dev/null +++ b/tests/plugins/inventory/ansible/ini/source/hosts @@ -0,0 +1,21 @@ +[webservers] +foo.example.com +bar.example.com + +[dbservers] +one.example.com +two.example.com my_var=from_hostfile +three.example.com ansible_port=5555 ansible_host=192.0.2.50 + +[frontend] +foo.example.com + +[servers:children] +webservers +dbservers + +[servers:vars] +some_server=foo.southeast.example.com +halon_system_timeout=30 +self_destruct_countdown=60 +escape_pods=2 diff --git a/tests/plugins/inventory/ansible/parse_error/source/hosts b/tests/plugins/inventory/ansible/parse_error/source/hosts new file mode 100644 index 00000000..d2e91f22 --- /dev/null +++ b/tests/plugins/inventory/ansible/parse_error/source/hosts @@ -0,0 +1,6 @@ +asdas +das +das +das +dasdasdasdasd=asd adadsad +asdasdasd: qqwewqe diff --git a/tests/plugins/inventory/ansible/yaml/expected/groups.yaml b/tests/plugins/inventory/ansible/yaml/expected/groups.yaml new file mode 100644 index 00000000..c0d2d5e4 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml/expected/groups.yaml @@ -0,0 +1,19 @@ +dbservers: + groups: + - servers + my_var: from_dbservers + my_yet_another_var: from_dbservers +defaults: + my_other_var: from_all + my_var: from_all +frontend: + groups: [] +servers: + escape_pods: 2 + groups: [] + halon_system_timeout: 30 + self_destruct_countdown: 60 + some_server: foo.southeast.example.com +webservers: + groups: + - servers diff --git a/tests/plugins/inventory/ansible/yaml/expected/hosts.yaml b/tests/plugins/inventory/ansible/yaml/expected/hosts.yaml new file mode 100644 index 00000000..cf9682ef --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml/expected/hosts.yaml @@ -0,0 +1,21 @@ +bar.example.com: + groups: + - webservers +foo.example.com: + groups: + - frontend + - webservers +one.example.com: + groups: + - dbservers + my_var: from_one.example.com +three.example.com: + brigade_host: 192.0.2.50 + brigade_ssh_port: 5555 + groups: + - dbservers +two.example.com: + groups: + - dbservers + my_var: from_hostfile + whatever: asdasd diff --git a/tests/plugins/inventory/ansible/yaml/source/group_vars/all b/tests/plugins/inventory/ansible/yaml/source/group_vars/all new file mode 100644 index 00000000..13cb84ea --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml/source/group_vars/all @@ -0,0 +1,3 @@ +--- +my_var: from_all +my_other_var: from_all diff --git a/tests/plugins/inventory/ansible/yaml/source/group_vars/dbservers b/tests/plugins/inventory/ansible/yaml/source/group_vars/dbservers new file mode 100644 index 00000000..443b50c8 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml/source/group_vars/dbservers @@ -0,0 +1,3 @@ +--- +my_var: from_dbservers +my_yet_another_var: from_dbservers diff --git a/tests/plugins/inventory/ansible/yaml/source/host_vars/one.example.com b/tests/plugins/inventory/ansible/yaml/source/host_vars/one.example.com new file mode 100644 index 00000000..a011cd08 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml/source/host_vars/one.example.com @@ -0,0 +1,2 @@ +--- +my_var: from_one.example.com diff --git a/tests/plugins/inventory/ansible/yaml/source/host_vars/two.example.com b/tests/plugins/inventory/ansible/yaml/source/host_vars/two.example.com new file mode 100644 index 00000000..9d27cf13 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml/source/host_vars/two.example.com @@ -0,0 +1,2 @@ +--- +whatever: asdasd diff --git a/tests/plugins/inventory/ansible/yaml/source/hosts b/tests/plugins/inventory/ansible/yaml/source/hosts new file mode 100644 index 00000000..9fca5c31 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml/source/hosts @@ -0,0 +1,24 @@ +all: + children: + servers: + children: + webservers: + hosts: + foo.example.com: + bar.example.com: + dbservers: + hosts: + one.example.com: + two.example.com: + my_var: from_hostfile + three.example.com: + ansible_port: 5555 + ansible_host: 192.0.2.50 + vars: + some_server: foo.southeast.example.com + halon_system_timeout: 30 + self_destruct_countdown: 60 + escape_pods: 2 + frontend: + hosts: + foo.example.com: diff --git a/tests/plugins/inventory/ansible/yaml2/expected/groups.yaml b/tests/plugins/inventory/ansible/yaml2/expected/groups.yaml new file mode 100644 index 00000000..914dee95 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml2/expected/groups.yaml @@ -0,0 +1 @@ +defaults: {} diff --git a/tests/plugins/inventory/ansible/yaml2/expected/hosts.yaml b/tests/plugins/inventory/ansible/yaml2/expected/hosts.yaml new file mode 100644 index 00000000..5e746bb5 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml2/expected/hosts.yaml @@ -0,0 +1,9 @@ +one.example.com: + groups: [] +three.example.com: + brigade_host: 192.0.2.50 + brigade_ssh_port: 5555 + groups: [] +two.example.com: + groups: [] + my_var: from_hostfile diff --git a/tests/plugins/inventory/ansible/yaml2/source/hosts b/tests/plugins/inventory/ansible/yaml2/source/hosts new file mode 100644 index 00000000..671ff524 --- /dev/null +++ b/tests/plugins/inventory/ansible/yaml2/source/hosts @@ -0,0 +1,8 @@ +all: + hosts: + one.example.com: + two.example.com: + my_var: from_hostfile + three.example.com: + ansible_port: 5555 + ansible_host: 192.0.2.50 diff --git a/tests/plugins/inventory/test_ansible.py b/tests/plugins/inventory/test_ansible.py new file mode 100644 index 00000000..78ed75dc --- /dev/null +++ b/tests/plugins/inventory/test_ansible.py @@ -0,0 +1,50 @@ +import os + +from brigade.plugins.inventory import ansible + +import pytest + +import ruamel.yaml + + +BASE_PATH = os.path.join(os.path.dirname(__file__), "ansible") + + +def save(hosts, groups, hosts_file, groups_file): + yml = ruamel.yaml.YAML(typ="safe", pure=True) + with open(hosts_file, "w+") as f: + f.write(yml.dump(hosts, default_flow_style=False)) + with open(groups_file, "w+") as f: + f.write(yml.dump(groups, default_flow_style=False)) + + +def read(hosts_file, groups_file): + yml = ruamel.yaml.YAML(typ="safe") + with open(hosts_file, "r") as f: + hosts = yml.load(f.read()) + with open(groups_file, "r") as f: + groups = yml.load(f.read()) + return hosts, groups + + +class Test(object): + + @pytest.mark.parametrize("case", ["ini", "yaml", "yaml2"]) + def test_inventory(self, case): + base_path = os.path.join(BASE_PATH, case) + hosts_file = os.path.join(base_path, "expected", "hosts.yaml") + groups_file = os.path.join(base_path, "expected", "groups.yaml") + + hosts, groups = ansible.parse( + hostsfile=os.path.join(base_path, "source", "hosts") + ) + # save(hosts, groups, hosts_file, groups_file) + + expected_hosts, expected_groups = read(hosts_file, groups_file) + assert hosts == expected_hosts + assert groups == expected_groups + + def test_parse_error(self): + base_path = os.path.join(BASE_PATH, "parse_error") + with pytest.raises(ruamel.yaml.scanner.ScannerError): + ansible.parse(hostsfile=os.path.join(base_path, "source", "hosts")) From aad786a5f2cd1bc095deb724b272011325bd0a6b Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Sun, 8 Apr 2018 10:47:21 +0200 Subject: [PATCH 60/77] Coverage (#111) --- .travis.yml | 3 +++ README.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 792ea1b2..5680b5c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,3 +30,6 @@ deploy: on: tags: true branch: master + +after_success: + - coveralls \ No newline at end of file diff --git a/README.md b/README.md index 6f69a953..eb1687ae 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/brigade-automation/brigade.svg?branch=master)](https://travis-ci.org/brigade-automation/brigade) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) +[![Build Status](https://travis-ci.org/brigade-automation/brigade.svg?branch=master)](https://travis-ci.org/brigade-automation/brigade) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) [![Coverage Status](https://coveralls.io/repos/github/brigade-automation/brigade/badge.svg?branch=master)](https://coveralls.io/github/brigade-automation/brigade?branch=master) Brigade From bba25ed40a37ecac1462dd2e1d599278b6da2961 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Tue, 10 Apr 2018 10:26:25 +0200 Subject: [PATCH 61/77] remove automatic resolver (#112) --- brigade/core/helpers/__init__.py | 4 - brigade/plugins/tasks/commands/command.py | 2 - brigade/plugins/tasks/data/load_json.py | 2 - brigade/plugins/tasks/data/load_yaml.py | 2 - brigade/plugins/tasks/files/sftp.py | 3 - .../tasks/networking/napalm_configure.py | 4 - brigade/plugins/tasks/text/template_file.py | 6 +- tests/plugins/tasks/commands/test_command.py | 9 +- tests/plugins/tasks/files/test_sftp.py | 94 +++++++++---------- .../tasks/networking/test_napalm_validate.py | 3 - 10 files changed, 55 insertions(+), 74 deletions(-) diff --git a/brigade/core/helpers/__init__.py b/brigade/core/helpers/__init__.py index 4cca086d..fdc6c302 100644 --- a/brigade/core/helpers/__init__.py +++ b/brigade/core/helpers/__init__.py @@ -5,7 +5,3 @@ def merge_two_dicts(x, y): z = dict(x) z.update(y) return z - - -def format_string(text, task, **kwargs): - return text.format(host=task.host, **merge_two_dicts(task.host.items(), kwargs)) diff --git a/brigade/plugins/tasks/commands/command.py b/brigade/plugins/tasks/commands/command.py index 293798e8..101b6981 100644 --- a/brigade/plugins/tasks/commands/command.py +++ b/brigade/plugins/tasks/commands/command.py @@ -3,7 +3,6 @@ from brigade.core.exceptions import CommandError -from brigade.core.helpers import format_string from brigade.core.task import Result @@ -22,7 +21,6 @@ def command(task, command): Raises: :obj:`brigade.core.exceptions.CommandError`: when there is a command error """ - command = format_string(command, task, **task.host) cmd = subprocess.Popen( shlex.split(command), stdout=subprocess.PIPE, diff --git a/brigade/plugins/tasks/data/load_json.py b/brigade/plugins/tasks/data/load_json.py index 656d9a02..dfc6fc12 100644 --- a/brigade/plugins/tasks/data/load_json.py +++ b/brigade/plugins/tasks/data/load_json.py @@ -1,6 +1,5 @@ import json -from brigade.core.helpers import format_string from brigade.core.task import Result @@ -15,7 +14,6 @@ def load_json(task, file): :obj:`brigade.core.task.Result`: * result (``dict``): dictionary with the contents of the file """ - file = format_string(file, task) with open(file, "r") as f: data = json.loads(f.read()) diff --git a/brigade/plugins/tasks/data/load_yaml.py b/brigade/plugins/tasks/data/load_yaml.py index 1df12562..058a18c5 100644 --- a/brigade/plugins/tasks/data/load_yaml.py +++ b/brigade/plugins/tasks/data/load_yaml.py @@ -1,4 +1,3 @@ -from brigade.core.helpers import format_string from brigade.core.task import Result @@ -16,7 +15,6 @@ def load_yaml(task, file): :obj:`brigade.core.task.Result`: * result (``dict``): dictionary with the contents of the file """ - file = format_string(file, task) with open(file, "r") as f: data = yaml.load(f.read()) diff --git a/brigade/plugins/tasks/files/sftp.py b/brigade/plugins/tasks/files/sftp.py index 27671842..42d67276 100644 --- a/brigade/plugins/tasks/files/sftp.py +++ b/brigade/plugins/tasks/files/sftp.py @@ -3,7 +3,6 @@ import stat from brigade.core.exceptions import CommandError -from brigade.core.helpers import format_string from brigade.core.task import Result from brigade.plugins.tasks import commands @@ -124,8 +123,6 @@ def sftp(task, src, dst, action, dry_run=None): * changed (``bool``): * files_changed (``list``): list of files that changed """ - src = format_string(src, task, **task.host) - dst = format_string(dst, task, **task.host) dry_run = task.is_dry_run(dry_run) actions = {"put": put, "get": get} client = task.host.get_connection("paramiko") diff --git a/brigade/plugins/tasks/networking/napalm_configure.py b/brigade/plugins/tasks/networking/napalm_configure.py index 6945fa93..eae41e0f 100644 --- a/brigade/plugins/tasks/networking/napalm_configure.py +++ b/brigade/plugins/tasks/networking/napalm_configure.py @@ -1,4 +1,3 @@ -from brigade.core.helpers import format_string from brigade.core.task import Result @@ -20,9 +19,6 @@ def napalm_configure( * diff (``string``): change in the system """ device = task.host.get_connection("napalm") - filename = format_string( - filename, task, **task.host - ) if filename is not None else None if replace: device.load_replace_candidate(filename=filename, config=configuration) diff --git a/brigade/plugins/tasks/text/template_file.py b/brigade/plugins/tasks/text/template_file.py index 8284cc34..96072a28 100644 --- a/brigade/plugins/tasks/text/template_file.py +++ b/brigade/plugins/tasks/text/template_file.py @@ -1,4 +1,4 @@ -from brigade.core.helpers import format_string, jinja_helper, merge_two_dicts +from brigade.core.helpers import jinja_helper, merge_two_dicts from brigade.core.task import Result @@ -8,7 +8,7 @@ def template_file(task, template, path, **kwargs): Arguments: template (string): filename - path (string): path to dir with templates (will be rendered with format) + path (string): path to dir with templates **kwargs: additional data to pass to the template Returns: @@ -16,8 +16,6 @@ def template_file(task, template, path, **kwargs): * result (``string``): rendered string """ merged = merge_two_dicts(task.host, kwargs) - path = format_string(path, task, **kwargs) - template = format_string(template, task, **kwargs) text = jinja_helper.render_from_file( template=template, path=path, host=task.host, **merged ) diff --git a/tests/plugins/tasks/commands/test_command.py b/tests/plugins/tasks/commands/test_command.py index dac59e19..215d7d91 100644 --- a/tests/plugins/tasks/commands/test_command.py +++ b/tests/plugins/tasks/commands/test_command.py @@ -2,13 +2,18 @@ from brigade.plugins.tasks import commands +def echo_hostname(task): + command = "echo {host.name}".format(host=task.host) + task.run(task=commands.command, command=command) + + class Test(object): def test_command(self, brigade): - result = brigade.run(commands.command, command="echo {host.name}") + result = brigade.run(echo_hostname) assert result for h, r in result.items(): - assert h == r.stdout.strip() + assert h == r[1].stdout.strip() def test_command_error(self, brigade): result = brigade.run(commands.command, command="ech") diff --git a/tests/plugins/tasks/files/test_sftp.py b/tests/plugins/tasks/files/test_sftp.py index ce921300..b1677fc4 100644 --- a/tests/plugins/tasks/files/test_sftp.py +++ b/tests/plugins/tasks/files/test_sftp.py @@ -6,6 +6,48 @@ # import pytest +def get_file(task): + filename = "/tmp/{uuid}-{host.name}".format(uuid=uuid.uuid4(), host=task.host) + r = task.run( + task=files.sftp, dry_run=True, action="get", src="/etc/hostname", dst=filename + ) + assert r + assert r.changed, r.files_changed + + r = task.run( + task=files.sftp, dry_run=False, action="get", src="/etc/hostname", dst=filename + ) + assert r + assert r.changed, r.files_changed + + r = task.run( + task=files.sftp, dry_run=False, action="get", src="/etc/hostname", dst=filename + ) + assert r + assert not r.changed + + +def get_directory(task): + filename = "/tmp/{uuid}-{host.name}".format(uuid=uuid.uuid4(), host=task.host) + r = task.run( + task=files.sftp, dry_run=True, action="get", src="/etc/terminfo/", dst=filename + ) + assert r + assert r.changed, r.files_changed + + r = task.run( + task=files.sftp, dry_run=False, action="get", src="/etc/terminfo/", dst=filename + ) + assert r + assert r.changed, r.files_changed + + r = task.run( + task=files.sftp, dry_run=True, action="get", src="/etc/terminfo/", dst=filename + ) + assert r + assert not r.changed + + class Test(object): def test_sftp_put(self, brigade): @@ -46,30 +88,8 @@ def test_sftp_put(self, brigade): assert not r.changed def test_sftp_get(self, brigade): - filename = "/tmp/" + str(uuid.uuid4()) + "-{host}" - result = brigade.run( - files.sftp, dry_run=True, action="get", src="/etc/hostname", dst=filename - ) - - assert result - for h, r in result.items(): - assert r.changed, r.files_changed - - result = brigade.run( - files.sftp, dry_run=False, action="get", src="/etc/hostname", dst=filename - ) - - assert result - for h, r in result.items(): - assert r.changed, r.files_changed - - result = brigade.run( - files.sftp, dry_run=False, action="get", src="/etc/hostname", dst=filename - ) - - assert result - for h, r in result.items(): - assert not r.changed + result = brigade.run(get_file) + assert not result.failed def test_sftp_put_directory(self, brigade): result = brigade.run( @@ -97,27 +117,5 @@ def test_sftp_put_directory(self, brigade): assert not r.changed def test_sftp_get_directory(self, brigade): - filename = "/tmp/" + str(uuid.uuid4()) + "-{host}" - result = brigade.run( - files.sftp, dry_run=True, action="get", src="/etc/terminfo/", dst=filename - ) - - assert result - for h, r in result.items(): - assert r.changed, r.files_changed - - result = brigade.run( - files.sftp, dry_run=False, action="get", src="/etc/terminfo/", dst=filename - ) - - assert result - for h, r in result.items(): - assert r.changed, r.files_changed - - result = brigade.run( - files.sftp, dry_run=True, action="get", src="/etc/terminfo/", dst=filename - ) - - assert result - for h, r in result.items(): - assert not r.changed + result = brigade.run(get_directory) + assert not result.failed diff --git a/tests/plugins/tasks/networking/test_napalm_validate.py b/tests/plugins/tasks/networking/test_napalm_validate.py index 0a33dbc7..e85953a3 100644 --- a/tests/plugins/tasks/networking/test_napalm_validate.py +++ b/tests/plugins/tasks/networking/test_napalm_validate.py @@ -10,7 +10,6 @@ class Test(object): def test_napalm_validate_src_ok(self, brigade): opt = {"path": THIS_DIR + "/mocked/napalm_get/test_napalm_getters"} - print(opt["path"]) d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) result = d.run( @@ -22,7 +21,6 @@ def test_napalm_validate_src_ok(self, brigade): def test_napalm_validate_src_error(self, brigade): opt = {"path": THIS_DIR + "/mocked/napalm_get/test_napalm_getters"} - print(opt["path"]) d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) @@ -36,7 +34,6 @@ def test_napalm_validate_src_error(self, brigade): def test_napalm_validate_src_validate_source(self, brigade): opt = {"path": THIS_DIR + "/mocked/napalm_get/test_napalm_getters"} - print(opt["path"]) d = brigade.filter(name="dev3.group_2") d.run(connections.napalm_connection, optional_args=opt) From 260393deefab85ae0629eeaaf745945ad81a94c4 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Tue, 10 Apr 2018 12:55:35 +0200 Subject: [PATCH 62/77] add mechanism to pass jinja_filters (#113) --- brigade/core/configuration.py | 22 ++++++++++++------- brigade/core/helpers/jinja_helper.py | 9 +++++--- brigade/plugins/tasks/text/template_file.py | 10 +++++++-- brigade/plugins/tasks/text/template_string.py | 8 +++++-- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/brigade/core/configuration.py b/brigade/core/configuration.py index 440ac2c3..5137c364 100644 --- a/brigade/core/configuration.py +++ b/brigade/core/configuration.py @@ -14,6 +14,11 @@ "transform_function": { "description": "Path to transform function.", "type": "str", "default": {} }, + "jinja_filters": { + "description": "Path to callable returning jinja filters to be used.", + "type": "str", + "default": {}, + }, "num_workers": { "description": "Number of Brigade worker processes that are run at the same time, " "configuration can be overridden on individual tasks by using the " @@ -97,15 +102,16 @@ def __init__(self, config_file=None, **kwargs): for k, v in kwargs.items(): setattr(self, k, v) - inventory = self._resolve_import_from_string( - kwargs.get("inventory", self.inventory) - ) - self.inventory = inventory + resolve_imports = ["inventory", "transform_function", "jinja_filters"] + for r in resolve_imports: + obj = self._resolve_import_from_string(kwargs.get(r, getattr(self, r))) + setattr(self, r, obj) - transform_function = self._resolve_import_from_string( - kwargs.get("transform_function", self.transform_function) - ) - self.transform_function = transform_function + callable = ["jinja_filters"] + for c in callable: + func = getattr(self, c) + if func: + setattr(self, c, func()) def string_to_bool(self, v): if v.lower() in ["false", "no", "n", "off", "0"]: diff --git a/brigade/core/helpers/jinja_helper.py b/brigade/core/helpers/jinja_helper.py index 8993aa49..e6f9ee26 100644 --- a/brigade/core/helpers/jinja_helper.py +++ b/brigade/core/helpers/jinja_helper.py @@ -1,16 +1,19 @@ from jinja2 import Environment, FileSystemLoader, StrictUndefined -def render_from_file(path, template, **kwargs): +def render_from_file(path, template, jinja_filters=None, **kwargs): + jinja_filters = jinja_filters or {} env = Environment( loader=FileSystemLoader(path), undefined=StrictUndefined, trim_blocks=True ) - # env.filters.update(jinja_filters.filters()) + env.filters.update(jinja_filters) template = env.get_template(template) return template.render(**kwargs) -def render_from_string(template, **kwargs): +def render_from_string(template, jinja_filters=None, **kwargs): + jinja_filters = jinja_filters or {} env = Environment(undefined=StrictUndefined, trim_blocks=True) + env.filters.update(jinja_filters) template = env.from_string(template) return template.render(**kwargs) diff --git a/brigade/plugins/tasks/text/template_file.py b/brigade/plugins/tasks/text/template_file.py index 96072a28..5e5b4112 100644 --- a/brigade/plugins/tasks/text/template_file.py +++ b/brigade/plugins/tasks/text/template_file.py @@ -2,21 +2,27 @@ from brigade.core.task import Result -def template_file(task, template, path, **kwargs): +def template_file(task, template, path, jinja_filters=None, **kwargs): """ Renders contants of a file with jinja2. All the host data is available in the tempalte Arguments: template (string): filename path (string): path to dir with templates + jinja_filters (dict): jinja filters to enable. Defaults to brigade.config.jinja_filters **kwargs: additional data to pass to the template Returns: :obj:`brigade.core.task.Result`: * result (``string``): rendered string """ + jinja_filters = jinja_filters or {} or task.brigade.config.jinja_filters merged = merge_two_dicts(task.host, kwargs) text = jinja_helper.render_from_file( - template=template, path=path, host=task.host, **merged + template=template, + path=path, + host=task.host, + jinja_filters=jinja_filters, + **merged ) return Result(host=task.host, result=text) diff --git a/brigade/plugins/tasks/text/template_string.py b/brigade/plugins/tasks/text/template_string.py index fc531504..80d3f83b 100644 --- a/brigade/plugins/tasks/text/template_string.py +++ b/brigade/plugins/tasks/text/template_string.py @@ -2,18 +2,22 @@ from brigade.core.task import Result -def template_string(task, template, **kwargs): +def template_string(task, template, jinja_filters=None, **kwargs): """ Renders a string with jinja2. All the host data is available in the tempalte Arguments: template (string): template string + jinja_filters (dict): jinja filters to enable. Defaults to brigade.config.jinja_filters **kwargs: additional data to pass to the template Returns: :obj:`brigade.core.task.Result`: * result (``string``): rendered string """ + jinja_filters = jinja_filters or {} or task.brigade.config.jinja_filters merged = merge_two_dicts(task.host, kwargs) - text = jinja_helper.render_from_string(template=template, host=task.host, **merged) + text = jinja_helper.render_from_string( + template=template, host=task.host, jinja_filters=jinja_filters, **merged + ) return Result(host=task.host, result=text) From bdc7e17c1a98a905135fb4900347d41d539c5d30 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Tue, 10 Apr 2018 13:12:06 +0200 Subject: [PATCH 63/77] bump to 0.0.7 (#114) --- .travis.yml | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5680b5c8..5fc003ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,10 +26,10 @@ deploy: provider: pypi user: dbarroso password: - secure: Zq2sLJ1yQzir4rlX9oopchnNqTNkAsbSOApWWPFYZwnLK8swvgMd95PDjLvY07Wzf4NBo1qy+cA1NwXIcAAd2HFr7hmnpj4ZMn2VxJBeznMW9h8OpGRusZs94ilK10A1CEcH77vQsRJYjycLV0hrslbXWfkJh88RJoeJYG4GLML9sDdxSf24ei5+vtA9e/eIQuP/rcoaq3g8CYiliiD6sU7fuIC6zGxzRWs2TSTP9mfvLZommOgVMqWQ9YshB06LtF+pn/UbjFjKnB8gMkSISW72jj9aL/D9Z3/68xPgFovbOmumL91XRnK6/89EwSULV7YzgbLv8PA95eevSuhiqT7Kk1UIHgKrE0v9tv2CJN39h4U74KaTvrssipJYvbGTwaYHScAOpRn4yk1H3Ipd/B6gVfj22ygw76+6yj2pj6U6QLh0JIU83oB5r92xZCZqrwn7/4rLpiLT3TF8IUi1WasTTHLfN7Je+l4InZ7myWXmxq8qqICappgyuFs+IA8d4iN8hAakAuShn2EB3KdnktPPjsd+qJajuMKwTFrogcWPNdALNCTS72W7x3+9P+d2MllEI2G2CF79O69DXSGzXqLrXuvmy0Nf9+q1ozXk1tYww13eAJO93Uzcm3WdTZFGBt8ENpSRIRBtXynkJriJ5PYEYxORzI7uR9A2Oi0UPhk= + secure: N8oS4N3BG8eMTXOxbGvCcZi5c/DSDml4qxux3OVZR2BvFp9X8yiC/9LgpTswp30cDZNgQqrd1cgHnm742hfKUMbcEpRergk65P+5tHcawUwS+jZ47PJJb84KQkne6i63vP5hGFGuN75cPk4U+Lv/q9MfTcWeaVqZfnjmMxwo90o/AqLIvPsduj8wP0wCSbO5DdaR5paTJOmHcTPksVDMyHaxbj5lDYx4kCS04jm4BHWRTBVP6ayyYdmgLDgcHdd54Xphk43EuI3vOMnB0TjU6GmwtsSkXGzsSpws+UNj/gAMZWkUpd5gwPgUThYWOtCiwPSism0DCCYQ9M9GH45210k+o+OgqEIU/HBxVve1rOYaLuApuOGO2gwpwM57WRv0AbnzQbgUVEDbC3XkOFnqxl2sD8ItvdpSTbI24pPj4CY5CdQkAjajorYIqZpmHMo9NVet9yPSTgtNVUqY7NNVIoEhwQzwqr/PtW+1o0f2+EVLyuYxR4Mvtx0B5Nuisrx1fwu0ZaCcpUTItXNkunSXsGmSk1THw06ub+/NgK8AqsKsOtGAwF37Uwgi92JkUmI4LA3UiO28Htu54q3IplhMaaxiMkTUNCj8BVBtykIK956TmDEjp0rJZTX+/64NN+68YYejFwW/Bkjkpra6LOK0AmM1sVoDBm9mNDIHMjiVIyw= on: tags: true branch: master after_success: - - coveralls \ No newline at end of file + - coveralls diff --git a/setup.py b/setup.py index 13867764..c0980027 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ __author__ = "dbarrosop@dravetech.com" __license__ = "Apache License, version 2" -__version__ = "0.0.6" +__version__ = "0.0.7" setup( name="brigade", From 1e841c8efc56690ad2ac8b63cebff75b8e891448 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Tue, 10 Apr 2018 19:55:10 +0200 Subject: [PATCH 64/77] Swap from master to develop branch for badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eb1687ae..b208ca28 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/brigade-automation/brigade.svg?branch=master)](https://travis-ci.org/brigade-automation/brigade) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) [![Coverage Status](https://coveralls.io/repos/github/brigade-automation/brigade/badge.svg?branch=master)](https://coveralls.io/github/brigade-automation/brigade?branch=master) +[![Build Status](https://travis-ci.org/brigade-automation/brigade.svg?branch=develop)](https://travis-ci.org/brigade-automation/brigade) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) [![Coverage Status](https://coveralls.io/repos/github/brigade-automation/brigade/badge.svg?branch=develop)](https://coveralls.io/github/brigade-automation/brigade?branch=develop) Brigade From e01bd5f794a3cdf4a2a51ee22db70cdc92fea11c Mon Sep 17 00:00:00 2001 From: David Barroso Date: Mon, 16 Apr 2018 16:48:01 +0200 Subject: [PATCH 65/77] update black (#117) --- .travis.yml | 3 ++- requirements-dev.txt | 3 ++- requirements-travis.txt | 1 + tests/core/test_configuration.py | 18 +++++++++--------- tests/core/test_inventory.py | 19 ++++++++++--------- 5 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 requirements-travis.txt diff --git a/.travis.yml b/.travis.yml index 5fc003ee..200e9ab9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,9 +17,10 @@ python: install: - pip install tox-travis - pip install coveralls + - pip install -r requirements-travis.txt script: - - if [ $TRAVIS_PYTHON_VERSION == "3.6" ]; then pip install black && black --check . 2>&1 | grep reformatted; test $? -eq 1; fi + - if [ $TRAVIS_PYTHON_VERSION == "3.6" ]; then black --check . ; fi - tox deploy: diff --git a/requirements-dev.txt b/requirements-dev.txt index 0e4ede4d..5365a44f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -3,5 +3,6 @@ pytest-cov pylama flake8-import-order tox -black; python_version >= '3.6' +black==18.4a1; python_version >= '3.6' +-r requirements-travis.txt -r requirements.txt diff --git a/requirements-travis.txt b/requirements-travis.txt new file mode 100644 index 00000000..062cef33 --- /dev/null +++ b/requirements-travis.txt @@ -0,0 +1 @@ +black==18.4a1; python_version >= '3.6' diff --git a/tests/core/test_configuration.py b/tests/core/test_configuration.py index eb51f9b6..d65f50c9 100644 --- a/tests/core/test_configuration.py +++ b/tests/core/test_configuration.py @@ -68,22 +68,22 @@ def test_configuration_bool_env(self): def test_get_user_defined_from_file(self): config = Config(config_file=os.path.join(dir_path, "config.yaml")) - assert config.get( - "user_defined", env="USER_DEFINED", default="qweqwe" - ) == "asdasd" + assert ( + config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "asdasd" + ) def test_get_user_defined_from_default(self): config = Config() - assert config.get( - "user_defined", env="USER_DEFINED", default="qweqwe" - ) == "qweqwe" + assert ( + config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "qweqwe" + ) def test_get_user_defined_from_env(self): os.environ["USER_DEFINED"] = "zxczxc" config = Config(config_file=os.path.join(dir_path, "config.yaml")) - assert config.get( - "user_defined", env="USER_DEFINED", default="qweqwe" - ) == "zxczxc" + assert ( + config.get("user_defined", env="USER_DEFINED", default="qweqwe") == "zxczxc" + ) os.environ.pop("USER_DEFINED") def test_get_user_defined_from_env_bool(self): diff --git a/tests/core/test_inventory.py b/tests/core/test_inventory.py index 7a34202b..5c9acf54 100644 --- a/tests/core/test_inventory.py +++ b/tests/core/test_inventory.py @@ -140,9 +140,10 @@ def test_hosts(self): def test_filtering(self): unfiltered = sorted(list(inventory.hosts.keys())) - assert unfiltered == [ - "dev1.group_1", "dev2.group_1", "dev3.group_2", "dev4.group_2" - ] + assert ( + unfiltered + == ["dev1.group_1", "dev2.group_1", "dev3.group_2", "dev4.group_2"] + ) www = sorted(list(inventory.filter(role="www").hosts.keys())) assert www == ["dev1.group_1", "dev3.group_2"] @@ -185,13 +186,13 @@ def test_var_resolution(self): assert inventory.hosts["dev3.group_2"]["my_var"] == "comes_from_defaults" assert inventory.hosts["dev4.group_2"]["my_var"] == "comes_from_dev4.group_2" - assert inventory.hosts["dev1.group_1"].data[ - "my_var" - ] == "comes_from_dev1.group_1" + assert ( + inventory.hosts["dev1.group_1"].data["my_var"] == "comes_from_dev1.group_1" + ) with pytest.raises(KeyError): inventory.hosts["dev2.group_1"].data["my_var"] with pytest.raises(KeyError): inventory.hosts["dev3.group_2"].data["my_var"] - assert inventory.hosts["dev4.group_2"].data[ - "my_var" - ] == "comes_from_dev4.group_2" + assert ( + inventory.hosts["dev4.group_2"].data["my_var"] == "comes_from_dev4.group_2" + ) From b68407631ed5573de76185d212079e8e111b3b43 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Mon, 16 Apr 2018 17:10:18 +0200 Subject: [PATCH 66/77] Remove link to specific build on RTD --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b208ca28..f8c098ce 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ pip install brigade Documentation ============= -Read the [Brigade documentation](https://brigade.readthedocs.io/en/latest/) online or review it's [code here](https://github.com/brigade-automation/brigade/tree/develop/docs) +Read the [Brigade documentation](https://brigade.readthedocs.io/) online or review it's [code here](https://github.com/brigade-automation/brigade/tree/develop/docs) Bugs & New features From d792835bf6555d57182afa4cdb9b19df11f170e9 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Sat, 21 Apr 2018 13:58:06 +0200 Subject: [PATCH 67/77] Add description to package for display on pypi. (#121) --- MANIFEST.in | 1 + README.md | 2 +- setup.py | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 607da8f9..c1ffe8e3 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1,2 @@ include requirements* +include README.md \ No newline at end of file diff --git a/README.md b/README.md index f8c098ce..7380f96a 100644 --- a/README.md +++ b/README.md @@ -40,4 +40,4 @@ While we are happy to help, the [GitHub issues]( 0 and not r.startswith("#"))] +with open("README.md", "r") as fs: + long_description = fs.read() + __author__ = "dbarrosop@dravetech.com" __license__ = "Apache License, version 2" @@ -13,6 +16,8 @@ name="brigade", version=__version__, description="Fighting fire with fire", + long_description=long_description, + long_description_content_type="text/markdown", author=__author__, url="https://github.com/brigade-automation/brigade", include_package_data=True, From 6a6cd88514e92dc833371f729776f70813d61b13 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Sat, 21 Apr 2018 13:59:44 +0200 Subject: [PATCH 68/77] Add result key and cleanup (#120) --- brigade/plugins/functions/text/__init__.py | 4 ---- brigade/plugins/tasks/commands/remote_command.py | 4 +++- brigade/plugins/tasks/networking/tcp_ping.py | 4 ++-- tests/plugins/tasks/networking/test_tcp_ping.py | 14 +++++++------- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/brigade/plugins/functions/text/__init__.py b/brigade/plugins/functions/text/__init__.py index 34ecb9fa..38a5b74b 100644 --- a/brigade/plugins/functions/text/__init__.py +++ b/brigade/plugins/functions/text/__init__.py @@ -69,10 +69,6 @@ def print_result( Returns: :obj:`brigade.core.task.Result`: """ - # def print_aggregated_result(host, result): - # title = "" if result.changed is None else " ** changed : {} ".format(host_data.changed) - # msg = "* {}{}".format(host, title) - # print("{}{}{}{}".format(Style.BRIGHT, color, msg, "*" * (80 - len(msg)))) vars = vars or ["diff", "result", "stdout"] if isinstance(vars, str): diff --git a/brigade/plugins/tasks/commands/remote_command.py b/brigade/plugins/tasks/commands/remote_command.py index 47a49a53..3d5070f9 100644 --- a/brigade/plugins/tasks/commands/remote_command.py +++ b/brigade/plugins/tasks/commands/remote_command.py @@ -11,6 +11,7 @@ def remote_command(task, command): Returns: :obj:`brigade.core.task.Result`: + * result (``str``): stderr or stdout * stdout (``str``): stdout * stderr (``srr``): stderr @@ -32,4 +33,5 @@ def remote_command(task, command): if exit_status_code: raise CommandError(command, exit_status_code, stdout, stderr) - return Result(host=task.host, stderr=stderr, stdout=stdout) + result = stderr if stderr else stdout + return Result(result=result, host=task.host, stderr=stderr, stdout=stdout) diff --git a/brigade/plugins/tasks/networking/tcp_ping.py b/brigade/plugins/tasks/networking/tcp_ping.py index 5c3d4301..4f4d47aa 100644 --- a/brigade/plugins/tasks/networking/tcp_ping.py +++ b/brigade/plugins/tasks/networking/tcp_ping.py @@ -17,7 +17,7 @@ def tcp_ping(task, ports, timeout=2, host=None): Returns: :obj:`brigade.core.task.Result`: - * tcp_port (``dict``): Contains port numbers as keys with True/False as values + * result (``dict``): Contains port numbers as keys with True/False as values """ if isinstance(ports, int): @@ -48,4 +48,4 @@ def tcp_ping(task, ports, timeout=2, host=None): s.close() result[port] = connection - return Result(host=task.host, tcp_port=result) + return Result(host=task.host, result=result) diff --git a/tests/plugins/tasks/networking/test_tcp_ping.py b/tests/plugins/tasks/networking/test_tcp_ping.py index b220496e..26e9ea42 100644 --- a/tests/plugins/tasks/networking/test_tcp_ping.py +++ b/tests/plugins/tasks/networking/test_tcp_ping.py @@ -18,7 +18,7 @@ def test_tcp_ping_port(self, brigade): assert result for h, r in result.items(): - assert r.tcp_port[65004] + assert r.result[65004] def test_tcp_ping_ports(self, brigade): filter = brigade.filter(name="dev4.group_2") @@ -26,8 +26,8 @@ def test_tcp_ping_ports(self, brigade): assert result for h, r in result.items(): - assert r.tcp_port[35004] is False - assert r.tcp_port[65004] + assert r.result[35004] is False + assert r.result[65004] def test_tcp_ping_invalid_port(self, brigade): results = brigade.run(networking.tcp_ping, ports="web") @@ -55,8 +55,8 @@ def test_tcp_ping_external_hosts(): assert result for h, r in result.items(): if h == "www.github.com": - assert r.tcp_port[23] is False - assert r.tcp_port[443] + assert r.result[23] is False + assert r.result[443] else: - assert r.tcp_port[23] is False - assert r.tcp_port[443] is False + assert r.result[23] is False + assert r.result[443] is False From 250d541e108e3456d827fe23a67285c3b4b65c78 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Fri, 27 Apr 2018 11:14:35 +0200 Subject: [PATCH 69/77] update docs (#123) Update introduction tutorial --- brigade/core/__init__.py | 8 +- {examples => docs}/highlighter.py | 0 .../from_runbooks_to_complex_tooling.rst | 11 - docs/howto/simple_runbooks/backup.ipynb | 1 - docs/howto/simple_runbooks/configure.ipynb | 1 - docs/howto/simple_runbooks/get_facts.ipynb | 1 - docs/howto/simple_runbooks/index.rst | 11 - docs/howto/simple_runbooks/rollback.ipynb | 1 - docs/howto/simple_runbooks/validate.ipynb | 1 - docs/howto/simple_tooling/backup.ipynb | 1 - docs/howto/simple_tooling/configure.ipynb | 1 - docs/howto/simple_tooling/get_facts.ipynb | 1 - docs/howto/simple_tooling/index.rst | 13 - docs/howto/simple_tooling/rollback.ipynb | 1 - docs/howto/simple_tooling/validate.ipynb | 1 - docs/tutorials/intro/config.yaml | 5 +- docs/tutorials/intro/executing_tasks.ipynb | 18 +- docs/tutorials/intro/failed_tasks.ipynb | 157 ++- docs/tutorials/intro/grouping_tasks.ipynb | 184 +-- .../intro/initializing_brigade.ipynb | 12 +- docs/tutorials/intro/inventory.ipynb | 12 +- .../tutorials/intro}/inventory/Vagrantfile | 0 .../tutorials/intro}/inventory/groups.yaml | 0 .../tutorials/intro}/inventory/hosts.yaml | 0 docs/tutorials/intro/task_results.ipynb | 213 +++- examples/1_simple_runbooks/backup.ipynb | 557 --------- examples/1_simple_runbooks/backup.py | 48 - examples/1_simple_runbooks/configure.ipynb | 673 ----------- examples/1_simple_runbooks/configure.py | 92 -- examples/1_simple_runbooks/get_facts.ipynb | 662 ---------- examples/1_simple_runbooks/get_facts.py | 30 - examples/1_simple_runbooks/rollback.ipynb | 438 ------- examples/1_simple_runbooks/rollback.py | 49 - examples/1_simple_runbooks/validate.ipynb | 689 ----------- examples/1_simple_runbooks/validate.py | 56 - examples/2_simple_tooling/backup.ipynb | 1062 ----------------- examples/2_simple_tooling/backup.py | 72 -- examples/2_simple_tooling/configure.ipynb | 747 ------------ examples/2_simple_tooling/configure.py | 110 -- examples/2_simple_tooling/get_facts.ipynb | 306 ----- examples/2_simple_tooling/get_facts.py | 44 - examples/2_simple_tooling/rollback.ipynb | 411 ------- examples/2_simple_tooling/rollback.py | 61 - examples/2_simple_tooling/validate.ipynb | 404 ------- examples/2_simple_tooling/validate.py | 71 -- examples/3_advanced_tooling/mate.py | 43 - examples/3_advanced_tooling/tasks/__init__.py | 0 examples/3_advanced_tooling/tasks/backup.py | 35 - .../3_advanced_tooling/tasks/configure.py | 80 -- .../3_advanced_tooling/tasks/get_facts.py | 21 - examples/3_advanced_tooling/tasks/validate.py | 47 - examples/extra_data/leaf00.cmh/l3.yaml | 16 - examples/extra_data/leaf01.cmh/l3.yaml | 16 - examples/extra_data/spine00.cmh/l3.yaml | 16 - examples/extra_data/spine01.cmh/l3.yaml | 16 - examples/inventory/network_diagram.graffle | Bin 2671 -> 0 bytes examples/inventory/network_diagram.png | Bin 114423 -> 0 bytes examples/requirements.txt | 1 - examples/templates/eos/base.j2 | 3 - examples/templates/eos/interfaces.j2 | 8 - examples/templates/eos/leaf.j2 | 4 - examples/templates/eos/routing.j2 | 12 - examples/templates/eos/spine.j2 | 0 examples/templates/junos/base.j2 | 5 - examples/templates/junos/interfaces.j2 | 15 - examples/templates/junos/leaf.j2 | 8 - examples/templates/junos/routing.j2 | 30 - examples/templates/junos/spine.j2 | 0 68 files changed, 345 insertions(+), 7267 deletions(-) rename {examples => docs}/highlighter.py (100%) delete mode 100644 docs/howto/from_runbooks_to_complex_tooling.rst delete mode 120000 docs/howto/simple_runbooks/backup.ipynb delete mode 120000 docs/howto/simple_runbooks/configure.ipynb delete mode 120000 docs/howto/simple_runbooks/get_facts.ipynb delete mode 100644 docs/howto/simple_runbooks/index.rst delete mode 120000 docs/howto/simple_runbooks/rollback.ipynb delete mode 120000 docs/howto/simple_runbooks/validate.ipynb delete mode 120000 docs/howto/simple_tooling/backup.ipynb delete mode 120000 docs/howto/simple_tooling/configure.ipynb delete mode 120000 docs/howto/simple_tooling/get_facts.ipynb delete mode 100644 docs/howto/simple_tooling/index.rst delete mode 120000 docs/howto/simple_tooling/rollback.ipynb delete mode 120000 docs/howto/simple_tooling/validate.ipynb rename {examples => docs/tutorials/intro}/inventory/Vagrantfile (100%) rename {examples => docs/tutorials/intro}/inventory/groups.yaml (100%) rename {examples => docs/tutorials/intro}/inventory/hosts.yaml (100%) delete mode 100644 examples/1_simple_runbooks/backup.ipynb delete mode 100755 examples/1_simple_runbooks/backup.py delete mode 100644 examples/1_simple_runbooks/configure.ipynb delete mode 100755 examples/1_simple_runbooks/configure.py delete mode 100644 examples/1_simple_runbooks/get_facts.ipynb delete mode 100755 examples/1_simple_runbooks/get_facts.py delete mode 100644 examples/1_simple_runbooks/rollback.ipynb delete mode 100755 examples/1_simple_runbooks/rollback.py delete mode 100644 examples/1_simple_runbooks/validate.ipynb delete mode 100755 examples/1_simple_runbooks/validate.py delete mode 100644 examples/2_simple_tooling/backup.ipynb delete mode 100755 examples/2_simple_tooling/backup.py delete mode 100644 examples/2_simple_tooling/configure.ipynb delete mode 100755 examples/2_simple_tooling/configure.py delete mode 100644 examples/2_simple_tooling/get_facts.ipynb delete mode 100755 examples/2_simple_tooling/get_facts.py delete mode 100644 examples/2_simple_tooling/rollback.ipynb delete mode 100755 examples/2_simple_tooling/rollback.py delete mode 100644 examples/2_simple_tooling/validate.ipynb delete mode 100755 examples/2_simple_tooling/validate.py delete mode 100755 examples/3_advanced_tooling/mate.py delete mode 100644 examples/3_advanced_tooling/tasks/__init__.py delete mode 100755 examples/3_advanced_tooling/tasks/backup.py delete mode 100755 examples/3_advanced_tooling/tasks/configure.py delete mode 100755 examples/3_advanced_tooling/tasks/get_facts.py delete mode 100755 examples/3_advanced_tooling/tasks/validate.py delete mode 100644 examples/extra_data/leaf00.cmh/l3.yaml delete mode 100644 examples/extra_data/leaf01.cmh/l3.yaml delete mode 100644 examples/extra_data/spine00.cmh/l3.yaml delete mode 100644 examples/extra_data/spine01.cmh/l3.yaml delete mode 100644 examples/inventory/network_diagram.graffle delete mode 100644 examples/inventory/network_diagram.png delete mode 100644 examples/requirements.txt delete mode 100644 examples/templates/eos/base.j2 delete mode 100644 examples/templates/eos/interfaces.j2 delete mode 100644 examples/templates/eos/leaf.j2 delete mode 100644 examples/templates/eos/routing.j2 delete mode 100644 examples/templates/eos/spine.j2 delete mode 100644 examples/templates/junos/base.j2 delete mode 100644 examples/templates/junos/interfaces.j2 delete mode 100644 examples/templates/junos/leaf.j2 delete mode 100644 examples/templates/junos/routing.j2 delete mode 100644 examples/templates/junos/spine.j2 diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index b15a5043..e81152ee 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -93,8 +93,8 @@ def __init__( self.data = data or Data() self.inventory = inventory self.inventory.brigade = self + self.data.dry_run = dry_run - self.dry_run = dry_run if config_file: self.config = Config(config_file=config_file) else: @@ -107,6 +107,10 @@ def __init__( else: self.available_connections = connections.available_connections + @property + def dry_run(self): + return self.data.dry_run + def configure_logging(self): dictConfig = self.config.logging_dictConfig or { "version": 1, @@ -158,7 +162,7 @@ def filter(self, **kwargs): Returns: :obj:`Brigade`: A new object with same configuration as ``self`` but filtered inventory. """ - b = Brigade(**self.__dict__) + b = Brigade(dry_run=self.dry_run, **self.__dict__) b.inventory = self.inventory.filter(**kwargs) return b diff --git a/examples/highlighter.py b/docs/highlighter.py similarity index 100% rename from examples/highlighter.py rename to docs/highlighter.py diff --git a/docs/howto/from_runbooks_to_complex_tooling.rst b/docs/howto/from_runbooks_to_complex_tooling.rst deleted file mode 100644 index 3f56fe61..00000000 --- a/docs/howto/from_runbooks_to_complex_tooling.rst +++ /dev/null @@ -1,11 +0,0 @@ -From Runbooks to Advanced Tooling -================================= - -In this section we are going to build advanced tooling in a series of baby steps. We will start writing very simple runbooks, then we will slightly rewrite those runbooks to turn them into flexible cli tools. Once we are done with that we will turn those isolated cli tools into an advanced tool that can accommodate different workflows. - -.. toctree:: - :maxdepth: 1 - :glob: - - simple_runbooks/index - simple_tooling/index diff --git a/docs/howto/simple_runbooks/backup.ipynb b/docs/howto/simple_runbooks/backup.ipynb deleted file mode 120000 index f6561d19..00000000 --- a/docs/howto/simple_runbooks/backup.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/1_simple_runbooks/backup.ipynb \ No newline at end of file diff --git a/docs/howto/simple_runbooks/configure.ipynb b/docs/howto/simple_runbooks/configure.ipynb deleted file mode 120000 index 9fc2fc70..00000000 --- a/docs/howto/simple_runbooks/configure.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/1_simple_runbooks/configure.ipynb \ No newline at end of file diff --git a/docs/howto/simple_runbooks/get_facts.ipynb b/docs/howto/simple_runbooks/get_facts.ipynb deleted file mode 120000 index cdf882f1..00000000 --- a/docs/howto/simple_runbooks/get_facts.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/1_simple_runbooks/get_facts.ipynb \ No newline at end of file diff --git a/docs/howto/simple_runbooks/index.rst b/docs/howto/simple_runbooks/index.rst deleted file mode 100644 index f63c4e42..00000000 --- a/docs/howto/simple_runbooks/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -Simple Runbooks -=============== - -In this series we are going to build a few simple runbooks to do various tasks on the network. Each runbook is going to do one specific tasks and is going to make certain assumptions to simplify the logic as possible; like which devices are involved, where is the data located, etc. In following series we will build on these runbooks to build more flexible and complex tooling. - -.. toctree:: - :maxdepth: 1 - :glob: - - * - diff --git a/docs/howto/simple_runbooks/rollback.ipynb b/docs/howto/simple_runbooks/rollback.ipynb deleted file mode 120000 index 4081ad20..00000000 --- a/docs/howto/simple_runbooks/rollback.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/1_simple_runbooks/rollback.ipynb \ No newline at end of file diff --git a/docs/howto/simple_runbooks/validate.ipynb b/docs/howto/simple_runbooks/validate.ipynb deleted file mode 120000 index 91119d86..00000000 --- a/docs/howto/simple_runbooks/validate.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/1_simple_runbooks/validate.ipynb \ No newline at end of file diff --git a/docs/howto/simple_tooling/backup.ipynb b/docs/howto/simple_tooling/backup.ipynb deleted file mode 120000 index 4cd21f71..00000000 --- a/docs/howto/simple_tooling/backup.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/2_simple_tooling/backup.ipynb \ No newline at end of file diff --git a/docs/howto/simple_tooling/configure.ipynb b/docs/howto/simple_tooling/configure.ipynb deleted file mode 120000 index 71c86d66..00000000 --- a/docs/howto/simple_tooling/configure.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/2_simple_tooling/configure.ipynb \ No newline at end of file diff --git a/docs/howto/simple_tooling/get_facts.ipynb b/docs/howto/simple_tooling/get_facts.ipynb deleted file mode 120000 index 450584f1..00000000 --- a/docs/howto/simple_tooling/get_facts.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/2_simple_tooling/get_facts.ipynb \ No newline at end of file diff --git a/docs/howto/simple_tooling/index.rst b/docs/howto/simple_tooling/index.rst deleted file mode 100644 index 4a338209..00000000 --- a/docs/howto/simple_tooling/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -Simple Tooling -============== - -In this series we are going to build on top of the runbooks we built on :doc:`the previous section <../simple_runbooks/index>` and build more versatile tooling. Most tools will be not that very different from its equivalent runbook so you should be able to look at them side by side and realize how easy it was to build a cli tool from a previous runbook thanks to the fact that brigade is a native python framework and integrates natively with other frameworks like `click `. - - -.. toctree:: - :maxdepth: 1 - :glob: - - * - - diff --git a/docs/howto/simple_tooling/rollback.ipynb b/docs/howto/simple_tooling/rollback.ipynb deleted file mode 120000 index bd29b917..00000000 --- a/docs/howto/simple_tooling/rollback.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/2_simple_tooling/rollback.ipynb \ No newline at end of file diff --git a/docs/howto/simple_tooling/validate.ipynb b/docs/howto/simple_tooling/validate.ipynb deleted file mode 120000 index e7b38cfd..00000000 --- a/docs/howto/simple_tooling/validate.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../examples/2_simple_tooling/validate.ipynb \ No newline at end of file diff --git a/docs/tutorials/intro/config.yaml b/docs/tutorials/intro/config.yaml index bb7bf3db..ed623ada 100644 --- a/docs/tutorials/intro/config.yaml +++ b/docs/tutorials/intro/config.yaml @@ -2,6 +2,5 @@ num_workers: 100 inventory: brigade.plugins.inventory.simple.SimpleInventory SimpleInventory: - host_file: "../../../examples/inventory/hosts.yaml" - group_file: "../../../examples/inventory/groups.yaml" - + host_file: "inventory/hosts.yaml" + group_file: "inventory/groups.yaml" diff --git a/docs/tutorials/intro/executing_tasks.ipynb b/docs/tutorials/intro/executing_tasks.ipynb index 34117dfa..5eb7a3f0 100644 --- a/docs/tutorials/intro/executing_tasks.ipynb +++ b/docs/tutorials/intro/executing_tasks.ipynb @@ -57,7 +57,7 @@ "\n", "cmh_hosts = brg.filter(site=\"cmh\", role=\"host\")\n", "\n", - "result = cmh_hosts.run(commands.remote_command,\n", + "result = cmh_hosts.run(task=commands.remote_command,\n", " command=\"ls -la /tmp\")\n", "\n", "print_result(result, vars=[\"stdout\"])" @@ -139,7 +139,7 @@ "from brigade.plugins.tasks import networking\n", "\n", "cmh_spines = brg.filter(site=\"bma\", role=\"spine\")\n", - "result = cmh_spines.run(networking.napalm_get,\n", + "result = cmh_spines.run(task=networking.napalm_get,\n", " getters=[\"facts\"]) \n", "print_result(result)" ] @@ -195,7 +195,7 @@ "def hi(task):\n", " print(f\"hi! My name is {task.host.name} and I live in {task.host['site']}\")\n", " \n", - "brg.run(hi, num_workers=1)" + "brg.run(task=hi, num_workers=1)" ] }, { @@ -261,14 +261,14 @@ ], "source": [ "def available_resources(task):\n", - " task.run(commands.remote_command,\n", + " task.run(task=commands.remote_command,\n", " name=\"Available disk\",\n", " command=\"df -h\")\n", - " task.run(commands.remote_command,\n", + " task.run(task=commands.remote_command,\n", " name=\"Available memory\",\n", " command=\"free -m\")\n", " \n", - "result = cmh_hosts.run(available_resources)\n", + "result = cmh_hosts.run(task=available_resources)\n", "\n", "print_result(result, vars=[\"stdout\"])" ] @@ -313,10 +313,10 @@ "def count(task, to):\n", " print(f\"{task.host.name}: {list(range(0, to))}\")\n", " \n", - "cmh_hosts.run(count,\n", + "cmh_hosts.run(task=count,\n", " num_workers=1,\n", " to=10)\n", - "cmh_hosts.run(count,\n", + "cmh_hosts.run(task=count,\n", " num_workers=1,\n", " to=20)" ] @@ -348,7 +348,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/docs/tutorials/intro/failed_tasks.ipynb b/docs/tutorials/intro/failed_tasks.ipynb index 30ffca42..e7a879cd 100644 --- a/docs/tutorials/intro/failed_tasks.ipynb +++ b/docs/tutorials/intro/failed_tasks.ipynb @@ -40,7 +40,7 @@ "source": [ "def basic_configuration(task):\n", " # Transform inventory data to configuration via a template file\n", - " r = task.run(text.template_file,\n", + " r = task.run(task=text.template_file,\n", " name=\"Base Configuration\",\n", " template=\"base.j2\",\n", " path=f\"templates/junos\")\n", @@ -49,7 +49,7 @@ " task.host[\"config\"] = r.result\n", "\n", " # Deploy that configuration to the device using NAPALM\n", - " task.run(networking.napalm_configure,\n", + " task.run(task=networking.napalm_configure,\n", " name=\"Loading Configuration on the device\",\n", " replace=False,\n", " configuration=task.host[\"config\"])" @@ -68,7 +68,7 @@ "metadata": {}, "outputs": [], "source": [ - "result = cmh.run(basic_configuration)" + "result = cmh.run(task=basic_configuration)" ] }, { @@ -106,8 +106,8 @@ { "data": { "text/plain": [ - "{'leaf00.cmh': MultiResult: [Result: \"Base Configuration\", Result: \"basic_configuration\"],\n", - " 'spine00.cmh': MultiResult: [Result: \"Base Configuration\", Result: \"basic_configuration\"]}" + "{'leaf00.cmh': MultiResult: [Result: \"basic_configuration\", Result: \"Base Configuration\", Result: \"Loading Configuration on the device\"],\n", + " 'spine00.cmh': MultiResult: [Result: \"basic_configuration\", Result: \"Base Configuration\", Result: \"Loading Configuration on the device\"]}" ] }, "execution_count": 5, @@ -123,18 +123,7 @@ "cell_type": "code", "execution_count": 6, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "napalm.base.exceptions.MergeConfigException(\"Error [1002]: CLI command 3 of 6 'system {' failed: invalid command [Invalid input (at token 1: '{')]\")" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "result['spine00.cmh'][1].exception" ] @@ -159,103 +148,97 @@ "text": [ "\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name spine00.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[31m---- Loading Configuration on the device ** changed : False -------------------- ERROR\u001b[0m\n", "\u001b[0mTraceback (most recent call last):\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 193, in _load_config\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 231, in _load_config\n", " self.device.run_commands(commands)\n", " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/client.py\", line 730, in run_commands\n", " response = self._connection.execute(commands, encoding, **kwargs)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 495, in execute\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 499, in execute\n", " response = self.send(request)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 414, in send\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 418, in send\n", " raise CommandError(code, msg, command_error=err, output=out)\n", "pyeapi.eapilib.CommandError: Error [1002]: CLI command 3 of 6 'system {' failed: invalid command [Invalid input (at token 1: '{')]\n", "\n", "During handling of the above exception, another exception occurred:\n", "\n", "Traceback (most recent call last):\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/__init__.py\", line 238, in run_task\n", - " r = task._start(host=host, brigade=brigade, dry_run=dry_run)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 43, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"\", line 15, in basic_configuration\n", - " configuration=task.host[\"config\"])\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 72, in run\n", - " r = Task(task, **kwargs)._start(self.host, self.brigade, dry_run, sub_task=True)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 43, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/plugins/tasks/networking/napalm_configure.py\", line 24, in napalm_configure\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/brigade/core/task.py\", line 61, in start\n", + " r = self.task(self, **self.params)\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/brigade/plugins/tasks/networking/napalm_configure.py\", line 26, in napalm_configure\n", " device.load_merge_candidate(filename=filename, config=configuration)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 207, in load_merge_candidate\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 245, in load_merge_candidate\n", " self._load_config(filename, config, False)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 199, in _load_config\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 237, in _load_config\n", " raise MergeConfigException(e.message)\n", "napalm.base.exceptions.MergeConfigException: Error [1002]: CLI command 3 of 6 'system {' failed: invalid command [Invalid input (at token 1: '{')]\n", "\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name spine01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name spine01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name leaf00.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[31m---- Loading Configuration on the device ** changed : False -------------------- ERROR\u001b[0m\n", "\u001b[0mTraceback (most recent call last):\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 193, in _load_config\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 231, in _load_config\n", " self.device.run_commands(commands)\n", " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/client.py\", line 730, in run_commands\n", " response = self._connection.execute(commands, encoding, **kwargs)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 495, in execute\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 499, in execute\n", " response = self.send(request)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 414, in send\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/pyeapi/eapilib.py\", line 418, in send\n", " raise CommandError(code, msg, command_error=err, output=out)\n", "pyeapi.eapilib.CommandError: Error [1002]: CLI command 3 of 6 'system {' failed: invalid command [Invalid input (at token 1: '{')]\n", "\n", "During handling of the above exception, another exception occurred:\n", "\n", "Traceback (most recent call last):\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/__init__.py\", line 238, in run_task\n", - " r = task._start(host=host, brigade=brigade, dry_run=dry_run)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 43, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"\", line 15, in basic_configuration\n", - " configuration=task.host[\"config\"])\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 72, in run\n", - " r = Task(task, **kwargs)._start(self.host, self.brigade, dry_run, sub_task=True)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 43, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/plugins/tasks/networking/napalm_configure.py\", line 24, in napalm_configure\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/brigade/core/task.py\", line 61, in start\n", + " r = self.task(self, **self.params)\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/brigade/plugins/tasks/networking/napalm_configure.py\", line 26, in napalm_configure\n", " device.load_merge_candidate(filename=filename, config=configuration)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 207, in load_merge_candidate\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 245, in load_merge_candidate\n", " self._load_config(filename, config, False)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 199, in _load_config\n", + " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/eos/eos.py\", line 237, in _load_config\n", " raise MergeConfigException(e.message)\n", "napalm.base.exceptions.MergeConfigException: Error [1002]: CLI command 3 of 6 'system {' failed: invalid command [Invalid input (at token 1: '{')]\n", "\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name leaf01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name leaf01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } @@ -313,7 +296,7 @@ "def hi(task):\n", " return Result(host=task.host, result=f\"{task.host.name}: Hi, I am still here!\")\n", " \n", - "result = cmh.run(hi)" + "result = cmh.run(task=hi)" ] }, { @@ -327,13 +310,13 @@ "text": [ "\u001b[1m\u001b[36mhi******************************************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mspine01.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mleaf01.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } @@ -360,27 +343,27 @@ "text": [ "\u001b[1m\u001b[36mhi******************************************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mspine01.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mleaf01.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mspine00.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mleaf00.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } ], "source": [ - "result = cmh.run(hi, on_failed=True)\n", + "result = cmh.run(task=hi, on_failed=True)\n", "print_result(result)" ] }, @@ -402,19 +385,19 @@ "text": [ "\u001b[1m\u001b[36mhi******************************************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mspine00.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- hi ** changed : False ----------------------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv hi ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", "\u001b[0mleaf00.cmh: Hi, I am still here!\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END hi ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } ], "source": [ - "result = cmh.run(hi, on_failed=True, on_good=False)\n", + "result = cmh.run(task=hi, on_failed=True, on_good=False)\n", "print_result(result)" ] }, @@ -422,7 +405,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To achieve this `brigade` keeps a list failed hosts in it's shared [data](ref/api/brigade.rst#brigade.core.Data) object:" + "To achieve this `brigade` keeps a list failed hosts in it's shared [data](../../ref/api/brigade.rst#brigade.core.Data) object:" ] }, { @@ -500,7 +483,7 @@ "brg = InitBrigade(config_file=\"config.yaml\", raise_on_error=True)\n", "cmh = brg.filter(site=\"cmh\", type=\"network_device\")\n", "try:\n", - " cmh.run(basic_configuration)\n", + " cmh.run(task=basic_configuration)\n", "except BrigadeExecutionError:\n", " print(\"ERROR!!!\")" ] @@ -536,7 +519,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/docs/tutorials/intro/grouping_tasks.ipynb b/docs/tutorials/intro/grouping_tasks.ipynb index 8ce8be67..cb2279ec 100644 --- a/docs/tutorials/intro/grouping_tasks.ipynb +++ b/docs/tutorials/intro/grouping_tasks.ipynb @@ -33,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "You may have noticed that `InitBrigade` got a new argument `dry_run=True`. That argument (which defaults to `False`) controls whether to apply the changes to the device or just simulate them. You can control that argument via the configuration as well. You can even override it in a given task if you want (we will see an example later on).\n", + "You may have noticed that `InitBrigade` got a new argument `dry_run=True`. That argument (which defaults to `False`) controls whether to apply the changes to the device or just simulate them. You can control that argument via the configuration as well. Some tasks might even allow you to override this behavior completely at the task level.\n", "\n", "Now, let's create task that is going to group what we want to do:" ] @@ -46,7 +46,7 @@ "source": [ "def basic_configuration(task):\n", " # Transform inventory data to configuration via a template file\n", - " r = task.run(text.template_file,\n", + " r = task.run(task=text.template_file,\n", " name=\"Base Configuration\",\n", " template=\"base.j2\",\n", " path=f\"templates/{task.host.nos}\")\n", @@ -55,7 +55,7 @@ " task.host[\"config\"] = r.result\n", " \n", " # Deploy that configuration to the device using NAPALM\n", - " task.run(networking.napalm_configure,\n", + " task.run(task=networking.napalm_configure,\n", " name=\"Loading Configuration on the device\",\n", " replace=False,\n", " configuration=task.host[\"config\"])" @@ -132,11 +132,11 @@ "\u001b[1m\u001b[32m**** Playbook to configure the network *****************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0mhostname spine00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m@@ -7,6 +7,9 @@\n", " action bash sudo /mnt/flash/initialize_ma1.sh\n", " !\n", @@ -147,26 +147,26 @@ " !\n", " spanning-tree mode mstp\n", " !\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name spine01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m[edit system]\n", "- host-name vsrx;\n", "+ host-name spine01.cmh;\n", "+ domain-name cmh.acme.local;\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0mhostname leaf00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m@@ -7,6 +7,9 @@\n", " action bash sudo /mnt/flash/initialize_ma1.sh\n", " !\n", @@ -177,27 +177,27 @@ " !\n", " spanning-tree mode mstp\n", " !\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name leaf01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m[edit system]\n", "- host-name vsrx;\n", "+ host-name leaf01.cmh;\n", "+ domain-name cmh.acme.local;\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } ], "source": [ "print_title(\"Playbook to configure the network\")\n", - "result = cmh.run(basic_configuration)\n", + "result = cmh.run(task=basic_configuration)\n", "print_result(result)" ] }, @@ -207,42 +207,17 @@ "source": [ "As you can see, pretty straightforward. We just call the function we defined earlier grouping the tasks we wanted to execute and then we leverage on `functions.text.print_title` and `tasks.text.print_result` to make things look pretty.\n", "\n", - "## Overriding `dry_run` per task\n", + "However, this was a `dry_run`. Let's set the `dry_run` variable to `False` so changes are commited and then run the code again:\n", "\n", - "This is not strictly related to task groups but as the concept of `dry_run` was introduced here let's see now how we can override the behavior of `dry_run` per task. By default, tasks are going to honor the value of the attribute `dry_run` of our Brigade object which is defined when creating the object:" + "
\n", + "**Note:** The `dry_run` value is shared between the main brigade objects and its childs so in the snippet below `brg.dry_run = False` and `cmh.dry_run = False` are equivalent.\n", + "
" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cmh.dry_run" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can change that value globally by just doing `cmh.dry_run = False` or we can override if needed just for a given task by passing the desired value as a keyword argument. For instance:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, "outputs": [ { "name": "stdout", @@ -251,11 +226,11 @@ "\u001b[1m\u001b[32m**** Playbook to configure the network *****************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0mhostname spine00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m@@ -7,6 +7,9 @@\n", " action bash sudo /mnt/flash/initialize_ma1.sh\n", " !\n", @@ -266,26 +241,26 @@ " !\n", " spanning-tree mode mstp\n", " !\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name spine01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m[edit system]\n", "- host-name vsrx;\n", "+ host-name spine01.cmh;\n", "+ domain-name cmh.acme.local;\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0mhostname leaf00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m@@ -7,6 +7,9 @@\n", " action bash sudo /mnt/flash/initialize_ma1.sh\n", " !\n", @@ -296,27 +271,28 @@ " !\n", " spanning-tree mode mstp\n", " !\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name leaf01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", "\u001b[0m[edit system]\n", "- host-name vsrx;\n", "+ host-name leaf01.cmh;\n", "+ domain-name cmh.acme.local;\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } ], "source": [ + "brg.dry_run = False\n", "print_title(\"Playbook to configure the network\")\n", - "result = cmh.run(basic_configuration, dry_run=False)\n", + "result = cmh.run(task=basic_configuration)\n", "print_result(result)" ] }, @@ -324,12 +300,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This time, configuration should've been commited so if we run it again the task \"Loading Configuration on the device\" should tell us that `changed : False` and should return an empty diff. Let's see if that's true:" + "As the configuration should've been commited already if we run it again the task \"Loading Configuration on the device\" should tell us that `changed : False` and should return an empty diff. Let's see if that's true:" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -338,45 +314,73 @@ "text": [ "\u001b[1m\u001b[32m**** Playbook to configure the network *****************************************\u001b[0m\n", "\u001b[0m\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0mhostname spine00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname spine00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name spine01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name spine01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0mhostname leaf00.cmh\n", "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname leaf00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- INFO\u001b[0m\n", "\u001b[0msystem {\n", " host-name leaf01.cmh;\n", " domain-name cmh.acme.local;\n", "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name leaf01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } ], "source": [ "print_title(\"Playbook to configure the network\")\n", - "result = cmh.run(basic_configuration, dry_run=False)\n", + "result = cmh.run(task=basic_configuration)\n", "print_result(result)" ] } @@ -398,7 +402,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/docs/tutorials/intro/initializing_brigade.ipynb b/docs/tutorials/intro/initializing_brigade.ipynb index 3ac0a431..a7504252 100644 --- a/docs/tutorials/intro/initializing_brigade.ipynb +++ b/docs/tutorials/intro/initializing_brigade.ipynb @@ -9,7 +9,7 @@ "outputs": [], "source": [ "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../../../examples/highlighter.py" + "%run ../../highlighter.py" ] }, { @@ -111,8 +111,8 @@ "2 num_workers: 100\n", "3 inventory: brigade.plugins.inventory.simple.SimpleInventory\n", "4 SimpleInventory:\n", - "5 host_file: "../../../examples/inventory/hosts.yaml"\n", - "6 group_file: "../../../examples/inventory/groups.yaml"\n", + "5 host_file: "inventory/hosts.yaml"\n", + "6 group_file: "inventory/groups.yaml"\n", "\n", "\n" ], @@ -166,8 +166,8 @@ "from brigade.core import InitBrigade\n", "brg = InitBrigade(num_workers=100,\n", " inventory=\"brigade.plugins.inventory.simple.SimpleInventory\",\n", - " SimpleInventory={\"host_file\": \"../../../examples/inventory/hosts.yaml\",\n", - " \"group_file\": \"../../../examples/inventory/groups.yaml\"})" + " SimpleInventory={\"host_file\": \"inventory/hosts.yaml\",\n", + " \"group_file\": \"inventory/groups.yaml\"})" ] }, { @@ -224,7 +224,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/docs/tutorials/intro/inventory.ipynb b/docs/tutorials/intro/inventory.ipynb index 9820bddc..a98acf7a 100644 --- a/docs/tutorials/intro/inventory.ipynb +++ b/docs/tutorials/intro/inventory.ipynb @@ -9,7 +9,7 @@ "outputs": [], "source": [ "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../../../examples/highlighter.py" + "%run ../../highlighter.py" ] }, { @@ -257,7 +257,7 @@ ], "source": [ "# hosts file\n", - "%highlight_file ../../../examples/inventory/hosts.yaml" + "%highlight_file inventory/hosts.yaml" ] }, { @@ -386,7 +386,7 @@ ], "source": [ "# groups file\n", - "%highlight_file ../../../examples/inventory/groups.yaml" + "%highlight_file inventory/groups.yaml" ] }, { @@ -408,7 +408,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -680,7 +680,7 @@ ], "source": [ "# groups file\n", - "%highlight_file ../../../examples/inventory/groups.yaml" + "%highlight_file inventory/groups.yaml" ] }, { @@ -1051,7 +1051,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/examples/inventory/Vagrantfile b/docs/tutorials/intro/inventory/Vagrantfile similarity index 100% rename from examples/inventory/Vagrantfile rename to docs/tutorials/intro/inventory/Vagrantfile diff --git a/examples/inventory/groups.yaml b/docs/tutorials/intro/inventory/groups.yaml similarity index 100% rename from examples/inventory/groups.yaml rename to docs/tutorials/intro/inventory/groups.yaml diff --git a/examples/inventory/hosts.yaml b/docs/tutorials/intro/inventory/hosts.yaml similarity index 100% rename from examples/inventory/hosts.yaml rename to docs/tutorials/intro/inventory/hosts.yaml diff --git a/docs/tutorials/intro/task_results.ipynb b/docs/tutorials/intro/task_results.ipynb index 21aa4448..e36cb269 100644 --- a/docs/tutorials/intro/task_results.ipynb +++ b/docs/tutorials/intro/task_results.ipynb @@ -20,25 +20,28 @@ "from brigade.core import InitBrigade\n", "from brigade.plugins.tasks import networking, text\n", "from brigade.plugins.functions.text import print_title\n", + "import logging\n", "\n", "brg = InitBrigade(config_file=\"config.yaml\", dry_run=True)\n", "cmh = brg.filter(site=\"cmh\", type=\"network_device\")\n", "\n", "def basic_configuration(task):\n", " # Transform inventory data to configuration via a template file\n", - " r = task.run(text.template_file,\n", + " r = task.run(task=text.template_file,\n", " name=\"Base Configuration\",\n", " template=\"base.j2\",\n", - " path=f\"templates/{task.host.nos}\")\n", + " path=f\"templates/{task.host.nos}\",\n", + " severity=logging.DEBUG)\n", "\n", " # Save the compiled configuration into a host variable\n", " task.host[\"config\"] = r.result\n", "\n", " # Deploy that configuration to the device using NAPALM\n", - " task.run(networking.napalm_configure,\n", + " task.run(task=networking.napalm_configure,\n", " name=\"Loading Configuration on the device\",\n", " replace=False,\n", - " configuration=task.host[\"config\"])" + " configuration=task.host[\"config\"],\n", + " severity=logging.INFO)" ] }, { @@ -54,7 +57,7 @@ "metadata": {}, "outputs": [], "source": [ - "result = cmh.run(basic_configuration)" + "result = cmh.run(task=basic_configuration)" ] }, { @@ -76,38 +79,50 @@ "output_type": "stream", "text": [ "\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", - "\u001b[0mhostname spine00.cmh\n", - "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", - "\u001b[0msystem {\n", - " host-name spine01.cmh;\n", - " domain-name cmh.acme.local;\n", - "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", - "\u001b[0mhostname leaf00.cmh\n", - "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", - "\u001b[0msystem {\n", - " host-name leaf01.cmh;\n", - " domain-name cmh.acme.local;\n", - "}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname spine00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name spine01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname leaf00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name leaf01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } @@ -134,12 +149,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m\u001b[32m---- basic_configuration ** changed : False -----------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------\u001b[0m\n", - "\u001b[0mhostname spine00.cmh\n", - "ip domain-name cmh.acme.local\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", + "\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname spine00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } @@ -164,7 +186,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", + "\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname spine00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", "\u001b[0m" ] } @@ -177,7 +209,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Or even a given task for all the hosts:" + "As you probably noticed, not all the tasks where printed. If you check the tests they all got a new argument `severity`. This let's us flag tasks with any of the logging levels. Then `print_result` is able to following logging rules to print the results. By default only tasks marked as `INFO` will be printed (this is also the default for the tasks if none is specified). Note that a failed task will have its severity level changed to `ERROR` regardless of the one specified by the user.\n", + "\n", + "Now let's tell `print_result` to print tasks marked as `DEBUG`." ] }, { @@ -190,24 +224,72 @@ "output_type": "stream", "text": [ "\u001b[1m\u001b[36mbasic_configuration*************************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[32m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- DEBUG\u001b[0m\n", + "\u001b[0mhostname spine00.cmh\n", + "ip domain-name cmh.acme.local\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname spine00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- DEBUG\u001b[0m\n", + "\u001b[0msystem {\n", + " host-name spine01.cmh;\n", + " domain-name cmh.acme.local;\n", + "}\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name spine01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- DEBUG\u001b[0m\n", + "\u001b[0mhostname leaf00.cmh\n", + "ip domain-name cmh.acme.local\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname leaf00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32mvvvv basic_configuration ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m---- Base Configuration ** changed : False ------------------------------------- DEBUG\u001b[0m\n", + "\u001b[0msystem {\n", + " host-name leaf01.cmh;\n", + " domain-name cmh.acme.local;\n", + "}\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[33m---- Loading Configuration on the device ** changed : True --------------------- INFO\u001b[0m\n", + "\u001b[0m[edit system]\n", + "- host-name vsrx;\n", + "+ host-name leaf01.cmh;\n", + "+ domain-name cmh.acme.local;\u001b[0m\n", + "\u001b[0m\u001b[1m\u001b[32m^^^^ END basic_configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n", "\u001b[0m" ] } ], "source": [ - "print_result(result, task_id=2)" + "print_result(result, severity_level=logging.DEBUG)" ] }, { @@ -322,7 +404,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "changed: \u001b[0m \u001b[0mFalse\u001b[0m\n", + "changed: \u001b[0m \u001b[0mTrue\u001b[0m\n", "\u001b[0mfailed: \u001b[0m \u001b[0mFalse\u001b[0m\n", "\u001b[0m" ] @@ -369,7 +451,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[0m\n", + "@@ -7,6 +7,9 @@\n", + " action bash sudo /mnt/flash/initialize_ma1.sh\n", + " !\n", + " transceiver qsfp default-mode 4x10G\n", + "+!\n", + "+hostname spine00.cmh\n", + "+ip domain-name cmh.acme.local\n", + " !\n", + " spanning-tree mode mstp\n", + " !\u001b[0m\n", "\u001b[0m" ] } @@ -402,7 +493,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/examples/1_simple_runbooks/backup.ipynb b/examples/1_simple_runbooks/backup.ipynb deleted file mode 100644 index 8f5956ec..00000000 --- a/examples/1_simple_runbooks/backup.ipynb +++ /dev/null @@ -1,557 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Backup\n", - "\n", - "This runbook is going to download the configuration of the devices and save it under `./backup/$hostname`. It also reports changes as we will a continuation.\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Runbook that downloads the configuration from the devices and\n",
-       " 4 stores them on disk.\n",
-       " 5 """\n",
-       " 6 from brigade.easy import easy_brigade\n",
-       " 7 from brigade.plugins.tasks import files, networking, text\n",
-       " 8 \n",
-       " 9 \n",
-       "10 def backup(task):\n",
-       "11     """\n",
-       "12     This function groups two tasks:\n",
-       "13         1. Download configuration from the device\n",
-       "14         2. Store to disk\n",
-       "15     """\n",
-       "16     result = task.run(networking.napalm_get,\n",
-       "17                       name="Gathering configuration",\n",
-       "18                       getters="config")\n",
-       "19 \n",
-       "20     task.run(files.write,\n",
-       "21              name="Saving Configuration to disk",\n",
-       "22              content=result.result["config"]["running"],\n",
-       "23              filename="./backups/{}".format(task.host))\n",
-       "24 \n",
-       "25 \n",
-       "26 brg = easy_brigade(\n",
-       "27         host_file="../inventory/hosts.yaml",\n",
-       "28         group_file="../inventory/groups.yaml",\n",
-       "29         dry_run=False,\n",
-       "30         raise_on_error=True,\n",
-       "31 )\n",
-       "32 \n",
-       "33 # select which devices we want to work with\n",
-       "34 filtered = brg.filter(type="network_device", site="cmh")\n",
-       "35 \n",
-       "36 # Run the ``backup`` function that groups the tasks to\n",
-       "37 # download/store devices' configuration\n",
-       "38 results = filtered.run(backup,\n",
-       "39                        name="Backing up configurations")\n",
-       "40 \n",
-       "41 # Let's print the result on screen\n",
-       "42 filtered.run(text.print_result,\n",
-       "43              num_workers=1,  # task should be done synchronously\n",
-       "44              data=results,\n",
-       "45              task_id=-1,  # we only want to print the last task\n",
-       "46              )\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file backup.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "Let's run the command for the first time (note we are cleaning first `./backups/` folder to pretend each run of the following cell is the first one):" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- ./backups/spine00.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,34 @@\n", - "\n", - "+! Command: show running-config\n", - "+! device: localhost (vEOS, EOS-4.17.5M)\n", - "+!\n", - "+! boot system flash:/vEOS-lab.swi\n", - "+!\n", - "+event-handler dhclient\n", - "+ trigger on-boot\n", - "+ action bash sudo /mnt/flash/initialize_ma1.sh\n", - "+!\n", - "+transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+spanning-tree mode mstp\n", - "+!\n", - "+aaa authorization exec default local\n", - "+!\n", - "+aaa root secret sha512 $6$5stn7z2imBLV6iO0$w0ZnOhy8SwNdELdO2da9q8wDKerYTyY8evY052UoyRJ2Wo6liaUneuTFGphL8JQD9gtESOipCBb6PYmSMuUjs.\n", - "+!\n", - "+username admin privilege 15 role network-admin secret sha512 $6$qkXlQpatVlanYe9v$aHTbPaGTaqDRCp5WSC3DPpDfblYSE24.OHeKgGOOTf0.Ol2lDpivTvHByx5tU41sVOGcHqc4U4LgrKv8AjbKQ/\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - "+!\n", - "+interface Ethernet1\n", - "+!\n", - "+interface Ethernet2\n", - "+!\n", - "+interface Management1\n", - "+ ip address 10.0.2.15/24\n", - "+!\n", - "+no ip routing\n", - "+!\n", - "+management api http-commands\n", - "+ no shutdown\n", - "+!\n", - "+!\n", - "+end\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- ./backups/spine01.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,70 @@\n", - "\n", - "+\n", - "+## Last commit: 2018-01-14 14:33:48 UTC by vagrant\n", - "+version 12.1X47-D20.7;\n", - "+system {\n", - "+ host-name vsrx;\n", - "+ root-authentication {\n", - "+ encrypted-password \"$1$5MhDFyrI$NBBMndW1POqbN.0QEA4z0.\";\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDi/i8iiAZsXC5qdmJZpTxKjUyyoMgEGoHXl/TMFdJjSV+XAZ18OXAEsvPO0AlXJ6RZTwK8Zcr6TLq4l1Kssd+kVN02shFkgDo3wWf3I2BXKKdog6/6fbhiD1SgCeafzWBlUQvREgDQDy1XSFjNjSJ39vtOa8ikqGdbf4XH0hjoLHYDV0H0VNZLboULCNFPF0PHQfPrsp2AXHU+p7sl61GhZgfw6WuLIzXWqJyq9B0Q5XgdmvnvdjZeTOShoPTPbaRYVVFOMGTqJQOZsl5P3wTIJT8JG7iEz1Tiar8nmltON83sy/lEODhZkJPXe3zw3fwUIS9yQ53z0t1UGHm7KGNX vagrant\";\n", - "+ }\n", - "+ login {\n", - "+ user vagrant {\n", - "+ uid 2000;\n", - "+ class super-user;\n", - "+ authentication {\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key\";\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ services {\n", - "+ ssh {\n", - "+ root-login allow;\n", - "+ }\n", - "+ netconf {\n", - "+ ssh;\n", - "+ }\n", - "+ web-management {\n", - "+ http {\n", - "+ interface ge-0/0/0.0;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ syslog {\n", - "+ user * {\n", - "+ any emergency;\n", - "+ }\n", - "+ file messages {\n", - "+ any any;\n", - "+ authorization info;\n", - "+ }\n", - "+ file interactive-commands {\n", - "+ interactive-commands any;\n", - "+ }\n", - "+ }\n", - "+ license {\n", - "+ autoupdate {\n", - "+ url https://ae1.juniper.net/junos/key_retrieval;\n", - "+ }\n", - "+ }\n", - "+}\n", - "+interfaces {\n", - "+ ge-0/0/0 {\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ dhcp;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+security {\n", - "+ forwarding-options {\n", - "+ family {\n", - "+ inet6 {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ mpls {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- ./backups/leaf00.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,34 @@\n", - "\n", - "+! Command: show running-config\n", - "+! device: localhost (vEOS, EOS-4.17.5M)\n", - "+!\n", - "+! boot system flash:/vEOS-lab.swi\n", - "+!\n", - "+event-handler dhclient\n", - "+ trigger on-boot\n", - "+ action bash sudo /mnt/flash/initialize_ma1.sh\n", - "+!\n", - "+transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+spanning-tree mode mstp\n", - "+!\n", - "+aaa authorization exec default local\n", - "+!\n", - "+aaa root secret sha512 $6$sRifRAo/DXihW7sG$3r4MMTsslNCCWdD/FFIw3lvnnkI4SWO0bvhEzvWSurrOBgUsxjrmgN5kywH5Ta7LNNXiWjFfjwoyefn9nqeB2/\n", - "+!\n", - "+username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - "+!\n", - "+interface Ethernet1\n", - "+!\n", - "+interface Ethernet2\n", - "+!\n", - "+interface Management1\n", - "+ ip address 10.0.2.15/24\n", - "+!\n", - "+no ip routing\n", - "+!\n", - "+management api http-commands\n", - "+ no shutdown\n", - "+!\n", - "+!\n", - "+end\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- ./backups/leaf01.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,70 @@\n", - "\n", - "+\n", - "+## Last commit: 2018-01-14 14:33:48 UTC by vagrant\n", - "+version 12.1X47-D20.7;\n", - "+system {\n", - "+ host-name vsrx;\n", - "+ root-authentication {\n", - "+ encrypted-password \"$1$5MhDFyrI$NBBMndW1POqbN.0QEA4z0.\";\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsfGpEhGi8CbjIHJkMju/CJH6IuQiIzZyDt+AVieDfXKWDuBSOfc7YV8xNdYMqQqpDOWmEVZ7dhfD6IWDI3aa6WLkEXORD+zScjQo+5iHty6VlI61ImHQkWhWX6pZi3Cq/JsH8oldIC2xvzFNWB2p1suu+rzuGtJjbDq5NMlp1bNSiBgV0dHZR6Lt1UuK/rVBl7FbBN8HpInM+a37SkkwIrKMK8z42Ax9ufd17P3SqZP8oo+Ql4Y3aeCz2t4CfZNh9YRLZSiUYF16VN+31mzKEqT7+0rFlyfv/CaPwyfAv2BPFljUEsyFsWU923EGYQsfOIKVnd+zzHDHIHapVMQbh vagrant\";\n", - "+ }\n", - "+ login {\n", - "+ user vagrant {\n", - "+ uid 2000;\n", - "+ class super-user;\n", - "+ authentication {\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key\";\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ services {\n", - "+ ssh {\n", - "+ root-login allow;\n", - "+ }\n", - "+ netconf {\n", - "+ ssh;\n", - "+ }\n", - "+ web-management {\n", - "+ http {\n", - "+ interface ge-0/0/0.0;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ syslog {\n", - "+ user * {\n", - "+ any emergency;\n", - "+ }\n", - "+ file messages {\n", - "+ any any;\n", - "+ authorization info;\n", - "+ }\n", - "+ file interactive-commands {\n", - "+ interactive-commands any;\n", - "+ }\n", - "+ }\n", - "+ license {\n", - "+ autoupdate {\n", - "+ url https://ae1.juniper.net/junos/key_retrieval;\n", - "+ }\n", - "+ }\n", - "+}\n", - "+interfaces {\n", - "+ ge-0/0/0 {\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ dhcp;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+security {\n", - "+ forwarding-options {\n", - "+ family {\n", - "+ inet6 {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ mpls {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%rm backups/* > /dev/null\n", - "%run backup.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's run it again to see how ``brigade`` detects no changes in the backup:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : False --------------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : False --------------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : False --------------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : False --------------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run backup.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's change the device's hostname and run the backup tool again:\n", - "\n", - " localhost(config)#hostname blah\n", - " blah(config)# end" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- ./backups/spine00.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -1,5 +1,5 @@\n", - "\n", - " ! Command: show running-config\n", - "-! device: localhost (vEOS, EOS-4.17.5M)\n", - "+! device: blah (vEOS, EOS-4.17.5M)\n", - " !\n", - " ! boot system flash:/vEOS-lab.swi\n", - " !\n", - "@@ -8,6 +8,8 @@\n", - "\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname blah\n", - " !\n", - " spanning-tree mode mstp\n", - " !\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : False --------------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : False --------------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : False --------------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run backup.py" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/1_simple_runbooks/backup.py b/examples/1_simple_runbooks/backup.py deleted file mode 100755 index 22b4c5e3..00000000 --- a/examples/1_simple_runbooks/backup.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python -""" -Runbook that downloads the configuration from the devices and -stores them on disk. -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import files, networking, text - - -def backup(task): - """ - This function groups two tasks: - 1. Download configuration from the device - 2. Store to disk - """ - result = task.run( - networking.napalm_get, name="Gathering configuration", getters="config" - ) - - task.run( - files.write, - name="Saving Configuration to disk", - content=result.result["config"]["running"], - filename="./backups/{}".format(task.host), - ) - - -brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, -) - -# select which devices we want to work with -filtered = brg.filter(type="network_device", site="cmh") - -# Run the ``backup`` function that groups the tasks to -# download/store devices' configuration -results = filtered.run(backup, name="Backing up configurations") - -# Let's print the result on screen -filtered.run( - text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task -) diff --git a/examples/1_simple_runbooks/configure.ipynb b/examples/1_simple_runbooks/configure.ipynb deleted file mode 100644 index 2f409b64..00000000 --- a/examples/1_simple_runbooks/configure.ipynb +++ /dev/null @@ -1,673 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Configure\n", - "\n", - "This is a runbook to configure the network. To do so we are going to load first some data from the directory `../extra_data/` and then a bunch of templates to generate, based on that extra data, the configuration for the devices.\n", - "\n", - "## Extra data\n", - "\n", - "Let's first look at the extra data we are going to use:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "../extra_data/leaf00.cmh:\r\n", - "l3.yaml\r\n", - "\r\n", - "../extra_data/leaf01.cmh:\r\n", - "l3.yaml\r\n", - "\r\n", - "../extra_data/spine00.cmh:\r\n", - "l3.yaml\r\n", - "\r\n", - "../extra_data/spine01.cmh:\r\n", - "l3.yaml\r\n" - ] - } - ], - "source": [ - "%ls ../extra_data/*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's look at one of the files for reference:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---\r\n", - "interfaces:\r\n", - " Ethernet1:\r\n", - " connects_to: spine00.cmh\r\n", - " ipv4: 10.0.0.1/31\r\n", - " enabled: false\r\n", - " Ethernet2:\r\n", - " connects_to: spine01.cmh\r\n", - " ipv4: 10.0.1.1/31\r\n", - " enabled: true\r\n", - "\r\n", - "sessions:\r\n", - " - ipv4: 10.0.0.0\r\n", - " peer_as: 65000\r\n", - " - ipv4: 10.0.1.0\r\n", - " peer_as: 65000\r\n" - ] - } - ], - "source": [ - "% cat ../extra_data/leaf00.cmh/l3.yaml" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Templates\n", - "\n", - "To configure the network we will transform the data we saw before into actual configurationusing jinja2 templates. The templates are:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "../templates/eos:\r\n", - "base.j2 interfaces.j2 leaf.j2 routing.j2 spine.j2\r\n", - "\r\n", - "../templates/junos:\r\n", - "base.j2 interfaces.j2 leaf.j2 routing.j2 spine.j2\r\n" - ] - } - ], - "source": [ - "%ls ../templates/*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As an example, let's look how the ``interfaces.j2`` template will consume the extra data we saw before to configure the interfaces:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{% for interface, data in l3.interfaces.items() %}\r\n", - "interface {{ interface }}\r\n", - " no switchport\r\n", - " ip address {{ data.ipv4 }}\r\n", - " description link to {{ data.connects_to }}\r\n", - " {{ \"no\" if data.enabled else \"\" }} shutdown\r\n", - "{% endfor %}\r\n", - "\r\n" - ] - } - ], - "source": [ - "%cat ../templates/eos/interfaces.j2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code\n", - "\n", - "Now let's look at the code that will sticth everything together:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Runbook to configure datacenter\n",
-       " 4 """\n",
-       " 5 from brigade.easy import easy_brigade\n",
-       " 6 from brigade.plugins.functions.text import print_title\n",
-       " 7 from brigade.plugins.tasks import data, networking, text\n",
-       " 8 \n",
-       " 9 \n",
-       "10 def configure(task):\n",
-       "11     """\n",
-       "12     This function groups all the tasks needed to configure the\n",
-       "13     network:\n",
-       "14 \n",
-       "15         1. Loading extra data\n",
-       "16         2. Templates to build configuration\n",
-       "17         3. Deploy configuration on the device\n",
-       "18     """\n",
-       "19     r = task.run(text.template_file,\n",
-       "20                  name="Base Configuration",\n",
-       "21                  template="base.j2",\n",
-       "22                  path="../templates/{brigade_nos}")\n",
-       "23     # r.result holds the result of rendering the template\n",
-       "24     # we store in the host itself so we can keep updating\n",
-       "25     # it as we render other templates\n",
-       "26     task.host["config"] = r.result\n",
-       "27 \n",
-       "28     r = task.run(data.load_yaml,\n",
-       "29                  name="Loading extra data",\n",
-       "30                  file="../extra_data/{host}/l3.yaml")\n",
-       "31     # r.result holds the data contained in the yaml files\n",
-       "32     # we load the data inside the host itself for further use\n",
-       "33     task.host["l3"] = r.result\n",
-       "34 \n",
-       "35     r = task.run(text.template_file,\n",
-       "36                  name="Interfaces Configuration",\n",
-       "37                  template="interfaces.j2",\n",
-       "38                  path="../templates/{brigade_nos}")\n",
-       "39     # we update our hosts' config\n",
-       "40     task.host["config"] += r.result\n",
-       "41 \n",
-       "42     r = task.run(text.template_file,\n",
-       "43                  name="Routing Configuration",\n",
-       "44                  template="routing.j2",\n",
-       "45                  path="../templates/{brigade_nos}")\n",
-       "46     # we update our hosts' config\n",
-       "47     task.host["config"] += r.result\n",
-       "48 \n",
-       "49     r = task.run(text.template_file,\n",
-       "50                  name="Role-specific Configuration",\n",
-       "51                  template="{role}.j2",\n",
-       "52                  path="../templates/{brigade_nos}")\n",
-       "53     # we update our hosts' config\n",
-       "54     task.host["config"] += r.result\n",
-       "55 \n",
-       "56     task.run(networking.napalm_configure,\n",
-       "57              name="Loading Configuration on the device",\n",
-       "58              replace=False,\n",
-       "59              configuration=task.host["config"])\n",
-       "60 \n",
-       "61 \n",
-       "62 brg = easy_brigade(\n",
-       "63         host_file="../inventory/hosts.yaml",\n",
-       "64         group_file="../inventory/groups.yaml",\n",
-       "65         dry_run=False,\n",
-       "66         raise_on_error=True,\n",
-       "67 )\n",
-       "68 \n",
-       "69 \n",
-       "70 # select which devices we want to work with\n",
-       "71 filtered = brg.filter(type="network_device", site="cmh")\n",
-       "72 \n",
-       "73 results = filtered.run(task=configure)\n",
-       "74 \n",
-       "75 print_title("Playbook to configure the network")\n",
-       "76 filtered.run(text.print_result,\n",
-       "77              name="Configure device",\n",
-       "78              num_workers=1,  # task should be done synchronously\n",
-       "79              data=results,\n",
-       "80              task_id=-1,  # we only want to print the last task\n",
-       "81              )\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file configure.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "Finally let's see everything in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[32m**** Playbook to configure the network *****************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,7 +8,8 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "-hostname localhost\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.com\n", - " !\n", - " spanning-tree mode mstp\n", - " !\n", - "@@ -20,13 +21,28 @@\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - " !\n", - " interface Ethernet1\n", - "+ description link to leaf00.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.0/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to leaf01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.2/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65000\n", - "+ neighbor 10.0.0.1 remote-as 65100\n", - "+ neighbor 10.0.0.1 maximum-routes 12000 \n", - "+ neighbor 10.0.0.3 remote-as 65101\n", - "+ neighbor 10.0.0.3 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.1 activate\n", - "+ neighbor 10.0.0.3 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to leaf00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.0/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to leaf01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.2/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65000;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.1.1 {\n", - "+ peer-as 65100;\n", - "+ }\n", - "+ neighbor 10.0.1.3 {\n", - "+ peer-as 65101;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,6 +8,9 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - " spanning-tree mode mstp\n", - " !\n", - " aaa authorization exec default local\n", - "@@ -17,14 +20,36 @@\n", - " username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - " !\n", - "+vlan 100\n", - "+ name frontend\n", - "+!\n", - "+vlan 200\n", - "+ name backend\n", - "+!\n", - " interface Ethernet1\n", - "+ description link to spine00.cmh\n", - "+ shutdown\n", - "+ no switchport\n", - "+ ip address 10.0.0.1/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to spine01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.1.1/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65100\n", - "+ neighbor 10.0.0.0 remote-as 65000\n", - "+ neighbor 10.0.0.0 maximum-routes 12000 \n", - "+ neighbor 10.0.1.0 remote-as 65000\n", - "+ neighbor 10.0.1.0 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.0 activate\n", - "+ neighbor 10.0.1.0 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name leaf01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to spine00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.0.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to spine01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65101;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.0.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ neighbor 10.0.1.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\n", - "+ vlans {\n", - "+ backend {\n", - "+ vlan-id 200;\n", - "+ }\n", - "+ frontend {\n", - "+ vlan-id 100;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[32m**** Playbook to configure the network *****************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The tool also detects unwanted changes and corrects them. For instance, let's change the hostname manually:\n", - "\n", - " spine00.cmh((config)#hostname localhost\n", - " localhost(config)#\n", - "\n", - "And run the runbook again:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[32m**** Playbook to configure the network *****************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,7 +8,7 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "-hostname localhost\n", - "+hostname spine00.cmh\n", - " ip domain-name cmh.acme.com\n", - " !\n", - " spanning-tree mode mstp\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/1_simple_runbooks/configure.py b/examples/1_simple_runbooks/configure.py deleted file mode 100755 index fce3b876..00000000 --- a/examples/1_simple_runbooks/configure.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python -""" -Runbook to configure datacenter -""" -from brigade.easy import easy_brigade -from brigade.plugins.functions.text import print_title -from brigade.plugins.tasks import data, networking, text - - -def configure(task): - """ - This function groups all the tasks needed to configure the - network: - - 1. Loading extra data - 2. Templates to build configuration - 3. Deploy configuration on the device - """ - r = task.run( - text.template_file, - name="Base Configuration", - template="base.j2", - path="../templates/{brigade_nos}", - ) - # r.result holds the result of rendering the template - # we store in the host itself so we can keep updating - # it as we render other templates - task.host["config"] = r.result - - r = task.run( - data.load_yaml, name="Loading extra data", file="../extra_data/{host}/l3.yaml" - ) - # r.result holds the data contained in the yaml files - # we load the data inside the host itself for further use - task.host["l3"] = r.result - - r = task.run( - text.template_file, - name="Interfaces Configuration", - template="interfaces.j2", - path="../templates/{brigade_nos}", - ) - # we update our hosts' config - task.host["config"] += r.result - - r = task.run( - text.template_file, - name="Routing Configuration", - template="routing.j2", - path="../templates/{brigade_nos}", - ) - # we update our hosts' config - task.host["config"] += r.result - - r = task.run( - text.template_file, - name="Role-specific Configuration", - template="{role}.j2", - path="../templates/{brigade_nos}", - ) - # we update our hosts' config - task.host["config"] += r.result - - task.run( - networking.napalm_configure, - name="Loading Configuration on the device", - replace=False, - configuration=task.host["config"], - ) - - -brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, -) - - -# select which devices we want to work with -filtered = brg.filter(type="network_device", site="cmh") - -results = filtered.run(task=configure) - -print_title("Playbook to configure the network") -filtered.run( - text.print_result, - name="Configure device", - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task -) diff --git a/examples/1_simple_runbooks/get_facts.ipynb b/examples/1_simple_runbooks/get_facts.ipynb deleted file mode 100644 index 920b6eba..00000000 --- a/examples/1_simple_runbooks/get_facts.ipynb +++ /dev/null @@ -1,662 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "hide_input": true - }, - "source": [ - "# Get Facts" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Following runbook will connect to devices in the site \"cmh\" and gather information about basic facts and interfaces.\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Very simple runbook to get facts and print them on the screen.\n",
-       " 4 """\n",
-       " 5 \n",
-       " 6 from brigade.easy import easy_brigade\n",
-       " 7 from brigade.plugins.functions.text import print_title\n",
-       " 8 from brigade.plugins.tasks import networking, text\n",
-       " 9 \n",
-       "10 \n",
-       "11 brg = easy_brigade(\n",
-       "12         host_file="../inventory/hosts.yaml",\n",
-       "13         group_file="../inventory/groups.yaml",\n",
-       "14         dry_run=False,\n",
-       "15         raise_on_error=False,\n",
-       "16 )\n",
-       "17 \n",
-       "18 print_title("Getting interfaces and facts")\n",
-       "19 \n",
-       "20 # select which devices we want to work with\n",
-       "21 filtered = brg.filter(type="network_device", site="cmh")\n",
-       "22 \n",
-       "23 # we are going to gather "interfaces" and "facts"\n",
-       "24 # information with napalm\n",
-       "25 results = filtered.run(networking.napalm_get,\n",
-       "26                        getters=["interfaces", "facts"])\n",
-       "27 \n",
-       "28 # Let's print the result on screen\n",
-       "29 filtered.run(text.print_result,\n",
-       "30              num_workers=1,  # task should be done synchronously\n",
-       "31              data=results,\n",
-       "32              )\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file get_facts.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "Let's run it:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[32m**** Getting interfaces and facts **********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'facts'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'fqdn'\u001b[0m: \u001b[0m'spine00.cmh.cmh.acme.com'\u001b[0m,\n", - " \u001b[0m'hostname'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'interface_list'\u001b[0m: \u001b[0m['Ethernet1', 'Ethernet2', 'Management1']\u001b[0m,\n", - " \u001b[0m'model'\u001b[0m: \u001b[0m'vEOS'\u001b[0m,\n", - " \u001b[0m'os_version'\u001b[0m: \u001b[0m'4.17.5M-4414219.4175M'\u001b[0m,\n", - " \u001b[0m'serial_number'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'uptime'\u001b[0m: \u001b[0m76742\u001b[0m,\n", - " \u001b[0m'vendor'\u001b[0m: \u001b[0m'Arista'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1516010990.2331386\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:0C:31:79'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m0\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1515939602.295958\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:0C:31:79'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m0\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Management1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1515939616.808321\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:47:87:83'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'facts'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'fqdn'\u001b[0m: \u001b[0m'spine01.cmh.cmh.acme.com'\u001b[0m,\n", - " \u001b[0m'hostname'\u001b[0m: \u001b[0m'spine01.cmh'\u001b[0m,\n", - " \u001b[0m'interface_list'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m'ge-0/0/0'\u001b[0m,\n", - " \u001b[0m'gr-0/0/0'\u001b[0m,\n", - " \u001b[0m'ip-0/0/0'\u001b[0m,\n", - " \u001b[0m'lsq-0/0/0'\u001b[0m,\n", - " \u001b[0m'lt-0/0/0'\u001b[0m,\n", - " \u001b[0m'mt-0/0/0'\u001b[0m,\n", - " \u001b[0m'sp-0/0/0'\u001b[0m,\n", - " \u001b[0m'ge-0/0/1'\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m,\n", - " \u001b[0m'.local.'\u001b[0m,\n", - " \u001b[0m'dsc'\u001b[0m,\n", - " \u001b[0m'gre'\u001b[0m,\n", - " \u001b[0m'ipip'\u001b[0m,\n", - " \u001b[0m'irb'\u001b[0m,\n", - " \u001b[0m'lo0'\u001b[0m,\n", - " \u001b[0m'lsi'\u001b[0m,\n", - " \u001b[0m'mtun'\u001b[0m,\n", - " \u001b[0m'pimd'\u001b[0m,\n", - " \u001b[0m'pime'\u001b[0m,\n", - " \u001b[0m'pp0'\u001b[0m,\n", - " \u001b[0m'ppd0'\u001b[0m,\n", - " \u001b[0m'ppe0'\u001b[0m,\n", - " \u001b[0m'st0'\u001b[0m,\n", - " \u001b[0m'tap'\u001b[0m,\n", - " \u001b[0m'vlan'\u001b[0m]\u001b[0m,\n", - " \u001b[0m'model'\u001b[0m: \u001b[0m'FIREFLY-PERIMETER'\u001b[0m,\n", - " \u001b[0m'os_version'\u001b[0m: \u001b[0m'12.1X47-D20.7'\u001b[0m,\n", - " \u001b[0m'serial_number'\u001b[0m: \u001b[0m'5efd44465d10'\u001b[0m,\n", - " \u001b[0m'uptime'\u001b[0m: \u001b[0m76648\u001b[0m,\n", - " \u001b[0m'vendor'\u001b[0m: \u001b[0m'Juniper'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'.local.'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'dsc'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76597.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:AA:8C:76'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76597.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:1A:7F:BF'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76597.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:70:E5:81'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m,\n", - " \u001b[0m'gr-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'gre'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ip-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ipip'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'irb'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'4C:96:14:8C:76:B0'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lo0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lsi'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lsq-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76598.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lt-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'02:96:14:8C:76:B3'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'mt-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'mtun'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'pimd'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'pime'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'pp0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ppd0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ppe0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sp-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76598.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'st0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'tap'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'vlan'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76607.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'00:00:00:00:00:00'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'facts'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'fqdn'\u001b[0m: \u001b[0m'leaf00.cmh.cmh.acme.com'\u001b[0m,\n", - " \u001b[0m'hostname'\u001b[0m: \u001b[0m'leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'interface_list'\u001b[0m: \u001b[0m['Ethernet1', 'Ethernet2', 'Management1']\u001b[0m,\n", - " \u001b[0m'model'\u001b[0m: \u001b[0m'vEOS'\u001b[0m,\n", - " \u001b[0m'os_version'\u001b[0m: \u001b[0m'4.17.5M-4414219.4175M'\u001b[0m,\n", - " \u001b[0m'serial_number'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'uptime'\u001b[0m: \u001b[0m76556\u001b[0m,\n", - " \u001b[0m'vendor'\u001b[0m: \u001b[0m'Arista'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to spine00.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1516010957.639385\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:0C:31:79'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m0\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to spine01.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1515939788.3633773\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:0C:31:79'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m0\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Management1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1515939804.0736248\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:47:87:83'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'facts'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'fqdn'\u001b[0m: \u001b[0m'leaf01.cmh.cmh.acme.com'\u001b[0m,\n", - " \u001b[0m'hostname'\u001b[0m: \u001b[0m'leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'interface_list'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m'ge-0/0/0'\u001b[0m,\n", - " \u001b[0m'gr-0/0/0'\u001b[0m,\n", - " \u001b[0m'ip-0/0/0'\u001b[0m,\n", - " \u001b[0m'lsq-0/0/0'\u001b[0m,\n", - " \u001b[0m'lt-0/0/0'\u001b[0m,\n", - " \u001b[0m'mt-0/0/0'\u001b[0m,\n", - " \u001b[0m'sp-0/0/0'\u001b[0m,\n", - " \u001b[0m'ge-0/0/1'\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m,\n", - " \u001b[0m'.local.'\u001b[0m,\n", - " \u001b[0m'dsc'\u001b[0m,\n", - " \u001b[0m'gre'\u001b[0m,\n", - " \u001b[0m'ipip'\u001b[0m,\n", - " \u001b[0m'irb'\u001b[0m,\n", - " \u001b[0m'lo0'\u001b[0m,\n", - " \u001b[0m'lsi'\u001b[0m,\n", - " \u001b[0m'mtun'\u001b[0m,\n", - " \u001b[0m'pimd'\u001b[0m,\n", - " \u001b[0m'pime'\u001b[0m,\n", - " \u001b[0m'pp0'\u001b[0m,\n", - " \u001b[0m'ppd0'\u001b[0m,\n", - " \u001b[0m'ppe0'\u001b[0m,\n", - " \u001b[0m'st0'\u001b[0m,\n", - " \u001b[0m'tap'\u001b[0m,\n", - " \u001b[0m'vlan'\u001b[0m]\u001b[0m,\n", - " \u001b[0m'model'\u001b[0m: \u001b[0m'FIREFLY-PERIMETER'\u001b[0m,\n", - " \u001b[0m'os_version'\u001b[0m: \u001b[0m'12.1X47-D20.7'\u001b[0m,\n", - " \u001b[0m'serial_number'\u001b[0m: \u001b[0m'9d842799f666'\u001b[0m,\n", - " \u001b[0m'uptime'\u001b[0m: \u001b[0m76460\u001b[0m,\n", - " \u001b[0m'vendor'\u001b[0m: \u001b[0m'Juniper'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'.local.'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'dsc'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76407.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:AA:8C:76'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to spine00.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76407.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:A0:42:60'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to spine01.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76407.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:00:6D:5A'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m,\n", - " \u001b[0m'gr-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'gre'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ip-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ipip'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'irb'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'4C:96:14:8C:76:B0'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lo0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lsi'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lsq-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76408.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'lt-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'02:96:14:8C:76:B3'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \u001b[0m'mt-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'mtun'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'pimd'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'pime'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'pp0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ppd0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ppe0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sp-0/0/0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76408.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m800\u001b[0m}\u001b[0m,\n", - " \u001b[0m'st0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'None'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'tap'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m-1.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'Unspecified'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m-1\u001b[0m}\u001b[0m,\n", - " \u001b[0m'vlan'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m76417.0\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'00:00:00:00:00:00'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run get_facts.py" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/1_simple_runbooks/get_facts.py b/examples/1_simple_runbooks/get_facts.py deleted file mode 100755 index bbe302b6..00000000 --- a/examples/1_simple_runbooks/get_facts.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -""" -Very simple runbook to get facts and print them on the screen. -""" - -from brigade.easy import easy_brigade -from brigade.plugins.functions.text import print_title -from brigade.plugins.tasks import networking, text - - -brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=False, -) - -print_title("Getting interfaces and facts") - -# select which devices we want to work with -filtered = brg.filter(type="network_device", site="cmh") - -# we are going to gather "interfaces" and "facts" -# information with napalm -results = filtered.run(networking.napalm_get, getters=["interfaces", "facts"]) - -# Let's print the result on screen -filtered.run( - text.print_result, num_workers=1, data=results # task should be done synchronously -) diff --git a/examples/1_simple_runbooks/rollback.ipynb b/examples/1_simple_runbooks/rollback.ipynb deleted file mode 100644 index e99f693f..00000000 --- a/examples/1_simple_runbooks/rollback.ipynb +++ /dev/null @@ -1,438 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Rollback\n", - "\n", - "This runbook plays well with the ``backup.py`` one. You can basically backup the configuration, and then roll it back with this runbook if things don't go as expected.\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Runbook to rollback configuration from a saved configuration\n",
-       " 4 """\n",
-       " 5 from brigade.easy import easy_brigade\n",
-       " 6 from brigade.plugins.tasks import networking, text\n",
-       " 7 \n",
-       " 8 \n",
-       " 9 def rollback(task):\n",
-       "10     """\n",
-       "11     This function loads the backup from ./backups/$hostname and\n",
-       "12     deploys it.\n",
-       "13     """\n",
-       "14     task.run(networking.napalm_configure,\n",
-       "15              name="Loading Configuration on the device",\n",
-       "16              replace=True,\n",
-       "17              filename="backups/{host}")\n",
-       "18 \n",
-       "19 \n",
-       "20 brg = easy_brigade(\n",
-       "21         host_file="../inventory/hosts.yaml",\n",
-       "22         group_file="../inventory/groups.yaml",\n",
-       "23         dry_run=False,\n",
-       "24         raise_on_error=True,\n",
-       "25 )\n",
-       "26 \n",
-       "27 \n",
-       "28 # select which devices we want to work with\n",
-       "29 filtered = brg.filter(type="network_device", site="cmh")\n",
-       "30 \n",
-       "31 results = filtered.run(task=rollback)\n",
-       "32 \n",
-       "33 filtered.run(text.print_result,\n",
-       "34              num_workers=1,  # task should be done synchronously\n",
-       "35              data=results,\n",
-       "36              task_id=-1,  # we only want to print the last task\n",
-       "37              )\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file rollback.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "So let's rollback to the backup configuration we took before configuring the network early on:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,8 +8,7 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "-hostname spine00.cmh\n", - "-ip domain-name cmh.acme.com\n", - "+hostname blah\n", - " !\n", - " spanning-tree mode mstp\n", - " !\n", - "@@ -21,28 +20,13 @@\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - " !\n", - " interface Ethernet1\n", - "- description link to leaf00.cmh\n", - "- no switchport\n", - "- ip address 10.0.0.0/31\n", - " !\n", - " interface Ethernet2\n", - "- description link to leaf01.cmh\n", - "- no switchport\n", - "- ip address 10.0.0.2/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-ip routing\n", - "-!\n", - "-router bgp 65000\n", - "- neighbor 10.0.0.1 remote-as 65100\n", - "- neighbor 10.0.0.1 maximum-routes 12000 \n", - "- neighbor 10.0.0.3 remote-as 65101\n", - "- neighbor 10.0.0.3 maximum-routes 12000 \n", - "- address-family ipv4\n", - "- neighbor 10.0.0.1 activate\n", - "- neighbor 10.0.0.3 activate\n", - "+no ip routing\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name spine01.cmh;\n", - "+ host-name vsrx;\n", - "- domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "- ge-0/0/1 {\n", - "- description \"link to leaf00.cmh\";\n", - "- unit 0 {\n", - "- family inet {\n", - "- address 10.0.1.0/31;\n", - "- }\n", - "- }\n", - "- }\n", - "- ge-0/0/2 {\n", - "- description \"link to leaf01.cmh\";\n", - "- unit 0 {\n", - "- family inet {\n", - "- address 10.0.1.2/31;\n", - "- }\n", - "- }\n", - "- }\n", - "[edit]\n", - "- routing-options {\n", - "- autonomous-system 65000;\n", - "- }\n", - "- protocols {\n", - "- bgp {\n", - "- import PERMIT_ALL;\n", - "- export PERMIT_ALL;\n", - "- group peers {\n", - "- neighbor 10.0.1.1 {\n", - "- peer-as 65100;\n", - "- }\n", - "- neighbor 10.0.1.3 {\n", - "- peer-as 65101;\n", - "- }\n", - "- }\n", - "- }\n", - "- }\n", - "- policy-options {\n", - "- policy-statement PERMIT_ALL {\n", - "- from protocol bgp;\n", - "- then accept;\n", - "- }\n", - "- }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,9 +8,6 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "-hostname leaf00.cmh\n", - "-ip domain-name cmh.acme.com\n", - "-!\n", - " spanning-tree mode mstp\n", - " !\n", - " aaa authorization exec default local\n", - "@@ -20,36 +17,14 @@\n", - " username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - " !\n", - "-vlan 100\n", - "- name frontend\n", - "-!\n", - "-vlan 200\n", - "- name backend\n", - "-!\n", - " interface Ethernet1\n", - "- description link to spine00.cmh\n", - "- shutdown\n", - "- no switchport\n", - "- ip address 10.0.0.1/31\n", - " !\n", - " interface Ethernet2\n", - "- description link to spine01.cmh\n", - "- no switchport\n", - "- ip address 10.0.1.1/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-ip routing\n", - "-!\n", - "-router bgp 65100\n", - "- neighbor 10.0.0.0 remote-as 65000\n", - "- neighbor 10.0.0.0 maximum-routes 12000 \n", - "- neighbor 10.0.1.0 remote-as 65000\n", - "- neighbor 10.0.1.0 maximum-routes 12000 \n", - "- address-family ipv4\n", - "- neighbor 10.0.0.0 activate\n", - "- neighbor 10.0.1.0 activate\n", - "+no ip routing\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name leaf01.cmh;\n", - "+ host-name vsrx;\n", - "- domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "- ge-0/0/1 {\n", - "- description \"link to spine00.cmh\";\n", - "- unit 0 {\n", - "- family inet {\n", - "- address 10.0.0.3/31;\n", - "- }\n", - "- }\n", - "- }\n", - "- ge-0/0/2 {\n", - "- description \"link to spine01.cmh\";\n", - "- unit 0 {\n", - "- family inet {\n", - "- address 10.0.1.3/31;\n", - "- }\n", - "- }\n", - "- }\n", - "[edit]\n", - "- routing-options {\n", - "- autonomous-system 65101;\n", - "- }\n", - "- protocols {\n", - "- bgp {\n", - "- import PERMIT_ALL;\n", - "- export PERMIT_ALL;\n", - "- group peers {\n", - "- neighbor 10.0.0.2 {\n", - "- peer-as 65000;\n", - "- }\n", - "- neighbor 10.0.1.2 {\n", - "- peer-as 65000;\n", - "- }\n", - "- }\n", - "- }\n", - "- }\n", - "- policy-options {\n", - "- policy-statement PERMIT_ALL {\n", - "- from protocol bgp;\n", - "- then accept;\n", - "- }\n", - "- }\n", - "- vlans {\n", - "- backend {\n", - "- vlan-id 200;\n", - "- }\n", - "- frontend {\n", - "- vlan-id 100;\n", - "- }\n", - "- }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run rollback.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As with other tasks, changes are detected and only when needed are applied:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run rollback.py" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/1_simple_runbooks/rollback.py b/examples/1_simple_runbooks/rollback.py deleted file mode 100755 index ee7fbe81..00000000 --- a/examples/1_simple_runbooks/rollback.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python -""" -Runbook to rollback configuration from a saved configuration -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import networking, text - -import click - - -def rollback(task): - """ - This function loads the backup from ./backups/$hostname and - deploys it. - """ - task.run( - networking.napalm_configure, - name="Loading Configuration on the device", - replace=True, - filename="backups/{host}", - ) - - -@click.command() -@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") -@click.option("--get", "-g", multiple=True, help="getters you want to use") -def main(filter, get): - brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, - ) - - # select which devices we want to work with - filtered = brg.filter(type="network_device", site="cmh") - - results = filtered.run(task=rollback) - - filtered.run( - text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - ) - - -if __name__ == "__main__": - main() diff --git a/examples/1_simple_runbooks/validate.ipynb b/examples/1_simple_runbooks/validate.ipynb deleted file mode 100644 index 8af4499e..00000000 --- a/examples/1_simple_runbooks/validate.ipynb +++ /dev/null @@ -1,689 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Validate\n", - "\n", - "This playbook uses [napalm validation](http://napalm.readthedocs.io/en/latest/validate/index.html) functionality to verify correctness of the network.\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Runbook that verifies that BGP sessions are configured and up.\n",
-       " 4 """\n",
-       " 5 from brigade.easy import easy_brigade\n",
-       " 6 from brigade.plugins.tasks import data, networking, text\n",
-       " 7 \n",
-       " 8 \n",
-       " 9 def validate(task):\n",
-       "10     task.host["config"] = ""\n",
-       "11 \n",
-       "12     r = task.run(name="read data",\n",
-       "13                  task=data.load_yaml,\n",
-       "14                  file="../extra_data/{host}/l3.yaml")\n",
-       "15 \n",
-       "16     validation_rules = [{\n",
-       "17         'get_bgp_neighbors': {\n",
-       "18             'global': {\n",
-       "19                 'peers': {\n",
-       "20                     '_mode': 'strict',\n",
-       "21                 }\n",
-       "22             }\n",
-       "23         }\n",
-       "24     }]\n",
-       "25     peers = validation_rules[0]['get_bgp_neighbors']['global']['peers']\n",
-       "26     for session in r.result['sessions']:\n",
-       "27         peers[session['ipv4']] = {'is_up': True}\n",
-       "28 \n",
-       "29     task.run(name="validating data",\n",
-       "30              task=networking.napalm_validate,\n",
-       "31              validation_source=validation_rules)\n",
-       "32 \n",
-       "33 \n",
-       "34 def print_compliance(task, results):\n",
-       "35     """\n",
-       "36     We use this task so we can access directly the result\n",
-       "37     for each specific host and see if the task complies or not\n",
-       "38     and pass it to print_result.\n",
-       "39     """\n",
-       "40     task.run(text.print_result,\n",
-       "41              name="print result",\n",
-       "42              data=results[task.host.name],\n",
-       "43              failed=not results[task.host.name][2].result['complies'],\n",
-       "44              )\n",
-       "45 \n",
-       "46 \n",
-       "47 brg = easy_brigade(\n",
-       "48         host_file="../inventory/hosts.yaml",\n",
-       "49         group_file="../inventory/groups.yaml",\n",
-       "50         dry_run=False,\n",
-       "51         raise_on_error=True,\n",
-       "52 )\n",
-       "53 \n",
-       "54 \n",
-       "55 filtered = brg.filter(type="network_device", site="cmh")\n",
-       "56 \n",
-       "57 results = filtered.run(task=validate)\n",
-       "58 \n",
-       "59 filtered.run(print_compliance,\n",
-       "60              results=results,\n",
-       "61              num_workers=1)\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file validate.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "Let's start by running the script on an unconfigured network:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[31m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.0/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.2/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.1', 'peer_as': 65100}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.0.3', 'peer_as': 65101}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m['global']\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.0/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.2/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.1.1', 'peer_as': 65100}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.3', 'peer_as': 65101}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m['global']\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.1/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.1/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.0', 'peer_as': 65000}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.0', 'peer_as': 65000}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m['global']\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.3/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.3/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.2', 'peer_as': 65000}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.2', 'peer_as': 65000}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m['global']\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run validate.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For each host we get the data we are using for validation and the result. What the report is saying is that we don't even have the BGP instance 'global' (default instance) configured so let's do it:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[32m**** Playbook to configure the network *****************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,7 +8,8 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "-hostname blah\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.com\n", - " !\n", - " spanning-tree mode mstp\n", - " !\n", - "@@ -20,13 +21,28 @@\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - " !\n", - " interface Ethernet1\n", - "+ description link to leaf00.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.0/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to leaf01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.2/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65000\n", - "+ neighbor 10.0.0.1 remote-as 65100\n", - "+ neighbor 10.0.0.1 maximum-routes 12000 \n", - "+ neighbor 10.0.0.3 remote-as 65101\n", - "+ neighbor 10.0.0.3 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.1 activate\n", - "+ neighbor 10.0.0.3 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to leaf00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.0/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to leaf01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.2/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65000;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.1.1 {\n", - "+ peer-as 65100;\n", - "+ }\n", - "+ neighbor 10.0.1.3 {\n", - "+ peer-as 65101;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,6 +8,9 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - " spanning-tree mode mstp\n", - " !\n", - " aaa authorization exec default local\n", - "@@ -17,14 +20,36 @@\n", - " username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - " !\n", - "+vlan 100\n", - "+ name frontend\n", - "+!\n", - "+vlan 200\n", - "+ name backend\n", - "+!\n", - " interface Ethernet1\n", - "+ description link to spine00.cmh\n", - "+ shutdown\n", - "+ no switchport\n", - "+ ip address 10.0.0.1/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to spine01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.1.1/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65100\n", - "+ neighbor 10.0.0.0 remote-as 65000\n", - "+ neighbor 10.0.0.0 maximum-routes 12000 \n", - "+ neighbor 10.0.1.0 remote-as 65000\n", - "+ neighbor 10.0.1.0 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.0 activate\n", - "+ neighbor 10.0.1.0 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name leaf01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to spine00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.0.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to spine01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65101;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.0.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ neighbor 10.0.1.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\n", - "+ vlans {\n", - "+ backend {\n", - "+ vlan-id 200;\n", - "+ }\n", - "+ frontend {\n", - "+ vlan-id 100;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the network is configured let's validate the deployment again:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[31m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.0/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.2/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.1', 'peer_as': 65100}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.0.3', 'peer_as': 65101}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'peers'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'10.0.0.1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'is_up'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'actual_value'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'expected_value'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mFalse\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m,\n", - " \u001b[0m'10.0.0.3'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.0/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.2/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.1.1', 'peer_as': 65100}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.3', 'peer_as': 65101}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.1/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.1/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.0', 'peer_as': 65000}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.0', 'peer_as': 65000}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'peers'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'10.0.0.0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'is_up'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'actual_value'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'expected_value'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mFalse\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m,\n", - " \u001b[0m'10.0.1.0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.3/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.3/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.2', 'peer_as': 65000}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.2', 'peer_as': 65000}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run validate.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What the report is basically telling us is that ``spina01`` and ``leaf01`` are pssing our tests, however, ``spine00`` and ``leaf00`` as one of their BGP sessions that should be ``up`` is actually ``down``." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/1_simple_runbooks/validate.py b/examples/1_simple_runbooks/validate.py deleted file mode 100755 index f7762b3c..00000000 --- a/examples/1_simple_runbooks/validate.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -""" -Runbook that verifies that BGP sessions are configured and up. -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import data, networking, text - - -def validate(task): - task.host["config"] = "" - - r = task.run( - name="read data", task=data.load_yaml, file="../extra_data/{host}/l3.yaml" - ) - - validation_rules = [ - {"get_bgp_neighbors": {"global": {"peers": {"_mode": "strict"}}}} - ] - peers = validation_rules[0]["get_bgp_neighbors"]["global"]["peers"] - for session in r.result["sessions"]: - peers[session["ipv4"]] = {"is_up": True} - - task.run( - name="validating data", - task=networking.napalm_validate, - validation_source=validation_rules, - ) - - -def print_compliance(task, results): - """ - We use this task so we can access directly the result - for each specific host and see if the task complies or not - and pass it to print_result. - """ - task.run( - text.print_result, - name="print result", - data=results[task.host.name], - failed=not results[task.host.name][2].result["complies"], - ) - - -brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, -) - - -filtered = brg.filter(type="network_device", site="cmh") - -results = filtered.run(task=validate) - -filtered.run(print_compliance, results=results, num_workers=1) diff --git a/examples/2_simple_tooling/backup.ipynb b/examples/2_simple_tooling/backup.ipynb deleted file mode 100644 index 7df81f0d..00000000 --- a/examples/2_simple_tooling/backup.ipynb +++ /dev/null @@ -1,1062 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Backup\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Tool that downloads the configuration from the devices and\n",
-       " 4 stores them on disk.\n",
-       " 5 """\n",
-       " 6 from brigade.easy import easy_brigade\n",
-       " 7 from brigade.plugins.tasks import files, networking, text\n",
-       " 8 \n",
-       " 9 import click\n",
-       "10 \n",
-       "11 \n",
-       "12 def backup(task, path):\n",
-       "13     """\n",
-       "14     This function groups two tasks:\n",
-       "15         1. Download configuration from the device\n",
-       "16         2. Store to disk\n",
-       "17     """\n",
-       "18     result = task.run(networking.napalm_get,\n",
-       "19                       name="Gathering configuration from the device",\n",
-       "20                       getters="config")\n",
-       "21 \n",
-       "22     task.run(files.write,\n",
-       "23              name="Saving Configuration to disk",\n",
-       "24              content=result.result["config"]["running"],\n",
-       "25              filename="{}/{}".format(path, task.host))\n",
-       "26 \n",
-       "27 \n",
-       "28 @click.command()\n",
-       "29 @click.option('--filter', '-f', multiple=True,\n",
-       "30               help="filters to apply. For instance site=cmh")\n",
-       "31 @click.option('--path', '-p', default=".",\n",
-       "32               help="Where to save the backup files")\n",
-       "33 def main(filter, path):\n",
-       "34     """\n",
-       "35     Backups running configuration of devices into a file\n",
-       "36     """\n",
-       "37     brg = easy_brigade(\n",
-       "38             host_file="../inventory/hosts.yaml",\n",
-       "39             group_file="../inventory/groups.yaml",\n",
-       "40             dry_run=False,\n",
-       "41             raise_on_error=False,\n",
-       "42     )\n",
-       "43 \n",
-       "44     # filter is going to be a list of key=value so we clean that first\n",
-       "45     filter_dict = {"type": "network_device"}\n",
-       "46     for f in filter:\n",
-       "47         k, v = f.split("=")\n",
-       "48         filter_dict[k] = v\n",
-       "49 \n",
-       "50     # let's filter the devices\n",
-       "51     filtered = brg.filter(**filter_dict)\n",
-       "52 \n",
-       "53     # Run the ``backup`` function that groups the tasks to\n",
-       "54     # download/store devices' configuration\n",
-       "55     results = filtered.run(backup,\n",
-       "56                            name="Backing up configurations",\n",
-       "57                            path=path)\n",
-       "58 \n",
-       "59     # Let's print the result on screen\n",
-       "60     filtered.run(text.print_result,\n",
-       "61                  num_workers=1,  # task should be done synchronously\n",
-       "62                  data=results,\n",
-       "63                  task_id=-1,  # we only want to print the last task\n",
-       "64                  skipped=True,\n",
-       "65                  )\n",
-       "66 \n",
-       "67 \n",
-       "68 if __name__ == "__main__":\n",
-       "69     main()\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file backup.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "Let's start with the help so we can see what we can do." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Usage: backup.py [OPTIONS]\n", - "\n", - " Backups running configuration of devices into a file\n", - "\n", - "Options:\n", - " -f, --filter TEXT filters to apply. For instance site=cmh\n", - " -p, --path TEXT Where to save the backup files\n", - " --help Show this message and exit.\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run backup.py --help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With those options it should be easy to backup devices at different sites in different paths:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "mkdir: backups/cmh: File exists\n", - "\u001b[0m\u001b[0m\u001b[0m\u001b[0m\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- backups/cmh//spine00.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,52 @@\n", - "\n", - "+! Command: show running-config\n", - "+! device: spine00.cmh (vEOS, EOS-4.17.5M)\n", - "+!\n", - "+! boot system flash:/vEOS-lab.swi\n", - "+!\n", - "+event-handler dhclient\n", - "+ trigger on-boot\n", - "+ action bash sudo /mnt/flash/initialize_ma1.sh\n", - "+!\n", - "+transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - "+spanning-tree mode mstp\n", - "+!\n", - "+aaa authorization exec default local\n", - "+!\n", - "+aaa root secret sha512 $6$5stn7z2imBLV6iO0$w0ZnOhy8SwNdELdO2da9q8wDKerYTyY8evY052UoyRJ2Wo6liaUneuTFGphL8JQD9gtESOipCBb6PYmSMuUjs.\n", - "+!\n", - "+username admin privilege 15 role network-admin secret sha512 $6$qkXlQpatVlanYe9v$aHTbPaGTaqDRCp5WSC3DPpDfblYSE24.OHeKgGOOTf0.Ol2lDpivTvHByx5tU41sVOGcHqc4U4LgrKv8AjbKQ/\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - "+!\n", - "+interface Ethernet1\n", - "+ description link to leaf00.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.0/31\n", - "+!\n", - "+interface Ethernet2\n", - "+ description link to leaf01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.2/31\n", - "+!\n", - "+interface Management1\n", - "+ ip address 10.0.2.15/24\n", - "+!\n", - "+ip routing\n", - "+!\n", - "+router bgp 65000\n", - "+ neighbor 10.0.0.1 remote-as 65100\n", - "+ neighbor 10.0.0.1 maximum-routes 12000 \n", - "+ neighbor 10.0.0.3 remote-as 65101\n", - "+ neighbor 10.0.0.3 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.1 activate\n", - "+ neighbor 10.0.0.3 activate\n", - "+!\n", - "+management api http-commands\n", - "+ no shutdown\n", - "+!\n", - "+!\n", - "+end\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- backups/cmh//spine01.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,110 @@\n", - "\n", - "+\n", - "+## Last commit: 2018-01-15 12:02:22 UTC by vagrant\n", - "+version 12.1X47-D20.7;\n", - "+system {\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "+ root-authentication {\n", - "+ encrypted-password \"$1$5MhDFyrI$NBBMndW1POqbN.0QEA4z0.\";\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDi/i8iiAZsXC5qdmJZpTxKjUyyoMgEGoHXl/TMFdJjSV+XAZ18OXAEsvPO0AlXJ6RZTwK8Zcr6TLq4l1Kssd+kVN02shFkgDo3wWf3I2BXKKdog6/6fbhiD1SgCeafzWBlUQvREgDQDy1XSFjNjSJ39vtOa8ikqGdbf4XH0hjoLHYDV0H0VNZLboULCNFPF0PHQfPrsp2AXHU+p7sl61GhZgfw6WuLIzXWqJyq9B0Q5XgdmvnvdjZeTOShoPTPbaRYVVFOMGTqJQOZsl5P3wTIJT8JG7iEz1Tiar8nmltON83sy/lEODhZkJPXe3zw3fwUIS9yQ53z0t1UGHm7KGNX vagrant\";\n", - "+ }\n", - "+ login {\n", - "+ user vagrant {\n", - "+ uid 2000;\n", - "+ class super-user;\n", - "+ authentication {\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key\";\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ services {\n", - "+ ssh {\n", - "+ root-login allow;\n", - "+ }\n", - "+ netconf {\n", - "+ ssh;\n", - "+ }\n", - "+ web-management {\n", - "+ http {\n", - "+ interface ge-0/0/0.0;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ syslog {\n", - "+ user * {\n", - "+ any emergency;\n", - "+ }\n", - "+ file messages {\n", - "+ any any;\n", - "+ authorization info;\n", - "+ }\n", - "+ file interactive-commands {\n", - "+ interactive-commands any;\n", - "+ }\n", - "+ }\n", - "+ license {\n", - "+ autoupdate {\n", - "+ url https://ae1.juniper.net/junos/key_retrieval;\n", - "+ }\n", - "+ }\n", - "+}\n", - "+interfaces {\n", - "+ ge-0/0/0 {\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ dhcp;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/1 {\n", - "+ description \"link to leaf00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.0/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to leaf01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.2/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+routing-options {\n", - "+ autonomous-system 65000;\n", - "+}\n", - "+protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.1.1 {\n", - "+ peer-as 65100;\n", - "+ }\n", - "+ neighbor 10.0.1.3 {\n", - "+ peer-as 65101;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+}\n", - "+security {\n", - "+ forwarding-options {\n", - "+ family {\n", - "+ inet6 {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ mpls {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- backups/cmh//leaf00.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,59 @@\n", - "\n", - "+! Command: show running-config\n", - "+! device: leaf00.cmh (vEOS, EOS-4.17.5M)\n", - "+!\n", - "+! boot system flash:/vEOS-lab.swi\n", - "+!\n", - "+event-handler dhclient\n", - "+ trigger on-boot\n", - "+ action bash sudo /mnt/flash/initialize_ma1.sh\n", - "+!\n", - "+transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - "+spanning-tree mode mstp\n", - "+!\n", - "+aaa authorization exec default local\n", - "+!\n", - "+aaa root secret sha512 $6$sRifRAo/DXihW7sG$3r4MMTsslNCCWdD/FFIw3lvnnkI4SWO0bvhEzvWSurrOBgUsxjrmgN5kywH5Ta7LNNXiWjFfjwoyefn9nqeB2/\n", - "+!\n", - "+username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - "+!\n", - "+vlan 100\n", - "+ name frontend\n", - "+!\n", - "+vlan 200\n", - "+ name backend\n", - "+!\n", - "+interface Ethernet1\n", - "+ description link to spine00.cmh\n", - "+ shutdown\n", - "+ no switchport\n", - "+ ip address 10.0.0.1/31\n", - "+!\n", - "+interface Ethernet2\n", - "+ description link to spine01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.1.1/31\n", - "+!\n", - "+interface Management1\n", - "+ ip address 10.0.2.15/24\n", - "+!\n", - "+ip routing\n", - "+!\n", - "+router bgp 65100\n", - "+ neighbor 10.0.0.0 remote-as 65000\n", - "+ neighbor 10.0.0.0 maximum-routes 12000 \n", - "+ neighbor 10.0.1.0 remote-as 65000\n", - "+ neighbor 10.0.1.0 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.0 activate\n", - "+ neighbor 10.0.1.0 activate\n", - "+!\n", - "+management api http-commands\n", - "+ no shutdown\n", - "+!\n", - "+!\n", - "+end\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- backups/cmh//leaf01.cmh\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,118 @@\n", - "\n", - "+\n", - "+## Last commit: 2018-01-15 12:02:23 UTC by vagrant\n", - "+version 12.1X47-D20.7;\n", - "+system {\n", - "+ host-name leaf01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "+ root-authentication {\n", - "+ encrypted-password \"$1$5MhDFyrI$NBBMndW1POqbN.0QEA4z0.\";\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsfGpEhGi8CbjIHJkMju/CJH6IuQiIzZyDt+AVieDfXKWDuBSOfc7YV8xNdYMqQqpDOWmEVZ7dhfD6IWDI3aa6WLkEXORD+zScjQo+5iHty6VlI61ImHQkWhWX6pZi3Cq/JsH8oldIC2xvzFNWB2p1suu+rzuGtJjbDq5NMlp1bNSiBgV0dHZR6Lt1UuK/rVBl7FbBN8HpInM+a37SkkwIrKMK8z42Ax9ufd17P3SqZP8oo+Ql4Y3aeCz2t4CfZNh9YRLZSiUYF16VN+31mzKEqT7+0rFlyfv/CaPwyfAv2BPFljUEsyFsWU923EGYQsfOIKVnd+zzHDHIHapVMQbh vagrant\";\n", - "+ }\n", - "+ login {\n", - "+ user vagrant {\n", - "+ uid 2000;\n", - "+ class super-user;\n", - "+ authentication {\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key\";\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ services {\n", - "+ ssh {\n", - "+ root-login allow;\n", - "+ }\n", - "+ netconf {\n", - "+ ssh;\n", - "+ }\n", - "+ web-management {\n", - "+ http {\n", - "+ interface ge-0/0/0.0;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ syslog {\n", - "+ user * {\n", - "+ any emergency;\n", - "+ }\n", - "+ file messages {\n", - "+ any any;\n", - "+ authorization info;\n", - "+ }\n", - "+ file interactive-commands {\n", - "+ interactive-commands any;\n", - "+ }\n", - "+ }\n", - "+ license {\n", - "+ autoupdate {\n", - "+ url https://ae1.juniper.net/junos/key_retrieval;\n", - "+ }\n", - "+ }\n", - "+}\n", - "+interfaces {\n", - "+ ge-0/0/0 {\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ dhcp;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/1 {\n", - "+ description \"link to spine00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.0.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to spine01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+routing-options {\n", - "+ autonomous-system 65101;\n", - "+}\n", - "+protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.0.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ neighbor 10.0.1.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+}\n", - "+security {\n", - "+ forwarding-options {\n", - "+ family {\n", - "+ inet6 {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ mpls {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+vlans {\n", - "+ backend {\n", - "+ vlan-id 200;\n", - "+ }\n", - "+ frontend {\n", - "+ vlan-id 100;\n", - "+ }\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%mkdir backups/cmh\n", - "%rm backups/cmh/*\n", - "%run backup.py --filter site=cmh --path backups/cmh/" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "mkdir: backups/bma: File exists\n", - "\u001b[0m\u001b[0m\u001b[0m\u001b[0m\u001b[1m\u001b[33m* spine00.bma ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- backups/bma//spine00.bma\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,52 @@\n", - "\n", - "+! Command: show running-config\n", - "+! device: spine00.cmh (vEOS, EOS-4.17.5M)\n", - "+!\n", - "+! boot system flash:/vEOS-lab.swi\n", - "+!\n", - "+event-handler dhclient\n", - "+ trigger on-boot\n", - "+ action bash sudo /mnt/flash/initialize_ma1.sh\n", - "+!\n", - "+transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - "+spanning-tree mode mstp\n", - "+!\n", - "+aaa authorization exec default local\n", - "+!\n", - "+aaa root secret sha512 $6$5stn7z2imBLV6iO0$w0ZnOhy8SwNdELdO2da9q8wDKerYTyY8evY052UoyRJ2Wo6liaUneuTFGphL8JQD9gtESOipCBb6PYmSMuUjs.\n", - "+!\n", - "+username admin privilege 15 role network-admin secret sha512 $6$qkXlQpatVlanYe9v$aHTbPaGTaqDRCp5WSC3DPpDfblYSE24.OHeKgGOOTf0.Ol2lDpivTvHByx5tU41sVOGcHqc4U4LgrKv8AjbKQ/\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - "+!\n", - "+interface Ethernet1\n", - "+ description link to leaf00.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.0/31\n", - "+!\n", - "+interface Ethernet2\n", - "+ description link to leaf01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.2/31\n", - "+!\n", - "+interface Management1\n", - "+ ip address 10.0.2.15/24\n", - "+!\n", - "+ip routing\n", - "+!\n", - "+router bgp 65000\n", - "+ neighbor 10.0.0.1 remote-as 65100\n", - "+ neighbor 10.0.0.1 maximum-routes 12000 \n", - "+ neighbor 10.0.0.3 remote-as 65101\n", - "+ neighbor 10.0.0.3 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.1 activate\n", - "+ neighbor 10.0.0.3 activate\n", - "+!\n", - "+management api http-commands\n", - "+ no shutdown\n", - "+!\n", - "+!\n", - "+end\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.bma ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- backups/bma//spine01.bma\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,110 @@\n", - "\n", - "+\n", - "+## Last commit: 2018-01-15 12:02:22 UTC by vagrant\n", - "+version 12.1X47-D20.7;\n", - "+system {\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "+ root-authentication {\n", - "+ encrypted-password \"$1$5MhDFyrI$NBBMndW1POqbN.0QEA4z0.\";\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDi/i8iiAZsXC5qdmJZpTxKjUyyoMgEGoHXl/TMFdJjSV+XAZ18OXAEsvPO0AlXJ6RZTwK8Zcr6TLq4l1Kssd+kVN02shFkgDo3wWf3I2BXKKdog6/6fbhiD1SgCeafzWBlUQvREgDQDy1XSFjNjSJ39vtOa8ikqGdbf4XH0hjoLHYDV0H0VNZLboULCNFPF0PHQfPrsp2AXHU+p7sl61GhZgfw6WuLIzXWqJyq9B0Q5XgdmvnvdjZeTOShoPTPbaRYVVFOMGTqJQOZsl5P3wTIJT8JG7iEz1Tiar8nmltON83sy/lEODhZkJPXe3zw3fwUIS9yQ53z0t1UGHm7KGNX vagrant\";\n", - "+ }\n", - "+ login {\n", - "+ user vagrant {\n", - "+ uid 2000;\n", - "+ class super-user;\n", - "+ authentication {\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key\";\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ services {\n", - "+ ssh {\n", - "+ root-login allow;\n", - "+ }\n", - "+ netconf {\n", - "+ ssh;\n", - "+ }\n", - "+ web-management {\n", - "+ http {\n", - "+ interface ge-0/0/0.0;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ syslog {\n", - "+ user * {\n", - "+ any emergency;\n", - "+ }\n", - "+ file messages {\n", - "+ any any;\n", - "+ authorization info;\n", - "+ }\n", - "+ file interactive-commands {\n", - "+ interactive-commands any;\n", - "+ }\n", - "+ }\n", - "+ license {\n", - "+ autoupdate {\n", - "+ url https://ae1.juniper.net/junos/key_retrieval;\n", - "+ }\n", - "+ }\n", - "+}\n", - "+interfaces {\n", - "+ ge-0/0/0 {\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ dhcp;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/1 {\n", - "+ description \"link to leaf00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.0/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to leaf01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.2/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+routing-options {\n", - "+ autonomous-system 65000;\n", - "+}\n", - "+protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.1.1 {\n", - "+ peer-as 65100;\n", - "+ }\n", - "+ neighbor 10.0.1.3 {\n", - "+ peer-as 65101;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\n", - "+policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+}\n", - "+security {\n", - "+ forwarding-options {\n", - "+ family {\n", - "+ inet6 {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ mpls {\n", - "+ mode packet-based;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.bma ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Saving Configuration to disk ** changed : True ---------------------------\u001b[0m\n", - "\u001b[0m--- backups/bma//leaf00.bma\n", - "\n", - "+++ new\n", - "\n", - "@@ -0,0 +1,59 @@\n", - "\n", - "+! Command: show running-config\n", - "+! device: leaf00.cmh (vEOS, EOS-4.17.5M)\n", - "+!\n", - "+! boot system flash:/vEOS-lab.swi\n", - "+!\n", - "+event-handler dhclient\n", - "+ trigger on-boot\n", - "+ action bash sudo /mnt/flash/initialize_ma1.sh\n", - "+!\n", - "+transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - "+spanning-tree mode mstp\n", - "+!\n", - "+aaa authorization exec default local\n", - "+!\n", - "+aaa root secret sha512 $6$sRifRAo/DXihW7sG$3r4MMTsslNCCWdD/FFIw3lvnnkI4SWO0bvhEzvWSurrOBgUsxjrmgN5kywH5Ta7LNNXiWjFfjwoyefn9nqeB2/\n", - "+!\n", - "+username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - "+!\n", - "+vlan 100\n", - "+ name frontend\n", - "+!\n", - "+vlan 200\n", - "+ name backend\n", - "+!\n", - "+interface Ethernet1\n", - "+ description link to spine00.cmh\n", - "+ shutdown\n", - "+ no switchport\n", - "+ ip address 10.0.0.1/31\n", - "+!\n", - "+interface Ethernet2\n", - "+ description link to spine01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.1.1/31\n", - "+!\n", - "+interface Management1\n", - "+ ip address 10.0.2.15/24\n", - "+!\n", - "+ip routing\n", - "+!\n", - "+router bgp 65100\n", - "+ neighbor 10.0.0.0 remote-as 65000\n", - "+ neighbor 10.0.0.0 maximum-routes 12000 \n", - "+ neighbor 10.0.1.0 remote-as 65000\n", - "+ neighbor 10.0.1.0 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.0 activate\n", - "+ neighbor 10.0.1.0 activate\n", - "+!\n", - "+management api http-commands\n", - "+ no shutdown\n", - "+!\n", - "+!\n", - "+end\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m* leaf01.bma ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Backing up configurations ** changed : False -----------------------------\u001b[0m\n", - "\u001b[0mTraceback (most recent call last):\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/jnpr/junos/device.py\", line 1250, in open\n", - " device_params={'name': 'junos', 'local': False})\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/manager.py\", line 154, in connect\n", - " return connect_ssh(*args, **kwds)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/manager.py\", line 119, in connect_ssh\n", - " session.connect(*args, **kwds)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/transport/ssh.py\", line 412, in connect\n", - " self._auth(username, password, key_filenames, allow_agent, look_for_keys)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/transport/ssh.py\", line 508, in _auth\n", - " raise AuthenticationError(repr(saved_exception))\n", - "ncclient.transport.errors.AuthenticationError: AuthenticationException('Authentication failed.',)\n", - "\n", - "During handling of the above exception, another exception occurred:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/__init__.py\", line 201, in run_task\n", - " r = task._start(host=host, brigade=brigade, dry_run=dry_run)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 42, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/examples/2_simple_tooling/backup.py\", line 20, in backup\n", - " getters=\"config\")\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 67, in run\n", - " r = Task(task, **kwargs)._start(self.host, self.brigade, dry_run, sub_task=True)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 42, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/plugins/tasks/networking/napalm_get.py\", line 16, in napalm_get\n", - " device = task.host.get_connection(\"napalm\")\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/inventory.py\", line 212, in get_connection\n", - " raise r[self.name].exception\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/__init__.py\", line 201, in run_task\n", - " r = task._start(host=host, brigade=brigade, dry_run=dry_run)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 42, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/plugins/tasks/connections/napalm_connection.py\", line 31, in napalm_connection\n", - " host.connections[\"napalm\"].open()\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/junos/junos.py\", line 106, in open\n", - " self.device.open()\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/jnpr/junos/device.py\", line 1254, in open\n", - " raise EzErrors.ConnectAuthError(self)\n", - "jnpr.junos.exception.ConnectAuthError: ConnectAuthError(127.0.0.1)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%mkdir backups/bma\n", - "%rm backups/bma/*\n", - "%run backup.py --filter site=bma --path backups/bma/" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[31m* leaf01.bma ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Backing up configurations ** changed : False -----------------------------\u001b[0m\n", - "\u001b[0mTraceback (most recent call last):\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/jnpr/junos/device.py\", line 1250, in open\n", - " device_params={'name': 'junos', 'local': False})\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/manager.py\", line 154, in connect\n", - " return connect_ssh(*args, **kwds)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/manager.py\", line 119, in connect_ssh\n", - " session.connect(*args, **kwds)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/transport/ssh.py\", line 412, in connect\n", - " self._auth(username, password, key_filenames, allow_agent, look_for_keys)\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/ncclient/transport/ssh.py\", line 508, in _auth\n", - " raise AuthenticationError(repr(saved_exception))\n", - "ncclient.transport.errors.AuthenticationError: AuthenticationException('Authentication failed.',)\n", - "\n", - "During handling of the above exception, another exception occurred:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/__init__.py\", line 201, in run_task\n", - " r = task._start(host=host, brigade=brigade, dry_run=dry_run)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 42, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/examples/2_simple_tooling/backup.py\", line 20, in backup\n", - " getters=\"config\")\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 67, in run\n", - " r = Task(task, **kwargs)._start(self.host, self.brigade, dry_run, sub_task=True)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 42, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/plugins/tasks/networking/napalm_get.py\", line 16, in napalm_get\n", - " device = task.host.get_connection(\"napalm\")\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/inventory.py\", line 212, in get_connection\n", - " raise r[self.name].exception\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/__init__.py\", line 201, in run_task\n", - " r = task._start(host=host, brigade=brigade, dry_run=dry_run)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/core/task.py\", line 42, in _start\n", - " r = self.task(self, **self.params) or Result(host)\n", - " File \"/Users/dbarroso/workspace/brigade/brigade/plugins/tasks/connections/napalm_connection.py\", line 31, in napalm_connection\n", - " host.connections[\"napalm\"].open()\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/napalm/junos/junos.py\", line 106, in open\n", - " self.device.open()\n", - " File \"/Users/dbarroso/.virtualenvs/brigade/lib/python3.6/site-packages/jnpr/junos/device.py\", line 1254, in open\n", - " raise EzErrors.ConnectAuthError(self)\n", - "jnpr.junos.exception.ConnectAuthError: ConnectAuthError(127.0.0.1)\n", - "\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run backup.py --filter name=leaf01.bma --path backups/bma/" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> Note that brigade detected and reported that we failed to authenticate to one of the devices.\n", - "\n", - "Now we can check we have the backups in the right place:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "backups/bma:\n", - "leaf00.bma spine00.bma spine01.bma\n", - "\n", - "backups/cmh:\n", - "leaf00.cmh leaf01.cmh spine00.cmh spine01.cmh\n", - "\u001b[0m\u001b[0m" - ] - } - ], - "source": [ - "% ls backups/*" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/2_simple_tooling/backup.py b/examples/2_simple_tooling/backup.py deleted file mode 100755 index db15534a..00000000 --- a/examples/2_simple_tooling/backup.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python -""" -Tool that downloads the configuration from the devices and -stores them on disk. -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import files, networking, text - -import click - - -def backup(task, path): - """ - This function groups two tasks: - 1. Download configuration from the device - 2. Store to disk - """ - result = task.run( - networking.napalm_get, - name="Gathering configuration from the device", - getters="config", - ) - - task.run( - files.write, - name="Saving Configuration to disk", - content=result.result["config"]["running"], - filename="{}/{}".format(path, task.host), - ) - - -@click.command() -@click.option( - "--filter", "-f", multiple=True, help="filters to apply. For instance site=cmh" -) -@click.option("--path", "-p", default=".", help="Where to save the backup files") -def main(filter, path): - """ - Backups running configuration of devices into a file - """ - brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=False, - ) - - # filter is going to be a list of key=value so we clean that first - filter_dict = {"type": "network_device"} - for f in filter: - k, v = f.split("=") - filter_dict[k] = v - - # let's filter the devices - filtered = brg.filter(**filter_dict) - - # Run the ``backup`` function that groups the tasks to - # download/store devices' configuration - results = filtered.run(backup, name="Backing up configurations", path=path) - - # Let's print the result on screen - filtered.run( - text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - skipped=True, - ) - - -if __name__ == "__main__": - main() diff --git a/examples/2_simple_tooling/configure.ipynb b/examples/2_simple_tooling/configure.ipynb deleted file mode 100644 index fd28dd6c..00000000 --- a/examples/2_simple_tooling/configure.ipynb +++ /dev/null @@ -1,747 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Configure\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Tool to configure datacenter\n",
-       " 4 """\n",
-       " 5 from brigade.easy import easy_brigade\n",
-       " 6 from brigade.plugins.tasks import data, networking, text\n",
-       " 7 \n",
-       " 8 import click\n",
-       " 9 \n",
-       "10 \n",
-       "11 def configure(task):\n",
-       "12     """\n",
-       "13     This function groups all the tasks needed to configure the\n",
-       "14     network:\n",
-       "15 \n",
-       "16         1. Loading extra data\n",
-       "17         2. Templates to build configuration\n",
-       "18         3. Deploy configuration on the device\n",
-       "19     """\n",
-       "20     r = task.run(text.template_file,\n",
-       "21                  name="Base Configuration",\n",
-       "22                  template="base.j2",\n",
-       "23                  path="../templates/{brigade_nos}")\n",
-       "24     # r.result holds the result of rendering the template\n",
-       "25     # we store in the host itself so we can keep updating\n",
-       "26     # it as we render other templates\n",
-       "27     task.host["config"] = r.result\n",
-       "28 \n",
-       "29     r = task.run(data.load_yaml,\n",
-       "30                  name="Loading extra data",\n",
-       "31                  file="../extra_data/{host}/l3.yaml")\n",
-       "32     # r.result holds the data contained in the yaml files\n",
-       "33     # we load the data inside the host itself for further use\n",
-       "34     task.host["l3"] = r.result\n",
-       "35 \n",
-       "36     r = task.run(text.template_file,\n",
-       "37                  name="Interfaces Configuration",\n",
-       "38                  template="interfaces.j2",\n",
-       "39                  path="../templates/{brigade_nos}")\n",
-       "40     # we update our hosts' config\n",
-       "41     task.host["config"] += r.result\n",
-       "42 \n",
-       "43     r = task.run(text.template_file,\n",
-       "44                  name="Routing Configuration",\n",
-       "45                  template="routing.j2",\n",
-       "46                  path="../templates/{brigade_nos}")\n",
-       "47     # we update our hosts' config\n",
-       "48     task.host["config"] += r.result\n",
-       "49 \n",
-       "50     r = task.run(text.template_file,\n",
-       "51                  name="Role-specific Configuration",\n",
-       "52                  template="{role}.j2",\n",
-       "53                  path="../templates/{brigade_nos}")\n",
-       "54     # we update our hosts' config\n",
-       "55     task.host["config"] += r.result\n",
-       "56 \n",
-       "57     task.run(networking.napalm_configure,\n",
-       "58              name="Loading Configuration on the device",\n",
-       "59              replace=False,\n",
-       "60              configuration=task.host["config"])\n",
-       "61 \n",
-       "62 \n",
-       "63 @click.command()\n",
-       "64 @click.option('--filter', '-f', multiple=True,\n",
-       "65               help="k=v pairs to filter the devices")\n",
-       "66 @click.option('--commit/--no-commit', '-c', default=False,\n",
-       "67               help="whether you want to commit the changes or not")\n",
-       "68 def main(filter, commit):\n",
-       "69     brg = easy_brigade(\n",
-       "70             host_file="../inventory/hosts.yaml",\n",
-       "71             group_file="../inventory/groups.yaml",\n",
-       "72             dry_run=not commit,\n",
-       "73             raise_on_error=False,\n",
-       "74     )\n",
-       "75 \n",
-       "76     # filter is going to be a list of key=value so we clean that first\n",
-       "77     filter_dict = {"type": "network_device"}\n",
-       "78     for f in filter:\n",
-       "79         k, v = f.split("=")\n",
-       "80         filter_dict[k] = v\n",
-       "81 \n",
-       "82     # let's filter the devices\n",
-       "83     filtered = brg.filter(**filter_dict)\n",
-       "84 \n",
-       "85     results = filtered.run(task=configure)\n",
-       "86 \n",
-       "87     filtered.run(text.print_result,\n",
-       "88                  num_workers=1,  # task should be done synchronously\n",
-       "89                  data=results,\n",
-       "90                  task_id=-1,  # we only want to print the last task\n",
-       "91                  skipped=True,\n",
-       "92                  )\n",
-       "93 \n",
-       "94 \n",
-       "95 if __name__ == "__main__":\n",
-       "96     main()\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file configure.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "Let's start with the help so we can see what we can do." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Usage: configure.py [OPTIONS]\n", - "\n", - "Options:\n", - " -f, --filter TEXT k=v pairs to filter the devices\n", - " -c, --commit / --no-commit whether you want to commit the changes or not\n", - " --help Show this message and exit.\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py --help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With those options it should be easy to check which changes are to be applied before even applying them." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.com\n", - " !\n", - " spanning-tree mode mstp\n", - " !\n", - "@@ -18,13 +21,28 @@\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$Ga4ejrWPFsycSHFN$IJoLAEfCFHqiOwZX/PHlcx5vZ.Hpfx3NxHQXXEuf.Ni3QKlYL108fHruK86rzCjh9aYvBzoQ/ljLSy09.p6Z6/\n", - " !\n", - " interface Ethernet1\n", - "+ description link to leaf00.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.0/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to leaf01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.2/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65000\n", - "+ neighbor 10.0.0.1 remote-as 65100\n", - "+ neighbor 10.0.0.1 maximum-routes 12000 \n", - "+ neighbor 10.0.0.3 remote-as 65101\n", - "+ neighbor 10.0.0.3 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.1 activate\n", - "+ neighbor 10.0.0.3 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to leaf00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.0/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to leaf01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.2/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65000;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.1.1 {\n", - "+ peer-as 65100;\n", - "+ }\n", - "+ neighbor 10.0.1.3 {\n", - "+ peer-as 65101;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,6 +8,9 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - " spanning-tree mode mstp\n", - " !\n", - " aaa authorization exec default local\n", - "@@ -17,14 +20,36 @@\n", - " username admin privilege 15 role network-admin secret sha512 $6$JA1pT7X2JMgpNLbD$mqA6evjEvg1wN09FOs9zniHg63Q.t7DEGEE5mxjXbmzLn5BI4H0OYjramSH5TTwsIyrBbTVbEv49dzeHqpYD4/\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$MZz3VvL4.drK.FFg$lgXW.Fcb9rxxhAoYPg/GxFKAKVxrDEsPmeVNxxn8IH7RnRDRgZltqjPdpq53XYPaeGQO51MZ1qt30ziPwKbDl0\n", - " !\n", - "+vlan 100\n", - "+ name frontend\n", - "+!\n", - "+vlan 200\n", - "+ name backend\n", - "+!\n", - " interface Ethernet1\n", - "+ description link to spine00.cmh\n", - "+ shutdown\n", - "+ no switchport\n", - "+ ip address 10.0.0.1/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to spine01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.1.1/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65100\n", - "+ neighbor 10.0.0.0 remote-as 65000\n", - "+ neighbor 10.0.0.0 maximum-routes 12000 \n", - "+ neighbor 10.0.1.0 remote-as 65000\n", - "+ neighbor 10.0.1.0 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.0 activate\n", - "+ neighbor 10.0.1.0 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name leaf01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to spine00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.0.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to spine01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65101;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.0.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ neighbor 10.0.1.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\n", - "+ vlans {\n", - "+ backend {\n", - "+ vlan-id 200;\n", - "+ }\n", - "+ frontend {\n", - "+ vlan-id 100;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py --filter site=cmh --no-commit" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can review the changes and commit them if we are happy:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -7,6 +7,9 @@\n", - " action bash sudo /mnt/flash/initialize_ma1.sh\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - "+!\n", - "+hostname spine00.cmh\n", - "+ip domain-name cmh.acme.com\n", - " !\n", - " spanning-tree mode mstp\n", - " !\n", - "@@ -18,13 +21,28 @@\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$Ga4ejrWPFsycSHFN$IJoLAEfCFHqiOwZX/PHlcx5vZ.Hpfx3NxHQXXEuf.Ni3QKlYL108fHruK86rzCjh9aYvBzoQ/ljLSy09.p6Z6/\n", - " !\n", - " interface Ethernet1\n", - "+ description link to leaf00.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.0/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to leaf01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.0.2/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65000\n", - "+ neighbor 10.0.0.1 remote-as 65100\n", - "+ neighbor 10.0.0.1 maximum-routes 12000 \n", - "+ neighbor 10.0.0.3 remote-as 65101\n", - "+ neighbor 10.0.0.3 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.1 activate\n", - "+ neighbor 10.0.0.3 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name spine01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to leaf00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.0/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to leaf01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.2/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65000;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.1.1 {\n", - "+ peer-as 65100;\n", - "+ }\n", - "+ neighbor 10.0.1.3 {\n", - "+ peer-as 65101;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -8,6 +8,9 @@\n", - " !\n", - " transceiver qsfp default-mode 4x10G\n", - " !\n", - "+hostname leaf00.cmh\n", - "+ip domain-name cmh.acme.com\n", - "+!\n", - " spanning-tree mode mstp\n", - " !\n", - " aaa authorization exec default local\n", - "@@ -17,14 +20,36 @@\n", - " username admin privilege 15 role network-admin secret sha512 $6$JA1pT7X2JMgpNLbD$mqA6evjEvg1wN09FOs9zniHg63Q.t7DEGEE5mxjXbmzLn5BI4H0OYjramSH5TTwsIyrBbTVbEv49dzeHqpYD4/\n", - " username vagrant privilege 15 role network-admin secret sha512 $6$MZz3VvL4.drK.FFg$lgXW.Fcb9rxxhAoYPg/GxFKAKVxrDEsPmeVNxxn8IH7RnRDRgZltqjPdpq53XYPaeGQO51MZ1qt30ziPwKbDl0\n", - " !\n", - "+vlan 100\n", - "+ name frontend\n", - "+!\n", - "+vlan 200\n", - "+ name backend\n", - "+!\n", - " interface Ethernet1\n", - "+ description link to spine00.cmh\n", - "+ shutdown\n", - "+ no switchport\n", - "+ ip address 10.0.0.1/31\n", - " !\n", - " interface Ethernet2\n", - "+ description link to spine01.cmh\n", - "+ no switchport\n", - "+ ip address 10.0.1.1/31\n", - " !\n", - " interface Management1\n", - " ip address 10.0.2.15/24\n", - " !\n", - "-no ip routing\n", - "+ip routing\n", - "+!\n", - "+router bgp 65100\n", - "+ neighbor 10.0.0.0 remote-as 65000\n", - "+ neighbor 10.0.0.0 maximum-routes 12000 \n", - "+ neighbor 10.0.1.0 remote-as 65000\n", - "+ neighbor 10.0.1.0 maximum-routes 12000 \n", - "+ address-family ipv4\n", - "+ neighbor 10.0.0.0 activate\n", - "+ neighbor 10.0.1.0 activate\n", - " !\n", - " management api http-commands\n", - " no shutdown\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system]\n", - "- host-name vsrx;\n", - "+ host-name leaf01.cmh;\n", - "+ domain-name cmh.acme.com;\n", - "[edit interfaces]\n", - "+ ge-0/0/1 {\n", - "+ description \"link to spine00.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.0.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ ge-0/0/2 {\n", - "+ description \"link to spine01.cmh\";\n", - "+ unit 0 {\n", - "+ family inet {\n", - "+ address 10.0.1.3/31;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "[edit]\n", - "+ routing-options {\n", - "+ autonomous-system 65101;\n", - "+ }\n", - "+ protocols {\n", - "+ bgp {\n", - "+ import PERMIT_ALL;\n", - "+ export PERMIT_ALL;\n", - "+ group peers {\n", - "+ neighbor 10.0.0.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ neighbor 10.0.1.2 {\n", - "+ peer-as 65000;\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ }\n", - "+ policy-options {\n", - "+ policy-statement PERMIT_ALL {\n", - "+ from protocol bgp;\n", - "+ then accept;\n", - "+ }\n", - "+ }\n", - "+ vlans {\n", - "+ backend {\n", - "+ vlan-id 200;\n", - "+ }\n", - "+ frontend {\n", - "+ vlan-id 100;\n", - "+ }\n", - "+ }\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py --filter site=cmh --commit" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we run the tool again it should report no changes:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run configure.py --filter site=cmh --no-commit" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/2_simple_tooling/configure.py b/examples/2_simple_tooling/configure.py deleted file mode 100755 index e4f03520..00000000 --- a/examples/2_simple_tooling/configure.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python -""" -Tool to configure datacenter -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import data, networking, text - -import click - - -def configure(task): - """ - This function groups all the tasks needed to configure the - network: - - 1. Loading extra data - 2. Templates to build configuration - 3. Deploy configuration on the device - """ - r = task.run( - text.template_file, - name="Base Configuration", - template="base.j2", - path="../templates/{brigade_nos}", - ) - # r.result holds the result of rendering the template - # we store in the host itself so we can keep updating - # it as we render other templates - task.host["config"] = r.result - - r = task.run( - data.load_yaml, name="Loading extra data", file="../extra_data/{host}/l3.yaml" - ) - # r.result holds the data contained in the yaml files - # we load the data inside the host itself for further use - task.host["l3"] = r.result - - r = task.run( - text.template_file, - name="Interfaces Configuration", - template="interfaces.j2", - path="../templates/{brigade_nos}", - ) - # we update our hosts' config - task.host["config"] += r.result - - r = task.run( - text.template_file, - name="Routing Configuration", - template="routing.j2", - path="../templates/{brigade_nos}", - ) - # we update our hosts' config - task.host["config"] += r.result - - r = task.run( - text.template_file, - name="Role-specific Configuration", - template="{role}.j2", - path="../templates/{brigade_nos}", - ) - # we update our hosts' config - task.host["config"] += r.result - - task.run( - networking.napalm_configure, - name="Loading Configuration on the device", - replace=False, - configuration=task.host["config"], - ) - - -@click.command() -@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") -@click.option( - "--commit/--no-commit", - "-c", - default=False, - help="whether you want to commit the changes or not", -) -def main(filter, commit): - brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=not commit, - raise_on_error=False, - ) - - # filter is going to be a list of key=value so we clean that first - filter_dict = {"type": "network_device"} - for f in filter: - k, v = f.split("=") - filter_dict[k] = v - - # let's filter the devices - filtered = brg.filter(**filter_dict) - - results = filtered.run(task=configure) - - filtered.run( - text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - skipped=True, - ) - - -if __name__ == "__main__": - main() diff --git a/examples/2_simple_tooling/get_facts.ipynb b/examples/2_simple_tooling/get_facts.ipynb deleted file mode 100644 index 87049422..00000000 --- a/examples/2_simple_tooling/get_facts.ipynb +++ /dev/null @@ -1,306 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Get facts\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Very simple tool to get facts and print them on the screen.\n",
-       " 4 """\n",
-       " 5 from brigade.easy import easy_brigade\n",
-       " 6 from brigade.plugins.tasks import networking, text\n",
-       " 7 \n",
-       " 8 import click\n",
-       " 9 \n",
-       "10 \n",
-       "11 @click.command()\n",
-       "12 @click.option('--filter', '-f', multiple=True,\n",
-       "13               help="k=v pairs to filter the devices")\n",
-       "14 @click.option('--get', '-g', multiple=True,\n",
-       "15               help="getters you want to use")\n",
-       "16 def main(filter, get):\n",
-       "17     """\n",
-       "18     Retrieve information from network devices using napalm\n",
-       "19     """\n",
-       "20     brg = easy_brigade(\n",
-       "21             host_file="../inventory/hosts.yaml",\n",
-       "22             group_file="../inventory/groups.yaml",\n",
-       "23             dry_run=False,\n",
-       "24             raise_on_error=False,\n",
-       "25     )\n",
-       "26 \n",
-       "27     # filter is going to be a list of key=value so we clean that first\n",
-       "28     filter_dict = {"type": "network_device"}\n",
-       "29     for f in filter:\n",
-       "30         k, v = f.split("=")\n",
-       "31         filter_dict[k] = v\n",
-       "32 \n",
-       "33     # select which devices we want to work with\n",
-       "34     filtered = brg.filter(**filter_dict)\n",
-       "35     results = filtered.run(networking.napalm_get,\n",
-       "36                            getters=get)\n",
-       "37 \n",
-       "38     # Let's print the result on screen\n",
-       "39     filtered.run(text.print_result,\n",
-       "40                  num_workers=1,  # task should be done synchronously\n",
-       "41                  data=results)\n",
-       "42 \n",
-       "43 \n",
-       "44 if __name__ == "__main__":\n",
-       "45     main()\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file get_facts.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "As usual, let's start with the help:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Usage: get_facts.py [OPTIONS]\n", - "\n", - " Retrieve information from network devices using napalm\n", - "\n", - "Options:\n", - " -f, --filter TEXT k=v pairs to filter the devices\n", - " -g, --get TEXT getters you want to use\n", - " --help Show this message and exit.\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run get_facts.py --help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks like we can use any getter. Let's see:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1516038050.9974556\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:0C:31:79'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m0\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m'link to leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1516037549.5002303\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:0C:31:79'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m0\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Management1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'description'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'is_enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'is_up'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'last_flapped'\u001b[0m: \u001b[0m1516037563.4058475\u001b[0m,\n", - " \u001b[0m'mac_address'\u001b[0m: \u001b[0m'08:00:27:47:87:83'\u001b[0m,\n", - " \u001b[0m'speed'\u001b[0m: \u001b[0m1000\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run get_facts.py --filter name=spine00.cmh -g interfaces" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- napalm_get ** changed : False --------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'facts'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'fqdn'\u001b[0m: \u001b[0m'spine00.cmh.cmh.acme.com'\u001b[0m,\n", - " \u001b[0m'hostname'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'interface_list'\u001b[0m: \u001b[0m['Ethernet1', 'Ethernet2', 'Management1']\u001b[0m,\n", - " \u001b[0m'model'\u001b[0m: \u001b[0m'vEOS'\u001b[0m,\n", - " \u001b[0m'os_version'\u001b[0m: \u001b[0m'4.17.5M-4414219.4175M'\u001b[0m,\n", - " \u001b[0m'serial_number'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'uptime'\u001b[0m: \u001b[0m1156\u001b[0m,\n", - " \u001b[0m'vendor'\u001b[0m: \u001b[0m'Arista'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'users'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'admin'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'level'\u001b[0m: \u001b[0m15\u001b[0m,\n", - " \u001b[0m'password'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'role'\u001b[0m: \u001b[0m'network-admin'\u001b[0m,\n", - " \u001b[0m'sshkeys'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m,\n", - " \u001b[0m'vagrant'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'level'\u001b[0m: \u001b[0m15\u001b[0m,\n", - " \u001b[0m'password'\u001b[0m: \u001b[0m''\u001b[0m,\n", - " \u001b[0m'role'\u001b[0m: \u001b[0m'network-admin'\u001b[0m,\n", - " \u001b[0m'sshkeys'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run get_facts.py --filter name=spine00.cmh -g facts -g users" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/2_simple_tooling/get_facts.py b/examples/2_simple_tooling/get_facts.py deleted file mode 100755 index 2552ac93..00000000 --- a/examples/2_simple_tooling/get_facts.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python -""" -Very simple tool to get facts and print them on the screen. -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import networking, text - -import click - - -@click.command() -@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") -@click.option("--get", "-g", multiple=True, help="getters you want to use") -def main(filter, get): - """ - Retrieve information from network devices using napalm - """ - brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=False, - ) - - # filter is going to be a list of key=value so we clean that first - filter_dict = {"type": "network_device"} - for f in filter: - k, v = f.split("=") - filter_dict[k] = v - - # select which devices we want to work with - filtered = brg.filter(**filter_dict) - results = filtered.run(networking.napalm_get, getters=get) - - # Let's print the result on screen - filtered.run( - text.print_result, - num_workers=1, # task should be done synchronously - data=results, - ) - - -if __name__ == "__main__": - main() diff --git a/examples/2_simple_tooling/rollback.ipynb b/examples/2_simple_tooling/rollback.ipynb deleted file mode 100644 index e09fc848..00000000 --- a/examples/2_simple_tooling/rollback.ipynb +++ /dev/null @@ -1,411 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Rollback\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Tool to rollback configuration from a saved configuration\n",
-       " 4 """\n",
-       " 5 from brigade.easy import easy_brigade\n",
-       " 6 from brigade.plugins.tasks import networking, text\n",
-       " 7 \n",
-       " 8 import click\n",
-       " 9 \n",
-       "10 \n",
-       "11 def rollback(task, path):\n",
-       "12     """\n",
-       "13     This function loads the backup from ./$path/$hostname and\n",
-       "14     deploys it.\n",
-       "15     """\n",
-       "16     task.run(networking.napalm_configure,\n",
-       "17              name="Loading Configuration on the device",\n",
-       "18              replace=True,\n",
-       "19              filename="{}/{}".format(path, task.host))\n",
-       "20 \n",
-       "21 \n",
-       "22 @click.command()\n",
-       "23 @click.option('--filter', '-f', multiple=True,\n",
-       "24               help="k=v pairs to filter the devices")\n",
-       "25 @click.option('--commit/--no-commit', '-c', default=False,\n",
-       "26               help="whether you want to commit the changes or not")\n",
-       "27 @click.option('--path', '-p', default=".",\n",
-       "28               help="Where to save the backup files")\n",
-       "29 def main(filter, commit, path):\n",
-       "30     brg = easy_brigade(\n",
-       "31             host_file="../inventory/hosts.yaml",\n",
-       "32             group_file="../inventory/groups.yaml",\n",
-       "33             dry_run=not commit,\n",
-       "34             raise_on_error=True,\n",
-       "35     )\n",
-       "36 \n",
-       "37     # filter is going to be a list of key=value so we clean that first\n",
-       "38     filter_dict = {"type": "network_device"}\n",
-       "39     for f in filter:\n",
-       "40         k, v = f.split("=")\n",
-       "41         filter_dict[k] = v\n",
-       "42 \n",
-       "43     # let's filter the devices\n",
-       "44     filtered = brg.filter(**filter_dict)\n",
-       "45 \n",
-       "46     results = filtered.run(task=rollback, path=path)\n",
-       "47 \n",
-       "48     filtered.run(text.print_result,\n",
-       "49                  num_workers=1,  # task should be done synchronously\n",
-       "50                  data=results,\n",
-       "51                  task_id=-1,  # we only want to print the last task\n",
-       "52                  )\n",
-       "53 \n",
-       "54 \n",
-       "55 if __name__ == "__main__":\n",
-       "56     main()\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file rollback.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "As usual, let's start with the help:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Usage: rollback.py [OPTIONS]\n", - "\n", - "Options:\n", - " -f, --filter TEXT k=v pairs to filter the devices\n", - " -c, --commit / --no-commit whether you want to commit the changes or not\n", - " -p, --path TEXT Where to save the backup files\n", - " --help Show this message and exit.\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run rollback.py --help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks like we can filter devices as usual, we can test changes as with the ``configure.py`` tool and that we can even choose the path where to look for the configurations. Let's try it:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -15,10 +15,10 @@\n", - " !\n", - " aaa authorization exec default local\n", - " !\n", - "-aaa root secret sha512 $6$DInx3sLBwR.ikKs8$ThNQ/uVPDT9YXcreGqYZ53IZA.abXsMPsV4jdylCVl5Nu6GMcVcFgvE9L3hvM/vZDJS7.1xs9ZwphFdP1BhNP1\n", - "+aaa root secret sha512 $6$5stn7z2imBLV6iO0$w0ZnOhy8SwNdELdO2da9q8wDKerYTyY8evY052UoyRJ2Wo6liaUneuTFGphL8JQD9gtESOipCBb6PYmSMuUjs.\n", - " !\n", - "-username admin privilege 15 role network-admin secret sha512 $6$JHsj9QpFAuo8TKNS$98Wmnr/.L2CCHtd6peL2q4fGOnt39C/XtBPJms6J/u1qBX9xWvf99FIYuQPSoqCTYBrN0ZNjzVKeIkNnV.Gez.\n", - "-username vagrant privilege 15 role network-admin secret sha512 $6$Ga4ejrWPFsycSHFN$IJoLAEfCFHqiOwZX/PHlcx5vZ.Hpfx3NxHQXXEuf.Ni3QKlYL108fHruK86rzCjh9aYvBzoQ/ljLSy09.p6Z6/\n", - "+username admin privilege 15 role network-admin secret sha512 $6$qkXlQpatVlanYe9v$aHTbPaGTaqDRCp5WSC3DPpDfblYSE24.OHeKgGOOTf0.Ol2lDpivTvHByx5tU41sVOGcHqc4U4LgrKv8AjbKQ/\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - " !\n", - " interface Ethernet1\n", - " description link to leaf00.cmh\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system root-authentication]\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDi/i8iiAZsXC5qdmJZpTxKjUyyoMgEGoHXl/TMFdJjSV+XAZ18OXAEsvPO0AlXJ6RZTwK8Zcr6TLq4l1Kssd+kVN02shFkgDo3wWf3I2BXKKdog6/6fbhiD1SgCeafzWBlUQvREgDQDy1XSFjNjSJ39vtOa8ikqGdbf4XH0hjoLHYDV0H0VNZLboULCNFPF0PHQfPrsp2AXHU+p7sl61GhZgfw6WuLIzXWqJyq9B0Q5XgdmvnvdjZeTOShoPTPbaRYVVFOMGTqJQOZsl5P3wTIJT8JG7iEz1Tiar8nmltON83sy/lEODhZkJPXe3zw3fwUIS9yQ53z0t1UGHm7KGNX vagrant\"; ## SECRET-DATA\n", - "- ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCcn03wv4SesN3JeAdwiOzgEdY5f+u4yptRK8OEjkHLuJg/6lR6MoD2BkdvWLShtx97/kVbxbTWOu9XM1mZ+E/YDR0mt7eHWwiy/OlgP9i0MzSj+XhtMUzRp7Ow+34VrrW7yQmuIkigq/QkDPv3b6O0u0y6azCQVrg5pvwRdZU2xTyKt/aM6/TL+glVh508XqG7RzlsmIRnrSa0WfHzcbQKPTJXlAjLGoYk53SltxW//e5HMQnTAJop0ic7FniXrVhS8F9iKxfLfFqzB5JJ2gaQX3y3cPr1MIg60aoSprI/8297wjE6fnQGcp1H1fD5rJx96m+3ViwydbtElhljcreB vagrant\"; ## SECRET-DATA\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -15,10 +15,10 @@\n", - " !\n", - " aaa authorization exec default local\n", - " !\n", - "-aaa root secret sha512 $6$8FLl5NfSda1Wh6d8$3SO4hP73eJnMf5kHrKUoMJ4jMtLU7iRrj/FJwAgAdk4GImfqy6WYLqMgmfpYOe6v/T4rjIFpOX..LmhCnbgbO0\n", - "+aaa root secret sha512 $6$sRifRAo/DXihW7sG$3r4MMTsslNCCWdD/FFIw3lvnnkI4SWO0bvhEzvWSurrOBgUsxjrmgN5kywH5Ta7LNNXiWjFfjwoyefn9nqeB2/\n", - " !\n", - "-username admin privilege 15 role network-admin secret sha512 $6$JA1pT7X2JMgpNLbD$mqA6evjEvg1wN09FOs9zniHg63Q.t7DEGEE5mxjXbmzLn5BI4H0OYjramSH5TTwsIyrBbTVbEv49dzeHqpYD4/\n", - "-username vagrant privilege 15 role network-admin secret sha512 $6$MZz3VvL4.drK.FFg$lgXW.Fcb9rxxhAoYPg/GxFKAKVxrDEsPmeVNxxn8IH7RnRDRgZltqjPdpq53XYPaeGQO51MZ1qt30ziPwKbDl0\n", - "+username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - " !\n", - " vlan 100\n", - " name frontend\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system root-authentication]\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsfGpEhGi8CbjIHJkMju/CJH6IuQiIzZyDt+AVieDfXKWDuBSOfc7YV8xNdYMqQqpDOWmEVZ7dhfD6IWDI3aa6WLkEXORD+zScjQo+5iHty6VlI61ImHQkWhWX6pZi3Cq/JsH8oldIC2xvzFNWB2p1suu+rzuGtJjbDq5NMlp1bNSiBgV0dHZR6Lt1UuK/rVBl7FbBN8HpInM+a37SkkwIrKMK8z42Ax9ufd17P3SqZP8oo+Ql4Y3aeCz2t4CfZNh9YRLZSiUYF16VN+31mzKEqT7+0rFlyfv/CaPwyfAv2BPFljUEsyFsWU923EGYQsfOIKVnd+zzHDHIHapVMQbh vagrant\"; ## SECRET-DATA\n", - "- ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuoXCl14JaKfWnyKSp1c4wjBv6XiCMsIRT7w0+BQxvaS7D1AoxNksYCTTjAJ8HVaMcLD7MI4bajS3/oEwtmCVpNJBG91UCi0P3tN2GjQwCwzrZG0eNpP2Gy51sKcq2lM1sxi+9QKYAtK5gmqV2Y8UeOuo4jKVNxCrPLYXO2BQBGCBUPayDjiPDir0H2BCKGpuwgegHgpkFKw+tWqo0IFsQmnvOQX+mjGDV8PVghCnzLO2ZbZrZPu5rRSgZm+CFGK1DGDsPBgdElxnu6ytjVIKkDzHrZ6HEm7yFgneb0WDGEmVl8MvBS9VPXXv8NzHJTUnedbxWKcqJ+xurpAGAYm6n vagrant\"; ## SECRET-DATA\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run rollback.py --path backups/cmh --no-commit --filter site=cmh" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks legit, let's commit the changes:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[33m* spine00.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -15,10 +15,10 @@\n", - " !\n", - " aaa authorization exec default local\n", - " !\n", - "-aaa root secret sha512 $6$DInx3sLBwR.ikKs8$ThNQ/uVPDT9YXcreGqYZ53IZA.abXsMPsV4jdylCVl5Nu6GMcVcFgvE9L3hvM/vZDJS7.1xs9ZwphFdP1BhNP1\n", - "+aaa root secret sha512 $6$5stn7z2imBLV6iO0$w0ZnOhy8SwNdELdO2da9q8wDKerYTyY8evY052UoyRJ2Wo6liaUneuTFGphL8JQD9gtESOipCBb6PYmSMuUjs.\n", - " !\n", - "-username admin privilege 15 role network-admin secret sha512 $6$JHsj9QpFAuo8TKNS$98Wmnr/.L2CCHtd6peL2q4fGOnt39C/XtBPJms6J/u1qBX9xWvf99FIYuQPSoqCTYBrN0ZNjzVKeIkNnV.Gez.\n", - "-username vagrant privilege 15 role network-admin secret sha512 $6$Ga4ejrWPFsycSHFN$IJoLAEfCFHqiOwZX/PHlcx5vZ.Hpfx3NxHQXXEuf.Ni3QKlYL108fHruK86rzCjh9aYvBzoQ/ljLSy09.p6Z6/\n", - "+username admin privilege 15 role network-admin secret sha512 $6$qkXlQpatVlanYe9v$aHTbPaGTaqDRCp5WSC3DPpDfblYSE24.OHeKgGOOTf0.Ol2lDpivTvHByx5tU41sVOGcHqc4U4LgrKv8AjbKQ/\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$kRQZJTqx69hOW5ag$Y6VX8Kk37TWEsriKdr6ixqvMuUSSbuFu2Eh/5SIet2TCeXP3bdlwikIAruPp6lHB5HdC.t6tPsZVctHMU7H590\n", - " !\n", - " interface Ethernet1\n", - " description link to leaf00.cmh\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* spine01.cmh ** changed : True ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system root-authentication]\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDi/i8iiAZsXC5qdmJZpTxKjUyyoMgEGoHXl/TMFdJjSV+XAZ18OXAEsvPO0AlXJ6RZTwK8Zcr6TLq4l1Kssd+kVN02shFkgDo3wWf3I2BXKKdog6/6fbhiD1SgCeafzWBlUQvREgDQDy1XSFjNjSJ39vtOa8ikqGdbf4XH0hjoLHYDV0H0VNZLboULCNFPF0PHQfPrsp2AXHU+p7sl61GhZgfw6WuLIzXWqJyq9B0Q5XgdmvnvdjZeTOShoPTPbaRYVVFOMGTqJQOZsl5P3wTIJT8JG7iEz1Tiar8nmltON83sy/lEODhZkJPXe3zw3fwUIS9yQ53z0t1UGHm7KGNX vagrant\"; ## SECRET-DATA\n", - "- ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCcn03wv4SesN3JeAdwiOzgEdY5f+u4yptRK8OEjkHLuJg/6lR6MoD2BkdvWLShtx97/kVbxbTWOu9XM1mZ+E/YDR0mt7eHWwiy/OlgP9i0MzSj+XhtMUzRp7Ow+34VrrW7yQmuIkigq/QkDPv3b6O0u0y6azCQVrg5pvwRdZU2xTyKt/aM6/TL+glVh508XqG7RzlsmIRnrSa0WfHzcbQKPTJXlAjLGoYk53SltxW//e5HMQnTAJop0ic7FniXrVhS8F9iKxfLfFqzB5JJ2gaQX3y3cPr1MIg60aoSprI/8297wjE6fnQGcp1H1fD5rJx96m+3ViwydbtElhljcreB vagrant\"; ## SECRET-DATA\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf00.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m@@ -15,10 +15,10 @@\n", - " !\n", - " aaa authorization exec default local\n", - " !\n", - "-aaa root secret sha512 $6$8FLl5NfSda1Wh6d8$3SO4hP73eJnMf5kHrKUoMJ4jMtLU7iRrj/FJwAgAdk4GImfqy6WYLqMgmfpYOe6v/T4rjIFpOX..LmhCnbgbO0\n", - "+aaa root secret sha512 $6$sRifRAo/DXihW7sG$3r4MMTsslNCCWdD/FFIw3lvnnkI4SWO0bvhEzvWSurrOBgUsxjrmgN5kywH5Ta7LNNXiWjFfjwoyefn9nqeB2/\n", - " !\n", - "-username admin privilege 15 role network-admin secret sha512 $6$JA1pT7X2JMgpNLbD$mqA6evjEvg1wN09FOs9zniHg63Q.t7DEGEE5mxjXbmzLn5BI4H0OYjramSH5TTwsIyrBbTVbEv49dzeHqpYD4/\n", - "-username vagrant privilege 15 role network-admin secret sha512 $6$MZz3VvL4.drK.FFg$lgXW.Fcb9rxxhAoYPg/GxFKAKVxrDEsPmeVNxxn8IH7RnRDRgZltqjPdpq53XYPaeGQO51MZ1qt30ziPwKbDl0\n", - "+username admin privilege 15 role network-admin secret sha512 $6$/K1M3ENrC/xALAOm$1vCB5TfaI8ih5GQRCwhRE7KGzmc.EGuQZ7dEuwhP7AJC0/A97u88miINH/7GtrBpRZ.Inn5JY9tuymMcmyyKc.\n", - "+username vagrant privilege 15 role network-admin secret sha512 $6$9CGTCvCiiJK3lDMp$kU9ncPDBkw0w09.h9wIhQtMAkZ/1zD1ds/wlAZAtmSQf5ntNMjDgvmZpBcXWAPAETlk4.kA9niLTVmQwaLBV/.\n", - " !\n", - " vlan 100\n", - " name frontend\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[33m* leaf01.cmh ** changed : True *************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : True --------------------\u001b[0m\n", - "\u001b[0m[edit system root-authentication]\n", - "+ ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsfGpEhGi8CbjIHJkMju/CJH6IuQiIzZyDt+AVieDfXKWDuBSOfc7YV8xNdYMqQqpDOWmEVZ7dhfD6IWDI3aa6WLkEXORD+zScjQo+5iHty6VlI61ImHQkWhWX6pZi3Cq/JsH8oldIC2xvzFNWB2p1suu+rzuGtJjbDq5NMlp1bNSiBgV0dHZR6Lt1UuK/rVBl7FbBN8HpInM+a37SkkwIrKMK8z42Ax9ufd17P3SqZP8oo+Ql4Y3aeCz2t4CfZNh9YRLZSiUYF16VN+31mzKEqT7+0rFlyfv/CaPwyfAv2BPFljUEsyFsWU923EGYQsfOIKVnd+zzHDHIHapVMQbh vagrant\"; ## SECRET-DATA\n", - "- ssh-rsa \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuoXCl14JaKfWnyKSp1c4wjBv6XiCMsIRT7w0+BQxvaS7D1AoxNksYCTTjAJ8HVaMcLD7MI4bajS3/oEwtmCVpNJBG91UCi0P3tN2GjQwCwzrZG0eNpP2Gy51sKcq2lM1sxi+9QKYAtK5gmqV2Y8UeOuo4jKVNxCrPLYXO2BQBGCBUPayDjiPDir0H2BCKGpuwgegHgpkFKw+tWqo0IFsQmnvOQX+mjGDV8PVghCnzLO2ZbZrZPu5rRSgZm+CFGK1DGDsPBgdElxnu6ytjVIKkDzHrZ6HEm7yFgneb0WDGEmVl8MvBS9VPXXv8NzHJTUnedbxWKcqJ+xurpAGAYm6n vagrant\"; ## SECRET-DATA\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run rollback.py --path backups/cmh --commit --filter site=cmh" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And let's verify all changes were applied correctly:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[34m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- Loading Configuration on the device ** changed : False -------------------\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run rollback.py --path backups/cmh --no-commit --filter site=cmh" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/2_simple_tooling/rollback.py b/examples/2_simple_tooling/rollback.py deleted file mode 100755 index 81538bcc..00000000 --- a/examples/2_simple_tooling/rollback.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python -""" -Tool to rollback configuration from a saved configuration -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import networking, text - -import click - - -def rollback(task, path): - """ - This function loads the backup from ./$path/$hostname and - deploys it. - """ - task.run( - networking.napalm_configure, - name="Loading Configuration on the device", - replace=True, - filename="{}/{}".format(path, task.host), - ) - - -@click.command() -@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") -@click.option( - "--commit/--no-commit", - "-c", - default=False, - help="whether you want to commit the changes or not", -) -@click.option("--path", "-p", default=".", help="Where to save the backup files") -def main(filter, commit, path): - brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=not commit, - raise_on_error=True, - ) - - # filter is going to be a list of key=value so we clean that first - filter_dict = {"type": "network_device"} - for f in filter: - k, v = f.split("=") - filter_dict[k] = v - - # let's filter the devices - filtered = brg.filter(**filter_dict) - - results = filtered.run(task=rollback, path=path) - - filtered.run( - text.print_result, - num_workers=1, # task should be done synchronously - data=results, - task_id=-1, # we only want to print the last task - ) - - -if __name__ == "__main__": - main() diff --git a/examples/2_simple_tooling/validate.ipynb b/examples/2_simple_tooling/validate.ipynb deleted file mode 100644 index 75711ffc..00000000 --- a/examples/2_simple_tooling/validate.ipynb +++ /dev/null @@ -1,404 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ignore this cell, this is just a helper cell to provide the magic %highlight_file\n", - "%run ../highlighter.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Validate\n", - "\n", - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
 1 #!/usr/bin/env python\n",
-       " 2 """\n",
-       " 3 Runbook that verifies that BGP sessions are configured and up.\n",
-       " 4 """\n",
-       " 5 from brigade.easy import easy_brigade\n",
-       " 6 from brigade.plugins.tasks import data, networking, text\n",
-       " 7 \n",
-       " 8 import click\n",
-       " 9 \n",
-       "10 \n",
-       "11 def validate(task):\n",
-       "12     task.host["config"] = ""\n",
-       "13 \n",
-       "14     r = task.run(name="read data",\n",
-       "15                  task=data.load_yaml,\n",
-       "16                  file="../extra_data/{host}/l3.yaml")\n",
-       "17 \n",
-       "18     validation_rules = [{\n",
-       "19         'get_bgp_neighbors': {\n",
-       "20             'global': {\n",
-       "21                 'peers': {\n",
-       "22                     '_mode': 'strict',\n",
-       "23                 }\n",
-       "24             }\n",
-       "25         }\n",
-       "26     }]\n",
-       "27     peers = validation_rules[0]['get_bgp_neighbors']['global']['peers']\n",
-       "28     for session in r.result['sessions']:\n",
-       "29         peers[session['ipv4']] = {'is_up': True}\n",
-       "30 \n",
-       "31     task.run(name="validating data",\n",
-       "32              task=networking.napalm_validate,\n",
-       "33              validation_source=validation_rules)\n",
-       "34 \n",
-       "35 \n",
-       "36 def print_compliance(task, results):\n",
-       "37     """\n",
-       "38     We use this task so we can access directly the result\n",
-       "39     for each specific host and see if the task complies or not\n",
-       "40     and pass it to print_result.\n",
-       "41     """\n",
-       "42     task.run(name="print result",\n",
-       "43              task=text.print_result,\n",
-       "44              data=results[task.host.name],\n",
-       "45              failed=not results[task.host.name][2].result['complies'],\n",
-       "46              )\n",
-       "47 \n",
-       "48 \n",
-       "49 @click.command()\n",
-       "50 @click.option('--filter', '-f', multiple=True,\n",
-       "51               help="k=v pairs to filter the devices")\n",
-       "52 def main(filter):\n",
-       "53     brg = easy_brigade(\n",
-       "54             host_file="../inventory/hosts.yaml",\n",
-       "55             group_file="../inventory/groups.yaml",\n",
-       "56             dry_run=False,\n",
-       "57             raise_on_error=True,\n",
-       "58     )\n",
-       "59 \n",
-       "60     # filter is going to be a list of key=value so we clean that first\n",
-       "61     filter_dict = {"type": "network_device"}\n",
-       "62     for f in filter:\n",
-       "63         k, v = f.split("=")\n",
-       "64         filter_dict[k] = v\n",
-       "65 \n",
-       "66     # select which devices we want to work with\n",
-       "67     filtered = brg.filter(**filter_dict)\n",
-       "68 \n",
-       "69     results = filtered.run(task=validate)\n",
-       "70 \n",
-       "71     filtered.run(print_compliance,\n",
-       "72                  results=results,\n",
-       "73                  num_workers=1)\n",
-       "74 \n",
-       "75 \n",
-       "76 if __name__ == "__main__":\n",
-       "77     main()\n",
-       "
\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%highlight_file validate.py" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo\n", - "\n", - "As usual, let's start with the help:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Usage: validate.py [OPTIONS]\n", - "\n", - "Options:\n", - " -f, --filter TEXT k=v pairs to filter the devices\n", - " --help Show this message and exit.\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run validate.py --help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Not much to it, very similar to its runbook counterpart:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[31m* spine00.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.0/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.2/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.1', 'peer_as': 65100}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.0.3', 'peer_as': 65101}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'peers'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'10.0.0.1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'is_up'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'actual_value'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'expected_value'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mFalse\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m,\n", - " \u001b[0m'10.0.0.3'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* spine01.cmh ** changed : False ***********************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.0/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'leaf01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.2/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.1.1', 'peer_as': 65100}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.3', 'peer_as': 65101}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[31m* leaf00.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'Ethernet1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.1/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'Ethernet2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.1/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.0', 'peer_as': 65000}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.0', 'peer_as': 65000}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'peers'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'10.0.0.0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'diff'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'is_up'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'actual_value'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'complies'\u001b[0m: \u001b[0mFalse\u001b[0m,\n", - " \u001b[0m'expected_value'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mFalse\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m,\n", - " \u001b[0m'10.0.1.0'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[34m* leaf01.cmh ** changed : False ************************************************\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validate ** changed : False ----------------------------------------------\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- read data ** changed : False ---------------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'interfaces'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'ge-0/0/1'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine00.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.0.3/31'\u001b[0m}\u001b[0m,\n", - " \u001b[0m'ge-0/0/2'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'connects_to'\u001b[0m: \u001b[0m'spine01.cmh'\u001b[0m,\n", - " \u001b[0m'enabled'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'ipv4'\u001b[0m: \u001b[0m'10.0.1.3/31'\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'sessions'\u001b[0m: \u001b[0m[\u001b[0m \u001b[0m\u001b[0m{'ipv4': '10.0.0.2', 'peer_as': 65000}\u001b[0m,\n", - " \u001b[0m{'ipv4': '10.0.1.2', 'peer_as': 65000}\u001b[0m]\u001b[0m}\u001b[0m\n", - "\u001b[0m\u001b[1m\u001b[36m---- validating data ** changed : False ---------------------------------------\u001b[0m\n", - "\u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'get_bgp_neighbors'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'extra'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'missing'\u001b[0m: \u001b[0m[]\u001b[0m,\n", - " \u001b[0m'present'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'global'\u001b[0m: \u001b[0m{\u001b[0m \u001b[0m'complies'\u001b[0m: \u001b[0mTrue\u001b[0m,\n", - " \u001b[0m'nested'\u001b[0m: \u001b[0mTrue\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m,\n", - " \u001b[0m'skipped'\u001b[0m: \u001b[0m[]\u001b[0m}\u001b[0m\n", - "\u001b[0m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "%run validate.py --filter site=cmh" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/2_simple_tooling/validate.py b/examples/2_simple_tooling/validate.py deleted file mode 100755 index d186a99a..00000000 --- a/examples/2_simple_tooling/validate.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python -""" -Runbook that verifies that BGP sessions are configured and up. -""" -from brigade.easy import easy_brigade -from brigade.plugins.tasks import data, networking, text - -import click - - -def validate(task): - task.host["config"] = "" - - r = task.run( - name="read data", task=data.load_yaml, file="../extra_data/{host}/l3.yaml" - ) - - validation_rules = [ - {"get_bgp_neighbors": {"global": {"peers": {"_mode": "strict"}}}} - ] - peers = validation_rules[0]["get_bgp_neighbors"]["global"]["peers"] - for session in r.result["sessions"]: - peers[session["ipv4"]] = {"is_up": True} - - task.run( - name="validating data", - task=networking.napalm_validate, - validation_source=validation_rules, - ) - - -def print_compliance(task, results): - """ - We use this task so we can access directly the result - for each specific host and see if the task complies or not - and pass it to print_result. - """ - task.run( - name="print result", - task=text.print_result, - data=results[task.host.name], - failed=not results[task.host.name][2].result["complies"], - ) - - -@click.command() -@click.option("--filter", "-f", multiple=True, help="k=v pairs to filter the devices") -def main(filter): - brg = easy_brigade( - host_file="../inventory/hosts.yaml", - group_file="../inventory/groups.yaml", - dry_run=False, - raise_on_error=True, - ) - - # filter is going to be a list of key=value so we clean that first - filter_dict = {"type": "network_device"} - for f in filter: - k, v = f.split("=") - filter_dict[k] = v - - # select which devices we want to work with - filtered = brg.filter(**filter_dict) - - results = filtered.run(task=validate) - - filtered.run(print_compliance, results=results, num_workers=1) - - -if __name__ == "__main__": - main() diff --git a/examples/3_advanced_tooling/mate.py b/examples/3_advanced_tooling/mate.py deleted file mode 100755 index d23562ea..00000000 --- a/examples/3_advanced_tooling/mate.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python -""" -In this example we write a CLI tool with brigade and click to deploy configuration. -""" - -from brigade.core import Brigade -from brigade.core.configuration import Config -from brigade.plugins.inventory.simple import SimpleInventory - -import click - -from tasks import backup, configure, get_facts, validate - - -@click.group() -@click.option("--filter", "-f", multiple=True) -@click.option("--commit/--no-commit", "-c", default=False) -@click.pass_context -def run(ctx, filter, commit): - brigade = Brigade( - inventory=SimpleInventory("../hosts.yaml", "../groups.yaml"), - dry_run=not commit, - config=Config(raise_on_error=False), - ) - - # filter is going to be a list of key=value so we clean that first - filter_dict = {"type": "network_device"} - for f in filter: - k, v = f.split("=") - filter_dict[k] = v - - filtered = brigade.filter(**filter_dict) # let's filter the devices - ctx.obj["filtered"] = filtered - - -run.add_command(backup.backup) -run.add_command(configure.configure) -run.add_command(get_facts.get) -run.add_command(validate.validate) - - -if __name__ == "__main__": - run(obj={}) diff --git a/examples/3_advanced_tooling/tasks/__init__.py b/examples/3_advanced_tooling/tasks/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/3_advanced_tooling/tasks/backup.py b/examples/3_advanced_tooling/tasks/backup.py deleted file mode 100755 index 58d367b8..00000000 --- a/examples/3_advanced_tooling/tasks/backup.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -""" -This is a simple example where we use click and brigade to build a simple CLI tool to retrieve -hosts information. - -The main difference with get_facts_simple.py is that instead of calling a plugin directly -we wrap it in a function. It is not very useful or necessary here but illustrates how -tasks can be grouped. -""" -from brigade.plugins import functions -from brigade.plugins.tasks import files, networking, text - -import click - - -def backup_task(task, path): - result = task.run(networking.napalm_get, getters="config") - - return task.run( - files.write, - content=result.result["config"]["running"], - filename="{}/{}".format(path, task.host), - ) - - -@click.command() -@click.option("--backup-path", default=".") -@click.pass_context -def backup(ctx, backup_path, **kwargs): - functions.text.print_title("Backing up configurations") - filtered = ctx.obj["filtered"] - results = filtered.run(backup_task, path=backup_path) - - # Let's print the result on screen - return filtered.run(text.print_result, num_workers=1, data=results) diff --git a/examples/3_advanced_tooling/tasks/configure.py b/examples/3_advanced_tooling/tasks/configure.py deleted file mode 100755 index 2ca12bc0..00000000 --- a/examples/3_advanced_tooling/tasks/configure.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python -""" -In this example we write a CLI tool with brigade and click to deploy configuration. -""" -import time - -from brigade.plugins import functions -from brigade.plugins.tasks import data, networking, text - -import click - -from . import backup as backup_ -from . import validate as validate_ - - -def configure_task(task): - r = task.run( - text.template_file, template="base.j2", path="../templates/{brigade_nos}" - ) - task.host["config"] = r.result - - r = task.run(data.load_yaml, file="../extra_data/{host}/l3.yaml") - task.host["l3"] = r.result - - r = task.run( - text.template_file, template="interfaces.j2", path="../templates/{brigade_nos}" - ) - task.host["config"] += r.result - - r = task.run( - text.template_file, template="routing.j2", path="../templates/{brigade_nos}" - ) - task.host["config"] += r.result - - r = task.run( - text.template_file, template="{role}.j2", path="../templates/{brigade_nos}" - ) - task.host["config"] += r.result - - return task.run( - networking.napalm_configure, replace=False, configuration=task.host["config"] - ) - - -@click.command() -@click.option("--validate/--no-validate", default=False) -@click.option("--rollback/--no-rollback", default=False) -@click.option("--backup/--no-backup", default=False) -@click.option("--backup-path", default=".") -@click.pass_context -def configure(ctx, validate, backup, backup_path, rollback): - filtered = ctx.obj["filtered"] - - if backup: - backup_.backup.invoke(ctx) - - functions.text.print_title("Configure Network") - results = filtered.run(task=configure_task) - - filtered.run( - text.print_result, - num_workers=1, # we are printing on screen so we want to do this synchronously - data=results, - ) - - if validate: - time.sleep(10) - r = validate_.validate.invoke(ctx) - - if r.failed and rollback: - functions.text.print_title("Rolling back configuration!!!") - r = filtered.run( - networking.napalm_configure, - replace=True, - filename=backup_path + "/{host}", - ) - filtered.run(text.print_result, num_workers=1, data=r) - import pdb - - pdb.set_trace() # noqa diff --git a/examples/3_advanced_tooling/tasks/get_facts.py b/examples/3_advanced_tooling/tasks/get_facts.py deleted file mode 100755 index f918e225..00000000 --- a/examples/3_advanced_tooling/tasks/get_facts.py +++ /dev/null @@ -1,21 +0,0 @@ -from brigade.plugins.tasks import networking, text - -import click - - -@click.command() -@click.option("--get", "-g", multiple=True, help="getters you want to use") -@click.pass_context -def get(ctx, get): - """ - Retrieve information from network devices using napalm - """ - filtered = ctx.obj["filtered"] - results = filtered.run(networking.napalm_get, getters=get) - - # Let's print the result on screen - filtered.run( - text.print_result, - num_workers=1, # we are printing on screen so we want to do this synchronously - data=results, - ) diff --git a/examples/3_advanced_tooling/tasks/validate.py b/examples/3_advanced_tooling/tasks/validate.py deleted file mode 100755 index e4dd471c..00000000 --- a/examples/3_advanced_tooling/tasks/validate.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python -""" -In this example we write a CLI tool with brigade and click to deploy configuration. -""" -from brigade.plugins import functions -from brigade.plugins.tasks import data, networking, text - -import click - - -def validate_task(task): - task.host["config"] = "" - - r = task.run( - name="read data", task=data.load_yaml, file="../extra_data/{host}/l3.yaml" - ) - - validation_rules = [ - {"get_bgp_neighbors": {"global": {"peers": {"_mode": "strict"}}}} - ] - peers = validation_rules[0]["get_bgp_neighbors"]["global"]["peers"] - for session in r.result["sessions"]: - peers[session["ipv4"]] = {"is_up": True} - - return task.run( - name="validating data", - task=networking.napalm_validate, - validation_source=validation_rules, - ) - - -@click.command() -@click.pass_context -def validate(ctx, **kwargs): - functions.text.print_title("Make sure BGP sessions are UP") - filtered = ctx.obj["filtered"] - - results = filtered.run(task=validate_task) - - filtered.run( - name="print validate result", - num_workers=1, - task=text.print_result, - data=results, - ) - - return results diff --git a/examples/extra_data/leaf00.cmh/l3.yaml b/examples/extra_data/leaf00.cmh/l3.yaml deleted file mode 100644 index f5fb9854..00000000 --- a/examples/extra_data/leaf00.cmh/l3.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -interfaces: - Ethernet1: - connects_to: spine00.cmh - ipv4: 10.0.0.1/31 - enabled: false - Ethernet2: - connects_to: spine01.cmh - ipv4: 10.0.1.1/31 - enabled: true - -sessions: - - ipv4: 10.0.0.0 - peer_as: 65000 - - ipv4: 10.0.1.0 - peer_as: 65000 diff --git a/examples/extra_data/leaf01.cmh/l3.yaml b/examples/extra_data/leaf01.cmh/l3.yaml deleted file mode 100644 index f3fb1c5c..00000000 --- a/examples/extra_data/leaf01.cmh/l3.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -interfaces: - ge-0/0/1: - connects_to: spine00.cmh - ipv4: 10.0.0.3/31 - enabled: true - ge-0/0/2: - connects_to: spine01.cmh - ipv4: 10.0.1.3/31 - enabled: true - -sessions: - - ipv4: 10.0.0.2 - peer_as: 65000 - - ipv4: 10.0.1.2 - peer_as: 65000 diff --git a/examples/extra_data/spine00.cmh/l3.yaml b/examples/extra_data/spine00.cmh/l3.yaml deleted file mode 100644 index 19c58537..00000000 --- a/examples/extra_data/spine00.cmh/l3.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -interfaces: - Ethernet1: - connects_to: leaf00.cmh - ipv4: 10.0.0.0/31 - enabled: true - Ethernet2: - connects_to: leaf01.cmh - ipv4: 10.0.0.2/31 - enabled: true - -sessions: - - ipv4: 10.0.0.1 - peer_as: 65100 - - ipv4: 10.0.0.3 - peer_as: 65101 diff --git a/examples/extra_data/spine01.cmh/l3.yaml b/examples/extra_data/spine01.cmh/l3.yaml deleted file mode 100644 index 7bdd33cc..00000000 --- a/examples/extra_data/spine01.cmh/l3.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -interfaces: - ge-0/0/1: - connects_to: leaf00.cmh - ipv4: 10.0.1.0/31 - enabled: true - ge-0/0/2: - connects_to: leaf01.cmh - ipv4: 10.0.1.2/31 - enabled: true - -sessions: - - ipv4: 10.0.1.1 - peer_as: 65100 - - ipv4: 10.0.1.3 - peer_as: 65101 diff --git a/examples/inventory/network_diagram.graffle b/examples/inventory/network_diagram.graffle deleted file mode 100644 index 871fb479332e1970f173a8bfdc1b1c8a05586a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2671 zcmV-#3Xt_5iwFP!000030PS3BSKB-i{#<^Amrr{EM;FVNzLfWHE70Zkk^tMDoU=#R zN}}ResqGYK5C457JBhD>P~enyoe!~NjYi|iJdehTGHZX{41Mh@3nMOqcgs)*%Nh$@ z;qjpVZuzY9e$`(7bA4&;Z`;RPosTCw+Q{coteu=~9_(*v%d4%{#%ScTR%^Snt(_d~ zw>z5D(Q54+Eo;kzI3B%iwXUzPb*iLvR}7V4)H(^ph=uX(fmF6CJLq2QEz4n2?FDn> zRgb&z`qG=VD|WlS;l}(cJD|5L+z&iG;46)eL*D0EBurhIcryP*COw2d z9tIme?*|qAu&O_iZjY!dRm|i=M*Vdx!zekKipmcvF1KmS%BCOytyPFtp`}6c7Q(lf zX#WE8Rk2Pf5n;LiHvP&yZBxdfh(x*1HjhR=y=}YHuM8|vCtsR7)ZS^c^Rj~X+-IHJ zQKd7LkzSTf;%i&D;~@*;G6ZLSL={I);xbY!Q3Kgxpp~$Z1Bc-_x?@4dAeMmG04#m)_GHM!mwvYgy1jtQqdTBs#A2XLqvnr0Ddq}agi`L0Zpb`D zNVgv{7O0a;f6U}Dk@{zs-HfQ5q`jHEyx#R#FQ%6k0!!Ty4ZY-Tda3)xRi9(tAH*!^ zQCIRBSXxT#iJ+-<-5${TY!$RX3*F6`AyU6wNKjVMRCIf8R#}ux2tc}=Wr+g~NDP2& zMH#@*O@Oco9B4vpS+F6KXCo7{A(Mtoep50r3@jfV9DtF`LJ-6lH<`(ck_l^^2(qtwtN+w1_CJmYVreuP#sUw6PNRR_;j1W?piK9EjG#x1U z#ISIhnIO`T$up1%Zpfq|lb0hC7NeiUBaRM;O=JRMNY=oLMu4Ro*aE;LrY*@O%}E*> zc@`Q$4UIH3^83*UvWYI;gd9u^;1Gl0nslV$k>}$P*zichBQMD#@b&OWDIYPNhDV-_ zM?k|P4Uhb)JTeFAyJ~M(6@}B?D!C4`y(%@~P*R?$Ki~nYqmj8_FDkDEe5QSm`CnPg zU0Tvzi~1?<)!v*L@QcBp_S<9ByWgNZJ>(ezmVV!@(_ZX5XUEV?`b5Z!MbGBGha4;j z06K<-Lo5p#zy>B<(V%7P#73rNLSzsN$;qJNsQdaO$I?w~S9Nfn9 zgZp7{K6U1A!2QdB+iJl5L~vU_4sP;uXYL;(hX&mL2QznhVX&}$3K1PTrfpabB&Oj& zwMoh}btCr^gMro3AS6IX*hJ7FQr<+Cy`q^&msb!_KXN)Il%aQbS4R_b>1F=%;R9$h zYtgnq?3UKqYGZ0kt=5#j@Pbq-MvEd7dIHjS7Q~j5y$XCa?R{C>8`jG9A0ZnqBwNB; z>s4cXON0RnPpQYp<-wAhBE_3~2!qA-!kQQ zV0Y>7pT~iS{!yKFo`Jd$COWbRu^p(uhKyf?x~zt}8tQ7O>s3=1kkrLqin!`>E@)V~ z0U)ukW5`?`TIBT+m)#IoLtG7Uy;kCiMm%6YBkB4TxXWp{tKqJOyIwbUJu>UcFJ8{y zj0KCEI&+0|3bl%ML+<5QvWq2%RBNfU%_NqPZezog&zuBV7I2)b)J@v+kbV|nZTFdh zpr*LcKwL+vSEY1OY2#cf9newK5evu{s|W3lxyPad;a)MXT+yZg$DH&zkN9P^dQNGW zWM%e*_F1$*<)Hnc6x@=NPRzmu#Q)9Ms3VFsd}d3x>FTbklNCK!J4fC4L%XC>$s;;s zRmo%+4OYcZXOtrc^bj2YL zwsRGVrt^kfivL8m%_IXPC7(*-KnEpxKQVJB=u1MV*y4$}VoadQK&hXp4p`8S2bBR3 zNMFdY0m4ZAf3+}R(*F?##@AxR7m_c6O`3Q$4?R_|9nyZl;>XBG5rMHem%oe|$hRedr6)$bd z@8~L8KvqF{K4^~Gn<9?I@Q{YNvTFI?_@=6RzMydt(vx!o7U7%GRXW0+2>CY=P+!{3 zgHq5{2Xcj{*t}+-&5ih*xA(#ScmVuk_1!C`M0Ja{7`%+7Y9dP+y#3k}u*oV2a=7WJafqddGo(`!MmHit9xyKT6Ss z%04EuQ-{Y@j!tV+7E-CS$51{vBxa}@ifICxmO@=1|4cfo6om#Zdt~3UfPWdY?0Mpz zyFZKAP7w3(KDVDQnhIa=Kt4s!pKrFtVJJP3c(VE=QS%_NGkNa&Z|dS)rkQ02lTA8d zfsAG=J`jTy4I?XA)4|YM(M$)|R9aP!EQPH=vs$lN`{~%v(uRtF{Dv;+L(Lc5%O`o+ zUv6q{UZSq;)5|@k;9W}8FfQeFll0+~^$X;c`N2Rkm$WPgP2S;(<`}vy3CS@g@6c3U zA_(dRvWW%LcVbEhCTnDfI9B?Oof;SBE4fbdX`Pf4RwZ>#<L^kH-dDRba#V*G)Ol{N_Uq?H`0xS0wS%Xl!SCiH%NE)yPm!GIcJ~W z?~U<}d;huPZpV;#c)qpPTyuV6t|vl8Nd^s>5E%*z3QbN{N(~AMZVL(urWx@GctztV zkOK+|mD*ZTQbkTul3c~v!NS_s912P{A~_Y|mAV{$&t@_;HFd2RTw%x}9K%@Alx#9O zj|8?XJv&@*B#FT*W9Ed^+(MFoA+jQmgt4+LI zZtS>-Gul6`o!t|hBeNvUMc7sSGB-|jHUI0=_lK*6_skYQtrU0!?cQ%R^hO4MCzpBOmvb7x((}lolb)Es zA8lN8@}pgKEURcYg`HFC=d0e$5QY`3_(^gj97pp9HUExOxE}P|faUe8c5YZyD3#}_ z`(!XW2-W%2RKG0Kgl9}=w724DH%`q~H;z^FJuN02eYuR%2uKBpOG1XtVjQ2c(vf?2 z(P?1z2BR)f%rfvGr@8k#-|%M zFVJqaqBy9+?yEEnE#fEa5gUZ*SiN7{2C&TAp6ENq59Q!83zLBZQ`1iE2!4eep1z7!-hX}8Jm)inug|y z-AU@xF1Mj_m^^)pIelWRsfN~pwZF8AnS&{Sgn=}LWDqh(jxH4H9~|)diaEo00`Ezq z@kHCoo?7cLI`6wu5+|d1*qyLhrzaI?<;O^DIArrEzkefsUeerOvQCZuNIRFPdh)EA zcjit;lt!MWXOw+xzIBRWDw!iAV##VauIAb=l?cC{Le$%|zY2C*XAjPu^v#b9C>+61 zZnM-%DmBstqBwIOv)A?X={cy+WY|{C^epGz++K$@%ygbcnIDp^pIB_Z6ea$iUchfE zPAHnX4XgZyG>K+?I@)Y@Zk8XGT=;fFrk^NuPeJAxe(Owi9PF|#T#WUSt*z%15`P$| z`vu<2(KlB}#;4tX1Wvad$?=Ik9Lci4H&sfYE<(C9y`cO4hw^#Vw(mfwoK4K6Ccjt|daB&e0%A^)Bjyl&OFTCX`pc{$W za;ru03qm)BQtx_}25k}3VC=6Aml9HBYHACu8Io+Gp)LFiX6a0$9A&ptWK}9Fmec9Y zH>0=5+F5Tc*HDhIn_-sT@vfE}m3i_m#s$!fAPT@S1``EI%aRvjSzsX}nTKSDNQR6b zW$sWkQ(;G-77&aQ_?Ja=xvuJ)A~|tZ1$kyo%lS$XlPAdPQZptZFa&qeZX_bh5y|<; z_Q-0<3KwD^MM<&VYRsw& zpS=yw(+TAUUonftl-0ko3!9azlW~oQ>O0E+8*#(4y`4#kCTnt~#3}G^%3|Hf`XPxicO={zyJ6SrZk{48+y2}) z&NOB_(p+&Z7xn3BUUGiji!!<0R-OvGPr^DrDHnMA!O#yo(B(HkZ z=w4b@454Ss3&1vdH;Ok>F2pp_x!s;U^Ir7c_TD{<-8tVGKNmiSzu7&D+ZMI7Ve?B% zA8`K7VDUXDR=hH(%eYCrsXZ@0-K5+k$mH#cA5~;Rlxpdyzz3cW{$_q_Y-?WKZrvUV zy|gT}zDa1bmWqp+8R^}bESz>6eip^n-5mYAWt>fxN}QJ*!#rO&zFUabI#%^oPTP)} zMCc0Wo-i{qv+Ct*Drv%$4QghuA+G87AoXa(G+8UwT~rO#RMZ^Qn@oqy;!bnTG!r`r ziCEud99#AT)Vb9T)_$&Uc~fG++gH(6@#CPbrAWA^b?hMnc93GkBwwS?KSsZ7e_V97s^NU^J@i{ec6?m(wvI3SF&%g zzg>86{^~yLxU~OZTQDQF*tHW8Cxj|IO*$vsD3qSlmoq2S)Qs9ZZKz?0(Gt_#uqfD) zd!v0-c)NG(wf$z7@j`h0c5!&np>@eAU_i9@d+&E)F=ld}Jj!M9JQHJGV*}%Wc(alD zytVd_<@japc3z!ECiJqDNzp#9u{*gEiH{Vc6i+EIB$*|DwJhyT78b%S7!03i{n@3^liNwkJ)T4OH=SMz7_d;eH6OV~~Lsm!L>x&G7T>70Y&b$W);Ni(ajO$+&`~Bs2s+d` z&n<>>W*DlmpGG!TFH}!iUPeiF3A)5*S@RDz>>SbECU)tcBozt{bAI7C>@5GLgJ4lM zgg4a6)#E%A$*+70dm4})HM}ukmubo7aNK-wEpqymRSd6?$x6?v)^WQdM_N3}ow=B4 zNc+ww$WGk4eU9c>UN>cj#h~_VR9Ref^6B%ZkthxHur=DKwduE6wOQFAdei)C@3{u^Agf<3kFDLB!0*Na zH;1WV?SNKWiJ4z$@6i&`3^wvN28m*LD;BRBf{mP7#=cgYBn=fm&0KW&ZQok`!$>q;PClKE>x=Zg1Xzc3i zHR)MimI~A=sZBLm?&QR_Josepe%}4c%SIS^8RVDfHyoh&aNhk8e{YANk3K=h#s6&^ z^Ik=jYK*U>>U+e}#AMd=yqD+LNiN-bHm|9}d?Ww4#T4_w zXUngg4&NJ-JS>k63VcF*q%SoNQiVsnRL;YGkf9kU8OSu=H?ayw`+HtuZH`9u@W+W> zGWkjPs9n5zwBF~uwfx)?)Iu^`B6R3Q;mtm+byc#Hn`xNwUFa(H(kS%?=f=k{!U(N} z#p}a)@$dbRuXeBruo#QxEkwRXXX3k^6>%(N!~T(vXReOFEXOuaSn-T>TSI+Yc;9n# zQJY51R2xB~YI1Qu4V>bJ8o^%qE{Op3p5de^y`22ywlKOa!1VfFQ8Nqbl zbdL2aZC7nY1pzY$I~J4I4yNWTo_3Dl-B3_Mo&w-UJ9AePa!)&3dlvyuVah+=Apm}c zyv#~T{>NKf-w0D`E2@x7Iyjq?bF*- zRu2yk77tDq2WLxGc7A?-RyGb+4i0AU4rUiGdsh=rW_uT^KTq->=aDjZF>|(dbhUP{ zCx@KZ#MHsfRhW_za-skH_vd|@ds_e3mF!*qdMxmOtdPI3va_(U{^z;Dp+b;X1yrm( z&26=%tnJM0UBER&*g3d)g#I|--~RMpm;BqII{$SjFB{w6kNn$T{yI{K74igsd!j#w z>yKB#c!?kjvHs`Siy({My=no|L2NCh{0e-Bfy@n<)zeZvoF@5U;8y|4fxmbI5f4Nk~yXZ+Z)Uk;n z5|%bk72oauaJ{MJcYERHkcQVQ%6LY4wfq)iqSku6gLH)#${&TTk6aA>eT)kRvg=Hn zs{{+YK!9Pf*d~V0I0w7{4%&HrVf?(PstuTf+~+F2g6<5t&@=iM)@cy+^stk z-F(a z&5PjoVX<=@riXY-&A%8%Hu9;oQt%@9-h!dQ-CD1tdwk#7*ozI{NEtGpoCIrbCLhE? zlp5PxB(^y`2pMGuU0QLD(Rkq!F}f&^9B%AFA=mj7ET6Aezw4BOSTIN$IFMbPwM&?b zs!GICU-T|;UzZ5l+UXUGSw?Alo%aP*R~3q-#>mU8tL2?;T7YS(WaCdpob+DoEv#lv3BWfBxvu}DAL%p6u7BU1 z17ko);W4$Idr(84)VP@T5c~5czpN+=H-3&nb`gEos=leW6^7psb&D% z=u`?FI)0q>`yB_@bd!g}JF;E{4#dDL|KlI{U4~B%LY|%s!x1mCwB8;Fo?py4^jw6Y z5)|BA>=PNCc9Fnf$}D;Bex7avS1P$V-^Ksq#XrmJH2{WMMtZ6}GY7Z( zH3I6|lE+c_;d(g0`{@=r<_Zdob>nuiy2}8&jJtBWo&Zd4z(WHJyTs1uhcH4uN8@dt zX=5H3%%bo27jxenhxj+6hrKAnpri@{?stu<#1W-9hxp6@R`ozMezLIMmt+Qu`Qr9$ z8wc`aLBk@q3M)M@YQs6glK?QYST=VuC%|6&z+(D9@E3a$y|;11osMO;#!8TIk`G*O z(7f6F08EubXtb}0NWc+)NQfK`>=V@ZL#Z%b>c;_h-?#`II&kCFO+WN0fr1Q$MGhks zh=>XO-+vh)Kvc=wMHO{<|3CTTUxz)F&g=0xY}s^svM^;7@R@Cp_hs}WF2%~j)gbRu zm%6t}%yd(aP_@_|74;oy)c{ANU{DVE1Kuh-M}rJGVldwUK{=MsWg2gdu|EdYJhT}m zw`A#^uc?tp@#lIg(>R~rAYJK-dG9MUC?hGPeDunJ=ssZ>Yjml-1v63|Suf6-^msm%Pv-8k7yaIUu+-(#1maT@37FRN>=!&qYn(n>n9~SJ_ilgurti-ih44Y zcUuS?rlRa(&gvguva(h6bVBbH^isctx-LN-lGemTArPPa5HgtYERIW}b04cpX36hz zVH%O=O#vTP=gL{g-8e(DW{g=4twNTV1hI|nt4`{-fqg-}qK{!-7{XEQWnw*c2alVm z+nn*^^lYpm@!z7#vJl8eq@hnDT8Iy<<;i8gv|Q+Bp_v5NgqiYX<%s3^Y$R)$5={%+ z|4z4z{Q`-puMMf40(KG8C0Gefv;Z9o3}f>|`mDw9u0EfZCKP0V41A0*DW*!EOPnB6 ze8A7;`N*ex)P#x|Z4OW(g|_f@&O7n2=4-P5w?MkOR#pnaSpI?K|G@J9-|#{UdrUZF zBMZ;_+oi{$a`lpdfQQpuo1KYICaIQLPA|A!w?+iqzW?&e7V@gj040tu)Ud^yA)b=f z3r;M4(f@XT`Y2EQ?W?6$zqL0x-z1@67BU@L35e1xbG%+XKHP&Bdnp3LxQ%>|rL8KJ zb46@`u#v=RX#7bgjubgJ;VL%6|7IJ-X6j4Y`b6$<Yi%^zskII^xX z%i$c3>@(wcFb3#bC9pJo}wC zf^}%1;FP}0I~YoT*&(6R0gceQqE^+sH%PQ}$+qwUce%cI$35(HU6S=*T5n$ZoeuKm zt85k~k&IZ~GzBhoIx8ug4Ii2WOrQF(hWX8^CG)E^ep%R`#q;rfu|fgEN5Qu|?=no{ z(s6L+7zAU`El8sL-q3rS=DY)i^&=>QpGonLwm z8kdVcUov>?GE_hKWJ44U<$qT+bhQxG44W$YLCGxUS@blkTlC)jl&oc_GbnPqSD~1) zC<5O&Mq$^`P8o#Gxd4gG^RM6Unb$-3KsbM8{yH4_nL;e6f;&rpqCjjDX7bl8^`k8s zU4$+zLV*}v(AA@D+VmW<>*E_~hVuGAF$AS=Ljt=WpK9q>{W5W(AGx1u()RHOmGcu& z_%s(BJJFC#Dm)GsS8VC%>qb$OPj+)E{RMS(ktibrP-zL^Fx8P*sfB_z2Pg>U$2E_F z>>pUydbB(;XfjD1k}D$o+?s<9ztOi6Ek0^sQyg7~BbWnh=5^OmcOB4p)PYj=`Rk&t zU3DL=O~Xb?*(3+hz#bkjPT&N(B3f<_nkFZ;j6T~p?bmljv-ny{>0`<;)tC&_Ufe%p z)``@G!iT3bcaDRq@`!WdL|GRbj87Qm4ZzTff$jT1@n$q7phJ|Ftc%~2KC@;&hBVwVAmr3hL)@otg(v+<)x+{ZFc6M|nr7R4E|k4))U3Hu#NWdG6sy5Fc2tY}gH ztBJyypRa)`wHavvL&C%KZL1(^V#YF;q;;x*bV%^9*`_F2Qw^fY4#2k~Rb>?mc1cEe zGx$Y6^iVb3k;cY5283YRuxwIY9I(eR74lD(bSFzSLcmdlx$DL0lrN?VMJ*H1{ zLL}1keD>=mhy5>V*nY(f%)R=B+>O3LfF$~JKwH0Bcw6XAS1X|i0>9s3%jN2jF`epA zNcf7QH;nVmLDOM3&ynO**5EVzqb`1!t0266<0lEY5>m-HtL}?#QwBRJdiF@EWR#@O zBwmp-*H4@7eEblr_CY4D0-oZ7*ydq&3e8B%pQN< ziJPC=({^QkDZQ9b=67NoaY z5_Dog_wtSjP3k?kYLI!#4BTgms4SdSs822fWcTj>MVzhUKvK&g(K4T&-(F8r)=V{U z*Ac?OlqZBl-jUBj@&dp z#{wy~|6zgbI!1u$AqLRc1Ex!u)$`=3C_VOr14Paz)G6qi4;puIQ@SW)2smkduRUbg zUjc;`x0!U;IX_Alu%G911B|vyS@Ck(ERM}rIyqHIJ&$ph#CR!|VZAPpE)ds41AA&P~3&{!<)w86HhZlP$q~f7cQ!aV=J`<2P0ha{I&adTnV0P^5>Yz_Pa!_?>3fkrujz7F?I> zxf-zos~6C+OWY5_?K%U5Th84$*@bmK?$%g%uR+s#Zd&xa2rXsNdsjYk+t3IdH_?aV zxQ!>%#YM5WTlOvInswK|Gkcsi9U+EF*~9(qS0poGhYzyr!wy}G|LSkJ$i<)RHPUw~ z8R|K-xDiu(&X}j7rLt(c>A=DZ;2#G6nvI4NaO_Z5;+I|_#IU|x@K{pGE9+Fh`1L|} zUl($RVgGiAzjJx#9VM@p@xC`D@XWl%aRZb|Q{=r)50Yz|Fv8}1z~g=Xhe{U)_Xll@ zbn}i~r5nkF-rTPdE&pmo{LUcXm~mGPHJAywom(m;^S`37_3sElvH_&b*`&1JPAzYj zBgBpuN*ukZWu@f=)Z0&SA~&+kEoWoM!3zNA&Dy8(&Qgda^rC;^c!P7xFTVpJ zHMNdmq(O@JyWJG1=G;dk`)A|I7=po`HPiaGooKuRhiRK*u{c|#zDMG9pjdWw-B)&^ zqfAlzT)f3U#f@lgBPFD{_*Z8l<4y2;%Qye0OU2 zT?0#KTz;})GpEe|ILgTNlfj~G7?d=nVDry%#l3#1 z@e1Y>Wx;0sU%*YmUbw5LxuPR&``qw5V+SloM8TTlZlW+s10YtM3T{@_u7OHg(mrG_ z>oUY&;(gLbH#w3oDcsnWYaJ;C<{xIVQXzPK7z1L}0)N$2_#8|zOW;2Isi-)k~AA9Yj( zH-gOfv7e=B0K57?JsVuh2>ag_kzyqI#(Dl;wX(>y)F1HfWWCR1oZONw+f{AGqH&%S zzL7<8+8uUS^s#x?xu03m37vC`e2dhn3(M|n57C@tAf>9$w`3>$DpuGZ7qjG#wivwl z9;$gRK{jvfULFsF%A)kScI@TO?csL}LHA!emY=`~wA3kif1Ff>Spblz_(k-y{K^HE zv5izC(kDq5fj%?}YSbs2Pavsooa67_o*Y(Tv&c94Ijavb9cYvzJmE8IaiRwu3aPV& zVpB9%jjo)0%M@Y6*!9q3v7TL2GO>GVnawk#(2-IXX~}K~Rjep-x9+{7`|K`m2=D@0 zy?9?4e~2DGg5ntU37|^hy$K+uePL<6T3to=E*({cA#p!>ChYBsdJag;Cm{Ec8hOkj zNmB-p(*1jM;)?&=eH&Fx6(^*2|8V&oBQwYCmrm!5t40*RM9|Q?O}#g#aRGN`#3yiv zQ2?ixF1Gl5b?1DO910~}FqT(qA3m)osX2?bo?9e7vk^)^;zrO>PZYnNtIhBARbZL{>QRp&5#;H@eT^#Ec(F6t&)uDDmkUzm)Soii-&3VxBADe5 zd(|kc%_{q~<4Ptq;gY;|v$a3%aK(cvY`=V6Tm(5e?`Rnhi9G_6BY!zq431&u$-W|d z{|gPv=S}a+rl7kTF8Zc<%)bI6@y=!bo6`;`3uw0jo=3}k>pFAU9-d}0NUkM0-lel3 z3?=xE-=Bezb3(K`&nyNBQs&CR?&+KMGTv0E0>~si&m`heg(a4Z4ZPUJX%HS0 z07K!q8~4Uj?6f10olT{q*FzS?DI}f!w?#qyD0H*+VG>ktLUjA(wjkvCvJ8Qjd4k}1 zCxB2&bW;H6<_c{0I6f3ELkSP$vKx>2OZQ5 zi>Pbw=oSG9D3|wQ(Z|7U_w(0Kl04wUV&F!AB?)(@L;H9JC>jTRBNwIfRN~z@Ex4K6#d-OoNoTuEH=PS70Ejhr3m}!U;ISofyC`$`9KZ zx3$1*x0YJ3pt+`l7eM*`utxT%qU|0WqGQM6p|OG5SZGF%O>-RIOnH%L#rst{c!HQ{ ziUxN}pK9LwHWBXAxuIJNEqr5z*>tvEo|qQeA!IQl{3~u@?h|Dg(YZ>7$%faa(JGRC z#gT_Mh~-4R?!rv?7-o*>&=W04zU$axju~|9$Y2 zV6xvCfl~%*IBP^o(ZJe_5?6hN>NnBArVd-i<5CQ&fFf@@l}FYbV3?QGA0}1c(Yswo*Hh90@%NCYySiyH+}=f=~$pDKH=_W?tazF5@wFIp2Gs?gF@O2X;C0OT;9`c6r%=?|OmgvXVbVcL*n5Pt z1z;9RRR15(0wB9c?r3(Zd1ayFAf8WQt1iQYuS-Pt#zFT(5m0AS)^ov--MtJNf+zevmyTC-1s0XrG>qqIxcA`DZQhFm;xu-*t4d?QRCToefAVzQ0BLE2+F)_Yc2Iv znMK(@QJ$JF*C0M>IscvM&^;LjYzd1@yZWm}B|4xQc**~X@IW&v1mVqE1HgFX_NhUs z^WnIMOl!{Ws{u?65Rl7qAI?f3&)|-fC?&e&wMp`a0|Zn_<(BhbdN#AQ);quodxcpK zT0lx}E)Tzif*ujENIad_San_4@*hb7v2A#x=FTwUHltC*O)eMza@Q3F4LDWMh3FL$ z0D%r&QebPCtv~pzz}}Xgh+8{MpC~if|9Xx-W$5#{5oqbFI|yXHm4w_juY3(kZ~%#D zruh@rgKka;tl#GX`1GoALchf1u?-djq6BjW&CsOkkCD&PJV(@@#-WlT@up-}m~RF7vr@r_`qGbG_P|@~Rhe%53bC%400>jTWTI!>QD=i620# zaD@B4Ed-Gc`-V$RK5KY1{A-wrKA$LC+y6pF7ri@rI}1#gNuaXeXg%&4J(fcF{{L~b zTT4UAHG(H-EcND5*$?XH?A14O16sX7TLRO;tCg{D*&d5J_v>_`s`9KYwUaF(dtfy< zCyf70gzMWDQ;PxWEObXd91QLjwxeg$5e2pvk?jxE+dpG~`}2`9*?jp^Vp^rFkDA&h z@7VTUzRHC$2!V^^L6rRi_vYmPiF*YV0gP^C;hwUd)=G}AlZbCzw~ETd8eW44W@%oJ<6#+pjxWj(O&=MxVf%v5W z2eO(PhH#*(fiT%uF$uSa?=betej*gLsCJ3^In_`SAKh*obz*2iY~Oj?uXd!-xew=e>UYy3?o*+U-avog1^%(<-webD11 zh8z&;3iWsDN=B*5{o>#|zDVVl=Vb3MUSK_*{TMuPyaKmA36HOzrzEgl=;`v|BQW_8 zkx1<@fuaIPijd@=B*i@gFi&3t8;~Kw;$1IhEa}+h0NT z6*>JY1Bmb4U*{1#p7jm30$ak-oG8|l;{8vc>3uQuT!B9a`f3?S1uFSVI=~Lbdp^J@ zAqGifj3=S0N#(;vTjLEIvp@=Ro!Awy27J`q~nBK{2N% zN|==%*>1m(%*NBt#fmlc?6^4@MJ~;Gcc35>_$UL3UfsV%Z}fjKc;2;Kk%pPFFRi5@ zF^azPJ&R&(RZ%Zd(qL`9GWBGVh=eh~l3*JC^Tzs5#FB)NT@?eddW&VLp`3AWx>}Lg zI%WnD6JPVP0K24azkZHZp`!I>X9w6dsB42X$j&Smvv0nH=Cypk9(0(9pvy_~N@Z*By7wy%V4gh&^=R=%`ny1aXnOC0Ydo$|i+v9Y;EAnQs{J&Lz zZd_S;7N9{9>ic+q8F5<~)aE*_nA+P}p_)Xih3ZmnRCha^qt5X_W;cYFiTInqd5C9MePUD*ex_y_*2O5wq!)rz*`jcJtAmQ zR6rA&0B=N=RmO1>s;!uPFu2$cwItrp#N z{TV+aH4*VmtlQjm|s58k##wZfusURS@l2!hFu2wif4EE2W9FA^AoF^uKFWx@)+ z{62(sqBb*3WHX?V=8NI~Al~H?NjsA`Evx1;!FvqRAj@JS+)q*#`Q(3IW+a`e7`Hs< z8J7{kxuwA6x%eC=@vcS*CVPx*$S`TKntw#JvU3Vxr|nwSl5BU~yd}03c~J^yn=u*4l)iSaYqDw zq*-DCa`hp75R5Q#0lE$Gw{(o#ArkN&@Tr4x?0%`x*%=MLK&eH5w3AZHeU?ckN1l#SGRJ$IV^4>hMdhC@+@qHo9D2>|2X9bQ{&cAP!%xK1|EZtDci~%{yIMx`EZ))`s+)XPALs@LOUEW4S#MNYwRj>i1JI^xcP$~>wC{@`7DQ6d z@7AbWMX7uwpH}(ZiLeZB7MgWrUxB(`;;)rSKzG@!95j}KLxsCXE=?vfB3iVj4R)wUSWgJe9xnVugq@2G? zZJbj1TT4TZGfDUBThL2L`sAM1Cn5&3;`@Vl-PlXU^qGiLkX~Qef%%CL5_Vz1l7u-P zuk3@04KE2z^9a`n)yA2&AgMnuZ|b6jvvLGo2&ilQ+jL(dE(TE)MUr!zEG-xmv2mO> z20EP9x<8r43G)m|D4;WkGepB89nbvIee;u5NOD-=)s@0%a9*%t*D+_3 zp;9^KTk@B>)M}uy#?Y0({&~AXBr#o$Nl3SHx6NX(J^KnQa z)3!RI5%dcTGC8;pDzQEJBRls!BTu9(Jb4#V7B&Ym-(oK zJYS7cz`+k?eka3PrZHdBj8^=bjzaA`>+^cDB^>BMak`n!b z6Op|WgMH`3wAp$L=NEhK6SH}5^=L5^PxfvdWwxpTDTnBUHhfOP;}C*J&cVb*AcwLBfVKN(9UUTv7pIuj&C68lVQa>zXM6CLwTH|M?NgqaO%#5S>k^% zJf|lhf`4suZnYte*E|?FOC({ukk_XYnJrPyjoo-V2;$f2&-nd?iolusXRUe)M}2LX zZ85_B#6W9NgZn$6@ni@)GdgH63kfo$GtQQ0OrMYZ)u)4cQ|aQ14vP_wHWMlb7W56RFyB=?sw=++Hb2Nzq{e4 z^Pujkkms3D!d!uA&qdj6kN*c-8|skH693af8A(R9iW;=58RS8O$z~v|8$*@iP8t!n z;yEn@LE zrw938S_h%85?bKCxHQI}R#z70E?peMdPeSVa1+628dW%sr)P^b7ilYUIq$Mo-9eue8VN zTOHV*ZoLY=6@U_O4v7hoTs4+0bodHS>4E#S;@0#R8Z<2U%Q5=%Y42C@zguB$L1-Y} z;lp>EX(#!f_wvn^yMnP1Gt-euCH*_j|zS=4O(#N4Xv>x3}A zxi79OJ!ApITWQWnCsEltA6_H73UnLt%?%La@ce935Sj}K?7$Qqtgrk8C&d7GcZsOt zgt(tx`-CmV=JxT9w%7LaAl4=e8TyfQt1DrMa6wh{H{n9SAP<&~s{v-{kFd^wA-N)# z_%vO7(19?%*6mRE4o{bUC6j}H<)i9{V91tkylrxK&7jO8r`|?j3BE%^p!GIa-vVqfrI=hXg$&qQn09 zmA~Y6NEO`nu&o@RCNQMKhkGyj%$__?l<)l_x5l=C1WMS)cSUURUvyM^&{c2ba?_vY z8u?#uyi97lBBZN)tBB@Wo+Ra8hA(iS|84ZGj!~3RgyOS;Y6u(rTr(svYVJ89uaWHU zoYfn}!ln93;J2PD0jbBd34+_A*Cx$LB+FUqyRm+!WW1Tx(n_Q`*|rBr*Ud0wS4+`a z05wnhh_dozMbiOc%G?71=)N1P`Mo-KlzzHX_T{;)4OWpN@4_qV0vv--8C#y9<&k~b z>Gp30A&OF!5%1DLIlK*2q#PLiRQBvYJ`2Eqd!rvB>{&d`L7@mFZ@K9aw^Hm;K;@Ok z;@F>v_K(l62mQg*p%3j(?fr2qUoF2LE0jCFWP9*9=cqwGE9Gpg1UeyuusQ=VQ}Ft( zL8YMC@>3!jo`?~Q-8I7%L6ls{?8G*tDwFr=ZP5BoAX5e34ugijmCXV}W=wmq`-x(1 zg5=8BdqAKzVk}sPvPnS+vDF38J4Q#cLeO<259#?crl#-&2KAnkVTK2C83bX@{9qleffT3|Jtsw2pRQ|i=5#-jGK-uCfQ-s|GarM9_%L_Ix??y ztUAD4o+IMQVkQ(TWfMNI%>fl|0>HaYRvTaIuafVpm)lsrAP_r>6(Ba{?F^z|d-337 z){Yo)n$XPv>Eq`B@^H19$-ZBabOSWu<$9fS6+}kyg_c5U z>N5nzeTBvsYA?YUql3hsiF_ph2F|W49BZX+KNr$7eSb6cU1|Q0-XTa^@6eoiszFD# z(;BK@0q?HWbi^dnuwakpQ9SJ7C;A{OsDMA15VT(xdb=u&&VC`8`RKPY$F8>-TYhl{ z(N%9bmiNJ2(;E1D{XIzQPh z9g8t|tHg;Ld&ncoKqmK?TxHl$9+luw4nJ#T{q5DlyI~*UOvXFE5QHAi0XE43vd{Xj zothhu+t2up%^m=Vi>>MZ9n$sy+Cb4gcHUw6@~*TWv|KI{&2>e<(J4H$U4g+^7{|D8 z&v(1Z#yhAmd@9t{(}hrY&=ph~=4uv4eO-d?RM;IyM&=IVJr1zWuj%~A^|LfSr`1RQ zK8-^4ibiNkcc4vzez}_0vIT zlH{=~*d6fl(1K8-PGHC2BW})EhFnjAx>TuhvEl7W=AO(Hi~o-)M#VgN5DaWO%I#ADuR)Z913s?@_Y=F2fGv~u0J zSp*|)ma#iqE9wB8$v_sj=X!!nDWEvLPF;|q z^Av|8rV1p(!Zaxe2}8&#BFJy2B2C-M9+f0N$}TgLz`~^@j}7Faqb6he{niu56`QWs zZ(J0phdZEk-)@!X$h-xPFQEs8QiTTYNRK`vFKFr4_Rwd?lf0n(*~{ z63f6uu_6;QPnCm*yQbX}{rp%MpMjkY?4JN$YHyP_q19|xH%1j9o(_wCmuMyq=kqk_ zHmI3)Q6);F6t$oKw#6Z2=ssg^5a|~BqLK;LXu_g{Bj1%tuEi^)V~?HFl!h}bh{vx zJ^CJ&#|Q#lEeS@7c_v1tlcN(HoM$p*Gg=?Ln}si2AXM$;Fw*QXI;jxm*3L9zb%o}ofvvcLdQO4ZoWSI)z{ zUWFOViqdLJ*rl*6R2O5oE6BI@&$!5HDhdV#Pa30jTrqQx-hG>~$lUPH*LV8y6b)tu z%+{APbPX?BIs*)U1}z<}!-8fj|f=?aQCU|b9T7N9ynRU1YFgE(MI+x63yccfxb zSd+PKLe0X(#5d^=S!@$b3zD(@6RRJoG^u16h<({qFU)XJ@F*E9cHF~4!r&pclo0OS z7phi`Wb7MUKMYtOp+J*Fai~?hGcVM6ifA@4Gb5;12Qg~t#~vSecAdK}DJ{OO2+lnP zh?ZQ$1@k3*%^v$4X>+xKQ^A4nh;LjQ#xk|4uS!jMxy#+}cVb~_{Qw()9n>xON>+lj zLU%76@`4bE2UlOt)w3FqWlBl4zR)JJ$EMf>s5e4I?utyZ zI1@4-zqLxq@iODjncq=Syab%C65X~4w)*$tJQ@nch;)$GaZm`WCD?~EHoevlm6-xM zX;D^^)DfA<%df`T*p(|g)wH@&=iKM)p60Zf($ZzCGiHt(>=>;~0v zs=;(D_^h4(sjmQIP(}80J%kpFl|Z?!wq4z1BlXB+Hb!wvU|9BV>~Gcl6nvPZ(b5>^ zq-BK$UCtGzsRvVAy+0b8R`Z)&f=3yA=kinrat8FO=yx3 z0#Dlc2sG8dW4(X>5#8W`$FKH>VU%Ieg9IwN&{3NhYZB@iQ~Xs6aZAZLdPz_YR!T%d z&gWk$MywQr<#RU0hS>O4;w+;FVCP?!*DcuDpZhUPT)uyGn9LV{E9`ahfx}aQsizQ4^N9Eku-@yk~Q)cMzH*5p* zrH6FdbbM{z2MUQ_sJqGAr~Cz7=)#@T^{=)B8Qm5tt_sl{uP=q`y9qngL&a|wjZwYv;oP8ZU*|o_gNLzix#W^_(fH-QhC1By+G>`kkpfc5Fny28D^Viq07O_5T zM3!8o^6h6j^FGUF>dKBk@&J&vyS5A;En((%E-JY*&MoTphamZ`pnf?SqQc#X+jT8; zeRq6$zZ?K(+vt5vlJ5^y*C!eHUKEDi6x&9lSI+)3_Nu{*XMd3ygEL51pf;e)z#N$% zT=le^?+80v`Lu>-sT!R|-utvqjDXj=^u}$vV40Zo#86O;AOMio`%6$rSu!=<}1r&fK%#b|Y_2 zn>2!*b4((33xYgn==l4|UQ&r?+cymm)-uaCh;$87dZp*`)wOlif*zH-A8VpnzWd2X z_|n4v-Ispq{>%G%C6fDYVhZGa>bohfJhlPT{$ceVzJp~l4<*dm?m z724=F9|kM)42f<;V9z~=?hqG!@X2&^j~MMEw&oW_(U#}p*>1`?TwK~M$VY*KoY+9? zaR8&2mSt7Ow@PdE%oi6-22v@vONg*7qbkdxYdPoarS;~~X2;c#^O-R07H`<=sXrSv z&L;=M#}gQM{nPN#p+w{owCW0U9Qkrcmij#hXi050^-_J{^wnF#0L#hYBhFQu9+IW! zcBO1r23!!e*jBa9Ur(3wU!N`@t!{3J^7_0$m!Otmn1tx;D)f4tZ;eQKsRAgN-&%`S zUh|Pz*;QR{Y&hL3%rc#ON_1l)1`}ig<^O>uQVvABPdFXCU zRb$%|-Yq6(O$?VD`*Q1X%S-DK+Q<8JMOLa!Y8tG#xbi}MJDf6EwwZQ%L)D-?SVgl7r#&_L1`GSc>+D6@_xQ%emlJM9 zCZ444Di3Y>dMKTw-`E{amx&kxJy5~!fW+Q<#pgElCFbWVp3fYV0zP(08bQRh9-oNDfwuqkHhGzHd#3XIBC zU7OEk7>s8p3O)1N#H6BBSibBb+kT?#diCW2_1nC<{R!DXV%++V@D`*hX!bqS+zP5W z_j!MPlD~c-;0l^^gQ@4un=d!@k9+O?(>><15Pq9j<1d_3|C~2lE);GAUwLRgqa!Xv z1S{kHDcmQ763dsDZuprndY-vOSnrhP17|(HgDe{J(Dlo2X5P?p8>%7Lh-Nb0&rJN> zln=!pB0rc2gb^@(;ODR>Cue?3m?Ug+It~DSUx|X{lk;`U%K#swAbq0v?Ru;4l&Qfu zn{Mo(emd;{zR~=_x;&tcj0_&WjDNo2_P+{Upo9dW3kH2%inl8mDyT5@NvM2Bf51t1 z!9#jQLnS5jY}k3U&>2IK4Bv0S0?=4yelFWvjw_LtMYZ#ksDy=PkB$lD92oBYDwhnT z>Raao4$l^2qY3y3Mo5eA(LGoP0nzL^U2(S58$0UEp7>usgz%lDOCZhm0#}n=-J6G~ zj%EUZE3=eBl)NPITf#<6FI`=YCkbg@TDagaP|>dtD+pdZoXW#PS%bqToynP$wr6KS zIq~?~M!&*LWUxe*s-BxeX+Y*8Lenx^A^MJn%&rNhuZvPCIJI^51&RFo9juu_1+H9Oq z-@?1y1V|qZTg_Sts!+Es@3vG6rsgc1M?>^Vey9ZyMgss;Wa#M16{}aO#L<=IuO9x~yX9T*Twcq9yXmxF zispi`{A_miOj)UZ_G8s&{SU0WN+@sJ8dlyU;#uDg|Jiag=N)FX_4qPS5Hbq@owZ(O zd-5q(&N!{QUx~QgdSPrpj+5%X(P#70ZcWWs4=OI(_d6qg3=W89Pod)bO=3B>9iqfr z2C;XKQ(M(ApL2EgG3i(B05y%UXKwILPV3-CeA(Hgr`(Fm(=Q_NxAJx~$+~kE7UU*D zYNhS;l1%n)=Gdx#o1a|FfR zvPrE5oJAm<;ItR7yBFFR4La4X%l1l~=~Wtr{F@z@!5Fou3k!*dcbDz8=S+7vR-QOq z4a07RIj_cI+}JAf1^r`E>?i6?uNWho>6l2ON=07;%=OQ9QrgH6(ildnsN%GisJdDb zm1May^vzOmhg#PEe3Id`i5qPy`chO7>%>q?--Kz+pel2QR&<%UHs!#FF)^Ph2oIxA zo-l$dI4?bkq1|RKbvxp|fQ@C7A z!7a~bjfIaijZlyp-;4MkcocmO zc+R!#yP#%d)1-P}JcK7>NjBbfN3;WBDH5yfLm9m_YfoRwbSVh6*sJuXyiL08{agJM zM}HBsIvjLG9C**LISJbck7;Z^Z-G;ZCV2!Jw{+^I$6@+uXW|WsN|x>_CkJl#`9mWl z9CZ6!KRy~A+K*6VXy?$^F~qa-jm4G|^wvK|QTgQx0XcPH(kpJetnv*6N0nGH`SK!AtkBao*bn zEy27{pqJvOvBPs<1txL+DUF4d|CGi9z;vE2bg&y3i}zte3r0(Lz#!dUgF2P=yidLJ zgp3jALFwJfj(3O!%f=um3{4Nh(Gv1#_rIIYA{_qO9iYY*oWjy(YL3&)sIs)8gFBD8?s2~zU25=GpGbZ`Y$YfO38sUcz5B(Jx@-wP!6Xx z`tji&xD@kOI!3Er1DRU{7yzF<+D3to@>u-HpJ^a`8v>6%a>L#~a>JbW(hqHam`%UE zxz9uw_##b2%9F#D^WYYk+jzQ`-;?orGmXv<=E757CUi8xKH`D`kPi2}Kc0h|{Mbq} z?e}CA%y)&4|L8aWtGi2uS-n*E1zgd3U?$E7H`kG13Os@Byv>|UB7ra>DC2p5gn)@A z9ejrCOkV%tmHl6Ib3yN2HvyCc;usxZ?3hA3d4Jwv0uv`(I0UgVcAF?+K*>%zy4>^Z zVXWS>f_UbA4uOW;lC|;DcVL2;EC5Z|(BnY%%!LFe-C^))9LIOa;@$3Dxs`~B?f;My z-NAVo5in+ejI>5?bs@djW4&y22nbLKAIx```c3r;FSNEh01hPa5a{so3{_WTyWjDgPf; z^Z#F}=HZJ+fTn0799>pyFY9z5?kPg6kkp!$t5%kSu?%Rp3dr@%&yRh&UYG}Z85%t& zf6%lHe@{iIbjV;Qzb)u8ar|2WhnzU0D2=&Q*0=I;H)Y&_&Z)2VB+i7X>;oF!!xSx` z=)pg;=8>SUaPRnP3EuJhF8N0bNeLf#cDDFCk;LDT_($Cg!2R#!u*w4RX3vU+m6t;9 zYt-Pnnj$g^`NRQM24n$gu!qvmhLTXSkm0-g$hrhc%sg_^Vgo~)3Y^W8cXurgJIHL8M58DAd zQX=Qr^-l@&>kmRVEC6Vv*q8jOYW-heHH1NIsH_NI7 z^nvsKITxV;f-uTIrW;)MRzUTjW|m(TrFOoPYa^ca+v{2Ax>X59zw4rawU;&oJ|U?H zK2$qtsx0YQAW#sFD2g)wg_r}LQs2d{Pa(aZGBhG`Q=W+VO#(28O`(Yo+;N`6@?_oW z-RR-b+Pi{Tts2JKkoYGF3;#*NW%r??5&JQtolw+(Sg#>`D9(zO2c2>pRpP+lAG{N+ zvo1mk?0Rn6k04xbkQfc{4}@?_%MQ#Jw#qO91gO2o@;A&karL`%?{p7jFh3deH`mI~)Xm zQ}=xHO#@YClcrnbR7r}A!ymY899ucJKOcP^PuQ)3rm3!R3Rqkr_G@9Qm zoeu;Y*TyQ*4>)4D^hFOI@%79H5M$)D2-jSP2)Fsi2(NxA&PY&0)IEIm+4H9b?+0XY zQGQ`XHKWk1BO;~mTh(`tvx!iqev62#L{-~HVz2d*o{tJZwr&mpykrB(3LX&I?+3*6 z_Xng?{ox_LI zp#5H!%!yqYh^Fw1PeWRiV(vqUuUd{z-7#8dhgnT@OzpXf9iTL>qfnI^6EwEYrdsAiK6GJDE^(xDVe6-5AhKr#bu==zE)=^?)8{Z8;KFPzwp2t@*hkPM zj?QhamK+a5)mxHXH(H!+UKcmo^O>$dj_NE50MwO5{uMCNdR{qTFxL`5_p8ZU zAN$$K;U3=4-=ZMfE}+7QA>Lj6`4&_bRSQUO@nIZMHu&CZk}gN1a(SXvV7d(cKJ1P2 z>EVA48_~ZGn@>o>$k(=0X*=cg_!&3>qcwvr+L+k@2A@1t;`+6sp*e8JR3s4GdeP*d z>-8G;6}6ipM|sROzsnBgIBw6EQv5~ZY3&ZougR*jRs(}R8yWJn;81dkw3zYEE_1el zci9hL%BO;Wd*TZ7y&6EnV@p=maTwmh?6&}GFZOCihPQ-2Xm3g`L)K6Q^1F<^M($O} z+m&+vkhgl#Og5O(+R{(}nfjs2zB^?{h6>kZmVchm}J(mNFTz;f? zPRz!A=|!X?2g%Ri?8BqMuVC#9GtLxJJca4xHn&BY#2;XEFt9F@K=_!ePvK6}|1N9t zkiJu<;@`G681n^q@wj@M4Zqx}s;4Xt)s5E59+CV?`tr*NxH!d4RKMDhi9@n+8skL3 z>5uJT*JYC;AoyU#IctoAv*D%Yqg`{s>+y#sHpxj7Sn!`BU>ah@@<{pH^#?jeFaMFg8p{y;*}ZHrx(@S@>A* z%blv4bY!Fy@avM$^-2&Q3GY9~PxsJPE%2DG5(8g*r-Pp%n`chas(z2?k4}#^zy6-l zhmydIUggdxzSCe$bNes!1K~a|6>E@T-K3h^bpKJ)V$6CFM8+RC(tBOnPMp1uH$SmF z7qhykfb1JuU5bWSl6+#M13pJ2f6o&tlV~$Zw?2Y2bfF#2K7t5zc6sKR9|Fg6-WuCo zSki9|pXv+jWA?<(Bji<&gJzn!UfdH!lx3)e`ikeX-E;mGEtlsQecMa`D+ zn0?gST(zjm;aMVlccJqPAt#3{0H37-AR$ieoJwOFT{-v~qIOB!8byB}XU_Kv4t*5k zqY;Y47<6>`aj9c`9)05nU8#u3h~!BeX$B0P_}*uG1ToLWe!0sw`a-DX*9$i`2jJ-| zh}9fQq0}wwH;acd(PL7j{!0}2Ig$e(sOYcZ@!M;sx}+pmqTDK!xv6tGzZPt5jH zpZ&-jvtMWS3%@7XjHc#(Wdsi>L5zBmSF33zzF9gXqMSf?oJ-|6hB`Uf^awdC&T`S3 zwYKOz=`oR<&K`pgmOJ*wIqFf|ULVf_>+VYLUqX#+)nWufH_sOmMH>04)Aa`R**u#+ zFMzCu;s7bnP48edotc`<_-GXshLwdP|K?oQ{g>nAFo9xv*#*^cqWbnkmoQq#i|N_#4(uFff)cUw^$q__N2PzA;`3u zb3QP=yu{_BLnsat&cz~ojAAVjCjCiy+9wD|(?m2`YY)F9r`VvqO@+3LZbUa1gQvb2 z4K!V>UwnQ!qW+#*MjeFTcTTUc_R+a-vgYOyaadrwViS8=GrmmVf7+M4MR!eH!20f1 z3kaBn&r6|gSY(Rf-xi;hdZx6(I@)qW+nSokbCU}CFjIG`X9U;SAzAnpy*y44VMepd zy!h7;CH>D3#UnCW<4{bZ%~qvY7+jC%mKzQuZVGz9U{Dhcvr}kqLoeV+4K)5Dy;*o% zGf!lQJ0C&2LU40db}BG~3=zYWPNJ~|-i9eHI{ORWDHx`#V!{z=ROv&T>-lv21JX7u zX*~T-L_p=iVQvP61i^Mx^E6E2FE~2%&1%Olor~I7s55&B0ZyMSB-^lpVe*}5EE={QZWZd*~!VIu*={}(sr#SUk! zUN9E9q`2;`_!i+i8?{*24CPXxvDbeSNIqW>@U7j|QLl+lG;a-RK+hR%Hf`Nl-8tFB z*wv^9cvUTB4{zmDM9e2SXwHEP*owta9jh9|nl6iRNM_Dh2w2miXld1#znvZT=Ca*W z{^)m$*0t*C8LzY4c`TkWOR=tv&^d+|6&j~v9xlr+th@4QCP(Kpt%&7`JtwGJ3S?}ax+9dY?88LfMQ3BV?%%6+eV%WO%e3aTgw#kjF8u+C++%%CCqot4$>e44 zlCrR9GnpEvU@c18oF>@Jse6_dBK`z^uWJ%U{Fo*k3 zX~g@N04J9f%E~TTJ~frKy$2s-1YguXQq{UHvq??1bj$90-I&ieC?+hvja1@G3nVgS z8n-M{way9j^u3R5|I`Y+M4wXRxq@QYq)116 zd%$f1iW4G>M^h3Cw*6Rq?_ahBrs-0LSyq#cB7NjPwJD<~eH>1?HOS4Z*d@FrdH{{F z>=v^%i#hEWTVyM5e|@m$l{~0>i%*_Llz^)!n=|00pjQ;w?s}qoO&F{ze#Vqf0M8G6 zICIqOh5jl@a-bw>&NH-AX`#L&tG^I)?G#akv$hZzG@ie?QxA}e(1$_UNgt|5bhlzH zmTz4>+j4~m)zK88TuL2v=Mh=rJueY|ov+{t*!~tT^|Jj_PzuYKs18sHFqo&E$}lIq zQ7JQ-0Sz|sqigv;O(nGDH`V>z%eQwcO{4@#6_a-`p8IJ4Vy-`<0XBWceU5>C2oV38 zWT|?=-?54^Z$u+`FkTQt0IQJHdCZ2aDdr;;0n86GE#9>9UPT{s;L}_InNf^{|1gt@ zXRsiTX!l7NTEerSc#YpS5^*kcSK+&3v50D@kOcVnZA{CP7E2|`4|wg=T5Mh=f@o48Tq3($0sFHva{@AqF~NndG11-Kx_v^%A3-k}iEn zHhOci0Y;&sN0}o2T-TQ`L+`?5Y6WWZo6YRS?AoZ!6o+-2Bp`O{9p}W63EA$P7+`W&I^!eY~lv*;w{XGX%V#h>6^+TvN0kSQEf1a9^-``BAg#_K>;FV+*4HP+<&db*@CbDUjB zS>QMyPxtc4#>(dgkB+oG@6VO2E>F(;?hx1dmx)kJH2&BEb;bG=(}iOiAQ~wv%qzN< zn?5D~H(Cf1qvvagm~vj8K-rwTtGb2r+#QM+zR+TEOt-UMo;0yaUSqii0}|0AQZJt% ztBB_60b$WQ0WsXG9VqtlcGo6B<|fclFhI$|0Ae+GPYtEpYm}jBm6`H8hYbLQ89l)z zuoy`luvvT)e2wUp^953SznKG+=lQutbX|dwmjjemEW0$E$1Fa{#u2;3v>C?BjFweE zc6@`+^0p)Q5EH?*q>&CQAWdpYkx?NF zL~3ky!=*D6ZCocPj{jLv!u5{Ei5i}SK(d5#>p>o=ch?gseO}<}mWlI@+MgJNJvenua zl|a^huDsx7#)9t0?9m^22dS=bKNhdlz?|!qCwhhms}|w3O_*#uD;aNEu}26)(b5-*6cf$0!neRx;JIB_3vK{4V%?H=fNUQjZ2J; zDhi;|nUn$fs^fqgg5TT4V_`wvWmeQq{mduc^bx;$opwq}f_+V;pSpkdH86zP_B*)R z9Rym`*b5e`jLh9RYJ8CS9kj3h9V%FjL;Bh<30(VbezEHjW|GcQ?a1qGC?;S3k1v5Cz+p4o5PpYO#U|G1-9hTBv8#TQ0Ea|bH=@o_r6VQ};<|^( za$wob5(?wqTVI3pgDP*O`9w&NX^1BP4zDiePgcE$e-$@4PJH(`6K{c;o-D z0O`ldN9H8?oBb;{aM=b?I(7PDmB%W*wRm4CmpGHQ4xm+GnBe6k#5-%FQx0`y)0o>! zVgFn9PXwSR8U}3E0F#3&siyxOWJdqh_$rLcCP@t4NO5! zR9EiuKU88^xx2Iwk`CYh6!URWtV}PivTIvZ?67t4hkEQ0N=9?97x(Z8J@WH>Ui6Py z)5&6g!JX}thej}XKn@dlOLof1g9>tyx~>y_96k+j^wt&S+hbw~yZ@yuD7uUp?0VT7 z1gC?;%`x_b6R-HHMUHQ`r0@{?ytF?SDXo3Ah@3N|e?t%dKK7Nibiz^$Bej^Qqz%6;h~~Ho)kUSG#CQpVO^jgQ88PVP8=ta_l;!fBNd&`^J4gw z7a;ia_gfiSNw-OXK1fC8pXAGi3xlBsQJve;>BsAgeftSJxmTRI=@rVruvm&iOo5R z_9QX+YJj(<@&pwjZjN32%0>{~{2ISQY<=yOoyX`|iE;WYLJ~AwR!Q#{sj2#EsEZPqHWFM_ zRlVJos=orb`=`t$?INB!Mu>=GT=YrCrpM@enZ*+L@+j`<&B_;_$RZYxkJMyHdG7Vv z|BxRYogQp(rH)D5h&!zQ4A3P1=0mkQ%`%)W4gdM~yLuTPeRKKV0H>q+&7EY1T0^gg zL?b_$Fca)rs_;cn(XThsl5-1bOuMHEc?*(jK=b;^Hbhh6vTgFf6|6}O5__3%aT!8E zoDnv48D1M;%pNF6U}K^cSsrVwN>5yy5x8f ztxm56*RIN9vb@`|8JqzNRr58ClFnH?Qa}CD=-r8bvR~1lqWf66oO2}tfrLz3Uy&LO zD}W5XRA*`bElQsS;`dE)`vQhF+d$8ciWTr^p`_x~5f+O(9*(rB}uiYl!Zan0e=$T_F z(0(EJg`xBlqFX2vzBfYhP4c1`Q_3S4;~4DtV}ty+si)@b&PVyPTJJ&HlF`*A>)efSMma~b z$LkYi-7_sMM!)KhrZ+cKIX?x1qPt{`!kTJ^o=`>am6Dqu548~8_?p{??87)V>Ur$y zwcS_q{4wEb-52e{-|t)syt-7;3j@+?}_WYlp+i9G7USZfEp^QPpO#3Fg zLvC(tgQ4@FDsx#sZ)m04B(HEfD0!!T%3{A>o|O{SE;vXS;WCdcaJdJi#IVyV_&WJ3 zdjV=Q%4@ANhk+ICG_M44iR%n!dTDNzuJ$xq8{kT#!sh&v2Dt9HI;96Gh3xq+w0HrW z9V;oPJ)*Uf#hakwx75}UVsH*sJ20Xt6X~1X@B0|Ryjmq9yO_KRk7tFgYEO%nbF!lT@WLW4)wmP!VN!eMNsqTDAl(4)tOTW!93 z8B^!vMA2-6Osx;q_R}s3?2MR3FuM|kv^-K)te6A6II^{gUxX?=)-|@9mh4Ng{dBFH zlHZbz*uIO$pe|#jKpv&W-xNm~+9iB#>9IYroU`G~e|P~%^|ii;v>wirP4(gAiRd

K(H2$az4OCzGv9e-Mz*M?n;83Jbh{`jIzcx=K9r#_&g*`-JFcG}A6-XFwS z*S#m&r@uP|Y}&$0U84BrxbU)wE`)jA_p?(Z`FI@R#gTQ6bq%uA8OcXZs*GVDGTu?s z=dRI})4r2O^K6&($|IpCG7l2n;k@A)ne7hC0QnnWRY^B_KH0;q3ygEFI}N ziJDSS78s4TfIkL(+fu_dEXUbW0B2Ng0x^LnCi~jYU4*O zI*SUN7z<3RuUelEqYmNJuyE2xo!_Li7_PE2uHodQbS`w68%ZqSFVxG!yt{^1rNn>s zqm1k7-Er~@)?qKni*VH=1H}!~2J6BWSCGk*(BwYit!YS)d4N46x`_ugNM>jN(ptfg_S z;CBnqVL-bRV{FPs|H~!}`(l?T3dwftL@3my1IKG^J@CfU_x0X5LWm}=zSjl`+>Z8D zW_-#POopYbZbom{rzjE#?e4kVm z$P%oVU#RkrQU6(XQ~xF@T_Npswc~nD(ZsbmmkP?I>KXnRM^g47DV-MIr{}M~{Nc;_ z9Od%aeM6P>W46;|-u(x4t!(ye+MF246<;LAWs9AQopKAdC23hV_q8!SHL@QKt8wvR z()Y#Nj|p}UU&YjMtd_fh3a>TA6_A23P zUwpD%g=EGOs#Xs*cfcmZDW0b1NJ59NR(R>QrQ3(MS1R|g?cPhU!|YK6(OuR}vX`K^ zWq-uVxY}IbfL<+4ZQvCJ@!mpD!eme@!*K;>bQ|_$n?>CWOQT|2W%ryI&7tCDG0w(7 zyXx4SPA%=yL8|Zya%o*&E1Sslga-B6R$fZCHYgRA{WWbXDl01Ec?XP(rZFR2%UFO-X@F33&;maje z=vq#4YuQtM|G+rGL3KFH5M?n-_9~XgIEPU#ipA8mR6* zucQEx*El;?rf!*3Q6qoj>S&?b%&VeLT6^W14sKn?1A9EM5f5%blMSCd7g8w6sE~ETQ_wG8cYU5SpyM`-# zzM!e1F?uVUKhSpr6E4|iRpwgbnan~aIoPl-v? z)g^iPg;+nIc&XrIyFYi)I8n0iJJ~49W+GO8gptfpa>u%nQNoE@!=Z`;Og1NWBt*~t zBz@=n89(P+XY}f%4y+==5nA;BaUmtqsr#r+yI0st>rQt=i2H8Z3XJR2LZ6h8F}$w) zHh2`J3?+%d;Xba__p|I@xfiL@qbdk}PK}8qHz{?X8k4$awKtZ7^PtR5bn<0@;iZbA zxe@$hp5lw6T~huBF}XcjKjjl(@zG(_XH$!KgP5eA_?u&b!#h*@8+AomFV^vHl%wEa z#t-}Z!5qHoUs8VQQA8InyEZ`p-s#foGj+H z5S#oZQ?ajVmLfyt_n|Eta{LbeKgt(5C|~%MyWvj4;CvVuGHXk!U4iBBwBx>AUZ82r z;uCzVkIfd0453$Uf99gWVIsY+d6N!{tl-1*YwB0f0Em0qo-MuEk{iZ1{E5&^PwFqy|V_$`^<{W*NJdCd-AYqc|{vprd+cB^rG z+lSKE`L5txws_ei~n0h*kP5Lt?Ka!>Fh5=aW7D`eXw5WVs%B_~a1MT*(mX ze5snVZ!5OE>s!y{7W2t|)bx57u!@K`!7=sZ6Ls5)UPcA&B>L@%cjR^PAc zOJ-z?S72~3;%}3SQNO%4_)bA_Zwe~C&iiWr)fHU`ba8{Nc@@lOQ2fvK&3T`6k=KM! zT4Ebs`(-{P$Ya{8)F;6h`CRCC2ul7^`cpm&N<;kJ=IQ?Cd-C?S-S4W0>m0==`0Rpu zD2=Y?RZn0u%Hcdg)NgsVvU{?9OL`q=EV&L1cUF3MA#<$9gTB@!Vccr+BBFx0OEPb^jEqyO zYKz+ED`I*vLHg{wOs5n0C{?}Vxl4O|s#PbA1n$WQTSgWx6QF^Ayv(X)|7377k=N%vSf8x8 zo_FwS-Ez8mocIF?Q{W}e^4_Z1U=h{rUdbMww0&w!ore!Tjz;|MjCN@-b!fVq9AiKo(C6o%;e*xLkrH z*OhG3g|1j!yFOmg6bLg;*}n(AncqaT=88RPeWgFOv8FjKG+kWVlYVh;6%OFIrz z_W&Bh!vg~^FRei1?zjvDje95*eFU%IpvB+2%!C^Etwl?6c7HAPd)!|5S64&zo`0qM ztO)!)ZvUT4p&}DMjW2F@Wlc+=E=4}v-ecHNfT%lx|3g=8QrTe&AgVup7~gsINbhtz zdIec$aF7;krMcLX5Pw9fGk8CgwGM}y8Qb!D+olu=cE1&{C?azfZH1AF?%v-kI=e}N zjH=0=ggYv^s`(@>+LPrLq#G}9EhT#o;V{2VMrIRWjh}%mrmJ9X8R7MOztc-U4;jq# zA8%bqIEy|;HgB}levGs;7+P!got*+!oC-8!4-8_&zq}_-mmPg!RR?{>{b$aAuH@J) z_UyY{HCKeZeu?pKd0n95L@}fJ-n zwLyd4V;-UX(+(1QcY51i#y?L$_RkZz7C?kWk#@Tz|RT&mS0?6#dQdY0aBvTkL%v(SC` zLHF5uhU@-X)w2wreRvZa6qAmo7VXVq4D_MQ#wmN-`-C=tYnKXhN9j?xI@x73L(b;g zY`8?}um*cv_2|nv;SQW|_6rr1g!byFE|RIHz}q(J^Ei(<;sA47{%~+7X!0#Z3W8_A zMhTbw2V2kh&2niQz=mXh(;7Zu@44c>Pu1+34`2o4awk$Ggj#5*#HjOao59yc3~(Fr zU^%`L<0TPxiy$s#cK@PRfqg%AiBo6IdxwRjjGF_~e#w*dZZ&stj;S^VGUTe6A0{t_ z|6FuxIMS&*L$fuvqr3b$A&<@qvEF$=Y9DHM$8oJsTeI9edr{096Z%BU2WmPFk(SgR z$A|@*T8eG|2AnzXxb)d%1IgHTpOaMG`i^x=rbB5eoia1{G0ox2iB5La~V!Wg^ zkUw)UH&#A!rbG1}F6Q5B5d%;>Qx> zEA22Yx-MmcTih!a^LywTd}pKY-K!dY%i8a4f^YeH!!V>@{QjY3@&ux(#=Y1Z5)HU| z;$K}<@i28%pZP6HpfQO2{!!#Pi(4JnPdW!_&v)sGF2i4+^^`7}61B))`gR3dU~1uM*FatgS0!Q7GAH;0!vTV z2%n*Sf+k??M10`cOxA5hSMfBdD8mq?ZDfu3-baVEF(r1*_bi72xTEIVci(P&`sC|< z^$J-4S0L|~8G|nLxtuSP0{|U#R=aee{BhC(wQGN#TR&&mg&Hk08>RnBSm#*#qbq&Q zkn>eN8~H+g<0h>#h!%u7i1Z)bau>JN6hK`+Rex~*mY;5lOJ1tcUD~gk)@f`+Ho%q2 zguei1k2aL#L#=SfDTy{{Vm+#jukfO|V|5AE9;C(uiiNTUcVY8^C|(e%egsJ z{K;e8W6?R*0$VD{ecQZTi6;IZ8P@|IWAeCjWl6GC84%jfU|UYosy>9jL*~EaH-F(Q#jP9l@YVPx*N#C@hepA^kmVWeN^0%}uWYu-U+^5HIZ@{&4PV1Hkuu zT=ldf!98<{XU1!cwXdP=^vW8}{}AhoMG+s|kw-C)oyk_0zW$C1i|BuG6yn%f+0pyD+lf_^t6_Ca`Uq_A?Ntn=Xd!a^qH~2k@yrLyCR{ z+0_3!S%13tyOxiH<0zRs?&=XaaC?kkZ>6R5AaX`v5Xdn}dqrokEHRiYa*|={@Erz) zv(&lM9_^0t{E`o;6TX3&ko0oO?oS2U0L32wxGI3(dbT|cUNb;;YQl!jO1gW>eZFUi z1leL~adgR`j$6CZhSYKIl!!7$2@I2{pDiRU7yppTOx__5d&cpnid6ekMas&&;p!uY zW9dBXt-JxdNcq!EaH|PLy!_!g_#6G;pjvPR2$^=Q7 zH@d>1Zmw&w9+~YkG_hVi3gR18hNm*9OKExlU4M|RWMx!p5;3?bwa*RfK0m?o(5cYO zYfGYMaHyl?Loql5z3vk^;u|1%@gU28amK+f+P(hg0M3B(_i4~V$6YK~sToUq+lO-C zCZ-NHZDTW3M_-JT`ed4V^bri+o&ui!i3mJ>T%o76BE()CqFWNDe%E zeKzNfI1c*j{ww3{$d*)M27ha@xXfg{vkcDaH&8^i08Gn_-3~(Fs{3&67t(ax7259- z9yHhtkw+~u)Bn)^({UC4>A3!1;zI((jC05TcQa-3Mtpe>ef(W};!k7OwUaQY{KV%I z<^D8Hk$;+|2SkkLZ%W!3(xAh(Px;U*O&3h!yf`pIzvzF&kl8AMVAEgZLV``;_5TFh z{{-9rmW=*y2sRm%Q}YG>tX{VbyTdi4XD9=}o7{N9S>+n!31z5--AoLbq%&?B!sNry zMJVB^z{J;SJE#8(g! zT4&Z2Ica>V5&L@gBCdeRT+JLnE*V}0usRC2xKtCDamgJ3@f-!W73FG9z!(Y299C6f zrk9(y|9S_!Ep3A63N(p*Ygh^$8!(5}0n!e-toOR*s;~ z9;tVG_AgfkLm&AQDB*|JJ+{1Q9zv&QOBQ%RjY&l2VeISGtA?9#*5CGHJyf4ub@TDM zA9qmT45u_0xuw+qsM}or0>!jSM?(p6iIxo~j=bPUHF=4%cFRiu+QhY;R0~Bo?Y_ck zcQnu;A1Z6oVX55ral3#F+RYqCY8e_>%Wg0#$@(`i@n5Jn`wh|1M07I8($*V^XC`u-~gpD9rBvERwgC`B(+7R7n zH~;56&Mc2#rz>EuIWz^auM;Ho!VxeM(L-8ciG+s9C~op>Q;oonJ0IZ z2gRB}R|7CvXN~5~j~Lk#E(~sK;7|DwQT13lf}h&TtUt|t0rBZ|rM}_UMGIJ&3Q3lW zY2#IP?=&l|Q&uJ`th(2~`<7iyX2^N1MN~+C#K1B#g0<5-QCa0oikX0y(?9X%6H<|S zb<(8QG2xzLIXvYT zR6G5TbSd7Tw0zuZfmI;82 zp;>_|gTj~C9@JtLO%|L7Z6ui2T}k#Rm1R@kxUbX}{X;~uLPX-rP&aGay-RYhb_HzA zzErx&`k7gc<9hh{2x%=6`+!Gz*JC#++aues8K+x& z$gDJRwXa#Z?@+p}qRkkn*X<#yLcPO*==A$^s#kEU)hmhe&!Z3@@a#g^riF_mm??bw z^x!Kg8Oa?mJ0gDF+Qv!@;o8-*ZxFoeGP|%o>b}#$yCAJX$MNz^dt(zNSP} zWk5M{W8D8@`0XAH8D!>|HIi=hjp25?IQe;P-zM2lnwzU1VL#81f(0K z1tgUg6e&q5Y3WW82~h+jM7mRuE=37J;;fgM?>lGj89mp`Uwh9Cmp(l2dRE-)UiZ?Z zi?nc1c@Whq_E~|jwVsG#=jWfL(I04{Q?d`kQ7sHrZYJ9Zd7SP|xZ+c9-IuNOjqIs$ z2o$*5oHH{aJcIHS+6*{9d&0dl#W#Xfa)G?W9C&F=3CYi|{M9}_y7=AXa*b-C(+2$W zf*@ei6P)uD)rWg411;j)WlW7sqmaL)3*8blM@__X>GgwrYL+zjxnVHDffAns8^kwq zt(pq9x0fLXEfYI@s#TmXx{T8Fkb?4A1=)>m;cJwmr62Z*zke`I8G*SVqf}X7No~F$ zMK(Jwx@8$WkMP6mruEuXwY`ZTArn}yl1~Kf!&=J$n2e5eeG}M}!$j0TMgC|Nqb%?X zfKFlKCo|J3Sk|g{qe0?$=%$LfDJ7i)m|%xb$H>9Ef)*T%JCUz*M+{T+`IGn<#kE2IBmx*gSpgr z`*mn;zC861nH=0ZHBP(#3F}#kM`r|AVH(DRDe&XVM+a|?ECR%~*C+J6R`jOSa#Gy$ zmxs$TO!`a1A%k||f(*J|-~w?b;?+r<%j*iHonq)TLY~c*!H+8Va0EwwHD3;f%>$a} z&2>_ZV*R+=?p>{Wsennno)RzaRg+TET^FEyc|&TevcyX%l$?*DFY3~yhDFIms2#kn z{&(#lzmOUqKyLJ^VZ&J5bU*3&6B;qy1K8)LZcyVKS^G+a;jC`A3G)!Vt;A(e?|L>` z<5KW`xJd8P)|I30SFB-rBH!qZH}3mN)l=~2iz#lGuk!8g0NJV^MjA`R0jtQz_xyyh zhl;0zUW=6gZjIVG1ulb{o08-bobo&eDb9X3z0KBBOb&Sq`+?uKt~RLSfzxBCSy^={_IvRF+8%n6V;E? zSW5f66Sh7Myz%jIfze`8bM|PV*X4E-A_vmL{dwwJU6Zh5IRg?5qERVTW>r>lUtDRk zaN(AX>MtPoJ6KJB^0pk=d}?nKM+;;m;3FfMzNzeU$tnl()F6Pqq4%zt*QoX;j*h54rSS-i*H-Dg792QVmdK)3+v28+*7n3k1ZVi{UO{um&J`*c-9s5c30+381V-$1UX-J$kHiX2;nHC8M zoQ90KuX$n|!KZId!EnrkN$e%n;U9Xwp53#Lqz@)Ag?{Wd-5!Umyw(+HxzRf|0{{K`!XwIycS_Gs6&r{iNbexpc?b8#Xj$#$%R=@{Oq16C?zgz!o%|#1s4hhx+Gz|*qO?Miq*F2- z(-?KTAZ_twq_44ycRrjNHf|UexqxQLwl>X0*2UhHECoM2i%0lpUMbBZ0BjTv?aAv6 zU8k5{wqb1q;$uj2{itrT)N~>Xo_qKWo+Pg7R-ZF)Cy70m-9nD9}dr6|BD}6cPDY58A!{%Nz zGYWNVi=MYj^Esrb=er+7a#2rD7bN`5nWr??$DaHur>S!r`_tGncv-SojkIQ-5*Crr zSUq@-@6~$peV4})kGsbM${^ymWVAqjt6DQ<%6OJEu|E44`vmsmm$qZe+V_tZroYfc zm4c@0vK}7L%bZ`Mi`EN$(0iVySkjV@Ba(EMsRwq#=D&IM8st(25b;~yUO#3Xbn?ov zN*k>))_KAU89J-Vc0%+IrZVC^#z@L9F^yljaOB)2Wc{d@3fs+cDOpf;%=q;vc652k z`J*PXLvo6c6Xd{*8&Ic+!9&koTkZ8Yi)n!7QGwoyqzAk?CueaEEvG4Oj#gz~mO z_Tx_b?(eGFjpK`l(}-e2MKm^&IO9#fzax@|Vly9Z9pGy}i%xj-wU(H6o-dV2=7Y(= zR$XEHS?2~4XUUtlxBYQMoJh%=gMxC7V0Bg=j7Kde5jc^WFrEJ<>6vT!D5+b&WRnpy zSzyCp1H4vQ#H8u5CD-**1^N|VI8P?4Fd}=_nZTaBGAxN8Vdxs)5qi=w5C*uckBBdWUizs3sHi@s|J2g^yB z2CkEGQD97H_C91Mpm1w7l9ZbW zDtW5wx_i{5sv4%KcV`W$t6~}~QC#hyKi_mY@YU8iVfsT8CeIAACv>M1)bR>3KJO6D zClzFUwU^}TkMcOfl+31+F!?s=X-G?Nv*Kg7?@tsvwwB-E)qg>t^^`d(Rx$Pqk)O+D zy$UfOcoH1lB_naX+A*QO=cYWrIwAc$t-!Y^QpfFxE?lZ_yx13C~bt(>j2HHj8t8I`u0sHsE>&P`X+!)q4?<>cd1 zA*%t9_PZ|1pnHU#?9S~nUwzCs4|!$313#dhz}SSeFgR>VHe#WY#B=%pvg46BQ|CL3 zoK5CDtc{f3+wrdGMu7tEYzK}Odz(wk@B?Sx+@4RJY2`TCG-dLg;>4Gu-X$&e`amoq zdV)(wQsRMir9IG8$=JCYv(ji=OHLo?H=X{YyM^Hzn$u+yDHdD+y~C>WI%uar1mddK zg6LF_WF%dT0)r=STAI@oZ6KOtKqPCnMA*Co9-q@;G0ldkJ5+z}r3gPeN#)%F3Mp#w%e2s3t9?`2PQxOn z@kvNrYCG(NmQ{+M-8~_Ki$5kV*iT*-v&MVsn%JA8LMv$6gni(VjqGQ;HxYh(m`lB_ zXMT*RcT3A?-IKY{2tWbQ}Op<~K3qId%@Oj1&-6Ej4@_yv`B zRiQ!cAWajiL7>n0Ng2Fp{>tF?epNCPiGl zShy@e1L(*i@L+?GWR5GM13y<@mm!sr7IHPuJ$d*0LIDN8`640D4==lRKrxD?sYxRj zr{267G1!1_BrVX1AMx6$=`6;L?gPp*^VLnc)j&sHlD1OtJwqjQBNUQj_-I$fxr2>} zRJ*IwsK&EX#o!k|PX>RZ{*9s{CES|PSIisi^AZgtY>R%?B&Ix=2JREk*!hqGU+7-6 zC9ncm{f8P%`CqMVL8QC^QPqCr)cY{%0`6Cz(8cz$z#z<86jFKrfMK@F>l8CoyV;N^ zUuoIHAZEP|e4dy0dF4f9J}M;%sU`zy()CTq@!dE{3cpgi;(=RZtjxWw2Ite&OC)iw zbWohp0CQne`=z-A8!kY)K9r8fXriDcwc4Nel;*%snh8#@&2y6l_kS#`p6O6z1W|$&XKrJoh^@#Snf#UQY2&fm#x=4qq zK<3MOKNXNz2dqc}Ivg{m_tOKfp#?$<>XeuP7? z{Q3~1%ZPxDy8yM!dqBqCU+gV6QxvZNeb?h}S}nl%MKfzNu9VbQNtTr3-4c_h3Ti_#FL^z2s4an*5wLHVXtjJ0` zHLn)z3YC7<_p5HV|cKbd*BF*$wv?Ur*nVQ-TuFl%qT4^D4K6xEC z{JOIGgTvGaX+mfFHwQ0MQi(z&kY%T4Z^N$~-gkkC#^ouj__UzJ20^t_ zDo5gM@@Sme0*|Bv>ehHgdN9(gp^xxJR}r*ZHb_R2%wNsXg>K<1J@t1LM78CmN#VLX z$lv6iz&OeJq%b3`!cyvDd{VG6-s#>}KfEsm;BpI)w*CYp^xJzo01JDGa%kR9S%n<| z0P=cp79Bs0rz<#M6C%Rk5D*%IYPUb3gFM-c0hmST#&3q2i zfJC8fumQ`DO+7oe+G)XB6@ZDjto0TujqHy_l#(5%|)t45Uma zYFu#rih;I*n_+`!Zrxp3K{!M}Qkh6X)2oE%An&-jLYZ`Q zITd;c%jqH9En`Wi=$Ff4dnYqiwWH3z zofUA)R@J+MlB_}|Ua(Pi1_)twE$iOOpwiK}Y123;FqrRHIQ;oV+WzquxlYX_=L692 z05Ez67{f284;Jd&!hmgKzPK4n2tO48Vro+<+X##u6Hd42>b6y+c|c=-Gq-xFFQ)+X zIpC~@ zYiFJM%(gUzJ<5egc~>3U^(D1le*VU~_|@Y(6m=Trgn=+TsAmZZf3HB8EuM6_h5BC7 zMC#U`PlxXxKb;FM`#8M_JxS|9Q((>3%Fx);VHncb4DhK4M5R>p%f9VO`BniNPz;kV zN$!ByN*=;9$20`^(TwM8#_Z$M6zQedO@N849oF6X!AyvmtlzbZBo$?dSEVKm^5cFI zQTrLf+Q_fNT2!7oo8-I9@7hx68B3G*KcDfqfXtUXJ+GpPfXvHKLr!#s{y?#pg-;O~ z5ynXvq9$s;)E6{UdDGa#+K=)NR4}-M=-VHn#KA$u2&KANQm4jfCpwRKbX$>TCZkQ zzSXTHYJHg2m=pm#(ZMSZL89=<>zf^Cg2r^puu<~?9ZnmH47eiIlbioEz%Z$wSMYmO zy~OK|m9b>#xgqUgs?9|dB4?b{N~|o@u)ZK8fUY_$YZFvCL)2QHcFp^7svsx20|;r zsb&SX)Y954@Og)>s31EYAWO-gQ{z84ha?_PSGfPhJF!-ZuzS6wDQGjuDV9*|oT&n< zl`3;7`Ai>)KyG2i&5)yNZI;^i;bXs*g><*c!0jgqiNN6}oyv*`6W_B0?+&`Kn(nzK zFAt9Wsm;H*h`jTXS50k5Beg57HAZki19BJll>BLGk(+Dq8o)AVr%=l#Dv!4aTm91X zfZlF^n#s#aDJOG&dje}QH4*9FnbcRya3cxe`Jpi+J9k8kLOVb@J?#{NltcCO^4HbV z?PaD&Ixd}ZDINv~(BjMojfu9D`_Q^xV;}-W$U1nWKE!f zT%koA3o;zPb|^FT_4tv}?EH&Ix`bMSgm$3nHMic&>tfKR+Gc)KK=KLKMWD4DSxYWdY{FMW)V{u+y8x6<1$A5UNnt$Q3 ziiw!U>n%tl?*o5ttr^iA(d|D&E3S`>_qqBIUeYh)VfgTBh?98{a5Bx8a34F*{4h0? zh37~PzTf>Z9gsNT@4k6_6YKxtCR)t=9_=oc1~#QjhxEf(xVEcgJlYf|L(lVT0p+)( z-DaY^RLKY3lZpK7V6YqaJO7M@F{I|(H*1}j(s_rdyiY=1WwS%}XMmr?{1=uf$0P@S z7)f6G7=t2CC;H)kjz8_wpR2kI)6)F4r@pf`)bsM*GR#$!40yA_p;>r?-=gy-khZx* zD;geR6#yK*IHm(GPT#dKP~|wbuN(a1++038?55u)faJ@OQb>0B4W0JJbzxY40xtxz zLH=6GL)Bof#)pN|=mt0<9XwUgvp6tpnQ~W0$mt6Si2_zpewnv+FP%8{R2~*cA^#6! zDPuBSk>P9I52rX8piWX54jBjI+ssYp@4BpBVh-hyqDP_XrOc5_>@B**99EJ$AeU^j z@dT;?wE{Nar}TVTfQG4TI4Re=pQHL7(Xz-6G1*p+uhJ!TqNth;KI6iTL??q z1dl{Yn(f!w`309=g$SS?6q7|h=oqeZt9T8QT4ICT3_Xj)3pve`@3_CpsQKCb++Ne| znAX(n5Zr+hS1%tDfXWaF5-&-TQ_WS!8L+qnUg{oPhw!5{n*_g3ET-lhsLmRYDkbHY zRZ7(LWC3EPCnE0x8R0rWJTcDTD?+;XvGI9pk?~2fO;Z%hPnlVYg@h;qXGqNZLL@$k z)j^b@q;dLi23%`0;$;~ZwAqOfPf^oe7$rUfiFlmAbUW}WH2yEsq{G*>jCCSCjU!97 z6bji*k);2GdZO~4`lGC--}&P*F7uX&ceappjG2)}l0)V)GQk_JV?2eJr<|Cd9oX>R z>tJa*m<>@Ub%S*m)}REu=M^%btCRo7DVFP^E-xdeV47IAg;OjrxUzQA2+qr36F2Yay%+`4mk@7NCP*z zr9U&N0zJpKJ+4f#Ad!TcIy?_xspXwd07ls6!hFfnn06NwS_d>Q zuwD@+K0pFYvyArlQ%KCUmZA6w^n$WTVUH7-$p~iyU^6 zhF0z7Vis^?j_c*s&X2cfh8IqncMun`EKYiUR|4aaafpot-JKq8bO#`)#L~>ToCdH2-Tfn|iw@$>X}WwgcqV!k$0A z>R$aOc;fgh+-Ol528gwUNni;8=z_+aWk3Q`$2;#X01Bh>yX%-FV#1EjQ_o=s&jQ1> zdU6nbQ&ST0%DH(8EayXC`%j=zdP@$0!{zek+o89!5i|qIwB9c{AcCg&<_$tCbP5c| zAvk_Us5F^7@8C+f8D63C0Xs(Hd(OhTNQAC)jUS4q=f8%K!LJOVaH8xwlZ18i>i`ZS zCAE`mvQCI_4xn+*ok(pCtt;<>=)Z6qMJ>*H1<`(n1r2=}^DphE>=NI-!-oO*?k_p@ zUOz_<#^u6}jf5Gv6U+!U$7|X~os*^*X7-v3NMwqo+d~L8^=t4JUQi0S+qA}_Ky9fR z$c`%CCL|#;)+x@!erPrFs+d9vND(_9YTssW)59^*b`4s zr;Rd&i7MACm!i&pLh{5m{^I_01i)ohYx@GnNwF&8QUjE|_;831jwAQGkHp9%2Z2}% zve52~rLR>VqbFZ`tn{d8OQi$j&itM^4W+M_x$%1;!VZf-f7w`0o%H5$AXmn?O`WC^ z>gGo80Y^h#RBp}nhvkw6SH6CaSnkEJN?=MAlUmyuUXxsSY!j^smaG0d%LOidCiK}G zxfxVN&f$^(82Ja3%$^TW@&#i?DJzm~LT*8R4JfX&WIGThsqI9KMk*P~0Emv8KM@IZ zM5?f}WB1}-&>yvS_|JcyAM{z`^n#W|iSz^zPWvG%xJB=}+%F%V-N-=n5DWk1&%SX> zfo-eu(;){STsJ072P_$yN*IM^-?v3VcYnZ@eG@_Je%6CSO9)lk>X%dKjvcQe5P{W^ zr$qmj=<;>RIJypz#PqZRVq|&nHOAwBj`*vqjjXv-}opA z&jd2Q$Zbrz1!JWAwaqjkZw*hI%cmjSVxB`@s6`QeTQrsGv7k4?Q4#?~rq%+0Q_<0itGg-Z^>>RYI{5g8s!K*l2geI29$A*C0+lQbRq6IUPeGS{= zPAUUX#yorbBpoT5&da^0;?ys?zOLlk*6})3j5=ab}qPDWe-&`VRhh!6+Ob zs_P@L983e~haKwTB1~U_M5aj3cA>cg%Pi%)Y8cuhL>kLQ;(9bP$J>rc_T-W0t@da( z_qopA9%mtc1i%Jbq9nD~W{)+j#UU0gNG~PBSjL1AvxoIrXBp2M-Jiy!JQwmX&4;IE zkwI*V>bpt^%Rp%FS!V}^WYK$?R-u+kXQgl(=oew}hXy6ZcW0<|2F30B&&;}KBTK;d zcHX#gZ?*2L2Rq+SLbfBU4VPWh8V9(mA6A4C95M{bJwn=tPn3|gM)`i7`x5bejaBgg zq_-L(Ou%yd^cg!^mZOVCD1FB^=4Im4ACK@JtLn?$P-?KXCm?|Vs2?Mj1O?fcWH`T} zg13KSJFWxHdGnYGEa#|BH;>SJ1n+*5@Q-vM%CcNFxZnjFm0VJ}VP>vKzqZQl#LZ8sY>PaeCS5R&RL|-GvwgN{>9Z19At(b-p0sWXB#ia# ze|!at9oK`c-eCrs<9~E9jZ>5+FNNme)_m%lF(jfpK_nOU78q|fve-xm)f)Usn_y=w zjNLiPqS1!&@=#0R$>^JqgtKW2ead{Q+^dF_QLJ6Agyw}avWIjK#08Dse=5AP`5Zql zBTPgAk&a?t!;~yninNeLZ>E0`Q>Ro7Yby9F@~ec;i$|g1kR(dM<1PZ~7X zf1I6+xXttD?Ay4w>;-eX>BcoB+MmNM&Jv!bjh9-pjY-Jtgv}jP&hACSWm3u9C{eiK7|-_bpC#vtC{ux7CnSAN1J{y={pjcAL_e8E<4X}+a8 zQfsVZpSZ7ggQsECNM*ZWHKDG$6b3!xTZcTILa(&OA0b_4pgrLQmjjhdbn3*^j^v}L zi2y=AfFuS&z32H;RS`<-=0z0YJca-!?Q$^hQE>I70BvNFDITl(Tk3tCS)979LA`BF z`@p>3UANgTmgGR~CE_ZXV(qf@Rj;5Jv9fqH&7Vzjg_);DhGd*USF5IEz5b`23uvXq z2s(~Cv@8)u{4mWP^$hOtZ70tLxNZF=em6VacE8On!*Fgd;|m2$0!`Oiu%!Wz z@Gl1Bzv&yg=Z84nT2-#PVqs`%?W{Zw{AkK!psT?-SS3;qtfkkubr z=0w~8NkC_W!;zfiLW)B__8&v!;n1j3|6M5@Pq)@dL95S~V7ESAt&1B|Ebw^DpzNGL z=8dHywc0A8`he9&is^gJ;Fk;LyHZPjqSU409RZ+O+0CF+cCfKYx++N)5L;V=1eb-d z$~R^RlzD~zUKa>(m4%L7z%tSWgmZG6F7mHmq>~KXw_y_)MI^g{aFg2de z-w8-sFB62FvT2ko=JA^g_O{mw>rHiV9#9aIirCTPWNH)~6iRJ~4tq-OaMv2y9p z0^5iKZV>|WcpE(ECBtHuZ3&o;Ax*VNa(FxsgBY?Ng(+unYup!^cXSc3MlsA*TMIKFNT{EME9fC<_c zlG{hw<)+QJF3@{gte!_oy^wss`gJ=cJ@FuAURN=F=*Nu{y!8iav&A1e>WAd+HyyWz z;6hSO)VOYRGfQ9a7KIGt+3)I_MpT|_CtxxaA#!(yOB*isXDd;PjoKiFJ`8jg0H0 z^JJ$fl2{bJ4^F|*@ROF*3c7w`8)2Ze{b!py>N;G>mQy|W>j9t}Y+Baz5*i=;+^GtY zqk_!|wV3SeKOu=ysYpQ3{-iA9{}=6N?Exf6%3*Lk9x1&Co?O^Ig~0x%jD@?HB+h~v ziu+K32Qh|@8>>2{@k$_V_j5mlz=+xx_{s{EH ztxY%rdVKG>(Knz)r$Y*&@(<>nVEY$)$EAfDm_1>kD)Kr;@nG0P7cmU^8=-?h_z+Mg zs)T7yR;(6QQ#_LE>7KxX5e~m91_Eg%wg1Tu0@VF_MATf}?KUDo+fe~Apb*6wmWRTJ zpWtS2*xzVbIgmCz0?6Nr<$n-=F0wmFb0U<2U*>yI1+JYABVX!`?q<|{ZVhrB!syi9 zg~&HSW0I|9U8M3Ydai?8b1sc}Gm2qO!XW~%isu8yE(k^F#(z?TKWax+mR#wA?I2{IS~#-T8B6#x9zL9U_Pq1D>x(5KZPro zzYQ%=tmeD>`)`NK1AZnSSxnP{IF$VF3g2>(>xptMr~>;;4xd#;H0mUe6%`?Tl1ndu4M~(Gzc*V>E%{u8cbe93_}2TI$5%*yB54~OTS`cTyTLA zg1hfMowcP*d(x$m)_=bw-;^!@yjzwRp0FY@bs0n~I&g%8%R#!r1!QR8@4jR=Zkge{ z)GK|4;)0Y3A-2B7C`8;fnjiN(k&p9qh3s$Q44g#o|96s$sz7MFLl*f~--W=L6?*MA z0Sehdnb)_*FVB1#MJnNrXZ!;I<9+BHdqR=~L4O(kVWjK@D6C{j*IzD1Og84b z!)^x>_?g$fLCVqYmbv@Hk6Uc7832W0p2}M- zc>XcUDq>qVU0`*}lBx@|2spfS%&Yj`j6*85DLDNlk?pnnR__p>RWB2!d|Vc2orX># zc#%l8_r~9pxIQO;LtJ7~55S2!y^zLAu5<~+G%I0JVG9NZVMN0HN3ws65_GVyziwwE zjche_Lvl0*f_SG+63+X4AQI*ROWGD!T4#3EyPr)e?DQOSWA^@zG;~Pu8`99RH@%Sb zFr9q+Lmbag`YER>+sV2SO+<^X@)I&^W+?TJM$YXPSj(QL0|&?a08;L(Q9zEOf>7x8 z>cWL)uxqc_P$JR^gugV6@mYz$?m&)_A%!p`NT2x%@=}{3AmjS~vM>MqFgK#rwh5e& z;X6aA8DJZ77l?!2mZ10keKB_1RIhC|QI><-@M)~uqL|$Y1J6)i9R3=whnF#b%mj=} z5sT=7=zGWc31T8`TOsgh|BG^9n1G?$y*6`QvMNM+`X$1{cl@hIV?soR{e}?%6%Y+E z2*1(jpw630Y3I?*K!kDfG%u9@mp~)B3nxSZOf`pd9fa%pAt-O{np6&6hB>u6n^C_! z0ZlYUbx3S#EZgF@KCK`i92?BYFK5>(hKa~hSzhVr=O%Bu!u;t<=|-U7)Bh&V5%$re15W&&7owT$T!=qqA!VFL+-rSi_mg)yXs zGXT4{Rv8F@K$RmF8;5+E&FEj>ODx<=(i+@L`NS3Ft}wq&w#ocZ^=^&kr#}EhX^I@2 z00p!OY+{=SIBE!omL%o?<}> zQVUV&l|L`4HbLZXm=CYA$Q>sSRNKcb0<-^V5rp{aU2lPvfRE2mW`oX}kt^r=Q)EyD zndfTJedGPw%MBUTvn>S5NQzGXhN?h;|!BDSMHpOroR1Di7;B4L`Rwsr<}E%mCTRTZEys`9 zsu}Wj>wG(Z>{`Rp9&j>n^Qr1cGd0=Qi^q&9-Balr8xS+danC;5 zy39MFG2oK#V=?)R|EM@ityAHhF|q=!8Q|*M`1#Nd(XFzxExj~y;b7>^p~mV&t=6P7 zSHVg6kN(;y1KqmCMcF|^b`_;~6xN6?Qa0o=>Uy$5i5 z)mm5E1uCpP?EN=KJ4a2>C!@m1Np?-3yF$M~d>RDMIm#f1c*9st9M>K_l~PQ0K^>_QC`Kf%Z_ z`%52)y!YD`won@uBA0hyO6=O5srref(_V+&3j|T#=-%7Nd~dEsL9BP5b8Ce}ahy-NBSDCFNPA8V-804p#gNJl{?# zFKp+!Rr>CYZ<=MWNXVZ^g&HMyIq6|xlbH(s5X_V@K)K1|FS1iHNPq2dAauh6!B_*$ zKPF&4`}n~F#73Lm`JXaN>_0CWsoe{$Fh1aV_mmi25v}Dkr0>pZ4E2u0MyF0S+DHD9 zvH*#e7Lg7j6wq1s+CRUS*mI8#i$#76U&j4}Zzr~^6$v^uj|ZHoPNPsVP5pV3I@Spy z`~^CW=5nKI$E;F6V9a||k^IP3PG*ngHdwxyp}OTf z0Ru_R(A35Jc$c*b<;zV?vlSvmu=rzt#sc3rEL;pFB0gvmO9xcaUM<5rr!z||%=I2i zSj4_jT_ITPn1-`{pn=oapS2-ayve%JFZrOUQMgq>ZPiL(Vs)e+sN%+y$1y z9$nTAw}M$uW$$Vli8RFkivtEi`0c?JUrYOZ3%LxJcxG&A*+vIoL%&oR0a;m(~KFp=nVg!i9FeGnobr1pe5cTi&^7C z)i}Qz==e#H$;cU1hmp$}+3&)y4c6fTU*wq+4obuje&)Vg zf%Zd*oU1`Oc<4+tosyc)Wk=9bo3j)dmGW~n=Zdzh5;-RbIigU{8=s@A1ML@R(G5h# zm&t&DbuL5lPNkqM)0bfKt&G#3leZvBr*o!2gVZgL?Ks zP;}soj<~@03L616$3SR(of>5_gOG-?{#^ z0(rg2jjr%25&&g#iDQTmjD^bxF&6EdP9iWCZr{H*7KNzQowc#^mmVX24w-Xq8OJ2k zr-KOv&U;Q-N({OCusnxk)8KXvv;!2MhYhB$^k#)58@wzbSnQqFeItkR4eR3ZM$Bdy zu~}+!9CYC1d(FusPNZ$>0!qYtKCcYhw=;mH|fJtFN&=FU~b!vQk1|AXAh-=Z+_;N`Zd8Gmgb^x|0t3pq0&axIZd+2Y15Lz2g z4hCWu*}t@lZ>G2Cyu|p&;A$%NLv;frEby-U;xIGi$nv?Y+>6jb6DC@Ry(h}wk!t7_ zRL)tvLohCW{!RCZgBwWsa~~!ZZYKiCuv$H4urN``A)Vx>Zl(3yY+U0Bc;@$ee)-JZ z#^ITV_x4_p zA6QGHRxe>cq?#PE!KNvm?^crM0LG}k->821?V#aT4jE25G3*+d!?Nl|KR1^ct^0GQ zqhr1uAE)cr$4NrGPH!I^XY+^O>+=MQ!;zvV>AQtlweje>%Z$TrqtFeQ^mREHC3=Ia z-o4K#y>j={1FC76M2YTb&3ntRrvc%Bko3xZVrBUV+78GF+Gu*^@@oI{Ygi+Pu(g0e zDgpZ3YV+F8U5v+Qjv_f)}34y*P?81xk>zcNrFFD@0ZVH9_}c#>x(wK&HTU z>$S^}3B7EV<%|vyX!6@H<6!YQc+rv~5C`Lw-;{3RqEnxmmtZ7VL@%@a@JJ%(jP2@U zdfwewUDU_gcLF8C(oJu^ z4^gs)z!-=0C&bC)E;a#(#PN|{OS|=GjbDTHi`nbYkYB_zOqaQaq_2cDj(`5l1n!3Yz8Pp?QSj`f9g)z$Di4|J3f_6yIp^l58gfI4lJu;Z!k2((i zr&;IbE$oQkcUt|;cH7nZ%5^YKKLZ6+bf3b+nN(>0LCgjW$d#;&R{dyIiAj8SmbgXS zmP)eE)`~a?Dj1PnE3pUQ1iStS3V-JW@3lw(8=55RB9Rdp1-5fdYpg^q#93jSU&Psq zKLLC}s%LCn8-(tsJOHghjj#ktSiJEHw)-V{_F=uaI62$)v>9MB4y22#a<8~%ncado z2ofCk_TE2?`s*)^+O9?7_6hU}hfadUu!`1kxI-uIUu1XfK#^*O5_T?n5acJYN5x{) zvJ_%6c`pIhAwQ zeqeD#f+qjp#wmbYo>7@x1koC{+mRZ&8KEd7Lka}VRV{s}L}mc9nq7)u;XtOW5J`^N z*WPe}VKLkWHLX@90{QDnPMr?ll&B#?lAg2~LfrB9Z#{1FPz@-bx3wQ5SggBzJw-B& zUzT3Li>Da~v~t7r7TqRc6Caa1L&VCQNv> zS_Ef2zz4a`hDkQ1;^B6||Hluz1MZK1!TxVP)1FXYg5!(9aoA(mT<7-v@?)6xW;}VC zoDLzr3kMfd-Q&&J+Cpk03WNyOc~E89^KL|H#_tsO-EVOD-44CncRnEZ!O_9KM1-W6 z^2FTZG^m<)cU~#Ne1Ru=A~RG!gd~S3Lm?+@0R2bJ~lZ~=6x7q zC_;ZVl+4@0Ux2_7MxMcz!t-XoyzhRIZsn}NAXG-JO2q6M`Ap?aDcQTdb|r|y+kGHf zP;&#_Z2Jy_1K5m+nF!p+Qf9&AOXLCPbQTXMAX#THbG|pE?=G4(HdoX7lwRHasT1sr ztKP~38DSR_zc5lrocpVTQ@fCaPbPz?lud3kZj!k^ZTh+rl_5@Ll;S*C;JzT6CN8S;@R#DQ+!q)6W_jmj<)L5YNd zIB2KoX%asvh)L?tZ)Uq7wG-#xT*{2F{cx$I9lB)3JfiHE(~zx{*uInqyRS(h<8=DA z_OP%#XKT??U;?=MO^7bb=ZKOaeW%chASpnaFPq7yKm>|1-+y@=6n}7L7%n09%HHr} z3laj0xXl=X#VD5iNkh$BX}njF@*u`R7~ET@|6ko3Nh-frY#$2&FzrbI<&MsIjxi{X*aN2+h;PO?`D?g_tra38a!iF zOOT|2EXH_$k6>}8LUB(4v0n{)o)x|u^lAi)xRGrV;&2q@zwxvr;rvC%YR)Ndxz<*t0O4TvD_fK~ zzLWGw_DjecR;DoMIZNMtHk7yQBwaW2;|q@00)71=q5hnY3erbvL8#RJyB1_Sw*X|N z_R4un5so5Zi}R!Yl`5&?u;;KiBIAv+&@`$x_Y=o3t!#z)$8!+(AT<`k+}u^lSbB^{ z&Ayv|*M+LF-ETb_89V^-+{S1i(Mk@G>=WR00Dnqe;5|# zKy~fI#ss{X$u@jZw4a_=p%@{CvqTl{e3|-kQwWybF&m9ay?fpBSeA&a*PSTzfNu$V8iAc(M|mc~{C>-f)2y zkHd&rT$`%F3q6}8)b?3*kL?i)%+TD7%B8@VWXt3?pp_jA^Tk1sUUhYbZQ}ZJ6LH(d z9HTC_x!=!iBS~(6oE{|iww8>SPWy6SC~xAHI8E||==TA+A;}2R9}8maz4{mG!2XapW#F~1f^svSOhbbcK*?RY^F|sMFk0A$lhOq ztb>`j8gZ%=e|4(8Z-kJ&6>9N`qW6kP{E);)C=F)5Aa|t}alZR41Po&l1xWTX_;kQO zb9`yU+~uB!$q2r*8R~4~aYpkkCZL$~MAGz$K?InrURo4;ERhpuA3X@Z^?A%4gC>cF z%fHXjn3}+aHo@R<7Vpk`N_(MCl!DewvL6u$*6|j44&8H%(r_$C2y?w!(8)~FhPk_( z$c@h}ibh*&V_Klw)uKKx?klm7ZL&VhLu7)YPUZOP?t2T5~f!pc`#R+5AP$DeZs^ooF@;OtZ@NMQSfhx{#qK zKWts}{UdV+{?cENHn57{X6|hY52UWhSl!d~AP!`d4HJ3*OCVU0B#dp=8P++r4S7YJ z-L4U?8OtGzgpvB#dU5B)2z4p-SgRcaq9sdQh}>AAJs5wWUDW@=gFp30TLR@JXMhHP zABzzyqZMg=M=iZ43Mm4YryqnrKrX`~4E%-oe?YdvrZ5po07E>t8Q|80FF_*spD0eW(}NfH zz8DHeEeD-XiJ+8x6@;ujGyVFh!SSXBM9&H7J1uh^DQ8SEA6ptAXs(R1TF0#%*R|20 zvRf^|P-)1U;GrigJw7^%PJP8`40!%1k;Es5TG-Be6a~8AvlQ5O-N9!)`<>5HFFrw3 zBoBOT2H_~{t`sr64rInj)d^^bWO4eAK~L>x()33Xjdfb*p`QZ&LQ-^lG!HztpQ~FI zVf2f>6<88#Pc|JB2^aAWTSWZdgjIFB6GTA{0;a(ieSv=(gi&TakgxWH0tWS|1hp#6 zm2x`zC9BIWHLEtS17^c;Z#8S@J)oeNIL@0BH>&Imkl>5-+N(WE6!dbRQk^)?2!&so zaP2}yc#1JrUl;{@zDUQ2P&KAF@88hCLlOPmLuqH00MIi&jZkfyg&+W*))g%UCi}pB zLV4-(O^G)8lt&+x#@d3T@G(?_0BpHxS;2KMZkFMg&rzfz%eV}?Z!$)ime0z+J+2#w zEFXP108c9YKc6r;wng`C~ zgAyHVmztZ+nMxdBqN5vspWM#?MuP&!DkWZA0xDoeQHCA=K zfMn$lfYuPn3jYhRmOV}K+nP674KD(&{ydE0BnT?no&3b&+JH&cszhgblcY#A?)}a7 z)xK7Kg;eqVuh%w!71_Rn4?vRW!Dt>-#A>-2c_pB`Syr);?|b}ka!xqyHxR0@aQ}HV2os>g#tl=d?XA7eMU~9)s;h z8O6s13LJ=!yP3&O6NXaOFmy%@>(RqPJrrKpUsPMBQ93jeM z5h%&84wa-P#Uk>i=dY|`WxW$$qx!tr#nWABH=)}dZcelWqmztNHVAm#Cs1T2ca^$G zX$Uls&eLKw6CUG7!JjGStdUz%T|BErhHl`nA60h_-5^RJqtYJ^MfTf65zzId9|C_R zPV{auVAdzpOAN)>;=%c<={tQCRQArJibnsbW=!C?0iOR>afY(nlZ)?vqXNaS~}EILeJ?kVi{s+#!N@&icD| z-b+Q-vu7-j9COh(jjd?C|Fy?GKA19Ki|-EKQ@d_uZWMeuW3!sUx6>{_rWcWesmB5# z$2Vgm=`e2TC_rt?&;v@Ja5*rph@ccb6z^Xnf!RPms;A_k1X=R4VraH3fr2$RJaU=e zJ@QOJ31qQe1x^!SSXAWD7mUk@vm_1#S1Y`mbw5ILJFE4Ab*ctR#QHlZF-B!9k#cI& z8M@7#4SxoedmzYmw(Z{{W_=#MChjDGnEuTIEP2JFJ?K~X2F~s|KHbtPamUM0Z9P@0qk_Dar!Kv5JvhL z*`U?@%Hea;zN4@l#!p8RiY@UOZ0DDuN{JWcpW7|LW&r#-xEabk5qZLUX>p~EwR2mfoZ?>eR&M5VL9q9Ik!zD@`l=lATk zflwQhF%ResBch~z{tXrW^)epWSk*6VIKE+bdJ}>`Oo9}l-`w9C&=Q+?1&ymDB_>EV z7ug!y-eCU$%YHfiizJf+#7-@$KQW}}kG?zv1UT+}{>?lFR$kc|`mY-;v>`B9rg-ao z%Kh}Tk6|tS1f<=H$KpDAZ^$eY9&#|-*0DeyBDB7mZXfU22 zTHIb8`K+BrTjH|Z@6hS+R`vl6IhC-Z)HwvN6`G4ye{nA7OA54ZfhO^`&?W%;(n z=dB~`2)WsL;9e8M6F&3RgbuV5LuG5&S+?DkFx3KIPBx1f@h> z##VxQFJQjdz$d~#0ZDff$J%&xU#^735o>8}0FPPXqeHFIp{`dEn58^YGAf5}eKDx{ z++j9!2HAokun7`-xVSggZdN;*RX>jK3e)mJ$)$<9Z|2@YTcsvh#Y#$*ec?(LdLaSy zYlNVw=TyRE+I{maOqrWoE6|armYsU@n z?zPp9H&HjH=cVwUEcuE7A?J`h(6v1~KwvHf%H6r~nYF4Z?woW{itAY3+kw9EZ?WQg zHVg=iPwJdNy%k3bj?u7!Bv=Ns=93*g8A<{T6~!pg_hgmFx1glHhLbE&C5%)T-FFtJ z8=HcNGsWl7tqj(Lw4jMaGd9d13&tX8<&|acqM_pu-3PMPtcMqz$rKbDlg|f~$3QMZ+P2i+T+MU}AYcQl8%jH_xznuQ2 z78*CLgwl$!oEy$-NS6&6mUsnIG?gj^Tja_;LCV`~H6L%f`acv4&Gdk>y%{uIZEGW;#IaPc`b8sQ7re*1-1Z*@T>J;h}<5u@UM0 zHt8vwfX}sWZ3rzcp7=lP{bf{^?Y1|J3z8z;NJ%5zQUXe+lt_ml4FVUSAT82JNJvYH zbV-9E2!fJIhoaIUN+|ix6W6`tdG@{cf9)~;W4!Me>&yDE#u_fJ^E}RZ%=xQXS+8=} zoXgPh6&3jsQZ&^)a`~+Hn$FCY&vV_E*t_(^cI1;EGOY@IO!sGGsY{hE6H;1r zM^>_&0_Yk;`@G;sAx21_jbcU3(DQUlR@oOHRJkT`Vdd6s*p+o5Tpom!`|PXD3-i2^ z4Isp)5&r(z=G%k9dZ3NQ8bLR@8i`cO#mj?Af&R1s2vvbLd7TSS4ZqPF6Lvua@D*iA z5~UIl1qcS+;Qw+=U%0$uc*K1}Ht8<8*a6FzflkTZX+|$M8>}ogkMXXL8Df=DTztN3 z^Sy}j0T;DV9Q$t?HDw=49-})?6!8%SX?gdzHf9ngJ0Id0D-FO(>&+dyRciR^4#Xzr z^1a;jTd~t-r9l|~yZ$ppsd25{#S?nv$~M?UpqI{-?sJ?eUlqlb4LL>j*UGr1^7G?^ zy%4`nPJvbfX+$2PnS1xbX@Z21la8hZd%Pxi|K%(}^OZTIKOHiy!R^ffEEGffxnUV(QJU8AGBU}gQ zE4fZIm23M{|FGLqn{ey=A1bd{XyJJNyB1CbLm5W)xZtz69;e)a8%@j*2qgs|O;rH2 zzn|$FKk4;;mm^sdimrHOEOv2lg066Rj^)D;*>|zI`y>6y%yvtgUtxLibF!7{O130q zdR}ayt7SlxRwJ>~0%wByKOZNIoyU17hixxULH3upqtFT(q?YEe`bpk)QtiFRNqrH2;1$Eax%vJ(&@F<7acGg!8AyzP zET0ulEq285YfBmqQ{uheI|*8hmktgo;z(0ujW8sdPY~3tCIaKgqLvi*hVZ&4s3Q=9 z&dY0}<{vI9nLrGX=HogQw!MoykTg9J+X*cp0V zt;kQ?%(I$+&pu999!!gc|Ej)5?f4@yI)CvfMxc#<5?*-*2i1Fnto9lgJdO&l=Y}Tw#kV^tM`Pw-(uD3w$rSlA7u5I@(`=ty`qM*r73h@5+ zeQyDo4<|O!k1CMeNMB{cwn!?6+408oa%`&Zf z)c=%50igN};9;R#08=lR1j45az4hOt^r7ha5P2R6|C(8B+7#pojXe1eWI?wa3O#gO z$raZ?p7lDYT4qK-=KIBosS1)M2b^Osh-sR@ewZJdRj15>j`-H8m_Tare^En@&lJO0 z3{5m3e7mSzg9@|x>OS7YJa4=D8~O7%za|nd2X$V{(E~W^4I*f;lc#eYyt;Woa%le% z^stEbI@46J;tv?R`o92UyXhE*j69GQp0?`R9I+R`O-Zx`00RO)+};1iF&<-j&0bmt zL1|*{+$+XKp&YRZXycfTkaaAaABGm6Wh!500QJS;ffN!^wf3R?&j-W%^Pm4<=+4E> z`X4wW%M`XCfIK1;k5b|xkbD;dzK`hLFv@6CO}eB>O%TZ*_^I~pLpNg%g`obnF%ash z5c`4dzzT%>UN4>*RAe1W7HF{e>}~K|GALhrT(EPBA$>Zy=+AQ@Vr2LxNVzbMQj3;LVPj8Z7D0}F*qLBmY|I0>MjVuA10?-~L-;9P+O7lM zhTiB4XXD>{QXrp1=7VM*2eUuY;<5iiTFeX=9^T)M<($7IAO$DQKlE$Hu?!9Y zpCjo-22~SsyuVgaIuXCJmlK}E>($6%wgARFF>l#!Qeu5Kt?wIcEW~WMiN@QFmOe>z z-T%kg2>++gMnXxA@1D!=kj&B2T>CPw=QqmIa^gj5bM8Z`qXM*SRf*5=!#tZgFy2`JYx2#J8<0>1ih z7%sj0bo*$E%=QcYnOp&tBQzdfxx^kY=~v~@F+dC)Qw>P}aD)1>I=@GLdW`0dM*59= zaH3wF*~WGti$~@xNQJCzqrgX?`ZQKvA`RV9@Kj)OfA+tS@Ba5_sE(T_=s~#wFlP&G zgf9Pb%n%0+5F0=c_ZF8U72_Mx60JHnHjbttKQ_(VU|A(GP39%#XT~jes}O48buMV9 z+>6E#<;6e+OgSkP%_2u8Fz%y?{LUu6L4BdRAZJ+^2Kh>(+o{jLV zO{|fGN2rdhXY$t+cAorTn!f|IpIpvJr!Ktxp0!6d9jmjVC zyUK7`0}paw$$zR=gR(L~ILZ+ZfrcX+X#hKt{(J1`mFK^c3B3Co<(@z$Tuzs*1^Jb! z-ghcA9i*JSG?SbU2BpZoA*rM75vV0(dE*G301PcysV_C5maS~rcTYQb)`z0C7m>f@ zX%9&Wcu52vD~MqPmD@e2x`2oW2>upL)A7%Q10tR-yEfZ8RV-^otD%JWZIO_{#0vMo zGb*78SrQf%VI`_1L`y$7k6`*t`3D5+v&^a$3Uf#wapSi52tp|s3Y;>}-;_913jt?kRn=!K&M)J5a z4lke9I8)llt#ZU7K>6raMhPQ$)(aPDzz@>!yfzYAS)l6v%U0I(aseWHC+6N}z6Z+R zeoXie57D58g*3;E!v<`excLOGV~I+>EX!#M@R7vly|-Hu3Kxw(6~SwR2>$D9w6uNI ztEQmL$f)M{^QVycbbUl-9Ru0{4uflu*{SAgida)_e2@U#UgGa?`%q50%XeOae6O&! zNf)rCE`Zs-5#HLrm@a=c@G(Z$UFSeQDHjzJc;GY&G%8{q3+lfoM3!c_ZM-X zLdz(t8f?`f`tk~WJxe*9xXgJFr?4oE@PJzup`5a?AYlKq6VuQ$ZDuV)g+B*Zp*DdB zX=PKm=OT?jXHHBvEBHqYLUgv#o>u0etapY&s1oR-X{CMiz`sTLgTb#j$!8x@)-raY z?Vfi)@cfOHdOg7-q{3syBs|5~-Jel(^rX9T|0c~o?0e<$hefnKx6Z{OU@IyIvLkbW zHRu;7*d}HS>Tkuf2fR)p1D{}fC$8RRUmeLmrG0u;#{U$vlw;Q8g)D7xhjN%kytJ(< zglQIFQb=5fZ&)M4XQeoz&eZ7|ylfI6+fq*K&e1tXYHQ-YDi(L8U>?*~x9bj3ilrsq zHccpyzc4Dbzm)ewC`w*Z5@gxx{+dHHo`|<2)AaKyFzpyevM)wBi!zu_X4gGhR+s^v zJ&uypH#FxN1~}=YY!X0%-NC%(2>nxXZ>zNo)`1x zC?dsBI$R)UWd4XTy!*QXk0Qd|E0>jd@`bZw_Pod!jOrg^af)Ikl|`xJvDnK=^c*8+ zm?QCEgJJmySLbUxH??YTRvsjGg!Zx$M2Y-l&v9;#AcYLU_x5WlUxADsDemhI^Y`Bstto97hM0z_R; zH$+7Br(|32!W@|QCVM+DIaxj@HEv$cryw=%hw9O19t?@GgNQ7wVFG<%GbsV6Caq}O zcQDj~E_TuV%Fl}!61P8LzPl)U>C8i*wdu}UE0A_!C`Yo@>g8=#0%sG2cvuma67w$y zfoD&(aZohCiBYo+4w2n3B6WwXVL>*Q_}HxP%&cl42dkFKtHlc9Jy&ME%5L%)s4LtXL}1uoW^KF39$Ik^`*dJDkG_`8rX(ly@|mAQN; z|K%`84Z!dBj)xwn>loNBM@^UwgpGz=3iI4i{YFTM|4@2%X%&XFl#p`)&JE^yq5-@`H_ljrelmk2|mvlmf}K`_*gE#x%C`b;+1S z6!>&G0kaF_xG3Qm&sV{iR=@#f)F?3py6g0#1R;5sP1&j91jWAg%z5cf~qDLs5tjm%0|KoqwP-(eB8}f z(CJ!>?KPxTS*V6OTK?^qk}yw?L@kH4Nm`t1rvJ8u8%Lx%{~%NI%5Uq#o;pkZ_TjUa ze0>CtuDcB9<9ZODOV6{2E}S0zz-1JjWwy+~bFB(uIc)Qo9fC%a5Bt5_m>&`{mtxS){eGRe};rG=-C##wEUg! z;O!Z?Y)c5cO|D^F53A1~I!`04Y~nrR`QsyfT&IUYm+{*cStZS*j}`u`V4Y(OB9X=~ zDEeM|X9;>=&a+kX+C>$ZYb*}^>=v%Etq_W(%rZC?;qPQ)i7j;CuhF*e?N-2mwJTxA zc95hnwP9MzahWGHOayLq5=5q);jgSqxE#jDYNWLctDlH&y@@79DsrnNB1PAZldXsM z(F60BR^^oFs)3RFDq5==4bh4QO$(~#3>1?WdH!!o$dp6p%CxN(S1C(Veg zz~P|3_my~pRywF?SpdOv5oNe7bI9f0I~x3G;qtFcF1x?V3URN*2XBkXsh>n{KXcIO zuPlHgbJ4_T8T*-=lh-W3n;>Sby5%Z+wtTKYKSX zFU@;>Qvd#@?;I(x{_dl7UT;#13>z;L{hJg=j6Fd}Vv*dEqR;2@jxg(=fjN$Ic=Qdzc;rMdG}-Si&9S!#T( zdT+v^S$nrBf6haYYj9|r%IA`Uma8McZ4F?v_!b<@xt*BIE5~x`*{d|@$ZsV6TG~_RihQD~{eEY%7W^Y$vu@dOv z%NrnW^=q2Pf=?=bA5p}+-_&dGtCSAyV_OjetPF9Rhv^o38P~56hC|s%)ONih;e;L0 zD1f|6uS1P|{a4HCA?_&@9Fu}KzVxr8irloR`WXtc&Z=Rsm?C>WZ7|ORB z5<$kbFn++ZdM@tJ3zfYI5eoNV<8cD>(;f<*bB8a_5{A3p|8k*8quT{M*G?z}b2~iL zwx9a^Mzu|!b$TrpvqpR&-KV&1(m>_>Y`2Se7UszG)tUVtjCO+Km|qOF}}Oi~MVf-hmrHKpwhW zObxdJB!ui#5oXXbcNE2q+lSaBU9?Od7Z9qww;G1C_~Q3=-;IT~SFJn!I{Q9h1^O z37Q5NQJrVD*w?@NK=5l%rpa>ZXnH}Ak%6hFeixmPNt$?2Y-a?1F4tl}9aZDBK&QLF+r-jLK@Mb0Yo!#v90M{{S{K1=eJfBP5LNJ}mg6M7FOX z4>-#gu6#8swB@fHsjj$8@!|}Dt>SPcBW3xa>>_)IcRzW+utZJ$j8}S#fYGoMfCTfP z`CDin3Qrbf9US6y1^j?wJ4`tOUC79rr37it214N9aOuN|n-;$N2#M7w@1ZdW)YE22 z;04`Cw%uG?>rX!|T{HX7C$%t5E=W}asEc^af9%vLpL3fj^o=o_y&LhQHI zukWAx?~M{Ll05l&c|85r<_maY8XYn4A zg&NR%4RUQ5rOocwWFM)EUR@<0ew+dYn{14uJXRgvskL>4>6zV#r_s|y^8-CSwWeo+ zG%rjJK5U%VO4E>|8C-auZj)UOJ!2zfmX#?Y|)W%?2>y>a(>J_?R1T1B;A3jW&9y zY~8;F_qz1FmdDyr^2Nd55#KXC-ekj$rnuGq;hBP+r)3&fbkS#!o#2f%7iOd|mxaHH zyvM_s)EwS97q3h?@!jjyl?-Afd<EGb(+xOhFpPk9$}NzGxE6|PN~0)Y()3qW88B2UGzT~&`G?|>dQnz zD<_?ve(u0vBq6_@*Nm~|3AVy3^8^2GD|{q$oIm6t92u(v198{f@oxPWI+Y3SLX0N3 zLACC~hS_-DKv{MSc_xp5m_J<`I*S@8$o=c;}~&8Yw3QGOrH)~vAUXIZ#8;KW}W zG}DVx_}E|{xfeA53MNQJFXUy($g-gOdSJXWRQ!)OX8$iR>1>kKPrFC8G(xyI&JSNB zQjDfrpNCJ)i6W>NDf!WMF< zHF0~&7olg0`7g|{LLn!;0jd*OolX5M5s(cJRA#`;l|rz2^&j^M{Z^6qu0Pnk59NRL zi+|C=K@lH=?S9791fxw>Fg4KkaNxMUqSr~hl*uuUv@{9`ebX?)Z!O$~S+zaR9 zs9f>T>DbpuYT@wFX@c}-gepJgAH;bdX95C+Bz|Mkj z+t18eo1TGCP_fSr+9jXav(OhVnht;z5AlZzG(zkATWrHR|I;Vf)j){|JfxovWI&)L zGiGbAA|)ea-VGq26WSW28cW^%_1$s{38plbT8fn^rhK0!LJAWM&IXZt9SPVo$z4NZ zVEkfb9X$0ioO^4}%hG)xsGVU@eCc<>0@CO2=d(`^ZQUS(qi=T^`|^?8ZE;v%riGXh zm@b1OM;?N8s-r`8W<9HmUW`?kZ#HHFpB@FiYo8x?m>%r>W=Fz+wm`=UC5?>e2);bDBxgfF5|W`Z5d=} zdc>Z+g1&o@%ssq!2hhe}(T=sku<;R*{C0PMP>@+uVwnXQDYnHd0tiPIyMQoDc<5r2 zODJ>rnXn7i05EUv04hX@Y=~jokaQMPnQLYUIIJ2egM7W7O%3+5*j2a>xR?&fD$CO2_itJ*eM==gB%Hff7a!yVA*}8USDlW}SjeEhi4s&?9<@I9a7^TNa6- zM=n0U?f~qDyMOU!G1x}a^eze67!-S)OR~erq$ASyq-j(RA|{bR%gk0f^!AvZPheHU zh~W1!0@=`El}&ch=OiI4)z?Rb#e}dx{!yw-K--!QVDO#bnIHMk`ffXvel+g7HM@_6 zI^nsvNOmF$!r-HJD&6z-Ku=VmmUXBHhU^@zZn1y78@E#O=C-g^ESBQ9z|(T7a4VAo zIgA}w*shuj8$MCt+W{E8B3PF&u|29!08(e7zxxR-q5!rzSk1QFD^}3^Eb z7#Hode1_n=M!hNwFB))Q^?=+oYD9zHLuP;I5k?HwwS7u7A0sV>VMNBZ7#5U00O7Ca zVx?Hz-tHfg!Di98s|+zctlH(*bNNC*GZTsEvmu+Plj5BE1P{u*2Ro>i1ld#5Mdv;J z8MO&Qr*007Ff0Q4``_gr$?n0X9kg>ekIB(GLq2b)Gtskf*+;)uw$A^R-KiuwboRbf zWxf3;5j6~0GAkee#=?7j!Zi{7BWZ}qqwYJO>O-@UaB^=6SoAhi6hSWoT9bKL_?GCL z0R9iv>Wpcvu<*0eb@KBUa}uRBTw6asydWj!4rpRH+F2|(6h2q8#ka3H0etVyazVNd z#lC+&cgS>G{si%NuLd{t0p!?!A2y}r_q6*Rcm=qHE^dE7f#`Z3*42|h;y_ttdHdjF z(*T)-%j^P)mzznigiH(niuLrT-{cyHbuX zgwxmHcMi^s>;;~Drf9=Ua8tY~mAbQO=`BSipK;qbv?~NcQRatN<34R>XDRL|9~Rl;v1||38u-R&cwewi$+DRBnsSC<9*T|J z;O@dTinZ(Um}J|-i|v^`*b*t1E7w1XWS=S1zNICQx5rk7eUrc*D9L$3%_53LOd^Uo{JuRd*WKQoEH;urWGoG9w}BV z*R`F%^z@8Pt#78`i(ERIhVA-jSvpxiM{)@VeZJ%To7-N8D$avj2t)0^Kazc^`vJ;S zA;N0h{Ak7C9utOiY6D0xxSE7LY`$JQu%z}QEOIWJboausJ-i2dq9b8Nh4Fm;%~deu zXz@&{j*gJ#q0@P}iR{hhgi^21e6edKG-ALzeZ;l14^Eb;B1XXb_^q+=u`x(iW2s=t z_8Kdu!ggEHaytOzq=EAgzD$ulxj?mJAsTeSk$SKRC=&rfaPQAU>on!4hSORbbs4v-#_rqGJT|o zZ|eC`f0xsY2OWGp(^G*$$J_;`Cd=4)L)L!bU+w6m_UnO-D)Xy)tV_cDO=h*vyrfLW zZhEqgO)34spp2v2fzFcq#I`oOucJ}Q&nxwFo5`{UqHB?@#H(i~Ki|Sdi93FkcY!So zKQ>>|tlzNwiCDw>Y3vtGTz^7@hHosDF(Ivc^7pUyA@`ljyr0w*)-7;X4S1A^IEdKt zm~0j^psadbuA3+H)?}$lX3K0-TgP0|cy3=y8Xvgx`sEg;AA5>gwSV~C^({`CO6 zJw|<;dwF@;M3KLtG_0}THcljjv51D0VkM_ePNCn(pVhYPT4vr{mm(%1Z_HTU|5PUT38~->ouPJ?aiP z49n?y#W{o{k!GcOp=XfP*9b3vP*`pCr#`S;b8%W~Gfw?7C-;AMdcflPjkT69;5O*p zsXT1P8Ztr&lUEFWkks}1>B9K=d~}W)l^yYWw=1u>bJOGbx^S9$dIUYu6rq2bF=Xf} z7{RmLvKXCc{v!9|Y#E-C+TftxT&13qlcE~$AWpr3xu1SoE-|XsN%f|>a+3X`T3V1| z#r7tIS$ELbU7Wr91;5dr+Bxp4`BYyULo^sQXanH?;tO}fqsw0gbZF$TgJKUdQ<;1v z6mrRCZeME7P4v4do2<$hotXw(q*DcLB5Re=O<{Lf7hJqw?w%t&^LGwA zXZuJcdwjmM;AU_K3^cXr@o~uI^c8`1I~&)4!1mBk6`iiI;SH77P2QBHjN691(Wsd) z&0R}f8q|z#ajhh@XSU%&8g98) zRL~XXr8%hIE8Mfj@un*!{wWVU{c;^8?w6_anQGs62;f%3h3PGO`7Fr(7UFa^1eXnTHTlQZn^HfSIdNiW7ycKW@uP&+jpptmwt|qUs{&7F z1R^cl_gXh6iZIPN{R=P8W-<;o+8?e`Ar|&>+Wuca!(vpxn?Z2)kDMf|(;urHHQ5g; z1G&$$`DqXBQ$njt{(&OX;IZ;E7=cnMy*SBXw{INt%BAOCNgEqL=5BRn ze+UDS#)@xOnp^^4viHR^w z>(IgL{I~II1`J1}q|KLV?Oc#p$5Dd9MzDe`AQx9-Rfh_D=GS5+v``UgM%yyy_$dgZ zyeOo3#gAhS_(ykbvjAE7-BQk)MldKZ+A(7}J}~P~Q%!e-S?JaNBdH(ZBQN~ofU#VZ zIT7D910{;fl=@c#$9xMjUtk~o%q0Ku3@{|{uip}VOU>AYJOYqDcO*ZFLePVc~wX=rAD$; ziIus7oAEKxJc?lWv6)KjSFRCx7Up> zQP#}B2z?Von;BUv=6WfG4`D6UGmDkyszBXc;p|I!bUOxUjof7i5>;Xy|JdGc)b(wv#JQ6#Yml+-y7Ao%)el z*f1<@>NR2WBV%oRPX-A6MgltWX`j`yj(v+1&$W}&sSGmt4uprf%5bkb?lz9VJ{rV@ zHe>kaPub8l5kb-s7s*1XW}^IX;pS6JiNF)+5}|V;NWc9g)-3rpADkY>-CFJ7x~OM8 zMpDZ3g(6FB$2%2^;!|{lI+i2?Pkke~oGIKu+2C8)fYtTj9v$A>o1l`UlDb=2L{Zq_ zbEk(?-R-??N78HR0INtxjEIj$u9s|il6g;tNH1hYWCh-Iz5IJ%5?80FIKj>sI;Dg& z7L|!`#H0oAo7TZydBqmjxPK1&D05J`@#J{(q+i<{kJV8ZTl`%Ar0gpXXTUMsM`;{G zdHZ1Q6dA~3#p=Cy1l_*btJP;ONzU3xr%gJXNRM#E%o;=XRp^+`XIRmZxoQ{5wUb#$ z1sntWi_p10RlJl2hYalrL!d|+pKVOSPaH*HZ~H-5 z!fzYn{=;BEl3hD$G_VA~wIX~+?~k;&+H%VV?fXeZyqJmzB;ZcQ{hZ~wt@Cl**c(6s zuJS!%9*m)r6df3acvX6blIxf&?dIR}I9rdcd&}DyB>KT9mP1pa(SL^1jPQ#oP^_-OGW#HA*8}aj z1fr!6;jldAOMV{3AF2~uAo!FbULlJh*>IQ;DMDJpg)o&16ob0gjQMki3fduX;OOHe zsUpTlqZN7DPF|ARs;ejrR>y7wEomAzrEE-X$S`v;MycbiKP19VKgnh7FkJfYZdZzwfG#xd zIrCCN`1@&eI^2;BjoxQ`asrkgydfD=#0q}L<>hBxe|TxRKfJVlk@Dj^27Tq?rwxLb z`ic@H4oJ_FI`Gjf^ zRUNmY)`ojpD#?^`K;V5di^nnQfM1t9d1Tv2jLVUyrDgwrtYxQ}GVcDkQP?wUupuEu z5|->ryQw74%SCqUotCtAS%Z=rJcI{GHJ5~kLL&eMl?>E}`Dht6m7LdX#G~x)Hxm0} z&Q` zZ{@Pu7UN7U>)^e4LF@;cj1l9}^D>jP9ia2`B-y|pgRilvFJ5H)A_U`0x;AC5>Dz7N4)?RJedfjQoeqf(}z)&XPizww?y0Ry> zxDMh*vMH0^CnF-k{pa3DdG)YKJIAKmZKnoAmehqfn|b`>-6{^+2h!B2^s}c5G*hh# zM#KJd9wACg=y6Tf>AONjmJ)VUZb~iP4j9o8`)1cjELqqKC3mk(BAEBIqQu_LfqgI| zmRf$ek+^wnlKjD%F;t3!#cspeQPBRwu$ibJVu+Uz31+UhE8Cs#j55r2hI@AG`tJBx zsYW;%zFuOk*Vd$5qV3Yx%s@>?LA}vZpV|AFRB>OSWq+ka^9J;#p*wju1|2i3F~|Dn zQvHrhy=PecK{hy5)LXHQ+5%~w6(|sY2wA}_9enHz&GNf!8S_%}_AJrHt=b|-jG1s^ z=FSXp52+VszUv}G(C}+zt>8*O-F-wcRRz#(8%zr!s&x~jW34dh;3ktVLCc5_oI9T2f4}j za3p?Q1A&@!yIP1<$Foh@=p0?p(LFX_Xn_u!a$=u!k-Vso255o9gF4v+99|s{N`4&M0Yg)9dO~JDErd85LA6O$i4OSQUVHlh8B|7v{mwW8&|J zr%jU{+CbSV6dr$2`iaq1xpn9BDz#O1XCryfINMJ%o_Mx;I4aWs?muZ>e=+3_lBhnz zykU1h8v4`GS2pl8u2qhf^{tkabC!=bdER>g=D7@Sndj7_lsaa<(7e2Do_;*j5^L9! zv&W!eTYZ8sFEph&D&*)Hy65%w6ZPoS-83St@4X1&EMNX!;+w`=*ub`$2%qh3EnRLN zxgMdek8~cao*4^w<2JNCBOOVqo7!oH&e%5;cfA39eJtie#J@VTG?W7s$|5%b= zC|k>vzTz!^`T@4xP~S#3aTVWo+4UYPdm8^p}|%OwQ0JsA2?FxvW?-P{cL5 zrpYsrM6JnNrPf`0Ugb|iUHW^-=|6v?y6TD-?o2oi+VIe`tUQM($*L!y_kKUYaqQu0Mny)d=w~Yn zwFvgy{q>V^QE--TwcL)VEr!V=f{}kzHk4{ppcZRu7npNk!0p)*Z znD<%AtBly){dq~9kYnsNhMHD0rkA8ea{Ac1@KQ4L52pjXvT2Lu6(K@h->m~mk! znN^Mo`d}+1YpZStI6}f?jUoaXgX$}%O%aeAbG{f&P%gD0qw#dYyYuPgKPJ2lV2J;H z!b4T)d@fHm^*Fs0Tv8!_O(*NR-aFl90POi}H4e59^Z2fKR~MEq zOdzq=&5^@fBU&<r#^wIpjD*N=}5W-1xS)hY|PD8oqXJXk5v zdHaQ|Qr=c+fvFU_=~HOxn*VcC2YSNqj3862Bq@Kc%c9y)Vl$R;Izn716xoyU{_&RG zw=)+R$9FeoR?7?TA0pDCSheNRIul#xThjjA!{vX%p`j??px*AYaMN$s)O!)^bh5(>d>#8IOL?^Z$=|E81D?z;xV;E9@4N8C_Hn2X$%`e<9P^jCQURa}Pwb|^ zRDk>Cy8)h5QM?B%#Oa5v)hreG4q;dBzt%AcibbDbbc;bZqKTkN4j+PDv215$jZ^c+ zKrX*%=Wyq#b+60QW0oYa)N>|u)x*0apEKS;eBL#^Rv^k>{@!HHQtef(uGHO|Lut8{ zlYImbzTgEy9VrTh94=AOJp2j&-J0yTVedDHQI-OhkLy{X8!`Hy=O`KVbArmXx$Ffl zpTkEZn@^4pJes{X`-c+Sa^!<2ppttCJJ&!!Ox7xr2UoFUzE@Y__g?pr6OeFM&$(_4 zc^$7V;h{!L4IANq^=;?lhS>U5isboos1Ljo6_DOjbi$$vi$}^D5pUP0XRo2{{03}$ zP)pq+7(No30f^~na(d@t*B$u`;`wpz;+pruQJ&s8myRp~1MC@q!*1i#gb1~MzSG|h zMpK~+go@-#J!)N@56H|%COugCC(tt;)SvC2p5b$UonZt)xdhPAazqZ8YA0aw- z@KQLg_938r+t19+%P&e9Wz&I48#mfhyE#H)V^GG2=>}4Uq^tFPxsN0!kcEBQt78MN z?cr^Ar1h@6^~i1k_{Zv9s(=*~&kZNbm{L+CTpS6m88!0E1uX&60?b2lc8AYCdnw@! zOUyt-UC=?JuwddC;W-bwf~tnCHy1Lc4lKacFhA*7L7v=TYm2K!OP2hdtu(XrfrzL6 z&D9UMYQGXTwH$w9$eonNdz>0hL8p^4rY%$YNe6aEj@vIHOndw9_pWx{4wkqNav_LQ z^NAlnk}K?&W3Ayv4)PGPQQcdA2Eeii_D3PdH4juR%lz26<#Z-1SM|Wn2>g#8?AI{4 z8Fg^Z@kn|?^vKU}_4nIdTi7nJ`MT|)86Q~FEhBIc_#J4lTgb(hV1e~}jwB$H;;q3~ zZx(;_?fQcW+iaEB+tN;D*E;8L@hQp}w5*T?qZDY`~RtNB$0o_c8ayh7I40F*0Tx8yry^rb&BWhW8xdzEk2n6O~& z)4xcrcq>8j;$Sga1{R2Dx*?`1-@G~6llIo1XOid*6mxNE(ie!tT6nQ;(}d4`aBr zzZ^XLvw5cneF**MIT@?(1iI>b=+WmXKCot5tbkwR(mv4xwG4QEu@yNYF_EP^8qJgE z3ByO|m~%3BYWb5yE?T9q(x7Y}9D8J8nTlxgx~r@VNKm7GU0fA$3ons5T^LEj^a8pxo3?ek?^Ve@7eMI!pD*?pd{&Npt=n{D&A zH($TG64o%8V^?(EnS~v%;FDxyJqv-`IuFlsAwBK<%EJ=-;t9)S+Ia`nO3!0K>6@Kx zQ`;7$0>&dweuZ?-4;6a(Ysu5RKAS&TabnHO0KorJ4+E^>@ne0P&zM3+nNevC`J($ zXf#c`^m0f_xA5>*jL@Up#3y^Mld@|@KU987Y2FlOp22=J3l_!#{C9R#d>e**o$*&p z?@bv@_ln&VVD=r<$6$@q_<>s}>zP2bCYO@)Ns$0;H>WRX{`2(`GZT83g0WEUkr11; zW);HRt*K=>%9Ei~2O;&MTuORfNZ``mf9fpUQfC*LbUF5|B>Z!EUG%7rmm7Oni)B_n zgv4GmF+HsNn6I9~rmaDAw^<`)&GudD(|#DB3Y%ULP1@zfq{Wi2TbSYFNS^ohJK7n` zvn=G#@dt;$-E2Ly1AJ+cXRqmOO~OL)4`AAHl5#z}koo&y?xdVeD~lHYNte{kyOyz% zIOHw-W3&qeuLs96y(T$ntS-z+ZjgHPO9MeQv@_l2woIjsPxquD0+CY%;G_c|1eon%u|WfW3lrI+C0yk{iR7ZXQ!T$I|R=WO(R2U1Ued&(< z`9nl!voSvfE09}YSzRGW4d9=;anmx??qWoXpydONObLBU7fEiKAjcb^HL>GuXgOTI zm3sac+$dTEo=lM5G&|+mPDdThPkr%2Mhi$*AMdg5ud@F)yFxltE`v_ ztpnZbhw|yy_Esx25fxJ^N~@&o^z)b7U@QP3_G(e;dmA zIX0iLpNN$yCpmKZiySl6nfmni%xEWkU4xgfoM=#%AD&(DhJP;OMFN>}LS3O8yGpZv z71Ye3+l9#UoRQoJUOTE|-YJsVo#+u>s+Rw{%eupkFA?HZAZL4~&;3T4d~y&CnbIy+ zCGG73S$CZJd^;KxYaoV}+Bue24xBWogxXcgD0oB8iithul5wpvyC1TT$8DKMa{5T( zr&2y-3oo6YOv1`UvFiI3cG)cVh zZw=+(qr)iv zz*t8ZzllUPxCkDmMV;NCN=LaRH#`Di8V#m^b=lqHaovFZTiG${A-rnxF6MvEf&mQ* ztCHKcK*gH+nVg%o>zO{w8|PTU?x;l;${C<5f3MA#B`KxAmrxlOiB^EuqL`=hwSul^ zmce&LD`2fA-hR*~qGw%gMGO9&b=8pmGs)jdg(JAnig3iP;aiBmQw{n`cm(>|b zZ1FZZSY7e0Xxw3joN?39S}A{J0nm2vaHe6I;xfJ(NkCVrG!kB7u^i*4z;EKGiD8Rx z_hR%7SSyw}sv1x%luKb{s^=?~fq%1>3t!^w&E%S4mg@5#axPbk1%Bh_!c4fzi=D*$Jn~A5R9Y z9aR+_Z+Bn0@C3^=IefY;|2SXHcCZ`{iiKgnYGRMz^^p0V*)z$nOUaZ8J|~lDgp^~% zeX>^xV!6o!2d>hQ3OR5w|2lC0|37g5I%NOfuWFvwAcUGLDa!Iu6`_fFR#;N@BF*Ub z6Pxo6bY`R1F^56ZS!m|7T!1kS>(@#bV5y6ByO`5p4qg#Clv3+5*T!!YBKLoNXZZ?} zx&la@Pgx7A+!|71CJ$fn|(8x88SaC*LMLa7K;>B*faq)LlIm3~1N zS$iQmB8gBOa+~KN8Q$|#`@6n-?`QAdT6?YckN3CU{rvf?^*rv+HJsOZ z9>;MWr@T41Iy+6@-_?lrXdw(F*|K*ZePM7t8pqr~cV|=O&-T5DMz`i7}QJni#snQQ^xOY@2df#PPw2`ZmwTH*?wm) zJ2}6zml25<@`=SO4YjB@9nVLAzZ(MO9;4uOm$J4YxDu~%h#8mCvZCnD$TCw7+W@8F zG~rqk)rz&T+<1Jn0A|yANmy@IAS=7f%gObW%~>NzGw#lzHIkuxgfh)Nv}imEC++@@ zff|8Az>Zy-NfoaH+Tg-XnT$VA+Jiq&nkjXB=k2N>&QiXmKJhvF$Jl3Q60XNcEO2_m z5DDz}=yr`@)~DeMmq6^Yjc9_p9~m$T?lP&rMRC9mRc8KmhwK{}ik!rx{G~TK&&Sg> z`MifgtJ$~}U9xVMSxDlJmP+7kxBSbq&Bq@5-3eF6jN#L)oF~wZ`boAlc*TAiFD@yR zl(p0LKXBjUU<(`ypQCfH&l3G)iM0)5@Z?RZryuwM-0kxc8e1w+xl|pF=*NTVkav`i zK;Gdv%8%q7RNlXnFA-9QDMpM2TFdXNwSKuSP3s?kwvlW|pfzoKTLr>I2nU+z^B z>=nJbhqq+_xHpSwFiLr0w6{Om#Jn7{OW~!7PMcCzhWloY_9K=40X9mpocM;lZF=rW z1>TwvbsVK3KQM9r`-C*8*G)3XL9D#y!&GkNQ#i82FAOGv{^gMsfFmoOG;_`V7;1(> zus=1G-s};=tN6g*XvP32an}R)PiIt^Dc5_>u3!;MX@50N`>0FnrNGPQr>V=VG6G-D zw!GhlBupv&Y~`aw`QuSb%VlD`T*8NAbl!HuqFJ&=3C|Aw|Kza0`u`;C7}$*k90N1V zQoo#YifgqFGB)bG8`$K$@dfFT0Wi`*GoR)^2D3jk9mdUwH*TN|5L1r0SgtJm`7YcV z7jKod-&-O7m#turZMY*a>}Km8)8MF*HQzT?C{$dH_pjoKoEUt(SmDeyJK|YexZ(y# zLlU{2-%4Ep3iP7!_Xne3hJ!AmlURUS#$Y<&xZxT>k7KA&^f2rb-x!(br%DGPwhUS`2GGKg*+C8)ZLM@ zd?-w|j@clML(qiVTi&{*-Nxev3GhshKSa4AFHzfHVyFhIJ2$GXcSK+uB4M>}O|=Hhz3P1lnc@9*07R z?r$;JI;W{vguzP5UW)fe*|BRK}Kp zofKv_6AXqRyyxFy!aTvT`cx{r3xgGvyyf}jhNyoP@>u7XwZdwG2}l3wp5jtek*U>V zO4G9g7lQ!9e0k$&<9XND1VdAmLuk>6^c}o_>s*PHhwc9&%q~^RNsbdnJpAf;NmHN; zv@#sn_v4-;q~kWc&?0FPOK)1TL(?^Id6vw8hKzkeWpDoA=l9_^RxLA=`MWM=Qkd4D zZ%0chz>s@wnhO{qj&7#t^RZkEFU@FRhIbZmDGV)gU6w| zYSiMo6{8iK9U>jYS6D`4Qh0{Wy z#b#w|ps`opq8%Z*QY&{j%XF;$iC;CW44j&ZkS9E=fW~*|1^egOZ(Z>@NhF?oE?jCf z+^Av0>n}A#$Jod;jqjdhw-^pCXe^wD5o)x&nTQ`1_rWJlHLy_EhihuG^=Q5tIOs%k zGCa*BKLOfVFF1t7AX~gJRWd9|h`N=mhD3$rzmE!;6@x^}4q^_^!S|b8>>=q1Ba3@C z<9{Zk4$&b`I7q7$_qB6Z6OFB(zMo?z{EbyJF<56cpca$G`gWbx%dEhjG){3ADrN6B#7cm?{<)2`Eei~x#XLR-l zPCL}mewW)U94}Xg!4h5d$%-aI7_0#bn)S50=7`_n zZ#|=sopvu28;!m*Slq&KjJtMxmCi5BAlv)z=x%qwim~*afl|47SSc^%kWJfRg ziI$3Dvg^m6Ib*Ot`hM0kwg2uar$#wkF&tG{EHdkdCeEQl&E1fbQFn8&LCvpPXdMrn zzvyj8%%(}?U?bs(?;_Mi`gABG03-@=eP<7~WlQ5+<&z0VF~mgfPoy#RSur8gR<$f- zAz!Noox7$dMsawBK=e(4W1Qs6~W?cr$?cN(kx! z2wQZ_4s)0#GLGJMXdCgK&Y^VqFq0kn1!O-Iz8~|*kN62`1el9>(nqqdBoSlFg$PcY z-#Mb{3G#vPUW7$-nb}7(!E200^^p~ehpA1J$Pl!bCM=5^%xsvyo9z+{$!o>a`XYI5 zivD?vkLRg4ErE}#rH4G9f=ch-nY?wu53s22CE3w?l9k1i3!j5lAdlAnwc6O|3rR8g z!z9(y$!GZqTpzz{)i#>M%L=^`yb}~%oGnC}NnY~e^OpcIbc7o~ko{ZS>vi>9hJ`{l z5^mFDLA|`w*#j50?bCeG{h2)b#q;0iu8BPH72hfJ%_{Fmb(J~(*_RUBqd;vwB>b() z;8)X{1WYC$hBPXp*3@KZ({n0 zijbv~hnZ3I4fueGc=1=-hJ~gF@Nqjg9_~0(5Qc)j<(F^ka6A!pd+U8mOmw?r6XWQunN6IDJQ8xv8;$8_XcbdD!kp)p z(WQ5a7fFoNL$jH*6@8Uu4qPqIxb*8w`)*x(hKss1Qhj$chk^y2=qRMyaDdWe&FJ)1h`XME%NN`<)eS zdyJMuQl`zDbf^x?7{5`i``2m1J?`y4al&dA<`vilDsj)NWC}^$&Hj=v;+X$gkYZVC zXJ+a9Dzh+h$`Qs36;ot0u8cReOze&C9YSf#RX-9kGL$1q+ri*tmZOz%Ma7@S%lGDJ zNIDt&Xl73DMHi}K4o9@fpVdHsJ>jK4#h5lAw!;MFwc2BgS#eM9KD;aYx|&<%HRA|+ zv**I7HEAL~Uu|Z0o(f}_my|}&PS_w%_=S5jgh>yKhghhL*Co?)XH*=AbLWC0*c~8E zolGH+cvjO!b-gn6)jsIO4PrjsWaanMl3cFT(>qt_GZt_5ED)P_W`D+SMvgk!ZkH zu6?-V;`s6M3B$CgP*gh(gKxi8rOF6wZRE?kfCAaMbdTaQNErhz{hi`aq~nI8vq&^p zvx@wP$yxp2U97Zx>oE3u62!2xvJY+US&b zS)Ve4I)ii)MKRj!KWaayAuU3K(yXs7n6tB}eK}Lz`OT^1w*l0c*y^T@oj+Kww)k4D z|O!%hty8SAG6`p`>y$7Y{ z%OP=#E@%cXwCwj=m&DQM`6Lt0<|{ZRluxrPJAJJ6$GkIcX~SV)RL!{E%_U7BvCxy0 z{L6>dYvo)`I5PsDS2;aSofXF1&OF0#wx5lx2(>G~QXT-Vs=hQb&0a5G8)P$!DcwQL-MzS>R)m++AIuNmitrDt`DFudOfLP{t-5vJ#I|@FH z4*01Syj3c4R;XCRuEY`b=K*k8<<|#s81hZJc3>yf^*rBd{O==4fEqiYar|a0(QDT# zk0UE)W-!6B1<>%+*Th$vBp%2_y&lyf8~#*g zGi#m@^@QAK>R!Qq8~=mYZ!gQUG+6UO6BJF>O>#L%4CnhELn>-)g?EcLH#vMzOLjOA zm$9(Yqwr0d=6I&Qb4gXADJ)`w#kXto1vySnE+i^j_}-P1c)PxXcyxG!CBBF`;`Q*- zwR$Xn-WVgfuTnig&cRWGrwHO;jh#9crK`7J_|=)d#2go-OG)FsB$UYW(_;I@;^Ggb zZrAP`ixY~D@iM^^3*mkb8Hc2sa!@d$wp{g?c_rL8)KJAgbRj*r%aylbYv61nZc-7c zgVEcpt^a||@N%Qh=FJ@%po~mzUu-zZaHsv8eJ(NAWRT2&7*aE3rjhb%`nHCkKqE8@ z^-_H;qVqfdapYN9bF_-tbyK1H*HHytTi2;kmyRYyjt@4KBur)YG|F}D+2LM%aW|&R z)uHz%1{FzMug#^VfHP2*PR7d3PZjA{9{l(_Z3Jbu3Y+#a^R?j42Lrh(s{Gi~t#cs9 zTw-ZYzJy^oLvYX;N#0{2&0${ed_Xkl0&SccqfszlCk+bft}=j3IVXRKj&+2j+ZxSd zQzS|VgvOWQ43m|* z+oaYflD*YTcXl_1`T<2VT1aId@999pRx)25*ke3P*RDl22tjdJexo=v7(kVtjPm?G z-9YyIZ@fZ33Bn<~6k>0U9veuWPZ{#W;gLFM^K(IeJwW8ZEi~D^>hYd6aJU&J%Hxm> zkU+v@l3LYDSo|yF@Z-=*c@Vlsraf=2|tJ-Nr3&Y<7T*HmexR zzQ538cF~adc381Ns^Vir07B>il&k<9j|Q8e*b04Z`GCl!QR*YY+7SN zLt-P0j%Kyl5~LwB6d*dYiTSByiVbI8&F@)BXli9QBTR6Dhc)V7Jgg>?l{u3$VZsdFWO?30^g z1j(2UQ4MInL`2?0K{5pO=CIerw-ujnf8c89cDj8RkofQ)VQNIipNtV?1iXCd6N0m1 zlg^)N!I}w%qGJ9f$po8Ye|(Q@=pxiQOxsY(i&E-%(_n|pGrzWY!$Nyh_xx6scvB@9nq$xW&>%5a4Rt7>lwPMb15!%{B)#n}sOP1UtG(+*=MDR0*)-dqN++G zZH%fKC$zR2LV`iueubu-nIn2^Z?VYn980pih=Qa41WS47<<8#aYS2MGA6W+WVUZa z2l*ZxhS1sttu8kW7NUx!#OgD#4M)s|NgtM>me)$QLYRi*gE^V_!+Jum57RCcACol^ zN=X$z1;8$!EBl!9+WCYYv z;B9tM5PG(W_ZY-!X58N~5jJDHe{su|$b+!pFgsFRZ|o=_$GoWKKy7u6!* zbpm4>>CL>}$R}O(o?*oVbM>5%Hp`h2UL1v#uT~HSUt=D-jq}AHolKW1>-RLRBQS_4 zms@Hxz`sT1c1eE+OwI0Y1jq+G72T?L&#U@KXW`Lw68D+KC^uF};KDtbWQ%wXEw}EY zAw4aTNsblD7Ck|)Cbl+d40={8C05!O?MOP7b6I*?%?3JQG+xuW)n+NZkk6>>Kz?b!mSL$nk}Um))j{AHyFc(u4y;2ZuK85h6EN|n zHTqIJ8@-ria}A0+HRtw+nZsLVT{@G4(ipzlFOTvWy@p;03cm2!$&CM+O059b{3R|N zkROLtUR`C{8rg15Ox(W!v=n~APBVroFmjAvg1R2=c;ON>#15kya#dez*f(iM0c$Iq zkVjpL5#*=qo&-CEl#Ta=%}@3HKN)EVU<9PLfH91e*YhPp0X-}GYaKg*(oF%s@@-BVu5hW>P` zNd69t?xmt8AcV%7ycoxBUlYc-IBJ}Dl-^q3>(O8nB#yzxMDS!Rs5ii{(hlB*G29%%>)H`d#1(r$}A(Tk8g831f^4}J-`D{sp0FI zzK|#exXZx-&Y-f&c3NlQHW*ZKj}Echk5$1H(j|^^<;LB89lE~Ag&BdFY6=ya#Wlq5c13nuf}K5!>&*z(s~y7}B( z6eYTfGO4f=A(GxgGg_0LIz#@eS$Jr(>$^GaIY$^H=Usz&EU67G;==y*2<}Ma~gFdY;99C?|C7Qow#wVT5N=$$GP2liH(+kov=HyJ3#Oi2?{3N;hI36R9 z?a^>#Z4&>1-u#1+z}jTK%zQCGOF99_y(@6|IX4yFpg4VdWv{nM==9zDtgl&!lg3+8 zhrWg{GE9v#2_2)ucL9R+rSUqUk~X%{*R_vF>opQ<$fy111!N`NPszKk7lu#irFK2I z+al$r>MoIoTa5}_??JYo=3g@ zEu?Zh&mJe;2sniQ?{$hz;H~t0-${yCHa*NW`y3&<@Qg8?&O9Tv)5SrL%QW{|U(~3V zBAts92%B|)hIpV~x?)nWHZZNPbKm>5_+tfuH*4*{;1qB9vvqBM$u&}56g=q}C+mIy z+@?`M+8xu|XYj2t9OJ5eGV%1qA8?LFDm_v@uaK!-w5n`Uy3Hac!OkqM;@%0TAWvlQ((RIP(rAgb%U7t3Ca6ZI(gVP$Jnqjbn%7f zNod*0WwHJK$XlqnXoPS}RT!C!h-dnRdahwhbQ#|;=#iB^#)79mZGl6)%jud(?e_RI zD}h9ko^n=MM@%A2z!A1Wg2=AGWL*3U!dHAn8T;RVC`q$iO*FB4(J4H*=^<}-E|~Z( zp!)IBFotdz8q2dGi7efE$v8ohgrFw219{jssidcf^6BKy8A?9p3hrb0)+W8ZIxW*n zd(IqXq+lz|j(gq3GH-19;D?wK$fc!kUrk+L^o~_-6D5#1xY0sQ+S9kCT2^aJJZ#|0 zD3cdD$4!$|G624nrCu?0--HcghUFCF4kcVMj9#kz3$dRs$xDx?sidEXoZoXNn{L@_ z9H5I^Da(R9J0q8S?>Oc-hUEgy&ibyvl|{=9p)Qi9mW;hkifK}mSgg9Gq9bdjA6j9$ zYhAWM`Pm~y`%C8$KKH@EdD6J6Xijv%-B07(vajdw4GzJ~l!5d3TSMTYNPW&8eb@Jy z{+2cwF~@8$Zay;2XFyJA7{Wg_lOgca_cx9O#rLM8z|n|HdenT-%KuKa4SGKIoCc1$ z&S$SC%}P5Iy~}G*nW*xU<%>>w4Su6wtegpSlhCoxcdVTVk)@Uq=&&cg5|m_%)YJ!8 z6qIn;{O{xj1a%Ho`#u{Jrg@FSaHVqndt~lgX(efwqUm=gy$BySzY^82K+^2{U9sYn zuZi0MXH)!#%UPkM@dPK&Jl|VoB$cy{vA8MFVad%RD}bTQqwu|JpaRaPZw87p6ptIV zwc>;OP9$Mr4skq7oq9mvWH_Hy8EZKdVX99g4z37FKWGxGM_W9G-QF(e-+{R|-J`P| zX^f}nUp$yUR!hJ~pR=M_f@j$YB9aqKNOigQ@iaHQ7ZN{@h zvI}EcNdmIS%cpZ;Z7j>kvHAv!+J#=x`}|Oz!556&0VVz$?nbL<;`148e=DkNu3OFhHVy}*pU0n^@dU{J*i7iyeXZeO) zU${*nqwoFm?=uHCGk1Dg&$DThpIUaPf%Hq!&IA?Ck>(XQZkOUZ5bEnPdvXP`MViCt zX1{%_>oGn1Cm5wN=f+2_yE7yZVo@mqhIl2(mg$mhm;~rrV8L-hI=}%hYF;ijYpS=! zRsDV(W0ej?4cC_dAAbjpg`WDvFM?zO=O0F!uFIV`IBI!N2r{Tb-j-jiCu2^pwJ2!4 zN&ozw>bi^7XFYtaHY>E1GDjrO8P+Y@*3X`oLoJ-|CWle?aP_nVa-@Ko8wd|-{DP(LK)*xCd5aCFAJs-DsA9ds

i%5Ff5z5{J#v$bJS)IY8?-Ks9a+pPt)A_w`!S&1zt`M$R( z_BW~(9roqRje)50*mv#+(_wxoGk&#cOwt3pW)~PATxJY7SXVK;s5q-@!xl&&x;91= zK>T*(Do)KXrHP;m-((Qqgj@j+^J#4r|D9G(%b7ct3ziRz**#C?j}zvD+dxj-)jjiv zPlf~uhS_8{ug=PDwz@vSeSO#J*{LlHcMXF|yY%)xr_7@Lc!|NI8@i@gvMD)OC*uhM zh5bhN$p`tZl6c4@9CQ8Fx_^h&E#jLHS5ap>Jhi@rmVHoQ6{z2aU>1S-5+oqXR5ZI_ zF5aKR^&mW$ICsk_v7tEs>oATM?QGUlAav=^CE2rS-dzZ@Y2f-AD#$JvP0r3wv>tIz zE2ahnMYa}KFIEQDk>6_c*4Wd*k!9i_2<##+Tfg`2?Rk=2VTIF4xioH5bYwroRJHC9 zHIR-U`0gD%X$-Z}%@M3P3iA^ zvQlB*3TrWQpKtSyi~syamHBV7FPxTZ*qFO>;p1bkZ{w7d^yA_A5HD?NGE(=_`!DZjkeIem9VQ0 z`xRm!@zV%3FqVpfh{KD+i zDGmUXmXEYdw~Vg3L#4ZRs_q&ZeOh;lH>c)1RPV)GUZ?vVX$YX?ji##Z{BYyB4T2YQ z{TtO^4We0bTKZJhMc9NHZ;t!KPJTc-F~;50=G#{iE9_Q}eRDWFIEZg6tb+69PlB%SMb z?CF1Uuj&o0=_EOV+G+n4wX2vWDygLV@u^Mx;?U!t{2h_!$a$S8r%(FoT7A0j5Ha7n zJDM^j*Pqc~VsCip_b(-j=Fnp_Oq5+KQ5FD*+Yr3;6j$V9qs4#FK!3>LOQToiRN+^h zww3Ndbt=Z|5`?Fz6vH^l?N{BUTbFs?6n6MiAy@6@|(doc_MZI%DwkpE2-jY34x zt5qPmZv??3f~n`NoJvX1aGym?a)^SN2tp4W#_8J z;|A{k{#kfSafC>R8-4npMg`iqe`r*=T)rFfjtgl?@DehwmILi1&hx)wNdIA5*FSgJ zg#W#6@W1U>|Nrgx`{#oJap}K3e*bMM{eQQq^uLGf|Nb7o|Ic?W|M!sn9}bzpK<3-E zX8d7oMm!cDg|h_}!dBLzkIyGIZIqX3Do1 z^5up&>&Al(wJK;yVE>zZ$>~SWi~f=xn7QNxV-{FG8ybCX5$vGP0e`)z!ctH+zw!k) zh_~5OSq5>?El$Pq*KTnwnL{rT5LXx8256}k(c6FLcA{~t4$%x5HU7xwh&I3V9(y6+ zXf7c8SAlE+g$8SJK)2%K*alKQ`xjhKQ?qz^lW@$rSjz~YEPACYf#$9GoE<{UlpfqV zx6+Kyp9*cHvO&E!c<7RpfV$&g?~~|6^DDixt_LPu3A!twbW; z39>$8H=n;eAAOnCDFUEFz5CGSa8}X0h8-HrP1B*lTuUkcsw#Awg5|-7x17njSGiHd z6LajEsf9#W_P!K;0*KliF~%rzpMF=};-$|>h>BkG_F9Mb&H^_ms0t&2h0=$V)srEi zBVywG)u2*oH_=j7KRSvDo}m2-X*a&oY}vU-PF0sKY|nuqcy6!MW)G$v0Q+-Dr-VK@ zd(@%2GZ90kA;4=BEz`kAlUCS4yL{S}4r%xKOr#?vs&u0&>zII4edQVG~O&AcRVu1YB4Vb&wmUK(r`5;RR8+K2`VEMd0BlCknVgT zFbnYd#yZFrXOk8szk?Vi3}xJY^#M^op8vK|pL>MJDTYC%L~mf%`IKb=mcZMnj7V*T zJ7@*|t$y+Acc|u2)&YdO0i3Flh;(H4Hqx*k{cqQ^dcsX|8#HzbZEp4J?F;h-8PyEg zvl|Y7C{Q=>-tz{qS8)`XjrO~9Hi%Hv;jNU#C&rV>^2;6-9+YDfnV&4q4P`8QczRG0 zN>J+;CvfG-1nkdqAR?I}IN&^}GNj|q>X|~}%VGivf6@|If(0OQV#cxJmE zRmTke%2xSC;coTS_C}b}5|o)V3ygsd=Rgcjn|_?{$Nf#OC7yn%E;gk^2{ zk=0XD_=)Z1IR%zqQrsIIoKL^K=pc1Ox3L{Gs^PJ9CFdKtcBEDyRqHr-Kwfaq(uHQ> z1Of4`El@Y`T%J`}*)8254M1*vf0IlMAjW8xhD7fk*zCD$@sATP-aN2>4vfslmdTDZlmpg60 zA}o3dkdN~E!G5+ajuHA#2zn09$z+ci!AE*)l4;{icc~C&?PeuRmFCzSxCq?90x(gA z2;;cFn#WV^2o@oBU=ebK;l(K~4Y@lhIB6GGvmMAzz2toN(R1&u1dJ)7FkEcb(^EeR zfM$~779zo6aJh~SGe?+J`vxWZg-Y*bX;Imc`$qG=|0k>_| zKP<6+aLSSFyJzfW)g7{Dn>N}3KRnkxp5desFC0IaHx1BC7FI!2&kLY$dva<8Zf(D6 zDacROjponBf}hGSXtykZPV6;@Z6YbFjss!v3UK=NrrBgUQ68QxwRmuKneU`fcBCzz z5XRWvqgL?beHv~(A+-y~NNKaDou|fHvkX`|-DRLXL|cq`!9WDjCAQ&A!Yqi_nlL1- zaE|^g2JB~TKOv-b>=j||XD_1g&}_fYSa}VyBMVwKw!M6rvU3Ekj_>)l=YTjM;XS<$ zNP^O?Ah6M$sS`k1sI7kR2?4W^6AZJl{Sj`^nXf~4u@Zf40a3(PW{*M`o_%XBKQqWi z20U%>l4n^M6S%l2rJv3PBc`=?UjY^~K%PN87-()M9BM38N!enGh?9yl4wvk8Ypm!) zanb}YIa9adFq~~A8J&%m)cm@7#sy}@+mn{ zJ*f9tQo}*%)*PrY5RG$=W6!OcwL5^zP-_H`ZG83=94i&UocIE?j6sf4jN!U=5}0W! zMeQO(%Mcy0V2;HvO<3{4xWBIW1z7QMiO|OLui8amV2?LEfLvQom5^rtY#Zc3FVWWQ z&XS!w?VNXQ@Q;ha3hai1a2wb*P?|SFYo$^$iRW;zggi=D0jm$$S*+N9^6RN7ky(Ec zqVQf|cMW+cJ}O87?^p~Fi_+i=D_aEyT_aFc>;N@+XRBF?O&OySTGkDkXfsw;+IV^oAF>7zB%2 zU)|3-0vlrp;&p8V_=@0Z5r^fxaov_sLMo|khSj)h8~&p(Hv(ce!3*7Rf{RDYeawMh z^!)kus|D=~$YDY*{8J9&t`=bZ?R38Qd#P3z7SMouA3npH!(YLBN9+jjw)qIpq;-#JCw z9epcW{DO4Ngyi)S*1BV6&=ip7Sr-()=4=b{bS1O0xX65~C#1w7&$Y`p17<5-5` z+t%v^5^Tsj&gG0QshtU5fbP8Ch72e$>ec@oPb6ms84i9GEJ!g(G__>O`N}(4kKF2? zE98UikZjjK*$(*>$*c=3-#FfX?hETU3{T?g6<|yp);WeO0g%;}3nelDy+tx&^YxAU zCX4PUotNbv;GgW~EQ0#%56%+nRD=AQTb(^DiwJBY0yY*1H;1yO*7d9pNIlPlK0el= zj9~s1o=I=ta_pUy=W%Ux?&(}{_-ch%{jB3C%&BcMy}XI~+37w3ooJ~I3%83uLvLKYGiZD?5s3FJ!^wms$z~TtZ9YB-6i0Z3+t@V6@&Oqq)a-4#t*@LmHaR^+7;GfdTjd_2TzW8o(TV z2$b`-qV5jNtB;JYW_Osm2+wrMN~ss_P!`K#3yfMF1miG?u3x(V!W9ee2#h$Y z=h6o@@8;tG+F?AR0=hk&#PlYn215sZNrkEMTT+gZgg6I>v&XU+yoTp6x0QlWoL&`2>uea>q=tsahhtjaDJJt)XI2&`I-Ge>W(H{3t9XO((Hx(zdF z*`$3Z_!Eo_SsvmFVc`%cm&e_I)cg}?yTG$G0V`L8#EWx_6JZs9X>M^y5%vg%#>OPg zoNkz0m&_>z(mEm$X#Ah9Af6RR5_5SiEx~%6V~_Q-Afb)me#Y1?aO$8__L0i7``64& zPY6|NocLkp65V_vgwr~X<3!*yi?VZ@#M>dq6B}$F&(A~%9p(^dwKzm4dscd2`<`r* zHeTC}ImXS(t@R=Fz4%_f)t=+XO@Nr@^d~A`W9Kw#PpA@B`AfoOsizqjKV5+?)BZK5 zN)st}%~yD{Uv)elyfflB5#$CP?CN|cChm6Lzx|X>^Gs8wT3=aIsL;XnJC9IGSwk7p zPwz@T9l46mLg%PoIz6ydjL|x1477;4A@Cy;&*-{qm4nqA$b?@d5<6E^BCce%JL?LM z4P+6oSchl=b=t^L@H>3oWzsmgr1wQa@}qZ-){a#r4N9Tlt>SFy-tpCZ*G`KN&jil- z>L$_C+MIa1k3!E0{8-b*lljKdYWd10OdDt=i2z;)Yjm3ro*Ys#ME;Ozz2%INB`Eva z@;FJ`Z`DyF_;|G8>+u~wHrv;#0XrSBF9WT~+@`yxcyGiH3}(pGMjzvnDFL1~pE@OA*4wM;6!DTkB~88V6K)&LuW2Et56rb?@O3j@77@ zZ7!nyJfKBIMHZ|^%}V@c*(hJW$2qOzd+H8>NVH$V$d?_zVcr1%%~Qd%?7k!vly8?C zV%M4JiQmr(gKu`OlDmK8s@oacF_3v|ba~;rv6c@do!GWlZ$6gH=WDXYR>s7}OrL^P zE)3id2OGP&0ZJuDG$fl4y8o#Tk2>`-EPBGzb~VvmXI>Z+j_FMMkSs5ZIRI?}2bkCC zMSGh-#J?H*IjsPv+g>e*FGJ0UJ`Z9Z$V7ksbNP2RmsP^84_uSpDdd3}TlRUMXq+_q zMVH)*eqexiZDr@B%w(Ae?+ctXEqQvOSwCOgQF>r0EgaI?R8UzvGybGSqnrW4;;NpT9YVc>Ue3 z0T;XI62~rKjQW$Y4_buJ`r<$x{=D=uxRl)x8qD1M=S-bKS;6ab`gy+^{|MCrStEI+ z6|)gG(8~raIikD3A?}%tIThUBb1Xh{@U3J2@weu{7D&)>eE^fx#HVlXFKGF=XsG4O z+N<_hJaEeN2W96*omZO<>}oPB=|5+>I#622QhSICw% zQtX_(2j5!#AAhR@Y(cMLcXqW#jBtMdzXH2Mt`5{i zGD6g)Yb(9Tx90t)->L*#;4P|~C=Hg0EIxp9{9XDzboJ*&NA!2k`S2WAHxVH?&P#)_ zTu%ptZEN6QZSaLF2I|XqEQ^=>e5fh(0uvvvZ@o7)Sa;xrro(*$XGigoo3YTKLVDXL z9ln+KKmAsyYj3}*h%JY6d=sy3qTtA@W26#1Ec08Jz9V5kDKAX%M%0USgx*zwCi7*P9 Date: Sat, 28 Apr 2018 11:59:34 +0200 Subject: [PATCH 70/77] dont mask error when running a grouped task (#124) --- brigade/core/task.py | 4 ++++ tests/core/test_tasks.py | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/brigade/core/task.py b/brigade/core/task.py index d802a722..15f1f81f 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -93,6 +93,10 @@ def grouped_tasks(task): if "severity" not in kwargs: kwargs["severity"] = self.severity r = Task(task, **kwargs).start(self.host, self.brigade) + if r.failed: + # Without this we will keep running the grouped task + raise r.exception + self.results.append(r[0] if len(r) == 1 else r) return r diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index 13290164..717dc9a6 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -93,8 +93,7 @@ def test_severity(self, brigade): r = brigade.run(task_fails_for_some, severity=logging.WARN, num_workers=1) for host, result in r.items(): if host == "dev3.group_2": - assert result[0].severity == logging.WARN - assert result[1].severity == logging.ERROR + assert result[0].severity == logging.ERROR else: assert result[0].severity == logging.WARN assert result[1].severity == logging.DEBUG From 41c2766460f3920018ee6b9b05d5ed89955b12a5 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Sat, 28 Apr 2018 13:42:39 +0200 Subject: [PATCH 71/77] run sphinx/black tests as separate jobs (#127) * test black and sphinx on different jobs * use httpbin container to avoid depending on external resources --- .travis.yml | 12 ++++++++---- requirements-dev.txt | 1 - requirements-travis.txt | 1 - tests/inventory_data/containers.sh | 3 +++ tests/plugins/tasks/apis/test_http_method.py | 19 +++++++++++-------- tox.ini | 15 ++++++++++++++- 6 files changed, 36 insertions(+), 15 deletions(-) delete mode 100644 requirements-travis.txt diff --git a/.travis.yml b/.travis.yml index 200e9ab9..c32b641a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,13 +14,17 @@ python: - 3.5 - 3.6 +matrix: + include: + - python: 3.6 + env: TOXENV=sphinx + - python: 3.6 + env: TOXENV=black + install: - - pip install tox-travis - - pip install coveralls - - pip install -r requirements-travis.txt + - pip install tox tox-travis coveralls script: - - if [ $TRAVIS_PYTHON_VERSION == "3.6" ]; then black --check . ; fi - tox deploy: diff --git a/requirements-dev.txt b/requirements-dev.txt index 5365a44f..01e91fbd 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,5 +4,4 @@ pylama flake8-import-order tox black==18.4a1; python_version >= '3.6' --r requirements-travis.txt -r requirements.txt diff --git a/requirements-travis.txt b/requirements-travis.txt deleted file mode 100644 index 062cef33..00000000 --- a/requirements-travis.txt +++ /dev/null @@ -1 +0,0 @@ -black==18.4a1; python_version >= '3.6' diff --git a/tests/inventory_data/containers.sh b/tests/inventory_data/containers.sh index 93d98edc..0498be87 100755 --- a/tests/inventory_data/containers.sh +++ b/tests/inventory_data/containers.sh @@ -5,6 +5,8 @@ start () { docker run -d -p 65002:22 --name dev2.group_1 --hostname=dev2.group_1 dbarroso/stupid_ssh_container docker run -d -p 65003:22 --name dev3.group_2 --hostname=dev3.group_2 dbarroso/stupid_ssh_container docker run -d -p 65004:22 --name dev4.group_2 --hostname=dev4.group_2 dbarroso/stupid_ssh_container + docker run -d -p 65080:80 --name httpbin bungoume/httpbin-container + sleep 3 } stop () { @@ -12,6 +14,7 @@ stop () { docker rm -f dev2.group_1 docker rm -f dev3.group_2 docker rm -f dev4.group_2 + docker rm -f httpbin } if [ "$1" == "start" ]; then diff --git a/tests/plugins/tasks/apis/test_http_method.py b/tests/plugins/tasks/apis/test_http_method.py index ad39061d..a2c5ceaa 100644 --- a/tests/plugins/tasks/apis/test_http_method.py +++ b/tests/plugins/tasks/apis/test_http_method.py @@ -7,17 +7,20 @@ from requests.exceptions import HTTPError +BASE_URL = "http://localhost:65080" + + class Test(object): def test_simple_get_text(self): - url = "http://httpbin.org/encoding/utf8" + url = "{}/encoding/utf8".format(BASE_URL) result = http_method(method="get", url=url) assert result.response.status_code assert result.result.startswith("

Unicode Demo

") assert result.result == result.response.text def test_simple_get_json(self): - url = "http://httpbin.org/get" + url = "{}/get".format(BASE_URL) result = http_method(method="get", url=url) assert result.response.status_code assert result.response.json()["args"] == {} @@ -25,31 +28,31 @@ def test_simple_get_json(self): assert result.result == result.response.json() def test_headers(self): - url = "http://httpbin.org/headers" + url = "{}/headers".format(BASE_URL) headers = {"X-Test": "a test"} result = http_method(method="get", url=url, headers=headers) assert result.result["headers"]["X-Test"] == "a test" def test_params(self): - url = "http://httpbin.org/get" + url = "{}/get".format(BASE_URL) params = {"my_param": "my_value"} result = http_method(method="get", url=url, params=params) assert result.result["args"]["my_param"] == "my_value" def test_post_data(self): - url = "http://httpbin.org/post" + url = "{}/post".format(BASE_URL) data = {"my_param": "my_value"} result = http_method(method="post", url=url, data=data) assert result.result["form"]["my_param"] == "my_value" def test_post_json(self): - url = "http://httpbin.org/post" + url = "{}/post".format(BASE_URL) json = {"my_param": "my_value"} result = http_method(method="post", url=url, json=json) assert result.result["data"] == '{"my_param": "my_value"}' def test_raise_for_status(self): - url = "http://httpbin.org/status/418" + url = "{}/status/418".format(BASE_URL) with pytest.raises(HTTPError): http_method(method="post", url=url) @@ -58,7 +61,7 @@ def test_raise_for_status(self): assert result.response.status_code def test_with_brigade(self, brigade): - url = "http://httpbin.org/get" + url = "{}/get".format(BASE_URL) params = {"my_param": "my_value"} r = brigade.run(http_method, method="get", url=url, params=params) diff --git a/tox.ini b/tox.ini index 6a4e96fc..f8eaccaf 100644 --- a/tox.ini +++ b/tox.ini @@ -5,9 +5,22 @@ envlist = py27,py34,py35,py36 deps = -rrequirements.txt -rrequirements-dev.txt - -rdocs/requirements.txt passenv = * commands = py.test + +[testenv:black] +deps = black==18.4a1 + +basepython = python3.6 +commands = + black --check . + +[testenv:sphinx] +deps = + -rdocs/requirements.txt + +basepython = python3.6 +commands = sphinx-build -W -b html -d docs/_build/doctrees docs docs/_build/html From 3cf2dfaff001c3fab82b2cdb27e048119204f6ef Mon Sep 17 00:00:00 2001 From: David Barroso Date: Mon, 30 Apr 2018 13:41:55 +0200 Subject: [PATCH 72/77] add pylama job (#128) * add pylama job * make pylama happy --- .travis.yml | 2 ++ brigade/core/__init__.py | 4 ++-- tox.ini | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c32b641a..00110003 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,8 @@ matrix: env: TOXENV=sphinx - python: 3.6 env: TOXENV=black + - python: 3.6 + env: TOXENV=pylama install: - pip install tox tox-travis coveralls diff --git a/brigade/core/__init__.py b/brigade/core/__init__.py index e81152ee..a78de50f 100644 --- a/brigade/core/__init__.py +++ b/brigade/core/__init__.py @@ -119,7 +119,7 @@ def configure_logging(self): "handlers": {}, "loggers": {}, "root": { - "level": "CRITICAL" if self.config.logging_loggers else self.config.logging_level.upper(), + "level": "CRITICAL" if self.config.logging_loggers else self.config.logging_level.upper(), # noqa "handlers": [], "formatter": "simple", }, @@ -239,7 +239,7 @@ def run( else: result = self._run_parallel(task, run_on, num_workers, **kwargs) - raise_on_error = raise_on_error if raise_on_error is not None else self.config.raise_on_error + raise_on_error = raise_on_error if raise_on_error is not None else self.config.raise_on_error # noqa if raise_on_error: result.raise_on_error() else: diff --git a/tox.ini b/tox.ini index f8eaccaf..b26595fb 100644 --- a/tox.ini +++ b/tox.ini @@ -24,3 +24,11 @@ deps = basepython = python3.6 commands = sphinx-build -W -b html -d docs/_build/doctrees docs docs/_build/html + +[testenv:pylama] +deps = + -rrequirements-dev.txt + +basepython = python3.6 +commands = + pylama . From b0cf8e99483261938b5e9b59f81799a3e9f22a4e Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Mon, 30 Apr 2018 13:42:16 +0200 Subject: [PATCH 73/77] Add test for has_parent_group() (#130) The documentation states that the has_parent_group takes an object as its argument. Don't know if it would be better with just a string or if it's better the way it is now. --- tests/core/test_inventory.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/core/test_inventory.py b/tests/core/test_inventory.py index 5c9acf54..62a7a02b 100644 --- a/tests/core/test_inventory.py +++ b/tests/core/test_inventory.py @@ -196,3 +196,11 @@ def test_var_resolution(self): assert ( inventory.hosts["dev4.group_2"].data["my_var"] == "comes_from_dev4.group_2" ) + + def test_has_parents(self): + assert inventory.hosts["dev1.group_1"].has_parent_group( + inventory.groups["group_1"] + ) + assert not inventory.hosts["dev1.group_1"].has_parent_group( + inventory.groups["group_2"] + ) From bd26fefed97e670370353191163e2e74c6af2af5 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Tue, 1 May 2018 14:22:57 +0200 Subject: [PATCH 74/77] Small fixes to docstrings (#125) * Small fixes to docstrings * group -> groups --- brigade/core/configuration.py | 7 +++- brigade/plugins/functions/text/__init__.py | 2 +- brigade/plugins/inventory/ansible.py | 2 +- brigade/plugins/inventory/simple.py | 39 ++++++++++++------- .../plugins/tasks/networking/napalm_cli.py | 3 ++ 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/brigade/core/configuration.py b/brigade/core/configuration.py index 5137c364..f296e978 100644 --- a/brigade/core/configuration.py +++ b/brigade/core/configuration.py @@ -12,7 +12,12 @@ "default": "brigade.plugins.inventory.simple.SimpleInventory", }, "transform_function": { - "description": "Path to transform function.", "type": "str", "default": {} + "description": "Path to transform function. The transform_function you provide " + "will run against each host in the inventory. This is useful to manipulate host " + "data and make it more consumable. For instance, if your inventory has a 'user' " + "attribute you could use this function to map it to 'brigade_user'", + "type": "str", + "default": {}, }, "jinja_filters": { "description": "Path to callable returning jinja filters to be used.", diff --git a/brigade/plugins/functions/text/__init__.py b/brigade/plugins/functions/text/__init__.py index 38a5b74b..b0ccc796 100644 --- a/brigade/plugins/functions/text/__init__.py +++ b/brigade/plugins/functions/text/__init__.py @@ -57,7 +57,7 @@ def print_result( result, host=None, vars=None, failed=None, severity_level=logging.INFO ): """ - Prints on screen the :obj:`brigade.core.task.Result` from a previous task + Prints the :obj:`brigade.core.task.Result` from a previous task to screen Arguments: result (:obj:`brigade.core.task.Result`): from a previous task diff --git a/brigade/plugins/inventory/ansible.py b/brigade/plugins/inventory/ansible.py index 6f3594ad..8859c9b8 100644 --- a/brigade/plugins/inventory/ansible.py +++ b/brigade/plugins/inventory/ansible.py @@ -185,7 +185,7 @@ class AnsibleInventory(Inventory): Inventory plugin that is capable of reading an ansible inventory. Arguments: - hostsfile (string): Path to the hostsfile + hostsfile (string): Ansible inventory file to load """ def __init__(self, hostsfile="hosts", **kwargs): diff --git a/brigade/plugins/inventory/simple.py b/brigade/plugins/inventory/simple.py index 67a220a2..762914c3 100644 --- a/brigade/plugins/inventory/simple.py +++ b/brigade/plugins/inventory/simple.py @@ -18,13 +18,15 @@ class SimpleInventory(Inventory): host1.cmh: site: cmh role: host - group: cmh-host + groups: + - cmh-host nos: linux host2.cmh: site: cmh role: host - group: cmh-host + groups: + - cmh-host nos: linux switch00.cmh: @@ -34,7 +36,8 @@ class SimpleInventory(Inventory): napalm_port: 12443 site: cmh role: leaf - group: cmh-leaf + groups: + - cmh-leaf nos: eos switch01.cmh: @@ -44,19 +47,22 @@ class SimpleInventory(Inventory): napalm_port: 12203 site: cmh role: leaf - group: cmh-leaf + groups: + - cmh-leaf nos: junos host1.bma: site: bma role: host - group: bma-host + groups: + - bma-host nos: linux host2.bma: site: bma role: host - group: bma-host + groups: + - bma-host nos: linux switch00.bma: @@ -66,7 +72,8 @@ class SimpleInventory(Inventory): napalm_port: 12443 site: bma role: leaf - group: bma-leaf + groups: + - bma-leaf nos: eos switch01.bma: @@ -76,31 +83,37 @@ class SimpleInventory(Inventory): napalm_port: 12203 site: bma role: leaf - group: bma-leaf + groups: + - bma-leaf nos: junos * group file:: --- defaults: - group: null domain: acme.com bma-leaf: - group: bma + groups: + - bma bma-host: - group: bma + groups: + - bma bma: + domain: bma.acme.com cmh-leaf: - group: cmh + groups: + - cmh cmh-host: - group: cmh + groups: + - cmh cmh: + domain: cmh.acme.com """ def __init__(self, host_file="hosts.yaml", group_file="groups.yaml", **kwargs): diff --git a/brigade/plugins/tasks/networking/napalm_cli.py b/brigade/plugins/tasks/networking/napalm_cli.py index 59879ac5..94187858 100644 --- a/brigade/plugins/tasks/networking/napalm_cli.py +++ b/brigade/plugins/tasks/networking/napalm_cli.py @@ -5,6 +5,9 @@ def napalm_cli(task, commands): """ Run commands on remote devices using napalm + Arguments: + commands (``list``): List of commands to execute + Returns: :obj:`brigade.core.task.Result`: * result (``dict``): dictionary with the result of the commands From 6a667c7acabe2289afe42c6bc3ad667c818cd9a1 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Tue, 1 May 2018 17:40:43 +0200 Subject: [PATCH 75/77] Add test for print_result function (#126) Change severity to severity_level on tasks, add tests to print_output --- brigade/core/task.py | 22 ++-- brigade/plugins/functions/text/__init__.py | 6 +- docs/tutorials/intro/task_results.ipynb | 6 +- requirements-dev.txt | 1 + tests/core/test_tasks.py | 22 ++-- tests/plugins/functions/__init__.py | 0 tests/plugins/functions/text/__init__.py | 0 .../text/output_data/basic_inventory.stderr | 0 .../text/output_data/basic_inventory.stdout | 17 +++ .../basic_inventory_one_host.stderr | 0 .../basic_inventory_one_host.stdout | 6 ++ .../basic_inventory_one_host_python27.stderr | 0 .../basic_inventory_one_host_python27.stdout | 6 ++ .../basic_inventory_one_task.stderr | 0 .../basic_inventory_one_task.stdout | 2 + .../basic_inventory_one_task_python27.stderr | 0 .../basic_inventory_one_task_python27.stdout | 2 + .../basic_inventory_python27.stderr | 0 .../basic_inventory_python27.stdout | 17 +++ .../text/output_data/basic_single.stderr | 0 .../text/output_data/basic_single.stdout | 5 + .../output_data/basic_single_python27.stderr | 0 .../output_data/basic_single_python27.stdout | 5 + .../text/output_data/changed_host.stderr | 0 .../text/output_data/changed_host.stdout | 15 +++ .../output_data/changed_host_python27.stderr | 0 .../output_data/changed_host_python27.stdout | 15 +++ .../output_data/failed_with_severity.stderr | 0 .../output_data/failed_with_severity.stdout | 19 ++++ .../failed_with_severity_python27.stderr | 0 .../failed_with_severity_python27.stdout | 19 ++++ .../text/output_data/multiple_tasks.stderr | 0 .../text/output_data/multiple_tasks.stdout | 30 ++++++ .../multiple_tasks_python27.stderr | 0 .../multiple_tasks_python27.stdout | 30 ++++++ .../functions/text/test_print_result.py | 101 ++++++++++++++++++ tests/wrapper.py | 57 ++++++++++ 37 files changed, 376 insertions(+), 27 deletions(-) create mode 100644 tests/plugins/functions/__init__.py create mode 100644 tests/plugins/functions/text/__init__.py create mode 100644 tests/plugins/functions/text/output_data/basic_inventory.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_inventory.stdout create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_host.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_host.stdout create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_host_python27.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_host_python27.stdout create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_task.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_task.stdout create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_task_python27.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_one_task_python27.stdout create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_python27.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_inventory_python27.stdout create mode 100644 tests/plugins/functions/text/output_data/basic_single.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_single.stdout create mode 100644 tests/plugins/functions/text/output_data/basic_single_python27.stderr create mode 100644 tests/plugins/functions/text/output_data/basic_single_python27.stdout create mode 100644 tests/plugins/functions/text/output_data/changed_host.stderr create mode 100644 tests/plugins/functions/text/output_data/changed_host.stdout create mode 100644 tests/plugins/functions/text/output_data/changed_host_python27.stderr create mode 100644 tests/plugins/functions/text/output_data/changed_host_python27.stdout create mode 100644 tests/plugins/functions/text/output_data/failed_with_severity.stderr create mode 100644 tests/plugins/functions/text/output_data/failed_with_severity.stdout create mode 100644 tests/plugins/functions/text/output_data/failed_with_severity_python27.stderr create mode 100644 tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout create mode 100644 tests/plugins/functions/text/output_data/multiple_tasks.stderr create mode 100644 tests/plugins/functions/text/output_data/multiple_tasks.stdout create mode 100644 tests/plugins/functions/text/output_data/multiple_tasks_python27.stderr create mode 100644 tests/plugins/functions/text/output_data/multiple_tasks_python27.stdout create mode 100644 tests/plugins/functions/text/test_print_result.py create mode 100644 tests/wrapper.py diff --git a/brigade/core/task.py b/brigade/core/task.py index 15f1f81f..472eee8e 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -14,7 +14,7 @@ class Task(object): Arguments: task (callable): function or callable we will be calling name (``string``): name of task, defaults to ``task.__name__`` - severity (logging.LEVEL): Severity level associated to the task + severity_level (logging.LEVEL): Severity level associated to the task **kwargs: Parameters that will be passed to the ``task`` Attributes: @@ -26,15 +26,15 @@ class Task(object): before calling the ``task`` brigade(:obj:`brigade.core.Brigade`): Populated right before calling the ``task`` - severity (logging.LEVEL): Severity level associated to the task + severity_level (logging.LEVEL): Severity level associated to the task """ - def __init__(self, task, name=None, severity=logging.INFO, **kwargs): + def __init__(self, task, name=None, severity_level=logging.INFO, **kwargs): self.name = name or task.__name__ self.task = task self.params = kwargs self.results = MultiResult(self.name) - self.severity = severity + self.severity_level = severity_level def __repr__(self): return self.name @@ -66,7 +66,7 @@ def start(self, host, brigade): logger.error("{}: {}".format(self.host, tb)) r = Result(host, exception=e, result=tb, failed=True) r.name = self.name - r.severity = logging.ERROR if r.failed else self.severity + r.severity_level = logging.ERROR if r.failed else self.severity_level self.results.insert(0, r) return self.results @@ -90,8 +90,8 @@ def grouped_tasks(task): ) raise Exception(msg) - if "severity" not in kwargs: - kwargs["severity"] = self.severity + if "severity_level" not in kwargs: + kwargs["severity_level"] = self.severity_level r = Task(task, **kwargs).start(self.host, self.brigade) if r.failed: # Without this we will keep running the grouped task @@ -120,7 +120,7 @@ class Result(object): result (obj): Result of the task execution, see task's documentation for details host (:obj:`brigade.core.inventory.Host`): Reference to the host that lead ot this result failed (bool): Whether the execution failed or not - severity (logging.LEVEL): Severity level associated to the result of the excecution + severity_level (logging.LEVEL): Severity level associated to the result of the excecution exception (Exception): uncaught exception thrown during the exection of the task (if any) Attributes: @@ -129,7 +129,7 @@ class Result(object): result (obj): Result of the task execution, see task's documentation for details host (:obj:`brigade.core.inventory.Host`): Reference to the host that lead ot this result failed (bool): Whether the execution failed or not - severity (logging.LEVEL): Severity level associated to the result of the excecution + severity_level (logging.LEVEL): Severity level associated to the result of the excecution exception (Exception): uncaught exception thrown during the exection of the task (if any) """ @@ -141,7 +141,7 @@ def __init__( diff="", failed=False, exception=None, - severity=logging.INFO, + severity_level=logging.INFO, **kwargs ): self.result = result @@ -151,7 +151,7 @@ def __init__( self.failed = failed self.exception = exception self.name = None - self.severity = severity + self.severity_level = severity_level for k, v in kwargs.items(): setattr(self, k, v) diff --git a/brigade/plugins/functions/text/__init__.py b/brigade/plugins/functions/text/__init__.py index b0ccc796..d1b383b5 100644 --- a/brigade/plugins/functions/text/__init__.py +++ b/brigade/plugins/functions/text/__init__.py @@ -30,14 +30,14 @@ def _get_color(result, failed): def _print_individual_result( result, host, vars, failed, severity_level, task_group=False ): - if result.severity < severity_level: + if result.severity_level < severity_level: return color = _get_color(result, failed) subtitle = "" if result.changed is None else " ** changed : {} ".format( result.changed ) - level_name = logging.getLevelName(result.severity) + level_name = logging.getLevelName(result.severity_level) symbol = "v" if task_group else "-" msg = "{} {}{}".format(symbol * 4, result.name, subtitle) print( @@ -77,7 +77,7 @@ def print_result( if isinstance(result, AggregatedResult): msg = result.name print("{}{}{}{}".format(Style.BRIGHT, Fore.CYAN, msg, "*" * (80 - len(msg)))) - for host, host_data in result.items(): + for host, host_data in sorted(result.items()): title = "" if host_data.changed is None else " ** changed : {} ".format( host_data.changed ) diff --git a/docs/tutorials/intro/task_results.ipynb b/docs/tutorials/intro/task_results.ipynb index e36cb269..f3f773a5 100644 --- a/docs/tutorials/intro/task_results.ipynb +++ b/docs/tutorials/intro/task_results.ipynb @@ -31,7 +31,7 @@ " name=\"Base Configuration\",\n", " template=\"base.j2\",\n", " path=f\"templates/{task.host.nos}\",\n", - " severity=logging.DEBUG)\n", + " severity_level=logging.DEBUG)\n", "\n", " # Save the compiled configuration into a host variable\n", " task.host[\"config\"] = r.result\n", @@ -41,7 +41,7 @@ " name=\"Loading Configuration on the device\",\n", " replace=False,\n", " configuration=task.host[\"config\"],\n", - " severity=logging.INFO)" + " severity_level=logging.INFO)" ] }, { @@ -209,7 +209,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As you probably noticed, not all the tasks where printed. If you check the tests they all got a new argument `severity`. This let's us flag tasks with any of the logging levels. Then `print_result` is able to following logging rules to print the results. By default only tasks marked as `INFO` will be printed (this is also the default for the tasks if none is specified). Note that a failed task will have its severity level changed to `ERROR` regardless of the one specified by the user.\n", + "As you probably noticed, not all the tasks where printed. If you check the tests they all got a new argument `severity_level`. This let's us flag tasks with any of the logging levels. Then `print_result` is able to following logging rules to print the results. By default only tasks marked as `INFO` will be printed (this is also the default for the tasks if none is specified). Note that a failed task will have its severity level changed to `ERROR` regardless of the one specified by the user.\n", "\n", "Now let's tell `print_result` to print tasks marked as `DEBUG`." ] diff --git a/requirements-dev.txt b/requirements-dev.txt index 01e91fbd..8d6f3c01 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,3 +1,4 @@ +decorator pytest pytest-cov pylama diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index 717dc9a6..7aa06065 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -11,7 +11,7 @@ def task_fails_for_some(task): task.run( commands.command, command="echo {}".format(task.host), - severity=logging.DEBUG, + severity_level=logging.DEBUG, ) @@ -79,23 +79,25 @@ def test_run_on(self, brigade): def test_severity(self, brigade): r = brigade.run(commands.command, command="echo blah") for host, result in r.items(): - assert result[0].severity == logging.INFO + assert result[0].severity_level == logging.INFO - r = brigade.run(commands.command, command="echo blah", severity=logging.WARN) + r = brigade.run( + commands.command, command="echo blah", severity_level=logging.WARN + ) for host, result in r.items(): - assert result[0].severity == logging.WARN + assert result[0].severity_level == logging.WARN - r = brigade.run(sub_task, severity=logging.WARN) + r = brigade.run(sub_task, severity_level=logging.WARN) for host, result in r.items(): for sr in result: - assert sr.severity == logging.WARN + assert sr.severity_level == logging.WARN - r = brigade.run(task_fails_for_some, severity=logging.WARN, num_workers=1) + r = brigade.run(task_fails_for_some, severity_level=logging.WARN, num_workers=1) for host, result in r.items(): if host == "dev3.group_2": - assert result[0].severity == logging.ERROR + assert result[0].severity_level == logging.ERROR else: - assert result[0].severity == logging.WARN - assert result[1].severity == logging.DEBUG + assert result[0].severity_level == logging.WARN + assert result[1].severity_level == logging.DEBUG brigade.data.reset_failed_hosts() diff --git a/tests/plugins/functions/__init__.py b/tests/plugins/functions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/__init__.py b/tests/plugins/functions/text/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_inventory.stderr b/tests/plugins/functions/text/output_data/basic_inventory.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_inventory.stdout b/tests/plugins/functions/text/output_data/basic_inventory.stdout new file mode 100644 index 00000000..400491f8 --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_inventory.stdout @@ -0,0 +1,17 @@ +echo_task*********************************************************************** +* dev1.group_1 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev3.group_2 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev4.group_2 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_host.stderr b/tests/plugins/functions/text/output_data/basic_inventory_one_host.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_host.stdout b/tests/plugins/functions/text/output_data/basic_inventory_one_host.stdout new file mode 100644 index 00000000..ba300d7a --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_inventory_one_host.stdout @@ -0,0 +1,6 @@ +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_host_python27.stderr b/tests/plugins/functions/text/output_data/basic_inventory_one_host_python27.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_host_python27.stdout b/tests/plugins/functions/text/output_data/basic_inventory_one_host_python27.stdout new file mode 100644 index 00000000..424afece --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_inventory_one_host_python27.stdout @@ -0,0 +1,6 @@ +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{ 'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_task.stderr b/tests/plugins/functions/text/output_data/basic_inventory_one_task.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_task.stdout b/tests/plugins/functions/text/output_data/basic_inventory_one_task.stdout new file mode 100644 index 00000000..5700ec74 --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_inventory_one_task.stdout @@ -0,0 +1,2 @@ +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_task_python27.stderr b/tests/plugins/functions/text/output_data/basic_inventory_one_task_python27.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_inventory_one_task_python27.stdout b/tests/plugins/functions/text/output_data/basic_inventory_one_task_python27.stdout new file mode 100644 index 00000000..5700ec74 --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_inventory_one_task_python27.stdout @@ -0,0 +1,2 @@ +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade diff --git a/tests/plugins/functions/text/output_data/basic_inventory_python27.stderr b/tests/plugins/functions/text/output_data/basic_inventory_python27.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_inventory_python27.stdout b/tests/plugins/functions/text/output_data/basic_inventory_python27.stdout new file mode 100644 index 00000000..400491f8 --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_inventory_python27.stdout @@ -0,0 +1,17 @@ +echo_task*********************************************************************** +* dev1.group_1 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev3.group_2 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev4.group_2 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/basic_single.stderr b/tests/plugins/functions/text/output_data/basic_single.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_single.stdout b/tests/plugins/functions/text/output_data/basic_single.stdout new file mode 100644 index 00000000..842de17d --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_single.stdout @@ -0,0 +1,5 @@ +echo_task*********************************************************************** +* dev1.group_1 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/basic_single_python27.stderr b/tests/plugins/functions/text/output_data/basic_single_python27.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/basic_single_python27.stdout b/tests/plugins/functions/text/output_data/basic_single_python27.stdout new file mode 100644 index 00000000..842de17d --- /dev/null +++ b/tests/plugins/functions/text/output_data/basic_single_python27.stdout @@ -0,0 +1,5 @@ +echo_task*********************************************************************** +* dev1.group_1 ** changed : False ********************************************** +vvvv echo_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +Hello from Brigade +^^^^ END echo_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/changed_host.stderr b/tests/plugins/functions/text/output_data/changed_host.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/changed_host.stdout b/tests/plugins/functions/text/output_data/changed_host.stdout new file mode 100644 index 00000000..7c043e9a --- /dev/null +++ b/tests/plugins/functions/text/output_data/changed_host.stdout @@ -0,0 +1,15 @@ +read_data*********************************************************************** +* dev1.group_1 ** changed : True *********************************************** +vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WARNING +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +---- parse_data ** changed : True ---------------------------------------------- WARNING +[1, 2, 3] +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WARNING +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +---- parse_data ** changed : False --------------------------------------------- WARNING +[4, 5, 6] +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/changed_host_python27.stderr b/tests/plugins/functions/text/output_data/changed_host_python27.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/changed_host_python27.stdout b/tests/plugins/functions/text/output_data/changed_host_python27.stdout new file mode 100644 index 00000000..7c043e9a --- /dev/null +++ b/tests/plugins/functions/text/output_data/changed_host_python27.stdout @@ -0,0 +1,15 @@ +read_data*********************************************************************** +* dev1.group_1 ** changed : True *********************************************** +vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WARNING +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +---- parse_data ** changed : True ---------------------------------------------- WARNING +[1, 2, 3] +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WARNING +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +---- parse_data ** changed : False --------------------------------------------- WARNING +[4, 5, 6] +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/failed_with_severity.stderr b/tests/plugins/functions/text/output_data/failed_with_severity.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/failed_with_severity.stdout b/tests/plugins/functions/text/output_data/failed_with_severity.stdout new file mode 100644 index 00000000..2534f3ff --- /dev/null +++ b/tests/plugins/functions/text/output_data/failed_with_severity.stdout @@ -0,0 +1,19 @@ +read_data*********************************************************************** +* dev1.group_1 ** changed : True *********************************************** +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev3.group_2 ** changed : False ********************************************** +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev4.group_2 ** changed : False ********************************************** +vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ERROR +Exception('Unknown Error -> Contact your system administrator',) +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/failed_with_severity_python27.stderr b/tests/plugins/functions/text/output_data/failed_with_severity_python27.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout b/tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout new file mode 100644 index 00000000..2534f3ff --- /dev/null +++ b/tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout @@ -0,0 +1,19 @@ +read_data*********************************************************************** +* dev1.group_1 ** changed : True *********************************************** +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev3.group_2 ** changed : False ********************************************** +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev4.group_2 ** changed : False ********************************************** +vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ERROR +Exception('Unknown Error -> Contact your system administrator',) +---- echo_task ** changed : False ---------------------------------------------- CRITICAL +Hello from CRITICAL +^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/multiple_tasks.stderr b/tests/plugins/functions/text/output_data/multiple_tasks.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/multiple_tasks.stdout b/tests/plugins/functions/text/output_data/multiple_tasks.stdout new file mode 100644 index 00000000..0a6892a6 --- /dev/null +++ b/tests/plugins/functions/text/output_data/multiple_tasks.stdout @@ -0,0 +1,30 @@ +**** Behold the data! ********************************************************** +data_with_greeting************************************************************** +* dev1.group_1 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev3.group_2 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev4.group_2 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/multiple_tasks_python27.stderr b/tests/plugins/functions/text/output_data/multiple_tasks_python27.stderr new file mode 100644 index 00000000..e69de29b diff --git a/tests/plugins/functions/text/output_data/multiple_tasks_python27.stdout b/tests/plugins/functions/text/output_data/multiple_tasks_python27.stdout new file mode 100644 index 00000000..2ee93878 --- /dev/null +++ b/tests/plugins/functions/text/output_data/multiple_tasks_python27.stdout @@ -0,0 +1,30 @@ +**** Behold the data! ********************************************************** +data_with_greeting************************************************************** +* dev1.group_1 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{ 'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev2.group_1 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{ 'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev3.group_2 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{ 'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* dev4.group_2 ** changed : False ********************************************** +vvvv data_with_greeting ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO +---- echo_task ** changed : False ---------------------------------------------- INFO +Hello from Brigade +---- load_data ** changed : False ---------------------------------------------- INFO +{ 'os': 'Linux', 'services': ['http', 'smtp', 'dns']} +^^^^ END data_with_greeting ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/test_print_result.py b/tests/plugins/functions/text/test_print_result.py new file mode 100644 index 00000000..c7f690fd --- /dev/null +++ b/tests/plugins/functions/text/test_print_result.py @@ -0,0 +1,101 @@ +import os +import logging + +from brigade.plugins.functions.text import print_result +from brigade.plugins.functions.text import print_title +from brigade.core.task import Result +from tests.wrapper import wrap_cli_test + +output_dir = "{}/output_data".format(os.path.dirname(os.path.realpath(__file__))) + + +def echo_task(task, msg="Brigade"): + return Result( + host=task.host, + result="Hello from {}".format(msg), + output="Hello from {}".format(msg), + ) + + +def load_data(task): + data = {"os": "Linux", "services": ["http", "smtp", "dns"]} + return Result(host=task.host, result=data) + + +def data_with_greeting(task): + task.run(task=echo_task) + task.run(task=load_data) + + +def parse_data(task): + + data = {} + data["failed"] = False + data["changed"] = False + + if "dev1.group_1" == task.host.name: + data["values"] = [1, 2, 3] + data["changed"] = True + + elif "dev2.group_1" == task.host.name: + data["values"] = [4, 5, 6] + + elif "dev3.group_2" == task.host.name: + data["values"] = [7, 8, 9] + + elif "dev4.group_2" == task.host.name: + data["values"] = [10, 11, 12] + data["changed"] = False + data["failed"] = True + + if data["failed"]: + raise Exception("Unknown Error -> Contact your system administrator") + + return Result(host=task.host, changed=data["changed"], result=data["values"]) + + +def read_data(task): + task.run(task=echo_task, severity_level=logging.DEBUG) + task.run(task=echo_task, msg="CRITICAL", severity_level=logging.CRITICAL) + task.run(task=parse_data, severity_level=logging.WARN) + + +class Test(object): + + @wrap_cli_test(output="{}/basic_single".format(output_dir)) + def test_print_basic(self, brigade): + filter = brigade.filter(name="dev1.group_1") + result = filter.run(echo_task) + print_result(result, vars="result") + + @wrap_cli_test(output="{}/basic_inventory".format(output_dir)) + def test_print_basic_inventory(self, brigade): + result = brigade.run(echo_task) + print_result(result) + + @wrap_cli_test(output="{}/basic_inventory_one_host".format(output_dir)) + def test_print_basic_inventory_one_host(self, brigade): + result = brigade.run(data_with_greeting) + print_result(result["dev2.group_1"]) + + @wrap_cli_test(output="{}/basic_inventory_one_task".format(output_dir)) + def test_print_basic_inventory_one_task(self, brigade): + result = brigade.run(data_with_greeting) + print_result(result["dev2.group_1"][1]) + + @wrap_cli_test(output="{}/multiple_tasks".format(output_dir)) + def test_print_multiple_tasks(self, brigade): + result = brigade.run(data_with_greeting) + print_title("Behold the data!") + print_result(result) + + @wrap_cli_test(output="{}/changed_host".format(output_dir)) + def test_print_changed_host(self, brigade): + filter = brigade.filter(site="site1") + result = filter.run(read_data, severity_level=logging.WARN) + print_result(result) + + @wrap_cli_test(output="{}/failed_with_severity".format(output_dir)) + def test_print_failed_with_severity(self, brigade): + result = brigade.run(read_data) + print_result(result, vars=["exception", "output"], severity_level=logging.ERROR) diff --git a/tests/wrapper.py b/tests/wrapper.py new file mode 100644 index 00000000..66b83da1 --- /dev/null +++ b/tests/wrapper.py @@ -0,0 +1,57 @@ +import sys +from decorator import decorator + +if sys.version_info.major == 2: + from StringIO import StringIO +else: + from io import StringIO + + +def wrap_cli_test(output, save_output=False): + """ + This decorator captures the stdout and stder and compare it + with the contects of the specified files. + + Arguments: + output (string): Path to the output. stdout and stderr prefixes will be added automatically + save_output (bool): Whether to save the output or not. Useful when creating the tests + """ + + @decorator + def run_test(func, *args, **kwargs): + + stdout = StringIO() + backup_stdout = sys.stdout + sys.stdout = stdout + + stderr = StringIO() + backup_stderr = sys.stderr + sys.stderr = stderr + + func(*args, **kwargs) + sys.stdout = backup_stdout + sys.stderr = backup_stderr + + output_file = output + if sys.version_info.major == 2: + output_file += "_python27" + + if save_output: + with open("{}.stdout".format(output_file), "w+") as f: + f.write(stdout.getvalue()) + with open("{}.stderr".format(output_file), "w+") as f: + f.write(stderr.getvalue()) + + with open("{}.stdout".format(output_file), "r") as f: + screen_output = stdout.getvalue() + reference_output = f.read() + if screen_output != reference_output: + raise Exception(screen_output, reference_output) + + with open("{}.stderr".format(output_file), "r") as f: + screen_output = stderr.getvalue() + reference_output = f.read() + if screen_output != reference_output: + raise Exception(screen_output, reference_output) + + return run_test From 09984855f42fd77b9a04a2a6816fbb90fe311c78 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Thu, 3 May 2018 16:57:42 +0200 Subject: [PATCH 76/77] Docs final (#132) * add link to brg-tools * fix docstring * fix typo * rearrange docs * fix generated docs for configuration section * fix path * fix paths --- .gitignore | 4 +- README.md | 5 ++ brigade/plugins/functions/text/__init__.py | 3 +- docs/conf.py | 2 +- .../configuration/generated/.placeholder | 0 docs/{ref => }/configuration/index.rst | 6 +- docs/howto/writing_a_connection_task.rst | 2 +- docs/index.rst | 68 ++++-------------- docs/{ref => plugins}/functions/index.rst | 0 docs/{ref => plugins}/functions/text.rst | 0 docs/plugins/index.rst | 11 +++ docs/{ref => plugins}/inventory/ansible.rst | 0 docs/{ref => plugins}/inventory/index.rst | 0 docs/{ref => plugins}/inventory/nsot.rst | 0 docs/{ref => plugins}/inventory/simple.rst | 0 docs/{ref => plugins}/tasks/apis.rst | 0 docs/{ref => plugins}/tasks/commands.rst | 0 docs/{ref => plugins}/tasks/connections.rst | 0 docs/{ref => plugins}/tasks/data.rst | 0 docs/{ref => plugins}/tasks/files.rst | 0 docs/{ref => plugins}/tasks/index.rst | 0 docs/{ref => plugins}/tasks/networking.rst | 0 docs/{ref => plugins}/tasks/text.rst | 0 docs/ref/api/configuration.rst | 2 +- docs/ref/index.rst | 14 ---- .../internals/_static/execution_model.graffle | Bin 14903 -> 14808 bytes .../internals/_static/execution_model_1.png | Bin 369085 -> 364533 bytes .../internals/_static/execution_model_2.png | Bin 371519 -> 367981 bytes docs/tutorials/intro/executing_tasks.ipynb | 2 +- docs/tutorials/intro/grouping_tasks.ipynb | 2 +- .../intro/initializing_brigade.ipynb | 2 +- docs/tutorials/intro/inventory.ipynb | 2 +- docs/tutorials/intro/task_results.ipynb | 2 +- 33 files changed, 44 insertions(+), 83 deletions(-) rename docs/{ref => }/configuration/generated/.placeholder (100%) rename docs/{ref => }/configuration/index.rst (65%) rename docs/{ref => plugins}/functions/index.rst (100%) rename docs/{ref => plugins}/functions/text.rst (100%) create mode 100644 docs/plugins/index.rst rename docs/{ref => plugins}/inventory/ansible.rst (100%) rename docs/{ref => plugins}/inventory/index.rst (100%) rename docs/{ref => plugins}/inventory/nsot.rst (100%) rename docs/{ref => plugins}/inventory/simple.rst (100%) rename docs/{ref => plugins}/tasks/apis.rst (100%) rename docs/{ref => plugins}/tasks/commands.rst (100%) rename docs/{ref => plugins}/tasks/connections.rst (100%) rename docs/{ref => plugins}/tasks/data.rst (100%) rename docs/{ref => plugins}/tasks/files.rst (100%) rename docs/{ref => plugins}/tasks/index.rst (100%) rename docs/{ref => plugins}/tasks/networking.rst (100%) rename docs/{ref => plugins}/tasks/text.rst (100%) diff --git a/.gitignore b/.gitignore index c8834cc3..209ded0e 100644 --- a/.gitignore +++ b/.gitignore @@ -64,7 +64,7 @@ instance/ # Sphinx documentation docs/_build/ -docs/ref/configuration/generated/*.rst +docs/configuration/generated/*.rst # PyBuilder target/ @@ -105,4 +105,4 @@ output/ .vscode # Generated when testing -nsot-docker.sqlite3 \ No newline at end of file +nsot-docker.sqlite3 diff --git a/README.md b/README.md index 7380f96a..5ad6d1df 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,11 @@ Documentation Read the [Brigade documentation](https://brigade.readthedocs.io/) online or review it's [code here](https://github.com/brigade-automation/brigade/tree/develop/docs) +Examples +======== + +You can find some examples and already made tools [here](https://github.com/brigade-automation/brg-tools/) + Bugs & New features =================== diff --git a/brigade/plugins/functions/text/__init__.py b/brigade/plugins/functions/text/__init__.py index d1b383b5..e5635c7c 100644 --- a/brigade/plugins/functions/text/__init__.py +++ b/brigade/plugins/functions/text/__init__.py @@ -63,8 +63,7 @@ def print_result( result (:obj:`brigade.core.task.Result`): from a previous task vars (list of str): Which attributes you want to print failed (``bool``): if ``True`` assume the task failed - task_id (``int``): if we have a :obj:`brigade.core.task.MultiResult` print - only task in this position + severity_level (int): Print only errors with this severity level or higher Returns: :obj:`brigade.core.task.Result`: diff --git a/docs/conf.py b/docs/conf.py index a1ac31c6..b38aa7f3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -181,7 +181,7 @@ def build_configuration_parameters(app): data = {} data["params"] = CONF rendered_template = template_file.render(**data) - output_dir = "{0}/ref/configuration/generated".format(BASEPATH) + output_dir = "{0}/configuration/generated".format(BASEPATH) with open("{}/parameters.rst".format(output_dir), "w") as f: f.write(rendered_template) diff --git a/docs/ref/configuration/generated/.placeholder b/docs/configuration/generated/.placeholder similarity index 100% rename from docs/ref/configuration/generated/.placeholder rename to docs/configuration/generated/.placeholder diff --git a/docs/ref/configuration/index.rst b/docs/configuration/index.rst similarity index 65% rename from docs/ref/configuration/index.rst rename to docs/configuration/index.rst index 4b724985..7f5f84ec 100644 --- a/docs/ref/configuration/index.rst +++ b/docs/configuration/index.rst @@ -1,5 +1,5 @@ -Brigade Configuration -===================== +Configuration +============= Each configuration parameter are applied in the following order: @@ -7,4 +7,4 @@ Each configuration parameter are applied in the following order: 2. Parameter in configuration file / object 3. Default value -.. include:: generated/parameters.rst \ No newline at end of file +.. include:: generated/parameters.rst diff --git a/docs/howto/writing_a_connection_task.rst b/docs/howto/writing_a_connection_task.rst index dad98a48..e5601886 100644 --- a/docs/howto/writing_a_connection_task.rst +++ b/docs/howto/writing_a_connection_task.rst @@ -1,7 +1,7 @@ Writing a connection task ######################### -Connection tasks are tasks that establish a connection with a device to provide some sort of reusable mechanism to interact with it. You can find some examples of connections tasks in the :doc:`../ref/tasks/connections` section. +Connection tasks are tasks that establish a connection with a device to provide some sort of reusable mechanism to interact with it. You can find some examples of connections tasks in the :doc:`../plugins/tasks/connections` section. Writing a connection task is no different from writing a regular task. The only difference is that the task will have to establish the connection and assign it to the device. diff --git a/docs/index.rst b/docs/index.rst index dec62677..dd169c56 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,64 +30,22 @@ Is something missing from the documentation? Please open an issue and `tell us w A first glance ============== -Here is an example on how to quickly build a cli tool leveraging on Brigade and click:: +Here is an example on how to quickly build a runbook leveraging Brigade to retrieve information from the network:: - from brigade.core import Brigade - from brigade.plugins import tasks - from brigade.plugins.inventory.simple import SimpleInventory + from brigade.core import InitBrigade + from brigade.plugins.functions.text import print_result + from brigade.plugins.tasks.networking import napalm_get - import click + brg = InitBrigade( + config_file="brigade.yaml", dry_run=True, num_workers=20 + ) + results = brg.run( + task=napalm_get, getters=["facts", "interfaces"] + ) + print_result(results) - def get_facts(task, facts): - r = tasks.napalm_get_facts(task, facts) - print(task.host.name) - print("============") - print(r["result"]) - print() - - - @click.command() - @click.argument('site') - @click.argument('role') - @click.argument('facts') - def main(site, role, facts): - brigade = Brigade( - inventory=SimpleInventory("hosts.yaml", "groups.yaml"), - dry_run=True, - ) - - filtered = brigade.filter(site=site, role=role) - filtered.run(task=get_facts, - facts=facts) - - - if __name__ == "__main__": - main() - -That you can use like: - -* give me general information from all my leafs in bma:: - - $ ./get_facts_role.py bma leaf get_facts - switch00.bma - ============ - {'hostname': 'switch00.bma', 'fqdn': 'switch00.bma.bma.acme.com', 'vendor': 'Arista', 'model': 'vEOS', 'serial_number': '', 'os_version': '4.17.5M-4414219.4175M', 'uptime': 80747, 'interface_list': ['Ethernet1', 'Ethernet2', 'Management1']} - - switch01.bma - ============ - {'vendor': 'Juniper', 'model': 'FIREFLY-PERIMETER', 'serial_number': 'a7defdc362ff', 'os_version': '12.1X47-D20.7', 'hostname': 'switch01.bma', 'fqdn': 'switch01.bma.bma.acme.com', 'uptime': 80644, 'interface_list': ['ge-0/0/0', 'gr-0/0/0', 'ip-0/0/0', 'lsq-0/0/0', 'lt-0/0/0', 'mt-0/0/0', 'sp-0/0/0', 'ge-0/0/1', 'ge-0/0/2', '.local.', 'dsc', 'gre', 'ipip', 'irb', 'lo0', 'lsi', 'mtun', 'pimd', 'pime', 'pp0', 'ppd0', 'ppe0', 'st0', 'tap', 'vlan']} - -* give me interface information from all my leafs in cmh:: - - $ ./get_facts_role.py cmh leaf interfaces - switch00.cmh - ============ - {'Ethernet2': {'is_up': False, 'is_enabled': False, 'description': 'Another interface in bma', 'last_flapped': 1511034159.0400283, 'speed': 0, 'mac_address': '08:00:27:AB:42:B6'}, 'Management1': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': 1511033376.7964902, 'speed': 1000, 'mac_address': '08:00:27:47:87:83'}, 'Ethernet1': {'is_up': True, 'is_enabled': True, 'description': 'An Interface in bma', 'last_flapped': 1511033362.0303102, 'speed': 0, 'mac_address': '08:00:27:2D:F4:5A'}} - - switch01.cmh - ============ - {'ge-0/0/0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': 80603.0, 'mac_address': '08:00:27:AA:8C:76', 'speed': 1000}, 'gr-0/0/0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': 800}, 'ip-0/0/0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': 800}, 'lsq-0/0/0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': 80604.0, 'mac_address': 'None', 'speed': -1}, 'lt-0/0/0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': '02:96:14:8C:76:B3', 'speed': 800}, 'mt-0/0/0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': 800}, 'sp-0/0/0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': 80604.0, 'mac_address': 'Unspecified', 'speed': 800}, 'ge-0/0/1': {'is_up': True, 'is_enabled': True, 'description': 'An Interface in bma', 'last_flapped': 80604.0, 'mac_address': '08:00:27:FB:F0:FC', 'speed': 1000}, 'ge-0/0/2': {'is_up': False, 'is_enabled': False, 'description': 'Another interface in bma', 'last_flapped': 79892.0, 'mac_address': '08:00:27:32:60:54', 'speed': 1000}, '.local.': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'Unspecified', 'speed': -1}, 'dsc': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'Unspecified', 'speed': -1}, 'gre': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': -1}, 'ipip': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': -1}, 'irb': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': '4C:96:14:8C:76:B0', 'speed': -1}, 'lo0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'Unspecified', 'speed': -1}, 'lsi': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'Unspecified', 'speed': -1}, 'mtun': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': -1}, 'pimd': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': -1}, 'pime': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': -1}, 'pp0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'Unspecified', 'speed': -1}, 'ppd0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': 800}, 'ppe0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': 800}, 'st0': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'None', 'speed': -1}, 'tap': {'is_up': True, 'is_enabled': True, 'description': '', 'last_flapped': -1.0, 'mac_address': 'Unspecified', 'speed': -1}, 'vlan': {'is_up': False, 'is_enabled': True, 'description': '', 'last_flapped': 80614.0, 'mac_address': '00:00:00:00:00:00', 'speed': 1000}} +You can find this and other examples `here `_. Contents ======== @@ -98,6 +56,8 @@ Contents Home Tutorials Howto + configuration/index + plugins/index ref/index Contribute diff --git a/docs/ref/functions/index.rst b/docs/plugins/functions/index.rst similarity index 100% rename from docs/ref/functions/index.rst rename to docs/plugins/functions/index.rst diff --git a/docs/ref/functions/text.rst b/docs/plugins/functions/text.rst similarity index 100% rename from docs/ref/functions/text.rst rename to docs/plugins/functions/text.rst diff --git a/docs/plugins/index.rst b/docs/plugins/index.rst new file mode 100644 index 00000000..02f8beb5 --- /dev/null +++ b/docs/plugins/index.rst @@ -0,0 +1,11 @@ +Plugins +======= + +.. toctree:: + :maxdepth: 2 + :caption: Plugins + + tasks/index + functions/index + inventory/index + diff --git a/docs/ref/inventory/ansible.rst b/docs/plugins/inventory/ansible.rst similarity index 100% rename from docs/ref/inventory/ansible.rst rename to docs/plugins/inventory/ansible.rst diff --git a/docs/ref/inventory/index.rst b/docs/plugins/inventory/index.rst similarity index 100% rename from docs/ref/inventory/index.rst rename to docs/plugins/inventory/index.rst diff --git a/docs/ref/inventory/nsot.rst b/docs/plugins/inventory/nsot.rst similarity index 100% rename from docs/ref/inventory/nsot.rst rename to docs/plugins/inventory/nsot.rst diff --git a/docs/ref/inventory/simple.rst b/docs/plugins/inventory/simple.rst similarity index 100% rename from docs/ref/inventory/simple.rst rename to docs/plugins/inventory/simple.rst diff --git a/docs/ref/tasks/apis.rst b/docs/plugins/tasks/apis.rst similarity index 100% rename from docs/ref/tasks/apis.rst rename to docs/plugins/tasks/apis.rst diff --git a/docs/ref/tasks/commands.rst b/docs/plugins/tasks/commands.rst similarity index 100% rename from docs/ref/tasks/commands.rst rename to docs/plugins/tasks/commands.rst diff --git a/docs/ref/tasks/connections.rst b/docs/plugins/tasks/connections.rst similarity index 100% rename from docs/ref/tasks/connections.rst rename to docs/plugins/tasks/connections.rst diff --git a/docs/ref/tasks/data.rst b/docs/plugins/tasks/data.rst similarity index 100% rename from docs/ref/tasks/data.rst rename to docs/plugins/tasks/data.rst diff --git a/docs/ref/tasks/files.rst b/docs/plugins/tasks/files.rst similarity index 100% rename from docs/ref/tasks/files.rst rename to docs/plugins/tasks/files.rst diff --git a/docs/ref/tasks/index.rst b/docs/plugins/tasks/index.rst similarity index 100% rename from docs/ref/tasks/index.rst rename to docs/plugins/tasks/index.rst diff --git a/docs/ref/tasks/networking.rst b/docs/plugins/tasks/networking.rst similarity index 100% rename from docs/ref/tasks/networking.rst rename to docs/plugins/tasks/networking.rst diff --git a/docs/ref/tasks/text.rst b/docs/plugins/tasks/text.rst similarity index 100% rename from docs/ref/tasks/text.rst rename to docs/plugins/tasks/text.rst diff --git a/docs/ref/api/configuration.rst b/docs/ref/api/configuration.rst index 6bb14964..d47c5bfd 100644 --- a/docs/ref/api/configuration.rst +++ b/docs/ref/api/configuration.rst @@ -6,4 +6,4 @@ Configuration :members: :undoc-members: -The attributes for the Config object will be the Brigade configuration parameters. For a list of available parameters see :doc:`Brigade configuration parameters ` \ No newline at end of file +The attributes for the Config object will be the Brigade configuration parameters. For a list of available parameters see :doc:`Brigade configuration parameters ` diff --git a/docs/ref/index.rst b/docs/ref/index.rst index 9e863098..d36b6071 100644 --- a/docs/ref/index.rst +++ b/docs/ref/index.rst @@ -12,17 +12,3 @@ Reference Guides :caption: Brigade API API - -.. toctree:: - :maxdepth: 2 - :caption: Configuration - - configuration/index - -.. toctree:: - :maxdepth: 2 - :caption: Plugins - - tasks/index - functions/index - inventory/index diff --git a/docs/ref/internals/_static/execution_model.graffle b/docs/ref/internals/_static/execution_model.graffle index 5f0ed3bdd6010fe2617bab59b3842ca7d4a7f3fe..a101d8da40cabc94168be0e591977b5b0405e01c 100644 GIT binary patch literal 14808 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 CRb#UN literal 14903 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
AzaHx>o< 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
8+=z{&C7B_=`=3wc-WlAf&*v*|cL(5WP5e(S!A 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%0A{5 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

saI(<)z_4}MdvMEH5!juCrjXmCxj$ZZXC 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%0D2nNn24%wCdfg!os?phN6s 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

^B6H=r6Sj;S|EL9Ji#c9`)a3?SEAZV)CBVOT|^ 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 CYKENv literal 369085 zcmeFZcT|&0`z|a9DzX7Z0cnB?qO?dyI-(%brAZA6p@-ffG!-l$Nbf};bPx!g1QZoW z=#bER@0~zs=fU@N|F-+=^PThWx7KzoBYBva=bo8+?sDDN_*Pw2f#M>=#WQElP$)ir z`1H(~i%e(ET)2JV9Ps2^!Ac$Q50Udzg$HMf+L;!BFJumn^_3PjpWT|D(b9q_D&F1Azne=dpD&nva+&DIGLG?J$)$u-|oOS$(xogE)HTK zkh{A(ue$)Ry^{rq@BaP!pnLovetsUH1&_0*oy&6%9y{k-{~6@hI1eGtrcPE4E>`w- ztf%8Xe_`+HB6;)X>5KmS^B*}~tjz!CO?J-zofa@b(CKeLe7yHSe~t}wl{kGW_7vi5 zZ|izGytbW{ixj`a&&Gd${6BB|PcJ!psDl&4*%|02CG_7ee|`4%_G(U65MX|%uaV;W zZ~MPK`+IwJOM4f4V6C03Ocm{1AWp!`{@eSPfdA(f{~b#Lbh=!BS-$`5&CjR6=15(X z0R6eqQWt}|i`dSbkvXIIP*%%>XnExPv#WiB4UV}_AKE^<`RV4(5`2+Hq~!|{FHOPk zZ18I;%Jngfn)Yaw>bvlSPj4B7-rh~=FM(#pS20GgEn4FDQoTL^|3iU zi`mwAfw@ETXL`FMc&+>&XNgEI$(;H3rrf6&$f;zC9${#tX{%Za1$Pp1!VlG9(e?JcAFU_;UeDqS}X7omg2ugH+d-

%yPE3(?a`JJG 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�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

KnTpUbho%9ouwS>K|JM<6?q`T? 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 Kdf{I-f&T}`-i77> diff --git a/docs/tutorials/intro/executing_tasks.ipynb b/docs/tutorials/intro/executing_tasks.ipynb index 5eb7a3f0..a45779d1 100644 --- a/docs/tutorials/intro/executing_tasks.ipynb +++ b/docs/tutorials/intro/executing_tasks.ipynb @@ -18,7 +18,7 @@ "\n", "Now that you know how to initialize brigade and work with the inventory let's see how we can leverage it to run tasks on groups of hosts.\n", "\n", - "Brigade ships a bunch of tasks you can use directly without having to code them yourself. You can check them out [here](../../ref/tasks/index.rst).\n", + "Brigade ships a bunch of tasks you can use directly without having to code them yourself. You can check them out [here](../../plugins/tasks/index.rst).\n", "\n", "Let's start by executing the `ls -la /tmp` command on all the device in `cmh` of type `host`:\n" ] diff --git a/docs/tutorials/intro/grouping_tasks.ipynb b/docs/tutorials/intro/grouping_tasks.ipynb index cb2279ec..1e3ceb39 100644 --- a/docs/tutorials/intro/grouping_tasks.ipynb +++ b/docs/tutorials/intro/grouping_tasks.ipynb @@ -8,7 +8,7 @@ "\n", "In this section we are going to see how we can group tasks. Grouping tasks might be useful for various reasons, for instance, for reusability purposes (as seen in a previous section) or even just for readability purposes. \n", "\n", - "We will also see very briefly how to use the functions [functions.text.print_title](../../ref/functions/text.rst#brigade.plugins.functions.text.print_title) and [functions.text.print_result](../../ref/functions/text.rst#brigade.plugins.functions.text.print_result) to make things look pretty.\n", + "We will also see very briefly how to use the functions [functions.text.print_title](../../plugins/functions/text.rst#brigade.plugins.functions.text.print_title) and [functions.text.print_result](../../plugins/functions/text.rst#brigade.plugins.functions.text.print_result) to make things look pretty.\n", "\n", "As an objective in this tutorial we are going to be configuring the hostname and domain name of our network devices.\n", "\n", diff --git a/docs/tutorials/intro/initializing_brigade.ipynb b/docs/tutorials/intro/initializing_brigade.ipynb index a7504252..50325cd3 100644 --- a/docs/tutorials/intro/initializing_brigade.ipynb +++ b/docs/tutorials/intro/initializing_brigade.ipynb @@ -22,7 +22,7 @@ "\n", "With `InitBrigade` you can initialize brigade with a configuration file, with code or with a combination of both.\n", "\n", - "Let's start with [a configuration file](../../ref/configuration/index.rst):" + "Let's start with [a configuration file](../../configuration/index.rst):" ] }, { diff --git a/docs/tutorials/intro/inventory.ipynb b/docs/tutorials/intro/inventory.ipynb index a98acf7a..d3d1b665 100644 --- a/docs/tutorials/intro/inventory.ipynb +++ b/docs/tutorials/intro/inventory.ipynb @@ -20,7 +20,7 @@ "\n", "The Inventory is arguably the most important piece of brigade. Let's see how it works. To begin with the [inventory](../../ref/api/inventory.rst#brigade.core.inventory.Inventory) is comprised of [hosts](../../ref/api/inventory.rst#brigade.core.inventory.Host) and [groups](../../ref/api/inventory.rst#brigade.core.inventory.Group).\n", "\n", - "In this tutorial we are using the [SimpleInventory](../../ref/inventory/simple.rst#brigade.plugins.inventory.simple.SimpleInventory) plugin. This inventory plugin stores all the relevant data in two files. Let's start by checking them:" + "In this tutorial we are using the [SimpleInventory](../../plugins/inventory/simple.rst#brigade.plugins.inventory.simple.SimpleInventory) plugin. This inventory plugin stores all the relevant data in two files. Let's start by checking them:" ] }, { diff --git a/docs/tutorials/intro/task_results.ipynb b/docs/tutorials/intro/task_results.ipynb index f3f773a5..e9cbd0cb 100644 --- a/docs/tutorials/intro/task_results.ipynb +++ b/docs/tutorials/intro/task_results.ipynb @@ -66,7 +66,7 @@ "source": [ "## The easy way\n", "\n", - "Most of the time you will just want to provide some feedback on what's going on. For that you can use [print_result](../../ref/functions/text.rst#brigade.plugins.functions.text.print_result) function:" + "Most of the time you will just want to provide some feedback on what's going on. For that you can use [print_result](../../plugins/functions/text.rst#brigade.plugins.functions.text.print_result) function:" ] }, { From 28a57e0c895a80309542c4f53d4875c6b5af129c Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Fri, 4 May 2018 10:27:23 +0200 Subject: [PATCH 77/77] Add BrigadeSubTaskError for grouped tasks (#131) * Add BrigadeSubTaskError for grouped tasks Raises BrigadeSubTaskError when a subtask to a grouped task has failed, this allows for a prettier error message when using print_output() * Use objects instead of name of task * Version 1.0.0 --- brigade/core/exceptions.py | 21 +++++++++++++++++++ brigade/core/task.py | 16 +++++++++++--- setup.py | 2 +- .../output_data/failed_with_severity.stdout | 4 +++- .../failed_with_severity_python27.stdout | 4 +++- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/brigade/core/exceptions.py b/brigade/core/exceptions.py index a07e5d85..af7de6d6 100644 --- a/brigade/core/exceptions.py +++ b/brigade/core/exceptions.py @@ -51,3 +51,24 @@ def __str__(self): text += "**** {}\n".format(sub_r.name) text += "{}\n".format(sub_r) return text + + +class BrigadeSubTaskError(Exception): + """ + Raised by brigade when a sub task managed by :meth:`brigade.core.Task.run` + has failed + + Arguments: + task (:obj:`brigade.core.task.Task`): The subtask that failed + result (:obj:`brigade.core.task.Result`): The result of the failed task + Attributes: + task (:obj:`brigade.core.task.Task`): The subtask that failed + result (:obj:`brigade.core.task.Result`): The result of the failed task + """ + + def __init__(self, task, result): + self.task = task + self.result = result + + def __str__(self): + return "Subtask: {} (failed)\n".format(self.task) diff --git a/brigade/core/task.py b/brigade/core/task.py index 472eee8e..61265ce0 100644 --- a/brigade/core/task.py +++ b/brigade/core/task.py @@ -3,6 +3,7 @@ from builtins import super from brigade.core.exceptions import BrigadeExecutionError +from brigade.core.exceptions import BrigadeSubTaskError class Task(object): @@ -61,10 +62,17 @@ def start(self, host, brigade): r = self.task(self, **self.params) if not isinstance(r, Result): r = Result(host=host, result=r) + + except BrigadeSubTaskError as e: + tb = traceback.format_exc() + logger.error("{}: {}".format(self.host, tb)) + r = Result(host, exception=e, result=str(e), failed=True) + except Exception as e: tb = traceback.format_exc() logger.error("{}: {}".format(self.host, tb)) r = Result(host, exception=e, result=tb, failed=True) + r.name = self.name r.severity_level = logging.ERROR if r.failed else self.severity_level @@ -92,12 +100,14 @@ def grouped_tasks(task): if "severity_level" not in kwargs: kwargs["severity_level"] = self.severity_level - r = Task(task, **kwargs).start(self.host, self.brigade) + task = Task(task, **kwargs) + r = task.start(self.host, self.brigade) + self.results.append(r[0] if len(r) == 1 else r) + if r.failed: # Without this we will keep running the grouped task - raise r.exception + raise BrigadeSubTaskError(task=task, result=r) - self.results.append(r[0] if len(r) == 1 else r) return r def is_dry_run(self, override=None): diff --git a/setup.py b/setup.py index c82646ab..7a76b253 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ __author__ = "dbarrosop@dravetech.com" __license__ = "Apache License, version 2" -__version__ = "0.0.7" +__version__ = "1.0.0" setup( name="brigade", diff --git a/tests/plugins/functions/text/output_data/failed_with_severity.stdout b/tests/plugins/functions/text/output_data/failed_with_severity.stdout index 2534f3ff..c6fcf161 100644 --- a/tests/plugins/functions/text/output_data/failed_with_severity.stdout +++ b/tests/plugins/functions/text/output_data/failed_with_severity.stdout @@ -13,7 +13,9 @@ Hello from CRITICAL ^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * dev4.group_2 ** changed : False ********************************************** vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ERROR -Exception('Unknown Error -> Contact your system administrator',) +BrigadeSubTaskError() ---- echo_task ** changed : False ---------------------------------------------- CRITICAL Hello from CRITICAL +---- parse_data ** changed : False --------------------------------------------- ERROR +Exception('Unknown Error -> Contact your system administrator',) ^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout b/tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout index 2534f3ff..c6fcf161 100644 --- a/tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout +++ b/tests/plugins/functions/text/output_data/failed_with_severity_python27.stdout @@ -13,7 +13,9 @@ Hello from CRITICAL ^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * dev4.group_2 ** changed : False ********************************************** vvvv read_data ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ERROR -Exception('Unknown Error -> Contact your system administrator',) +BrigadeSubTaskError() ---- echo_task ** changed : False ---------------------------------------------- CRITICAL Hello from CRITICAL +---- parse_data ** changed : False --------------------------------------------- ERROR +Exception('Unknown Error -> Contact your system administrator',) ^^^^ END read_data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

i^~ZVm$lU$?pxrf+2hxso?*h z6iPNRtg2fJ=K?v)sBtcgkyZ7pAZUH7{x<8L^e0b5QhGz`vW=@PX+qpIeJv8iD2ZCG zhE;S02Rpqf+F?DMrAjn+s^SlLD(K}rREI0;*c<$4@UGixI>fZ99r)5U5(hm*F>l&liYP9EjTT$O~G%BjJ z_4Ilka_W*IEP1l|%q}Yb4&!a+D-}I%#1uq4O2#DO zOYfC8uajICLq<@MxmqnsUjrEv**kSDkpkYu5++UV6SBH>`)(nt!?M~J#t!$j`tax) zi|v@Pp#$fMZ-#yNbVuH6uosLW&wlm-NH~-1b$_aVdHn98R0`rCkNM+*N3FzmlGNBA zh8RmCxvTMAPwIoC*DsTZ>k0OjxG}C|5&B@5OC=m3XFtd8K1wv=ls^K&wsMc-V~=eX z_0p&hT;j!`Au{9@56P(u%C@??(u{q}%S1xUw@9^d8?fz=yc@sjXB!eaDoJgeABGh} z?tOP>yeB`f75BZWBz-1WoTH*_mVdg4Wa_>*6pD`=f3nnH^Ds@PtN2;>k_Nsm!NI?=nQGy5Q}8jx zmq-4r?4Fp#a{MM*oqh6HYRKjG59F*&CAXe%`DYu@-%gD4Ocov^1>>wEYqurmdUDpQ ztil9dHRi|wnWfn-ca%foLhcFjDclDkZ=kv9CyvSPj}oF}LcRHDrP>V1(6^;>N% z!mlbn=0+X+&Z(TXr8eYB}3jq5q-9ES@6zp1KrUwRc>yw()d9iy-3-^m6o?<=0FRNCD%SZV4Ut10o3_&Ez-Pb_^FtW0e9ASD&b*MUx zvaa2Tr~)n>IN$H=K2Y%b_~L6y*{*pX+j%XqzUmm<3Rp*NIt zQ2`iE@-xHzB3=HOzb6q?U=lcjZ|-Jl>_c|p8J2y6j^8pPO=R&|T4Y&lj_UeVE(6I(w3 zqF?5ABW^ztdJG+{NUKC>U^DRSApeC*>L6lx{Ei&&4Vt2&!b1mm~X1HUlI*nc>D0MEl zW2?)x>kaeg-=!Q#mOR;UYKmK`vcExrA1&pBEp`@OD2BJ#67gkUAw#Peh|;nRYL#nq zGy5^^v!p|-)7E1eW&=_bXUC1nBMdj37=&0Juo7sJbDRpT>WtSjq8^~~=kz{I8mgtc z+_$dwP9?bas2LjifGH)vn6{8njl}h!MzHojFf~$`$uu}$p$&ia>)CZpv{t& z@u*&_&UlLTc!BSkhWKlRhT@{Q755$fSRiNX;0h63NI_#OWX=~7t5`vL%zZq(ZrFVR zGjb##f-o^km!z zOPnHC6R9t1Kw3%9bG5Rw1lEg?Y}8cj)HG*%LIEmgOEuSA72LO+?{j_ z1)#8}jaH-9>000lJy$`4Vgs(kw zYVmZiquds(FWr%gNZ@SwhZ_8fr2P4BYK#sX*qK}`F#_SbKK?+;?Ui+i+t$otniZN) z#Tvi>m^f^Z9C`nsErJ{TO?q7>T3}F}kZV*Gp`3geSbIGFeERYTzol7!>F26U`}!oV zmX~TDb#@B;J}`L$9i+Qu4L8EwjH`D*r%{ZS1EjvBJe@bQ9pW5%Xc@uqA4z<%C(}5j z(GPwu)_CCY(Vki9+gxVh;L9lv26g+EA>qXLg~=sda+D)-1{)CYW!X((faE`zENxiP z9@W*wyPNGfc4U>(5%r4E!}12ZQH{g*K0uy7@Yvs)oz0Bph)|P5bm!QOEHR%X7NjM| zcjnE86Y=$~%ZP7GK)fEUu(#?44#$=0b-*hfzVnj*2pvK$d>ZKhQbaBt#Fld4TE2r) z@Mp3t{vgam~*RNiOdh%PopGE`308*e9?BzX`s68Iu3z z-Kv#t--BGRH!%y>==b9lhlYKfZ6QCkTVngalV%8= zll6Xrm)gr{ia?pQj9Z-z#O1HUcTu_mtO@;yW3#G-A#x%&``i7s8t`*E+3oiF4Ci@F zj4)X_UsuIegnu{|Hg&`e$sI2-dy>m7tzf*CTtsf;qc>azUIu7_YFU)zC)R85QfHGL+Z{cRDHZyG2wj})GB;fI?jrYlRLxqc zOpRO9`B=jxHc6+^2vU^t>To~WHB&Jd5>v_~z+$i^rG?Ha?<_IX7pbz$HwvN&q4Eu( zdefY#miRuFxLlDykL@c)&v?|Ckq_9^;6)W0z9~)q;C0*EUp05XFxcZ*-F&|?o;b7^ zD4^dizfn^&{>GTiIGP3--F)&55Ppd_D8`6W$$Z95UCoX#dpM^`^>1{ve8Pq zuYqII0EJrfkU|l#sIm~mmIcpl_)>?*)P{FA3hd@0kCR{4_hnMv0XP%(ND)Y6;jQ|np~en{MVTq<=UMtX_fOVvRg5~7FU&Rv zyF6I+(7cn^Ereyild6ZA?OF|GC5QNWJqd+dHhePS7`qE#3jIK~?E_QBawClQGj&i# z>?5ahzq_2fdhcLocSI}GrsBn%*-+{E=IgkDqr<#UjcHa%uFAw~1% zbHpHQ`jdLzb?kBZ(4*OBj23I70m2TZV01e`Td}k?J+W!K)81bgU6=l&bo?W|T$|iK z(YhEXcYZzTFl_VH@wY4Pj8>?6lTx(F2Xgkfl?;=8aM@8m($ORlV|>YDaU>cVOzu5s z#IFZP#a*843DEw#u;hE`;)XzYzLQ4mNe(ZE9IwMx5~dnZ^n@+if^0!^)qP>Ce3_Y< zt$8|z{CX=R6=?1hy{z2$iyHXxnA{V0T!v9GQEoARaGCLcO_DaGW)z@h7dEagi?q+C z%&9N!>$68)V)gutsfD<>6l7#&SuB^CAVgMEhQ3Bb;;p1jG-&|FTG}xTJ80K8yt3mA z-$AAJ=GNzwSsbOaSr5~$WqZVEQTD)Q-$tQz1bxs z$WK&zk!xXmGeC)UM6ZOhB4tjJS?kY_?48t9gB6kUnBDDbyQLztEbc#!YE_p%yN)F> z?k_EaJD7<4wP%@>Tb)~7w%;P%M)x^ZJfJOJj(eMOQ#s1NoNLH`x?tjp;VeOv%u+DI zs&)J=K%}1mpLsG#GL|JOG2VoyIBjB)<$AQ5pTDkLcd@0zDAJEOI9jIr)XAD1X=$0o zCYLOw;b;p!v>XZ!Z&4euTz&PNPhzT#j;J2L7!(zmeke)aHt5TT zZ*8(luU81+tdGeSHB0;>96AIE6BOKGYFnXtRcwp9oEYUe=B!gg4fHN^HiQ@`K8D_1 zdIQtzWOZL&=brui({gvsoyw+9Va-)?$G@K}o7%1w zNq0iVv-99MK`Z-`MQ5V?V_F<@s~v&ALY{-g;IV4nwoBmq_n3a3?AI4oBh4Bde$*%iUUMm-?Lr zChq{cQD&r)(mX#*tyO{yTU|CB?~&D8k~k}fxu>bjOmVKT!iNZxNER5r6@Y9^O*3$7 zcc{L~`1ny`sLm`Uyd3KK+Z2FvEO?yH>AED!cIT|{;EC0)HqT&;F3(37i)xzN+QCfv zg6VI*;tv@Tp^{-wnv>QWVJ?pYaiOH}+8N1T)n(L&PZq(fn;ZITLR@6L1-Wlz*R`ay z{{BJUS7NT?^fc@=s=H(qlJI9uYlRIbv}mY zJe5DZ>N`-tdY+XVcXgY=d_iKZtjs0!w1n60Q25q|GX+DnUk_*vZ3gTZC|yc;yIiZP zmG1QPb1W{=&;VmAkp{^Sbiq73^+}t4C(3>ilx3G|{TqqTc{eSr!D-Aj`SyBfIhu2>D)wDFm<{QZvhk7<@BV;FDLf<@6P z(yoTZVF6fCzw^rBH z43AqR56(O$Kq(8!_A)+i1^>l=^c9$cP;`-8(NVd;SS>B!vAb2B=f|FnND`zL}E4I z=%x3}H^Z62itOPKA(L9g-CWZG%MKQaLU7N!5YU^Yp`zh3Yl8(l$xerC>N}nJarCQN zKv4G3xtYwF8x36EPX3voG*7~jSm}ow6+|J_k*WTvo0{mm+ ztQNKllU7xzedCwn++Pno-v=^M2UaJP=_%4wyIAubA@uR`YHyp0p#ou2|x-`^Sgy#hu?6T^2sdELL$`HaEtMl%O8Rt@o8=wx`HH z#^lFcCzI;&hpoO|^h{(>q*%Va;()k*E+fg@#27}0`cdlFH7l@K=#z(Q%1&)QK#R9pGSW-hYpCxJx2{VBE zt%BZGSQao#98`yJ#?ojt|Aoo!>;Ld&TpsNpuh(}lIiymT?i};qR5{Q%BGp^Tl+Nqq zpE5kid~-s~F7X8qUtkd3v(snt__Oy9i^1_mn>oe8sj}b+O z!Zsx^m@LDjP`z^4kHSODY?<@aqgw9UDg+#U<+)_JA=_+6f_N0bz=k*i0<6q?vyw_( z7UA7E^isnOQJw19Qb7H<21e|EU~Vv%T%d_NAU4geC(*WtFIhBiM~1MY<>p!MC;3kXnpkuc6(W>AA18>L2zhg5>!*`Z^^qJuLqMkxS z&-B|Zg#a&bUhzqw-;kTKbP)X2@kMq16OaLH6}7Z@fVENnGbfWP9vj0UwEbq9^DT9C z-qS~BNkIqX&}Q+JJ62}Bx9qB2QZ(k2Mppe*PlkBduLUQNIM-9_s+^1pKs~)8lq+^} zeR{ICW4a;?mVHG`9y1X)MRyVVUx=WGeB^oQJ%`b<=-8ap@-u!-4T36S%;d*dZ~Fm1 z4&F%zU5yIEp4I3tl}kEjl^44zn?uffn%RPHJmQcaGdt?M7Q|ysU-YxWu75&K zzh(uN=VKDH5pM%e7$a}t^oJ}-BJ?pEs?VRl&!i2=j-1(ZBv4Zc+?ogI3-d0IJe7Y) zqu%anW%WAb+C+DHi!roER}DX7mC_vS*_R2VBGpHaqA0nUmf#5-PH6oms_x)@fe8i6 zCR2HTjnmZ-V-cI;x#kU=kc`PZ)$lGv>eTOZ;*(tf2J#ei`P8n%Q$%oxd!tERN`Ik` z%8!=r(J(NUxAE)Hc~?t7WWxxvd*t-y?mcqWRUqqMB;F{{5kvFBQ)kfJD7^+p4qaP{>F$oA1-NGFg)iCW%Q zwB@AMTqr{}yWmWWWmhV?S~9vrzXny~Sl|UqDa*E7j3E+sntdPIu2P~Y+;=zUONExT z-tU5zwAHQ>y6ObPheMB>Cd8s!E%H}eezsT7Q~@**O{bP0q-RKr{mbTbDDoprZ8%p? z$Oxj1f-LroWBvK})7tJqv|D<#5hv&Xpj!E~95P_q1_0b(g(^EPu5A*nIK24|*`?_` zWd&We_T`kz8Z$3|sq@IQMr%N*kK#xRW$RgsHYga<^lAu=6UzPd$){L(%FnQEjuZI0j zK3Wfv(kIBRpC(TnR-xBw?O8J1^)NU&CH<4l} zEmu^%{r_J83Jk;iDtVdCdBO>A8MNL^;xKJRpewWyOl${rM861cCoak73dl+AM zUUqsShaTu`!~xG;8eN*7f36gQTbTdIDmaEZ!Kuc&UtVJ-6%*~FYWB0s=IvELYKV!D z&an#0L%l8z%81q3?dto{S zK^(H}TeXDM)gkBN;tnSAzD}Mt#)yk&F_9Y_7Gz>MASYl@HY}I0T$gOocLdAilg7l_ zP+QETN}DuUyyYFa1JAQSt`aJ{m;?9iOknIk6FbhRE%QE zk({r3vvS}1nE=}L!ba${b1!SkGCX(kG(&R5x5Lz}8yMcyxRMW!AG(#^8CN7WP0Thws;N0c6PEbV(ptnV zW#8E9)3Crw>-fEa&jyZv&n_6h)|H`~W8vqQ!(deaz7cijb9kf@Rj7)Aj1gYxcSahP14q0A`y% z1i7cb5wrt287W?&czX-(ywdml5KaJ@)rh3_Rto;?!Szia2nUH!nWd*NMh`bYJB#x+ zNPjIWW-mA@q}I_K=rIr2htOqv&8%8883wP>Ig!&rhPYUJ7i*;#W3iIXF>^K2fJ3V+ z(Rpt}12nF$NJ~~pk;4yN&$a*#ck{k#A;`oehhH!1%*df;l_%R~!HPCdw(1p7qJ3gD`g+J={e5TgQNT3Wn`H)c)S$w3eWEyGjxop#){S zJ)=wEH9F;HT{iG)ZZJ1v7|efAQx`5&XsE_am^A4)#)v0Y+?|>d2JOE4XO3CG4;Sgn zo&EX^KxhAo7w5ZLcXtE$689}>`j5S! z^WxA5Vin~zWG^3u=s@oSM@>~UdwaGD=ASn@x|IQkWK~>_oj_nDCI1VXbhu%(ZOd@E zjU7)fm2^>t9+>jw+))W?9nz3Sk%Uh;wnDH$?tW){T&#KsX!-&oP;L{f$|#qvQBSpz zJjG@=`f6WZ!*_UvfCAbi{4V8Uk);KduxLAn6MYiO!F&C>4vkXY7Vb z4K48|FX@QGHbSSavd|EW2?R_6?EC9l;(&ImI=X_TwT?Z#9f5O}1x@#=fy3dhHgPob zedO=OFVtH1w|Ok%rb7UP#*SLf-S0V&o61ez`NvIt+s+q#ON;yatJ3{qGU`#C5cbt) z6G>KZvCmg8aKT%(jjWQGJEF0FSz#N}Ptvie-z*I-zhSLV}bsaPK?1;{&&8Scl&-sjP;!!-+KbjcDWp8GgfjY0SI zQh1)`X>zM4d)h_K_F3tePA9p`@kuQxfB_R?Nw^GT4plb6b6htv^VX*&Sp}>*zybY^@gN{pgC=B{m+!?c@Fc@f}z_ z4Q81;b1KHnLUtNp7y7O)iE-+*>`V6?QeE8?jCFy+{Z$YbE71jJTz=2H$uCA8(*Jen z5}wE(ffHPg5U4zwR;!BzBaI_;T3_G+{|a5Kz;1y!HuSRe%`5+S6lx!tk|LfD)yR-0 z1fm(w*t6K^S6K!9b)?bv^%<`%@?7)r{uWBQ?~1}4sn+%L>$LIOY!vZB#%q(*_njcz zw>wtMeJaT^&Ykt|<2%dap#D?*RQ|DI`8vfyZBE!{1C6w_ZU)d9VPRoPvv++OI$Ws3 zQ0=N-=UP5W?xi7} z`yzO`qi$`4lcyrr=V8*0vW&zUn+Q_VS>uL2T{Kaw0N<%q*b$8vw@SNJ_G|GhiCZJnq*Qak!a( zt>M^nT5F`q?)ltWb|g4lBi&A9TXMCQlnkjj_D+k{7413c8oHAn7*El_7ggHmz3sJV zl6JM_!OKbaNObW131f5yn}e5?JPM0#abLjhV-~9Z1+h9}Ci99kWc^FQrHL3B0@{3s zyqNab#(eCcAY~N*FJ~dACgU^-cCE9(oYm1y4qK$G`aNs4#}o>Ac)epmVfxFZ@c|Tv*Um!g4QHjCeO5Zr%1@xkmlT_@ zFWb4Z=^-h(_VPP6(&D8j3x_!Q0x6y-2*duN9+F+wjki@SeR_SF-c74lfq%P<96nJ3 z|6D00n#)|iwZ5>XIN>gFGLmKX=P9xV%85)0I)waHW-^doPNI(*9`1f+r>6p_NQKjK zUVW(_I4Ge-s|?j`bfBeYZ@oKM{LrUfyU3_p;_KorX5`ej7S8&Qt1MDi)o862CTjpQ z(e~((9x*HyjQ9q?oG18u#1)ZFYRnXas?}MsL`mn@@!hDnz5Ir6hZ#Wk5alA~F6j}T z0~WXpTuFs&+7!rmVuryY)#|sE5yFAL7U1P=8wkm#VbreS(^HK^Kt{htU(ycy&Lk>5 z6(LV(Q!HO8PG;=6YyCl}&SR`(FnwDucYer|cR`&tfXQNM2pzfVs-q)NzVy+hczFQo znRtp-F2hpH2z%fO$jy1v)+W*JKd?^PlFuu0MvDJfb$Nx5Fo~9K#b%9FIs|=#Ww!Ij z?$Gw?Un%d+!V36C^ToZ(o?@`r+px0rU9ea$~?aq6r z9F@#60nfupZdO=YEVl~UMCOuX=_>giP&@2O+GHZ;#pAv&*&yp2M#@>~zc8)F-lTgI zUvXsG5!9~i{F$9I#c5HmEI)$IY=p#mVf&_io5ifBzC7l&}905pH;jbcOx? zN4=g#XX>IgZg_KrSxbx(VC37DdMp5yQPwTk(;Y6ei!dAe4JmI}JjsbvW|EiRK4y^| zz%Mo!+RI*-KiZJbHEM-j%Lt9vbet^r?sICAAAWt@mg|)yCF%s}w1)XO^-%fJa|(SfvWRT@XPtFyBKm^P}H$Mdd%YMmc1=g^y&$yk<<`1uk6v@*rkhi z!6tin>a>;~BLQ4t%EUVrEZjIPX6?wB!`s{=1g|j70vsG@-QjE*dF@2p4!kiH@*_pL zox93*CpC6~SvDz?j@{r{((pivcgVc7G`=oq9v-9En{|FBJ@hD2Cv`VQVB$7lk#5zr zOmQT57E?q&I8U%nJPGWL#QcqW8n#bP{Sh&Bw7c?*PHy<-6uoiMeFuT83>Lg8*NBP?$>nqt@ii zl1o_G2by>b3e~IcMNBupOj>eSTK>sG zxBcS}rkVbX-suA=@zE~4Tav6NUEA6iE!6Cc-h=lC25_F<;^Hpb`LzjoAw&HaXS}?; zY;nx;l%0Cpjz^EJ4Y!ZqV}y~6U2%pzq`kEo`%+oKoLRK%g&7RgbGE_vHql6e8z>|{ z63Q=#J!#jM6LL?h5vCIV+!Bi~goVmxflC^7r-x?V+}{%Ns3vvC#7)~Wi2eo8yCi#$-2uDQaq+O z$`dKFlDp}*>H6|?u<9h&FYgl`%WowBd2xkK-rk$Db)Ay+bJS#%AQk0!T16xsO68ZG z#y^o6N1c0lNk~t2;GqFn2gmPh@r0JY=)^o1on zYh{1Aa>+9aBHsv`&g-jx39}xnk8!Ci33*%5E~j;T=_tyi9H93#}G z{N?);BjMZ2p^rXHX(rzrNV`f8{aO07IWa=V0VLT%ecz@7j0q9Rbzr;gxO%T*07AIK zznCcvKa$wp&YbIcF|XCjhZMHjE{vSBW52B3E!4fxwe~Htzwb%=Q!r-<;@Uml%1T+L z6!X&(1qCHz^|86vLpZT%_MLfX5VdGpY($>?3(Omgtpn?3>l^9t9a&#HDv2?88HZ5p6@c-B{o5?cBRj zGp??`>1c4XCwi90U(}X=y3gQ1u#rGw)7(@~$Pk<(9I>P9>y1UEEC*36#XG|Rp7<9{ z0y?1l5#}YOVkuX_P4JN&BRKP#LU;K_W*e3mgeP-#G1uxwn^WIV#UeSb=hsW#hIt$3 zkBo0WCM(u>cM(zLqEmUVcy zd=$oDYRonz4|^p33T-Agy7*=8Ee?zebi{FYW@gbmYDvm;6izgkBZ19v@&e7$~epxi43HCbRaK)zG<#gw#|AOMBOqdK-&2y}9JDzFVTN!tH0~5Qvp5_dG!KObkT9eb5rd)2+=9d(T$oOP4nWwAoWv^B6K<6C%RqW-kH(MwaI>yuqHa(RENWd%Qc zaC}0+zcd_%8Jiv<-7U_F@vrNtzRuGN0|a|C%@jpeUhyGBFG`Lp!Q6f&CF1Qzb3=!h zs*OGm`l)Y7-c{+*D%9d=ev%T2;(UH9R=!WU`kZx`85tfhv#2ITFII4M5g zOE>yJ@|3jTfoZ6=rpRIW8fUT@`7!K1-rS=DT?mv0N_9``qh9kF8ta1~6|Hh3FEva? z#-Om?=VMUZ-*uncr>PiS+}E<_?Tn^YhV$K8-X4;BzfupZ$_^`ekC&?0RyrP+sIqhJ z|M3dQRCv~##y zq1Yw+-E|SXJVU}wFJ=Re?9NKmR(bXgo)Ue-)mPdX>^i|@FF7hIDeLU`7|glsZ*RqZ zoV~KL-?s%ArsfZQW&EAZrX#lw!@R{L3pMGo=M9W5Pqz_IRI%-lh*cLR!AD-tAn?cO z20H;aK~oj(iyqd-r$PoCJSpCje|jy!*g4?eMH*`7Q1h&g|PFLv_q7^e^gDvL$c9K9HpM-5 z3z1y8VQQD&O8F=rEb4wbKGb0=A7Dd>7!0ga56CduX0^CN zug^S;mbAQd+Z-xe^q&m=^hUd%F{dkDE}r>FqDsD9jV1cpNV+wCNq9LEdddA- zYwZy@k_7sIgS@xD4+D0BWZ7m^iOtCPp#iP+KuvX~veizI=W0=*KnGkWma}gQ*Rq?4 z>F<6J9&R|52}@zYc&!dJrg16`V{Z&xau`eltK=5EzHv5E5Lp=qZC%J<;K5kB{5GG5 zqRYGAnrIcs-%fnCWdv{;B`Ig_hQBj-`>h=f%l_`p=$b0t+Wsxi?Nm>0f>E2u)Lvw@S2M(maU|FJ;{H1_#E7O zuKa@u=T?G7%m@ae{;q%?llM~72{HiwI^*{8BD?42uE~geJer3`lDk8!cZ!5_+x@22 z@B${94$eGt6mwT%Io=?7SWUM5_>uMoNqQa-`3Z5C`SkerwtC*N$D;36YGxhj<{3SM z_|0+*oIl%k@ZqK&%cq~-;{VZB@N&w1bMv4?K0lwP>6St;2h+swubBUPAZEw*&6|mZ zYe&&eN5n+BgPN`GIpOIzft!OoHO$n(pD&m9ZEod~0Ykdy5OqfedBZP8xJ9}ARP=07 zfU)`3D&Oo%>xTznaLIY1yyCOa8dm+h>}>NvOXGWID7-PTH^=gs^|KAJUz{d1RLl>w z5;~^C6G~6eb$os~+Kqld=aCnEC?ke*Ad1swew`J~P>f7{SzAg@_)$6m$MXI4W=+CQ zXmQk7K0t@3#8dh6Ru;9r9bz?HFnxqyhOWu7NT!a(lWAQfYQ5&eyJ&B=*IVoL1q?JZ ze-P(f+up@5@5*|D2(pU$sv}E{(E^RH<~y(0GJj7T#^)R1zj(m>50;T&_em#X_v7%l zS!XNQ&MZ&-V62_}Erx_b`0ffmG!&P=wsCwkK&r`^78uswzi zsU{gPS~!>e)57FONUi#Phj~bXV5%_PSH1c$$arLTXLALegi3OI+R2>}M||DH_jG<_ zDPe!q&85K%c(k*j6>jnUF859RS(gW6^u*5eY6)|5iQ4o;mCXS5)OI-L%cv%Gd4Z#| zsM!>aXw4^8IJ2euE!neX`T3C6qQ@<^u>&FkOPk}Ox%qoh?nq>y^C7^nrd%@qeodae zx!-GWy%jiLej`yX_9en})cuBB!Mz>XY`I-)<6DT94CMdE-dhGlwRZi(f*?w%pdykU zLAs?=5s>a4N?^#LLmEUu0ci&5?vfa~6s3ml?rs@|j(2m8eRKZL{XCyvKCx$J*SglV zdi|E$@Nq3o3hw96oKhsuH(G&{Kb3+$>$)9ASwe*n<}R`Q>e>Y{#V=YrBWXNTrFcH`M2?i zO;~O5CxuOWA-KObo(pxL@-*k2Ank4PbsbZm1Scq6-Ht#QG3Ez2F1*+k6z~HS)CP8l z`*jX{9S`J5x_{P5{Ya6XbLwXiP%J%#GCDr#a7ZFlvbKDu&_Wc*)J|U4Dt+;Zv|@U` z6z`VGW23nAZFd3I{WBge{)LWDr$Mk_;Z<1)o0%{5ZSS=*3{Q3%de(P+Hr9MJ^XH}Y z?Xjo{{%NEKAoD)upf`?S5R1m~#U0)1Bjvl3Vs@ywM)ctDm}4hz_>7}9d8VU$XSzb$ zes#@pQK5$({`KDa?Zw@qQsj(gUskD+?2h=T&OX!G(X++<;w*$8B6`EPilXs0iDM(4 zm0E4Jti}uDG=Ih7D*Z0dcf>oJbBjBOo8#lJd;XWo6f0%&R0k27&DFz#`8A_yN#2Bz zb=HjJ+%VTi8}W5-A*~1DVWQ)?lhO%(e39!sc?Gy-;UX4+ku+rmp@xdPl5HDLE3Bqx z=zX9Pq@mrCYI`2luhTf;8KlAc4~CmevXn5{&OP-PE=#Qcn6o0Z!7n%{_m52I`KO?N9bY74K_JodLw5a>F?({d%rD}zGRn3Ph)JmJ7GU?A&xDi!qS)hI$RN6%kdHf~;ZY-`f zH%tAjiJ?ROf_NP3epQV5oTGsjF;0dsbta22d%%i#uSI)_rMDRMhUVV&$n=_`mn=xu zZf6riS=?~?rLcyWMh&?K9sj7~#1bru3?ra{ge!)f5_V4xUfCZA-L+mm#n?a8mMb1M z1iwogdmT(0!6Tr8c140OIb2{FOSg_dQS_KY*Me7M_~##73X&OdSnXZTL*^4QfH;@ z5#t3qIuj4Ysfw7aA(O!;0pS_?o$wOh!BH}Y$^vh6-tpM8Q!WmbaD998nC}Rg;nnqL z?%IP-I;V^#!!{Vq2)L%UVgwxr;*Oi3`Cr9p9=DtMk{%fED8rSvv^U5c)|j+k9r>4$ zWJBZQ_1ukdaWJ`t$?3PM=^~9sKZrivdCLY4o<6K$;W389&@J9kCh^coz*2QIEpce{ z8y{Tau=jX!SvHO)dsi}>#4*ThGei;U*-#5v6$$Sfs$l#^J2mw8(_Jf%aWC3oUJ4Hq zy@%EmBcgAw6*F$~#xD-#cLx{L1)U=t5uVB$od*e&nkipwA4l0~ZcQ_t4bvtBsXaJS z{X*CtKE#pfj9zg(4Ti3s9kd8=;~UwRC^g^5FJ3Kq3XyI`TARxb?6oduMO6&2k4OZF zcTD>o&@r|aE^M~;eTV%~MF$t~%k}nG?jlRccy8`5?68*&M~ZW|RM(n?p)znE&6LrN z1l|?g3yJU$bDVVI%5Tr@cPX&g>mmpei<83q0D3?c1#djHLc}65=-HSnoez0?2X{Xd zj3zpNFdTStq#t;6GNS3-v&)5+$34K5e~cwuRe<>Vl_le^N$dTmIWv_|-ckF(a=gwA zXb^YAEsMa*F`4e)u>hp`>o%7LqX}`PZ#euTmZ;T%W?adEgo|-c0jo7}Wnj~@^Yd+U zyl4tv#7omT(sH!|;momp8(u=TMb-*L7~{FknKj6wWG9qde2XB2LNI9jFPBI%M~9(2 zLlTS32SCarda$pUq{G9pEQ(2z7Z6cJc9VCp&Q}xwLFae5|^`AEOl@tb9|kx9KQum>C#~l+!n(+|o5ds#>fykyb@oKl-hE&{HZC#|Oc%S? z!8n?fcn`&9+!hk6TpW(>t6DOL6-JX?cqjdO?Dw9F3am`^v6X-`!;^LV1#>Bg7L&Q7 zuP8gNBjl!gs`_|WFY;411)0Ar=8*H$i~bt1*&N1E(tc;7xwiv>3~Hmq5>(e31z9-``~cCz&OHOZKhv?B;kG8G&t$dJVPb&@tp;|+)??nr1 z?w?wi3{_+UC3|8R8VeDDWX&21!%T_QkJc0z3Kad0U&sf*nt4UMzp0R5X>xx4UXRg_ zv+Ky&7|MmuFNRmR@9ZBQrn>JA!Fquj;tXC=TS_vu`{Ye^iCc(v4ZNXv0m+QL|`gghTz zO|6X!;|GB1t;88yDEDGIjV3qRIyyRB_c%5w&f55FT*B;`JZi>nS!J$tf+`A><Toj)*h|2gyueW1%vG~M04Xv@w8apL5zJcymX zx609(P)^-cro(JWqk5Sbhd|xXwIs2L=x`uh#`_btQL@8l!fla=YaWS}uQ+J+Yu#)> z+4O`uOZb!TH+6zB@*fSn{9&HQN+-Ja+Z?$&A>%u%d7LsN zoxPH)Si{|krrfhS&z2*GzlHCFLe3FRDb~hrU8E#Yny&U0MYC@vFkP4MDJ?0iG3lJl zm@g^CE{d;q9Z!=`L~QO!eeoS^Y~3;9h$-{VSv!k!$Rm1*OqV`F$aj3Ldcx_*xxA~P zZ@p*7wkNAjtYL=OTVLS$^0hvqQG+<)y4&B%&`QfIs$g=j7vB-KpQi_#;un~RckmF; zzDI1e=ATg|HL}+~JGom~II(<;8Av$f8>&$5+SP?pgj;A#@0xLbMi#9}NNoYb~%-=SSc-o$>Az@JCoB)HVEuwZ1O z-tm2I=B+rPjR6&!N_QKhf28{_HvHcr3b@1%n#mNQ>kLMKn6Ty4P9+2YtX~-eKAd(^3|80yoyd znTaq-V&x@yC%F=#xu*|%#8mne%Nb0 zJ1=s0?vn*2l%+Yfy_Q7D`$QX0JY3fxBkO40Oi-j5qas)UAwml1NQv9-ZE{;cSJ* zoM~#Fp6-m;)WZb?$(OSTdrB>FtZl0}yc6be7-Op`5ECObZ;kTb`=5BbNx{iuu<}V? z^J6N|m~dr1Vozga|nC>e8xS-s!B?T}@% zTwB=`ypeZjxoPctZr2Gd;LLB4?XY_%JNZ*aVA8TUhfZ#2sm|pb^i%{CoIalO47Tvtr@pZd zzHH+&W(BNa<@zy_7? zVoMir8K$;;QL8DX7lnn|E%rxOPSP*Q_e((_>YHVxwbrr%(Q^vlHa|7_IdbsT0r_@; zvtwiRGJ#KhpeEcrEdC+6aju6CRR(fvI2vAfUx5*`SEE`Q0l;Uh2F=vNl@QCoy~;&W zgySIbYD7sGfRE{86w|xkkr33mY**VE$4iib{!%-HR{6>HxQhIv;8<66D7`urovH;i zPjfH&rRMAmo>ZOrHLRS6K-W4m1Tyld`z41!iNuN*-8)#S zfNA>zds7P;C zhTCZ+08|}LA0n1)@cPdF{)*Xbsxxxb;PabKAd$by6lUXcR%Cd2{$P=eMTbN0lWaPn za63BjuW2A4rgAGwNSz_L;4E^w2hd3niBGv&Z+Rok*@l=iC1?&hRi|wl8rW@*FLU4S z8$!f^6=3QE>Q|Jlk~E?Z%nd?K5-5kdMzx&ZS=`rKr!!a|>JL3EQ|d#-yj;w$(?w5R$!rsPq-%sK`_u#n`{7ur!21|7B^N+i0@-Fw$fI5rn0zEPF6^ey5 zPDyGCg39dHhC~5aXL=MAcb_|-8e;Bl=Z9Xy#tu$!Cx+OT&o;X0Onr#1Y-IBQq%YdS9jvdHz-?Tq;R;JX_ zR5&JqJp2TJg*EGVNZ%n_=WmvEo_;N6P(1B=Cs6^Zt(?IH)$)Yze$R8cByI4fm}YNZ4wt`g5 zA&LwKu5o`@kqU(0P`!$XOm|d2@~1%idC2>>q%5Qu1RMUk#$-j55hL_dzXaV7V1R&MikTdNPL0242(S>{{@myeduBxe~6kt1Zd@ zUEaB(9Gy}YZXL~UJ08!4ZO#vUHS;L>xaL!F^z8T;fjXSk9-EP2s!Z47cY9JYPeU2` z*KV|DK|#>Ys$-e7KTu+;G=<_T78qONv^k@Y3H9t?baH<29xA5-CnDpq1Ife(u%Ojv zuP$_GKJ4T}#Je7?R}Hg=r5%TIc3m2miWq0la(1X;s>7bD*VzR9Xz=(pk;*o8G zXT{IM_)d0sw~>RJ@8R1vi7%COT))aYDaNqNr%i&-Aklg9=m-EQ_czzT94owFgQ_5J zR{i!69Hz^C!f zyNVSC;CG?;3Y6M0+$_^;hP`b*CN#@4Iul}=+QVX~!mhUb`iYi=Oc0+&jr8^xVxtwj z+Q#Ijwo2I($>z235%z+#KImMz{6=Is$f1@WIriae`!Afq6T=V9E8J_PXf_Q_%E@;N zb}U?kMg{2Kl$!Lippu=G^*X?~)7igIa`1WyfPa5Te2wUGuja5F!XT4k(HT~c8UEmQ zbZ3DNV~}8|(mp7uC#L|HVyKJ!Njf=N<=BMwDI&ooRlV35z8S6YRp84>c4(vzA{zdVfKu&r7h5NqCDcWHOR{e#v1^-v-mFm+}2 zK>#k3-bMr<-Z+TVCnCpKIOm>YgoMcZ-1PNPVV-LtpStQrWNCiiW%u}gG1!fE_X;fA z8NhtR_Zg+qs-_q%)e_X*43l*ahN~*H4PG&O{CczQteV@>O|HU5B#NWG{E4TAsq5+S z?Ez)mxH8;V@sE}VL1iD&zX`3Mk>`K;?~5b=gG}Y3oug_Q0-yuLxb&xp839t4d6D~r z?9`{%Xu=}0ve$*|}l^%dyQ4NBK+ee$FqG#@KxlZ>+e2y~3#hy?N36riEc zR~sltGIC0cZl(LI=8m$&may55Le?otdSH|l>9S{vp`nZ;PVD{vO13|~@JsPD0t#Tn zH;R$;dM8JdTDlGVuKVR}@4rUof-2Mj$r94n_b5w){qrNmQT?FtgbbnVSe}^oFXVx? zi#&Qzxx~4d%)+ur!N4F*t3uBNfPP0= zj3+KLA7-$&e!C!3V$wU5U$1CrPFQ~DhMb0y97z7*?N_A$s9%hhoCDMZu`oU}AAtx; z1Msk(Ay*<8nBYijQ`79_C}6CfI3FLT;9Yj|df9B{JPN90nV6$mlU_zdVV?KNQP8uw zo3m|kfR#V4(ob*bcH|KDE+!xSQMRL;o62~}d?F$`TywH^+;EI)GA8<&RAp*=`hEuA z!JM}fBy{x;y8i27EQoxunUreNReW_KO|oUAC)dBNVS9HwG+)b-b&__%o-CitADjoyTEj z>Egg-o*na2m)qeEE|Fdf2nN_xb)KdN+oJyrIW4W|M$M*rl?A_Z+u&dx=Rr=HVOJtX zzGkP&>zy4tLY5h}bz6RAg_1EC-H#}-eS7*p>row?n3<$+Y{V-a!LDqw# z2q=_+NaIe+#<(v4E=1Mx`K_hIaFN%7E$8G|t7|T9M=U?n&6`K5B3QFX9|;G8jjBx! z+xn#J(}wGH_*TZgM9TlV4!?cjHA7n;+A6a%H<0HaOh=QoK+0~Zt>fzE*5)Ke3@X3D zM8b0{_R#%65~?e_y4xhXFMhZ~2-b?tsg4#YbV3}>OEWaXRX!xy>t`f)wnEDIAEt;( zhX({;ul9;Ws}^t89FCL&D2EXHt%Tb#smeJM+wGhpMEgcLmia0i4r`9vrx=P-AAL;M z2w=KHs@f-N=`wMOOSgl8PdJ~seQw7Ze z^iVSDdxl<8|FlsCxUFsO;gnuC2D{|!7k_ncKil4i-$9`MP#*tz7^@24p~Ni>=XRm? z(klY>jSX@mZr^#Aj((61D;DMC-!V5diOnW;Eiy}~#7(~UHbUwo3ww@`Giehb5 z0(A)4OM zZeB-{N1R!WkBqyne*O9t`V#bT)K!>@NA7X)Fn>mKGj&B`J8@P9b2}?FwNU5Cm};h6 z2e^X&H2`)x4rW(AT}t7H#M8Zb!VX^o6cLVej^ke$c3V>{4a=4G?<75QC>zVn$Mv(> zEGJkY3ym4=$eNlOk@n0N^~vupV+5>6(Jjs-mT(BCuIxELN}opb@n)cASk~3JF=`~y zehb9>;Zyv_p^)`WV3NSwc%=c)1~BeAfILly4d2Ob+^j@^0q9lyuf0$sn3QeFyywxb zTg#)_nGyR@2H9b^KIn!jWrZTJZ5CPwxwraXULkYNjKL<{4!)B) z%mow*AI`5h)uu9JRXf2g6hkzsotL`y(lpC(74kvB+IgQh%?5G-Ye2^(A9~q+%8S5Y zz|y~6M86R`OuJ@-d6C2^IGZ8K{2=Os`6$nR=Qijuan7D3!*VVa=X#=Q0i*N4!UT^{ z*CC?%#a9i4{b=cCFY0T3N(zc0kP4t~h3k{-FQrsGXS}YISVU@-$*7#*f{JVV_SwZl zSby8X=h2D8_gC)@&eA`OV|+VaZ9^#nkVNn92o5I~$COpu`vRQxy`>59g^m+?$qz}{ zeZ`CGtd1%xWOPn@K)K!U6-1hLe0-7lupPM;Sp!KuuPCR?UH!VFds-_bB+PO-eudWOv5#yoP^zts`!AVD|B~DMuZd z$8m$Y&z!=^Ru6bPR|OW@&N7&<)em-hd@DN*nCo*i(N%)kRg6piNU4hz*zjz(Ui)Zc zJyfE~jRZ}=;N@tx#>VIkNB}IKa}E(*c*+g4nO~^p_+tOx8Xz*~<4MB!5`iN67%+Zc zRSJ|F7b_><2vMVx(XLP~p-HPQYbpxs6!Z}8Q^*-k1N0CSK;CZKuq&OXeX;$8K=4s4 zfP2^^jq<|h2~m_$yp!5Jj!cL^vFD%elDAC2^s zu2cdFf5?R!Nld@BR(xV!`d+J|z4d_pc*cL($FRM>En%~k_feBdZ*MP-AeoZks=9be za(??#RtFh3UYf(g+@@vhmz|j}28fDd;z!1EaI1rXJQo}%*8ld!DaFn$FDIz!fg(H= z+-qwP%{)ydYzyE-dIJL*hULI?h#~#GQQD3|^PW^fJd>MiN@X(kPP6Z*Y^y~Dm#3$b z(2@N4M$$)<9y%7y1Z7fy(!QcN6EdYgD@)eQSiX?)?&B2t;rny0ZW4%=@XE} z?mPo{OKFhO1fHT(Irm<-acsxC^1ppg^mEM8k3^&PzQsmNcUQQ9X(H%6>ggz#*RVb) zz)=TF9x!(otsfv%)xh($M;37Fha$p;484{1`oi7Q4NW))Gtey60-q!}m25oAT+6L^ zPfTMH?rlPGsWA$wK&FWDa-8i?SeG%=E?bY-i~wvDF$Y&|+rzT#eF{v`0e2WV>e6v_ zH8tI}GS;FJ5a{lT4GOY$vRgg$X{~4;I#f42LC_Pl%l{ls_@A2R*PUGd7M(Ay+>)`M zeRa6S9R2GY#@zl_;|2gHX^?ZS7+!7yugR_y3yN#a_eBHdeJG?~%K%x!R!k4S??4S>bhRb|f4$Pk0pf(?$3+?S|wFW*4gxLImV zs>C>tkFE80(!!or8Cv#rvblie+S}bS|A=Y)i&JowTyE#QMErz}8CmZv$}Dz;I6JBX z50B}d=si4ziQrBed_26^UXupy+e0t9O}YCKi?j1Vf>3|Vw%)KWNfl$;uERx!bFmI_ z5`e3d&O^K3t={t%zZ-Bt9Y@MfS52vv&8QihrSbs$JAE zCJz{1C7m5lvlJ*lgP^@$2|8Ky8BCgO;h8cjnQ{YiO*)#4BdqF!Oj;v@+jj9m%3EMv zUC+r4PE$RjRWeP7MbAdxpGOd)9&1cv?gqY z!!b%$N%r@)mR1KuDq3?WjZ;!OCFWai+uCbARuXVO4hK*V2v{K_2@8Z+2%7}J83B-d zP*t%D0Qh|T0{}kRwv!)rsfLhEprgpHyyE3MZ-q41;mktj#5g>rFhDx>TmLwX3qBhcKymIL6!Ph_;FF znBf~F!VF6j^Z9= zezSL%*e+PLdUhZbU!Z<#ImF&G(B4YUoyUkjEGk-yiIawsvVUVGKE5$195BKjS%8{0 zR*Q3%R#(Huv!2kXqP)C(1)CEHEJdwsR4m>hWKAtN_tsjnf&>H@C@7K9DaZh;*Q{49 z6f#jKJp=*l&*cXV{7nI*4}%0odgZ{DqUbj^hFyk0Cvz=#5rsU)-N|0}Co|>W-}hMQ zBNVRHfXN996cFCtH$Ie(6#+o@`|f0LeJ?`&C$1K&T|YT__Wa3{C&Q9oX_8O*JW{#o-90V9sZdMFHlx5#n~9y?@4Q9ReXl3j@9;Y5P9oXU2a=`|%j8F=C!gQ?J{`P4&5DA=&2ki{L|WWd7c2jsh5gkC^=v>J zBN@QMnU_p_{>8>;m4v%NuRr_#Og=-4Y1H%Q&l!rjNfQJh9^=5!Az{t0*TiiW0!~o; zef;C7i^1(2!j_`%oCorCh3(}H=B_osoLYv65{>!&wX`?Bupi*7)w+7~?N2cSdE0vf zy|%(f@S{z^0wY98f#%>{^1C++C%a^_6l#G9=i}1A02&sRth0|zPRLavFP-Z_u-B?TtRPZ zf5ZcS>d*YYO(0j)dmOn8rf;?Rv*sNEK0pM%sy7d1qMbT>M!k%J34aA*|t6v6*c6Ji+5+Z%K#V8OLTS8pGvPm$!rSZU0_Q& zG~mAswuqc5WoI;^Rz$JUZ*r&d#s~_(hVLEB$DvA}>+M ze(5YIIS;3F#Q?yNcef8()R=Orftg5E(ULN?^g!=+Sx&xomVOh*VUkImp7(5{o^g3F zE8&QgJ+A{X^Q1JoPxd8wmtMcyF-1zsk{XNQ*-BZ)T#(JS*J45Ok3f+LQti#@5sV_lU*#GofhqRhkUhMGteAUE8tQ@b%+`+KDz^>x3LJV&CPKKa3y7Lt{SQ$ZNKPk=A%0Sf6-OZ(0In( z4z5hpOLYg}(gTf?sh%|WVN!dIJ@ZhZeunu#F}>2`fV$JeNJIJBK(oPoaQQ??G1Usr zV5T0nX@H+!x9sg^cfduXY&3nl`Cx?28QE`rP?-=tUmzLTG(YBq$kt@t&%&55?mUew zaA07<#iV_(K3evHJ{0gv#)Hcu#0Lcm&J%Z5*)DrBKCbSp1A-a39)a^2ko@0g9r`^X zfAr{48ZhMksILaUQ#%A=TbvJ)yLB=XfAtn83i2n>%HMgN{#w=kUHTf_CZA%?5f6z_ z!&p(n*q#F_W(7uNUEQkNrPunQ`Y@w~j|Fw7?XK@?F!)_27|YbrxZ>+>Fae)s)kG4l z03haXqYVo)6%`?(TyTJI8R6!oO%KFm!j&M{1Ix}R{sU~pr@#=ZWO^G3!DD9GWZ9+# zB}&yr)Bfz|nS%O_Pvk$E1xf*eMYGgE>u^whPmxVIUjz09Y+DLWDpBtioo)$Z0q_tn z&xe1(4h}jg%W(brC1z$}0X*whO@KrEqHcNya0M6#*@%D`mhj{lOaSMuRY6i*HCPG2 z`2XyVn9p91v9vJku>EDTohKAky>31bJ2MyFquVjM4gdQzqha zXl7S<(-yzi8+|9(-&}i3A5hS7OVi_ka+QZ8S4;q0qtNK+Y$F8h`n79NF;bQ*gvj-y zP-5=T6P@L{WCq@&pm+10>&tI6L71P_o^%@$7Ncb|Lnx80PkyyqaBiK56#T*J#vTy%pPvOAvxG&-PyQ8?{k%Bu-xr>FUwYRhRi{g zXhDzH0Q%0YhAhAt4L?Mh5w>ne50^p;Qq_(FOed;qGo$YQKAc*}nqX}H1%&FS4$Ng)Wjv_T|E93IwHIgfFw5g-EM8Bz(fA+Q)>YegZ8FQ4$ zHwy(!a_IqeV{VQ{Q7PzJS$66%{N^p8$nzWx&`n0d4p=mGK-#SMDLPG7>dRCf2iK=q z1}b}o=blkjq&Pq(RV9vqLsgf$$BueCv9W~o*g5|fa;UQH2c*? zKi7Qoa}Av3yRV zq#o6gN(I`(JGtS*0BR77(n}BuL_2#j_1>>_W0QpREn4qyJ>Kqt>$kVpWWO_O3cTD? z<02+6$!LZ@5)~H2;SEMC;Iuip;Px%%n}k&s*$zHdv`2DR94wq_Sgl-YFMF3sc;hna zF}5^1I{GtU0t~j{t^r?(t~N4vXYskyyA?6*P)tAN1ay9y!2SKF6=$bO&OlbAzi!f< zC_&#%cD;D#BL>s6Nnag~LI0sb9Ul98iRj+7$>@TmoHdFxG&CbNaF1sANU>tN^Y-Ax zS0IztU3@SB;3l?pH8xz|JJ0w0w)eiM>jJZg5x^{BIVu(wmaY9#tRmeVQlQ-Kf%V?p zrlUW?HfP&x?(g(-1i$YFbpKg7)Na^m1s1tGg8fE7&^jX2=nUrMo*{%8Vy{486Vok*|22L}5Z3*}B3cFvax^aH)D8iB zb)#$H$D+jwY{~*@=-4aEf`IY{WTOTU6wNVo=bhZnY`0yBH@))(tzAvll;hJpJVT;* zfgkyo$#Ak4hraGE+kk?+15|s!XJa3xjTCPf1rm&MIqi)L&&fjWJQkxs=BK4^ ze8>S{W8Gv0&Yn9%E7M%vQlGrG(a<#wNF9COZavT@3#3AMi$IZ)sJCN5DUItkf31`( z+mKl@z4g;z{P@uj(L+3VzT96_>SuU;qd6)y3Q4Y#{9V;bO^wo9M`nz|X?^Y5wM~LP zY2&gfG@yt<1=%e|MiL8!E~ITJ)EKHSA6T%_++NbM;!HC{^ULzo5LItC&%_`y_22@~ zLRb2jj*zR7CwO#U>~izF)`6KC)%oZk3={qNI(yKx7n>;Bjpm$7lY0o-rXTS*p=&p- z`p?`KWQ*d~E{~ex3hOvBg@nQIceulARCeqzoxH7s#dp|HU|ghG79uc`5)%`A9A~G=CnsIE=C>= zukEaoRCw%-FV1!3a~hd!KLNco+5JSK!5lN68$i2nHbY?9s;}Xh9-Y_8nx|dU&uWG! zSIn?-LPmITbY{6|U=Vf0^FNL@E=G5DAxy|?zp_TZ)8F_3-2P}e7nznA8Xd72W?kTi znM}XbS7O3H3^R*A-b7NRZVHbZ%#F&%Y@0SV&x8XQ$0G3`ZrVlVqQA+WFU#}B>34Z# zxc$r*orpHa<8;^IW_BWw+kELv)mNoQXr4Ji@)8HJ(HimVCH~p&p2g=Tt$}Q#G}g9@0#;XV z7-nk>?_gmuwZQ(A767SThL_IpHbyHOUq$N<@K-EReyrF@9}cl?u+TsuD9A zE?ws&_)YPz?t==hFi*3Ratt>aTTF^Sh%X;`|VC6C^kFo7BdX zmtq;RXU{|f?*26o&k^in)E2K%)iK#@Dqw3A4{Nk9TCYBI9ZN!I$?0sG4chA{)z+5D zq>N$cRg~2_sxbUniu;dzlp8~za9+(DH-&P*9_0cv6oKOG1G_pYXIQ>nfySwwMrpm!Anb6Dq4uX3m|xi%0Uu5?~( zR{|MTvZ$E9a&D~20L~hFmCn=80+3jOxv>hauiM+<_4Svsw5qa!`tb~nG7Eaz^3Ev5 zqB~db-7M7E-4y)mXqP191%z-#j^S#dGg1!79)~p;IV%=}vX9QueoM@4fykNE-b!|R zxmqze;zu`#rm`o)HDO zg?h&=r66MhuTKQcZ8s`X8RB9?z-;v#5BT_8N5g3p7dR~^#`dp^y`EIwcrS~hs)a|J zU=9K%l;l&@@3{@SECl?Rfz5oie8oeMS0K5qUgJ3%`aP@6KA-DnPtRjdXqluvyX(bi z>cxlYd}rsL<*l^({jY+p2&MoIN4<^MPGEL`CHp_6jUaI#psot!^v*-M&0&}7JlpVN zY;_(1IiaqQ2VxGxRgRY4K#Es(af6{oIB^P{kB_hC9*23kY)tpo<^*6#5FC?K2#lmITriMxAM{(%{87mr+aK?)X_(s5=kHy*L`wedi1c3Xw16Y zNzK-%rN{kZBU$Qj7h8OQ^T>Ho*sG?Oy3ei%=kS!-Spc2;4r<}Q#sGxg-jYL69@!PP zvn$#A{1$&T4^&ZPVQy}&3j%?nQd21eAravw7p2-^_i3n{p^B02pWoqJ;=K6D=es^d8*uWCy=an_bp8R}#bF)D@P#(R0>CuUr5E~#xO0~hFC49*%l%5%| zPrvRlK@OeH@dnRJfh4xA2#GETG5+>`-^?@5h)a^RnqFL*yB)l|#*cll;_@_iFi_Ay za#Pd3E^q$z&Hv+C`84&|zWE1ZgzW$2oxfe70+{x|tO`>4-e~xrLhK^q)U%^s<+5vE z?8v+*D)0vxe>rT904Q29ll-lV_#z&<=(Bv9^ZqIUN73)VKNtPzKR*-7N4v_^cAFsL zfA^49(txL_g{WXN{qKnJoj^8}K>jJeJTu@w7Uw@7?dMNC&CWG;bZ4CWubcJf_y6`^ zFdguewqHaH|91}wQUtc>pzB7!z3+17zuF95ARvM9o{rIW9@{=VL~kSt>z5*LD+Uz* zO>b8gyF9T@|&1GQd(!F4-ATY|*j$#^ zU9;SWfjWX6;oYBiVWiMS@^>AdbiKZM_kT>ll)wM`9jE+D;Q5)7MxEM!Weq}m;F@Nj z@Ad0|YRyIK+Y?0cZ<#7gV)gF{fc`e zhZYHcan6u?Z*;mD1+${}jlMi2Hof5p1qivy23~|S+~ve3kxCL{)-Ej zzXBHRz@;q%2H)&0HRx}i{^?q#`cI+*WVIqhk&PrY`G{+mKj10`Q9PnG(r0S!S`-MrE_kf6QFrD5 z1oAb{jV6U!*WmJsireP0#w0)1gS-^{I2$k?m=FsLVZ+6d&-z;K!gu>vTTQ{j zFL4-@x&BARbN;4X)dn0G3~B_ZvjOKXxL^eJmn*8^++edqr}GohsOY^|Cp622%_vaSzt z(H!0A;UI&sQ6k~1irq#?dYA7vx`eVwP@ZgWom5(r2e~;SdSM6fZ!`v}00SCcI_<1P zcJss9bw(>qMSqn&=RHKVclNAH2a8;C2IAjSnl@7UY&5jw-H)%y zFT zK6MWj2r*f-N3*-^Onvl50;J^g!6vk+uwCpRB4E-!&M>>m{Bu78>wP#wCHfr;;DIPJ}TFL3yPuBnSMv-@3Y`0Jal~_)?3jtX#Zhj>A89Jhc;Qe0+Qq8WFU5vGvWL-=43k1Qd{Hl&emx z_kOwRML+!GGt8#|p;7hHbS&CxVEiuwP`|A3kaJL;;D-?Tm6B+fvh~GV z7GL82xWSLZ6d_mFYO(Q3`vgIkUGq0QYz}KfZFd+n*2YR9qq2?Bb3cCh+oL3A0))ZpX%VOsf08IU#N)GB-~qD}zTTe^7N(f~5a9H=ebx=;n@-~Rvv zrL#FiS4!=cduTaYX)YETUVq&JS~9MFt+?2t&u8qa^EitexT3ACtqP1sSUwq;pSy6Q z2_+f>ik@D>W8kyDIYk4 zV=rWsL~1lX|C#i$?=7N#-ct@0h`nnAD8Tpf(Mb+-s_$4)16jSpkQA{X_pI$7+Uxh{ zwjxCVbJ@ikJ(m6Ra(_!&D{e0q{l-WA-Z;pQWV{Z!1IGslx)rBiOwC`Jbc*;~d^Xu8 z68!q<4^yE$wSKz6*BgT4x;l`@0f+RbVgJiU1ZoN!K3Oj?UU(UDUE!&>RPjR=T5Gej zwkAtmNk{)L;rZgu`g#TLg`4GSd6CfG#&{>+(OPjGFas#H+Z!TcTfXvBb&hOZ@9JJVV&A2c>!}c=7lDb}_5xfP#+OpYCG+-?4G52;kEhIpOVmhYR~JZ%YOAe0BZ* zulL7t)c@aCPnK$f=we=}r$J9nNvQ$MH8som)(Crjef`U`Gc&Cel#~aCU~nb3q3`l7 zRNNa@wzlw{y}i1-w{C^sASNcBEYxrE7WTpBzH#qf^o-|%3F-xmn0WUbmjjy=PwV%( zuz%RV3fD`$82mc$9(y)Cp5NtOYDNaa(yZgF+LFk9ObQB$aDMxh@Z~^_ddSgrfqnA4 z^U4Mwy#Cb@PzWhlg>++>7v1tI+P+x#UqXw}iv++IN%G$Ux~mmc_M7AUd}$>*gxz4z zVgV6SFT4kd?Nc<7j1QlQI!8N6(QY{`cEm}OzL@e7ot~Z^O$VAHfT{Nj;tQC6_9g$l zf5WMPy&~B+YruTb0|efA&jHcs|LBcz{h5>$cHb!OReC0zm`Q46Oi5U9D|_0lk3Kv& zM|g~hFLA?Qi4E@+#SG8#kwu)(^C%h<6jK}qQEfCG0lC!y43ju;t8+g|mf%8fxIhem z6o9=K>AHq}Q9Pxd)C-6QbGYw~JCeyrN+J}H{q#O0Rl5-boa2NCHctH7geN2sHKIO*?B1K-I41k~C;$9nY5eysobyV*wI4k*3ALYnw_0bKd zC2s4zt!80K&`ZzNtC_>NKONN8>`y@+L!N#p)2X;I~xH#1EJ25eZ2D{v;i0R6x7^+ZiU7gwLH5> z{t}Zj+srjHYOtkyaIOx)3b?IWQKWm(P#N$4opiTluh4PJ*x~!dv;6UlUeDiubW?>idIs;u+y5ecsLp$Z z#7WV{fB2ZcP@3A=YiMXlsD|KvgxQKOfPVt;3v@GhzAC~uz5I9Bk$+CF7e80ip%{-j zf4Rz!EBk4aGXj94E3d0ciOp#Qd-b{<{Yc5>q|p0#Qzs}Rb{uowV@`uPH*j79w;YTJ(GDef`5trueo@1L#VZI$HQ`LAx)oFQbR;p5WqSTVjQhGup#u6!18 zcAB|JQgfy^9B;aLQdF8VvGF-$^S!MmVrB8~9cBgbx+$1v!m2+%;UMv`0r2m;UEJLB zRVL2-%yO8|pOxGQcyQa@Y5EIS@mDD;mxvmJ+ZY}N%)fc}4kI}yAwW9!hR3pm&`esm z=UjM6&uLmU9_^KbI4p)$0!=oGt+g{!)4DvFw8S~obvYD{_>hqMO&y;H`z+6+rG;Lk zgkA*cRYDH|={=!^&^Zt8y?yulZoc!K@5lLd4!?3GJgd$#Yv!I=_uM{pPodsjcI&Dm z@D`?q{7~isk!r9kbciI-4sDMhPSJttJ-y6Ku>-5f7Y$oEvS6^olfJy;4#(%>=#vtd zziFKCu(9amD^QKv?&2dy>XEddtT-0NQAIZv#g zI20dzIdJzdASPyaF0`_X`>dOwDYExHiGw5{h9l_{yw2LI*D*H*;V9&V!oX<6nCg&; zyWx|QI~$+1SLvTUR}`od@M}GFMi{2MbG0v1^`0RszjC7UAh@?B{=2Qd`Jpk1!OU5= z0&5cdPG0kE$!eqj_nn`FA7cHmDT11YLvbg4$%R;0Ud>GDw~8VHeD+(4SI`*9zEXM?7^>6 zO-W2C>;z3!zOQHXF{=+Fs;Zt3VXE*26OTrAIlpdp+&#cVJlbT-zer4y9JHNKX5_(D z7gn!XS|c`GzMoC??IadcvbH6br=o87%kqjYKxj$UNqTBoLl&hIJxlfg8 zqLPP%+3!CticB~@Y_PR>Xxj^=Tf9*+DPJD>DF&72UHDX{&A(v6?WoliS|m?MNE9?E zu3XbV>AoloP!RD-q-Bv`x86%c*7Vg`mELJJQ8ol=vPMpD)b6fSfk<3b zFtOGm?%NU~>BFwJI+$9q5j7w@dfiSM$5oSt_w|2^9$yO5F#^(GUJ2n*kFTV}`-2v8 zy2=xg*S1e1AWUc=LH|*NVEK#~0+i<588vI5up#>r366pt{L+inrU5bA5@Xd$nKt7No!VwyHEA4i zCv)$lFW$S?w}${ZpVl}Y(!3W2$FC1=QI+$$^?dx&Y_l3@YfDOAl5VWs07s#0En}P$ zF{6~N8D^L@QaYHbz_|UK0-S3RT=Z80@a;42d+B^e-oF_I0KXJ3j(|YLj!rag_~dBu zN^+nu|HM?LX=v#gXU#C}=Q2Bwf*(8rPGaO_hPo25pA&C5q1&epP{&sN0?DXP^Hg=o zJZnSjW&qt&K{-%)r0O)+FjiGnermI|NUVu9Rtzqjud2{Ty_(EU|1+UTGUxTz=k<;w zbd}QduIv3@nlIMyiWM%>mP@!W)elc#0-vBjn#`>#HssPGI+Cl=J0S|nw;sA~4EnnV zDz!!Dsj0 z05cw6whro(LA~|jrbChEvGNE6^as$eBN zxx60n6U9+qyr{EsW@QvI8SP1kX;O>Mo@dGYwyu7e3_)^|3C>{e3jS9=%Gshj_$%en z2sPJo!8Du5aZ#+4VV6&)l#b8nI|};!xNvl7bRp7&A18)O7F}lu#B#2yk z5%<%MiJtXxpXRDC+lq&X?ai%cIX7tRoK8PDV$}Pmvm9Z(`<@#%2_>t|h6&-HW7TZ6 zYi3ZGLnVK6&5Ddzl7!l|fba4wzA>|FKa!brMo4ETMnaHeq4o6-l zP6dggw^y?YM%Bs;&O2btC>WbT~%85+r9xWTS zZ$5da*yda_wUeMqeF<>#7^OG8DRRlZa=vouv40$vLC#h2^ z-#XEZ9|6ixZu>52? z{UzoNb#A9Lr>c`5VoX=D$@yk+t}(NkS%ubgCru<=HX=9SO#t6Rfp@M?1wgnu1Tlmx zx!8b-smjy^YDy&dX{@tSwm0mQy>do~L@>1syD=y6UU^G|u?jqCLTT%1Ry6hP|5~#cr&mr{;}O~yjK#(VQ$Rh)9v+1LXIx> z@Z(xBo)hneJ`$YF+FAClw(bd|TNK(x3QMS_#Jy_zQav!1;f{q{- z2~+S|QS(?Km!UPMf&0-?TYsfFG>6!7*mps7!@^&m*?vWUAGe?$_TN*P_&y=eCS8M6 zDb0U*)`dWc*cSq?4`mocuRd#Kbc$cxq-w(UjG7gpGpIFG_&7S$ogNI*cAQVLX^I)i zQ$_hyWCgxj;H^`#-8DQePhS|@laJm3QE8G)=5_A?icf3?pO^^R0pOO z)z&KrO?9mh&%nFMyu?YpD_sGULTWj9GkWIngaJuI{VJcz{{05lznqMJeY*KpQY*70 ziv#R!dzBS%l;3c;1wAG#1P^k)(H-4q-a+Gl1 zxaKmJC@|=l-J+Z|rfTAgl^gt1bsS|JYPP(w2_kELG$ox79&avD3$R#Roz))cv@Esb zFQ)k#Ua^?Dhz7kL8CW=7A8-nsF9&iS4b;eOi)^&b-10fT>9ufA-870w5qs`KcWwZg*1;MJ4D4V{GxO^k@} zxQm3C%{4%a(o>RAK(}mdZI`(wDC*@U7K0AgBg|KH!gLeXH!}#dO4++mm9hw7^IB1{ zLak)O8}{A($@5j8E9Gx-Y)={_FaKJM{MXf|Q1==RvD5JzW8>U?zwTK2T*V3WBsf>M z{CyRCjqls-McKnj`yEcc_6{EFxAjt)z4kcjHOq523|Ct_ zzy_;jFIc$YRd+|$0|6@(NJIA|h>1?9VYZ$V!fqXE6B||vc!rBZ+u`=*XST@dtlFV6 zWNPANk9T(1ss@Wkw!!=t`IS+1I3-ZtS2(&exoqSKM~$BLp{LHUgg4W->o0+;%ONe? z4Y{H-8h)hcw12IIul1$Y9)v1(DXvl{CaZit2&=OYe6VMs;Az?=?qscsEWT7WFCX&Aym4&mNfk#u(4~%iCu~H-uCDVa&|C zFN%na5gqnzf5&nw1=lQ^>~0Khw@fCvg`x`Cguhp~+gZ2UH#<|m+s7xg=x8ZW>u=lRkyj!*{Sm<6W&JIR|12K?d6q}#`uumrn7@k* z&ZYRPo(Cwy?^nR0mRb!5ONNSJ!YI@vEhvO@zZ3AEMgU?1M#YxTvw(C)8?TNE4!T;C#@p`)yI~tmeHx{FgsO-&t&wj_J7Y@$NFqBlr z&qz@qRgV^Ko|kIkEA7R+jLe^@_TSf@QCRVQtvi7f3t8S}+H&OPbw0QfP*%bEXBiU! z;;mNrQVZ?fZ(J6IU~r{P)lss&^H-8Z4R7uo*Yl(gl*seqI6w9_a6^kbw6yieJjjXO zX@t3IHSTZYRo})8fLyXLRqlGHdd>}OFh+Gg&P9hV_k>}umeKn7FL&XulOpO@x9*ys zZk#~3$NYtx--k^xrBpqQ3v@0mM~1_8oPX4Ql{Gl<)Kt_@n$*91yHm0`*;EVq#iiMc!uB_*j_*cuNthbfma@2XN+tf)nc$(abNeDF?6A}HHWr$+0 z)yhtZg?dU!`N_Mxd|hn(Y*d<)Ygp?szRTyKq|9EFi&4wdgc_lE(8?)XRFT)+jCPkQ zn@RM9g!#DJYh=W1*L6WCc=ieDB8;~8b`cen7vD@{d+ba!!&rfcV)~@p!MTa3k^)!r z57wOR58k}q_*vKBrv2vdc7qf;fLw5a(ayE|P^suwY}?w<=-79sA9PYVQ$ex%A+j{m z`{~q1)GbJ*tv}yoZ^qWk=4jCv%e7X>2wm+=p|(_b_%eMe<&Pe%FJw3JBKw{Wu3}oz z4f78?;ei;=wRgF?1;&$md$eG$n$yeL+1dHrYlfXsBMnt9-5)fROJ@8?aVE>94&Tus zA*`B|$l`Cy&W!yVknmn)$+S_meOa@1`XQC<#3*QH?6j6C~B8RHJmDTcP7E~!S%rx=g48-jVpFHW0HxMlY%22!OHO8D)rnPNa z{L7jBw@+o9FAQ|<2N9Npg8U39xBWA_@a)hI#+<-r03NbrIQ}&>wYS}3m#b(6ddOeC z;L+%dCQ)JVgg02(b#}=ndZ@fU_GGtNmd+DoqiW{cn?^b}PLP|@#L@3?z%$gpy-TAq!bvZa` z$W~vyK)W$DJWJP0cg5A!u@IzV5N0*btBi!$PS5#ad+AR66Y}IseM7l_@{3j6SE9tX zUjdUBHAw71HIox}_n1fOOBY_ymlJ~!I-nHeCQrV{Ddo->IyXjj+u;RS58%Y`O$O|& z;;gyfHERB4SN-Rwei>gsbBDmG9V{2v`{{*P~y6#hRJnXA2Xv^=EVs#Ko!ROr0xz{b_h8TAn^Ut0EbX* zVEYPVO8eL4yLAw+_0O;6Ug(yusmT~vqM0Q|Mb)A6pKen-)GB8eJ!;&_(rY`cNUQE; zf7ss!N3#1A^HGurP?T;l&KF!M=kR{h8#V-~+ME}k#xd8))1`}qbAd(QxD0p|d1HTm z1TNq90!NP-T+%Q<3?*nA>ZJ;8<3HSwh}ZrJr=|N<4XYRrXZGU&tY2&V-|q|j=YpKc z$7r796O)g&Cz%&D^N#bfb1?1gY=j*gIahl)I7wpRS)H#f#~6>Ja?}qCkRE1J0gK@M z?ml?AB12vd#&v!dD{!AyB1wH`-vgw!z?$yomOC=Ais59OANsa(BGE8$Tw0+)U+He7 zu<=3uN*fKt^V>Tq?)S=Kw#)oQWpZTKGD7Su$RCf3NsSWJ%6CJ-kjJ?H~jSlI0& z%n@AsGapumVdZon7W$b*Z2?ivwf5x5v2>G!Us?xdgR1my{XsG$3Yu({y^{2vXuIoc zS!iJI9OGQcAX;PUKW9}2YM0gT|NJ1aDa%V z*@do)D#lQibh0dQ`6Qxr->*%)*5pSpR_SzU(J>$^j;=JItQ^BqulZ$byZL!sSoJ1d z=6v*?(v2T2!#|~|e+l9lJ8TyE!pOO4FTZ1iXD9Vd9LA+W{>`vL~gs zyM=?>=}-M0cAGF?Y?2Y*NuD|xLA#Go`4LZfTkQ587TtE6tJl;tEJvI4wl5qoZnNfD zdCl2Zv8L1a8t{TAMj+KTs&ex430+)+>Q*v>JDUz@m`}4CkX>@{^irY*)EUK$fZ0Oa zRZWw;lVbDSUg$X5RJ7KDn7`A%xJW#-TU9AI!dY$Btpe0kg=vN?S73)y`bJ+{>N1N~ z@5spG64%w~StShTggh99?gg)myO(a^cqf}-`0K)|A@I5H+YaixBc3&f3Zt4L$~y=T z)-3c_M?C!MPAZA=#A=SbeEg%K1Q41s;riyx=M&OQt9m}0f=p#pVJ{IKic@`v&)FbX zS*BizY%qVJ^b8rHQSo7krrj)r{}+WI{$=zOv-p0v$Pf(i+=nTr)VmE_ff8xTkcJrU zq|kp-*v@C+xR|h8U$T)-%LObdpmIyCO-|qY(G@7Tviqf-9Bslx0z@|^n@VzpDdZ2+ zioi4<6q096_+1h+`O1qX-gaDc%{7lvAG{=r?Fjp}QqN&apDeIjS(6~2X^FUkB^Dy5 zodJEe8snWJg^San%+l>NUJk|KU5A;espSc<(XY*#YJfq`*=-A9>j~IhsZwu+lg0Iv zD0ai0MJ!$1;du8CF99JD5lg6zh72`kZ$A%I__D8bq2SiebIR#r`yB8V4|MY?3t&4p zZeHr1Y@`YIp*t_EcE`vAH+tSQ?cr(d0}jp?!=5Vo>UV2vy`qPdF9qz}_~CW=fnf;@ ztvfu^q^I&RmPIbAps?)Oo5MYP`i48xtMvEprOmvn3AF!s1>v_U8O+ux-%`aRD_v!* zTF6Ffi=qpX|8kY!!_6OcWbYy!+fM4KvBVQJN`IhOjlP$X>zoIsdsr4>Hh{wVG``-) zPoJ>aq^}k^|FY65x!k6WStjNIsAQmUPC9rb+*>+MP8;@!<&l-Ll8RgVSnYt85bf7- z6vMKcRN-OQqUO;?EMDGV?J(?{cd{^iw(}|&d60_9NnoaR_nJ4*H+3#}mC+I|Kp)pX ztU_ga7_Gb!e}@?^?rbjH2(R-tY1nA42{R8>FY=hLJh?JdmJU9yo#@8BNZ835q86w- zqo$#4qaiNZ-j;75zrxMI0AZ`z-b!7ZJDBf{tU*JZF$Hdnx9SGD9p*Yo1Zc+`R!#kQ z21P+rF0LsnJ54#&P=jrr`%HsH6XQu1^uS5muMc1%F0s5Lf7C(zw>KW(8zj4A(ugSR zVQY!Fs4MMfFl8L-jdR!d=LWvc%0himp0#>7Vc5VXTa50f@OGEOuSCiQ3qsug`-<(g1 zyz7`%E;EeFkWlHm^{u@UL8pk_^XiJ|zGFI94hm215(v9iX=`{ex2U-$ym?6dDNG>w zhbJq0qb%9Amn!P3NY9SKj%YOydhedhR_bF(E$OG6(vBG{~4#wB4)44_N&eF(Ch6BV_Ywz>>kkAH; zNc)BdqNmHD%k(C$UvSlU-3dG) zVmH*+zBA?6kDi7U4*w=UPBU65vNvD^RAtp!`_yZMkK>rj-pR zFmHT-STnYlNbn_eaOec@1vM4J#hSVC05uxuQq9>Gh&cb_l1obZY%Mg$#m!h9OwSN_+wKa~GHkID? zd(?iRDSXl!I%XurMGqmRAvgWZuN9XvmhT0s-wS^>R@%WnMaLaP=rXLO0Yd9>L3ZfVAGIi8KX@I5j;#>Lq$I?j(F&ku&~ZTN$OYW4?pg<{@$JX z<5gQ39uX*87CCmWyXIo8S399s;1a*ysxfZB3ZMhyBVBdfW%F63!A*)-u9#j<_K{1+ z(w7dLo;Rji%T5{i#-~uk;Rz=Yzd)^so6bdBdRMvF+ZTpj+Zq;4pr~n}IkPC%w7)3Q z+pbZ*tv@%=WmJHhFyeWS7>%^HP7cmXcoy#&eLKRb>gwu{?gu>UYnQu)ATn#JGW@(r z!)B_ngpwvt)(6z8%$f&@Z%T!>x!UfjnwTc?qWY3f<)^2I1V~WbipNSVrtN56=k*XiEqe|ch~-ejV#h7pSzWt2@mrp+m^Q!)!rAE-S^Zj zI{FbBY@LzFdC<75H${5flyFKIPbgO9X_B}gD&)1+JFAT|OUBRxtzYl#o#OXu@69@? zaQj#*qpnzhEv2`m{t>h4R#T%MA5%1PI%gC=qN7tZLOn6ajWdagKN$3c(Ner8*c3~N zSNWVh>?BbjbFkmBD67J1KDfVLNg;epuA1#I zLt(uT|0n9!T%;)*XW3cS^Aa(TH&G)M2RhFlztfN7E9Jp|yU)eJg`Z;N&!0h@?Op6i>(UM>hu?jh{l3N67d(;Aiz(Ks zSb;p*t*DB)Zu1Q}N_ykZm&?c*H`>{Kabm_nv3Q{I^G8lXjTNN}B$^|aO?e-A>FXc+ zHwtA1NJ7xTVFMJTKlSrMgkvKj42NZH(4F+kyDGTEB)Nykuj){B@!gpq`e3=PJij@N zhP4R4ILo7z&zU0{(4nDA&sK7+#5lw>WAbtfMncwZ-DW&ieOnW`2}I zv$V)$VVLI8Yz{(LCscY-Q&ast(GslI98;IdyO7k0z%i zjwN6GkVM^ZGqzXn3yUoqDqg1aFIB6-xDkG<=EnS0Z)hl$#KYW8sq|$W!U1|~!5iDV zu7{C9PD9=o)829$p3cwf&P9DCPaI#C9;Q_wQ~?O12ZQ{MLXv?RS%$qD#r}f*71|W2h&&EY?FkSMh`(G`sussVVwIjTlBKE$Ng(bRtEA2WdT}R z8~5%$MBQA#hl?eO+rm6v!Zlhv2Q!VM*Aqwt*E+>B&B(2AiL9Ccjc)#x7=hoqGf z*t4$Ij}8dDs=O`e`S#WQr$SU|dE70fb?k_dqU*P+TOXU^`Z0WGjMWFJU?;?CuYLOr z^{)U9b+r`HfSR1^mVYQI8qJ@p^vaepG^H8%Zjn3 zt=^ai(~Y|bzCMcBsl986dX~hu=8GjyV(aJg{yeC+HX{;yJjJ}N!IUx(()ebx)SGp) z$y`F|AqRq){Z6w}L;23&^!S%Avx;v6bVMq6!o}R+d-^~LNQ_ky%kq8zOU%&mFl+H>_#d5u)gfl-P1#Z?ZqD?Cl9r0*^PhS!}-IDxh2$32RT zee3ZVzW334AS*j9Lpij$;cC)IX((w-`Ym_XyydN9iePELDzl8y9+$>{sAq>In}K?y zaOcMwI>u^K>h=h_IfX-)c?xw#p+21v&tro(p3Sm*r$MV#6G7b7_fb^Fe^%bL)A9|R zI+zZ~MojHt($Utpqt#Sj{V=qv#Wqh*Iwl*qXiBSxE=Wy8rPjH2viKu{So~rQPK>b_ z#Vi+&0rh~Rnerj{xK4`BNn_l^P+!cfz%sPD zGv3DyVqkA>@LavLZ)g12GPS|Ob(YqF_bEnHKr?nF7M<`_8VR;dFjSpB9UrNo*fH2^ zZ4R%iur$$DPue_M=*)BD@`^~@7|*R6$vbqQ{<*5{wEhl9jLy!Y!0W(s^@9bR)P%v$ zv-BX~P?xteH;3m;B|OC6zR3L;P%lssh*Y~(Md9VA^pww_B_H)%js7tg161pxO8M6 z+d`oVM?Z(NJ`dm2a7j!|l0NlKm$ucY-hAQP5jAQB<*3ZFG5w2JS)ch!NZPIAEs73- zhH3}po}Z)ruNe*kvX~iV%$UAkif#=!&;&3&QR2i-A|)}yo3;D>Ro`TL7f5W!!w0N!xLUUq$H~8Gs;H;o9b*L}hIP=a@ zYFTaS*3p4`9b%OY%XD-SkTL7fAQJ0g7CO3_ComFb(Z`35=W~M7$Jz#~^+l^GoKAUA zqhG##R1rcyy1F*;b#pN)=Tq14nh+Vx_B8HuPaw~gXXfR#6P1;?JgoMt=CXe4C6z5Z~~F#e74%KOnH5&@d9W6phrrT{7PHua%F z_dL`2-SJI)>dQ~@G|m)Aj08`VWde8~o9k6QZU0L4M%r7401Q!AoalWfb5CQF57!JP zffC?5vtRSyXReYcEA?@F-~lc+jXghYLdJUCoSQW;kDrRP1g*liY}$C?1PauX9)`*X zb~a~{L4@=sCcE~zYbM>))$&tt`cvUTr2e? zv{H;W%k}h=K$FLqTl6r2H|-)B`CLhlEMHbb z>B3Lv_z*%7wE)cI398xAh1WH|yjFyhzIxUbZT;{PO{YT_KRq>)3@4C8pKoQSl-{PN zgDb~+dvL68LUefp8s(@fum+}CR|%_xxnpxIJ6WTQo=&f=y)+jlNErT}GyNff$y3zQ z&gm^w6pK2PCZKK$CVS*N91ws4q-_?Z$FsoIw1@kd>jw4&}C_w!}>#pyeQT`a<|J^+L?O>0-_t|2M7WDE=5lpH!Oce2YnkeC_y0j|7|Iohz z>{E&T0r`N*J7IRQJy5+mPX(2C)BY-00?B(7z3)J<;C)dh=x%z}d*5cJoxP<%sLi@X z_3~1{-RU3ex!m^^JPaNi%*Ogy`B&!Mu>SLEQdBr0;;t*V@IXkcG;^`T!M8pcPkBnzzJ+1C zHQBn$&1!5)PXP7ZP-0Bw%Vh}dvo6|C>My71DChLkW0nio)n{+Gu;Q4Hz!u%}QuK?r z%=;kvoAY60Jn@7YAePboE_lHaRzR<0El!t-&a%&0C~F<};_J6;;y~Z7V90U;!Xc^+W3r1e~U=_pxG}El;dYthtRGzLXcPJ;pR18_J z1&DZ^1Nd|xXhm|!=nU1|I>|l!V->uC(8x#4^ONi~IPY8}Qroq@sSDBK+$!PXzU|L_ zZ104|F<#54nyI-3wv<@|9wG3GQU=LV$_+seEpLA>8q2e0` z`pQ1F8fFl_MN9UvXrByybX1No&=c|k!kC)?1U_3ftq39}+~}>E-MYJaLzH~u!Ua01 z=T9HMjP@|y1a0}rF52!Nhd%c(JP>sogfUS1^_s+fFDEz3Hh?!H%ePiC_7sawX0{5% zNS*Rv=~V@MyUT#F#;X=NC1C!&cVS$K4lu5ME}dOnJz(=WIS(Dys%tz@M+e)i#w3*U zJQRGggOYf9DNu$L6m|8(d(zZSr+NV54JZNCYgxM}fhZkTOsZBen0pNCm4eRJ;esA3 z#qFXAtSeSMSKdXyA3_d#Q(8h@PajjR+j)Z25#Jv*Tv-1pV#tn#six>5YTH*Km_cXI>ds6c1X5ZtHAyDK-8gKhsl9${ZZT)|){>e# zh7mujs44@Zl)$E`bbDN+%(Ekn&E(F;aM~7?rs+;swpUh3^MIrLlg?Z#(Y)MMq@Sml zQ(f~#0IiIiC1kF|b+I(%lAPE+t4jQ}sd*rG;y1hu7(r zk}%ss&G11l*e~533dj(@&c}0a+&8XV+C^!-Cbt&!oVfPLZ5a25)5>J8Rc&c$@DdVS z{3_acm<`Tvo+OePVqGcSzB~9*lZtDo{|g1%B*b6>yCfm~#w7946ggR{BJ>4kyU0|b z?aetei{4TvD>GT=5u>kv9JM}v1nnyOW^4=@9p%hdWiUisHP_n*$zstvAmT85&J-~y zdKm1Q6wkz_+`}&SLWW?C(GM$pY>a%FddF=UqP6!Kv`tZ-6o{otZzm_a)9R|>;b3%ogVP4Yi6r+5~F$r2-v3h&>-zvhGzpVn2yzWcb0ASO>l3%KgLASodJVM4E=iz zZR`lQv^+ggPPZ|;`LVW6<5 zi#Ulg_|dCzjPb#Q2(NRBh?iC=I8Q{;@1ipO)D*N3h%UV6QS7x8zQKsHxtIC7jATEj z@96cZ6$F&%z(8#Oh0e)GGRVF?RZ;JMNkkT`lWP|%eiA;*augWvvxNMdSIuzGs$`x26n ziKM$^&06kkx5Cay+g?w)x}TRTV{{SMxtuRvqf>>DLpwK*mDl&(7LCxB0X#GOMx#Y_ zqG)y73_vhYyA91EkT^B!@s=0qDNoNV5sQEME?V zaI^yDwp2&U^UgCVrEqy3;qtlt$8;NkY!tx9XD&E8+)CP>lP(Ezng(IB{Cj~@cgmC^ z)0oG1W-GU`TDY!e%$L|KDoXRvrIQdk z0d2XqY@p)hpLkFE@`KL#kKDqBdQEnZtd7{5z2#2_M~0~0ZYhMzVknKOK?)vkEE_Je zv-FbHpFD1z9gf-9*}WCpQ>C46unGHW32JcH92^;8QG0I4oS2vxvJd^xbi}^7f5`QI zV5Svac#Qkx`}gIMIC7p0djW>Ke^Ca|JZo$oDu2~GdO|(OdFWB4nY&y#D$Xy#qONVY z6jYr9=k~=>`Nj-dSrHNAzbnrA0A51=g1|Qh&!Bd-XPiQ#fT?xI!JJb6BeI` zC<1GBupdjbQe&;jKtSC}~iu_}R z_G74g<_)_Cva5vn;rw(C4lev57L~e`-};Ilq~9q#np3ym-Ffwh+Y-8jguG{JR2oij z;g+^G*p6sd04Jix##+=vk_1PziY)Iv6zq1=^gRB-X1w!GJHWf@!Q%dvfS}KnzVX~* zbqt4}YUin2*qZxq*3}yvZD1h3!28-8PPb_j?wA-E`x$`kV)s`Y_EWNRhP^e#k2?|m z2{l>Tu6F;vibLAGp4c^_DWMm!wDoy`Q?(u+ni($qAr(HfXSXP21tJU2Q(&VhjZtF~ z@DLcY>_ff!Ids!dkA6Gpj>$v4=dTL2+h(tX-m;a81MmXsFh1U;mV`cu2cA(ES`$!S za!>Vdi`n-&V}tLRI@PPS?NY4@7K4&L0x2TFuXvv*bJ5?;avTOc!9sKP?E5DDKi_&J zUw@ohr%)QYywNTQL|V5>;4Sf7F#xl>l7QwGH^$0s!|4rF_ee8JM(@R|DcN!-~mhs8~=37{W7z`3dF1kNlVR zk6~l)14>?ebeKd28>m86>kW8>P2dD}VAdw_bK<5x99JJUrE*L#o||j*vmaNJ&zGi6C^YkG>K*A!iBQD@-vImo?pY>77UKJ-ceWh88Ko9MiqDk7w^u6A7Fs5K^;9y- z56-=vj_Xei+gL!?9;k4t2+5b@Ifhq+7=gdA>oTFR6d^VETRlm#>( zF^+UbK+1g7@i*M2a&51K{+@TWVWSEJV)m{X1u3wXKG*aa=eSNq$}nfOd@oCkE?)sO z5!2GurrgfQ%3sfsHRh#FnN2BSp%9B9!*Zr)8lTgIuhNbF-lT!&(W*q}h|)RXmEQ-& zXe@9gd)HZF`G5GJ{yiX1I<{Dq<$u=SE|6ZG>V;Hx{|os!_s#r=f|85{NJd5(^Ir!2 z@8M|F#kTSGJD!x}AfA)yFIW-rM}N*&ozMB_#>6`#v35r@lRB z2u6rAG1xs$$DFsHNe_OmuIh5;;T7BZcy;>&KxI@Y91shknmG!sP{yhe*GZEHs zV6eD+jy{m=BLoO_=HHD6&9aCL-PgTz-6GIunaAY7x;&j#>9?Z%TmQv3fJlD9oJ{{; z=?Q;#6@8N_0HU5Ns``3**Bl$^#ESI?4L=jZ7IkF^uNQOR?60+(KjYkr`_va>gYg+Y zXECqxG6TxXk#+98gb%?CNfQ&39)Nl>yrVZZ`sRBvM7`s)E5f0YvUqc)3@LZ3+Rf#} zb!iJCx6dPsa|c++o0A)^l>Ixx{>S(mgD#zs<(11h?vy+SvP#%lJLLe*6}&r5({1qBqBLKZUWG`1Cvx8TAK5#KoR^`7BuZTX6pT zBxz0%a{JK}>_P =)=n!?r5+xz@mQVGD-;bbjdLV1#F$-?EUc+B>6N7Q? zNqkI>8^(Mm1#e%W-CT-x?1ebb)>uT}$Jr14XSXx|V^bUJ@$}YfJa*0_47%XEODMYC z%@a5~J3DnW&jqO}&d+C;44Z)+Y*)0voV!}SkdjHy^l#p~$Ex&Ze~*xvIcwMOJr8Ly zsc%5QWtAM!D?*F#@0(FcGfTefY55tAqwYeXB{X9njieax@y{8|8R2+Y9^$$AKgJ0R zTUb}}vJw%k@J{q0P@lbXZf;IR?zoq`Q7&wSNwZ3@rjh{smY9hA=yd}w_vnku$dv^8 zX*CJkiAt|v3a%5t%v#6tN%o!7GA^+j(Lc8HY^m)?aVRCrfpTfev0R4r`(x%QNp3)a zMqdmD(|W2KiKA6L&=fq_^y<=@a$`$NrY%r`p)Kl%BZZuxZiHL~ca~Y7X_B}_p1Czof=ED8{>YwWmbRSR9 zej!idbia>9u3k_3yz!rX7kJ&y<-Nhc^K+Z{uO0%jn?3@M($379{Lh}FkphB8ZIyjH z=g?~Xr#$~nynTrQ(`odsxYB=5a`E>eH$FO}H3~UY;5tu9{rx}x*4J6;*8iiE`y!1~ zCpysI|8vk7pZJg0$jBd;39TQ1G?ebsh&S(VJt;F@#ty|*mVw+ShURldDz>`L@xLacK^{)C$pQh`&!>VO9f$i|^ zz4>$7+uTZ(;;*)iUgL%xowd!sYn)m24^3^vgS%)dAAS19K~Yf=1B=suzxXAOf#e_2 z+FNz2xNm{RQy(vh0`2veTu8y{!ltkOZX5e&+b*YDP``h)-7kepx#B#MuT7ToCtQ5T zs0UYZvNQy3Iy_-EepW(u=cCW2xk+S7lGq>(=U?dvKvzk)isBckB&c1?sohs}F462p ziH`h{KL2+?^Ptema@oi$s;5f(zt=;$Q?ZVV13(-q)z#It54r8pFuOwn$at|m&b|TT zR4J#ERDECvmiw3Q>$`xrS36Zp_e>< zxYH@DqfNqV7_WCG3ciH6o|B82zXvS%`9gyP+v(W45jGKZjx~m4xpR?EJc=R;helJ+ zzGb~L<}`e{SERB0m$u+!y)%`-Su5LNBvsXp<$Oy-bo1!UcPwLVTs+or6Z|~^z#D3i zICYZPC$T+r*N0R8LrWHm`?f_fnRc2biF;L_4(6zV?=STq*xukcd&g+hCF_|xuuS`O z&fg^K%{#E1e;^ZGm-cGGab%glHCF=pPwZkVLbmZ$Iv&eE`jGs>cBv#aMZgKXH*y1pxt?`v&s;%Uk#plzzGzYzjbxObzpW2;7GOYvAJ`$>Z+4(qgG}w zS2Uka0iv(3=*`;bSC$b2kM-%XQgd^n+Yi4qjm6!5Iur=}Nr02W&HM|} z{||KmB*Dw)Ea92fscZM#BaAj`76yaS4uBCA&|7^6^J_%~3nhVjxN6eU{^47hA3!_= z?u=+DQ!fSWIGHNSJ0)kb>T-3%t%24e@wXqhQwA)$uJ@G_`sE@`S8jx{?FHcPxwO*L J!Y4*={}+SuLK^@8 diff --git a/docs/ref/internals/_static/execution_model_2.png b/docs/ref/internals/_static/execution_model_2.png index aec1298a99533e3e44b7c96c4ccd25db9464f1af..edd02795c49d841c5e3bffb70bc58b4bb281eb4d 100644 GIT binary patch literal 367981 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𝔈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 literal 371519 zcmeFZcT`i`);5j^DguH95D-KK>7Z2UAWHAO2c(7;dJjzn73m$MNiRw0y{L%v-h==_ z>7kcU0)cOH&hfnWde8Tc-}mQljO!Re*n6+FSDo{j&wN(is;S75UZuH;hlfWhFZWCX z5AUiv9^Pf4E0=&PV1_JW;MWCL4cVu7@V+}Mz#l|Ta{8`#c=TV+|6gz%a2LnJ!zTu7 z>AC4CD+!xJ9JtIZATKPryd0c>r}6May@Y{}4wi0a3|Un1AYVHDdasxvg8P4l9 zdjWBG6T5%^{6&BN`?H;HV5|RmlcVcj-2ytueSU}gG1nvRzv~8yik@E;*06Mi*t?%s zuk8qS6Xy~Ag|Ige0EF}$baB{J9bp?uv^Z!-kU$6cCys8V>66oLgYs4S__58nH z`~7(}8;BbO7;6`>xxAyBr3>(~ze@jV;Q#%Jzv>d@J|C`s8NNT~=8vnu3aJaM_*8JhwHH!qYgBs% zrDjwV?39xASJ_ya!uDq5uW;TYx+nS62R9QNIU&+8F>TT6D6o*RG+}Mk_d&>YQ7~57 zV=3)GtKbtE{uPEmy#N0A?-=}d9sGA2{MQux*Ao8M68_f`{?`)z*Ao8M68`_p5=Jr4 z24DPr)^e3TsbWRcOmGX@vL;pY6dc^T-rFyK+uxGln;p^D+B;W+8}BbvshAYc$1`&K zlS|@VAo%OYr_cBV>cY2^7O(%yMd0?@!vP%wA7zu53)+K@up#o_U(ckyOF8y95*t+JIeU-dU;Poi~ip}Ih0(ILPO21XDP$WsZ^8I*+h8^KI@zB`VxWdoR zFUHu&$VCx-VSxKr%YL(52ME??1} zeD>?%cc4s0(Im|iS>sn?H=gMe@Ciu$y7gy=Sp(L@@{(v*wK|+J)rlb4%WK~!F#kVm> z*LNmi>=g$bWRE8eaxgBp(yUMO}7%cT})mArj28J}1Zi>(*aY?o+4eMGM}bLK(lWnsy&Aa@{^pI1TT>!iRC#3MT5@zu=xxOfCdvL^ zeG9rz{N%^y5BCp7CunaxTUq1%bo$#OP$C@JGDBOb&5+L+*Sk$rIM02{V7kdP!K|FC zC-d8s?c$>sJzM;7r%kR)eG%hiI;86`dhz#Vt)F+vv+2me_`g;&ODBHYo~erbLzYqq zfjXt!Gs1sgOhGRwlO7y5=&oy8W{Ub9ZYkljgdLHTiv0G}4JHO@pN4ANQS^0VnXZhS zmj~0P%-(OdFI||p^Y^Pb@vr$m%CCH+x5g|LM+w#o`ZYs;I+$64pz8AerX82~Pn|iq z@)?yU#A`QxRq*F_%lt}IK=Kq=M7}2YY`7d(+scq@JHk#E=@#yNqy1#A`Kx7_ zl|)aLKYtkdW?J0>w^C&Nd%^!T;-7@@5#5fv;>9!GOKEmQnQndZrikArnn_g>Dx;GT zk2p|*didim`4rN>xKmuMOZFJ9SN4-xCaCs;vcU6SW3Lbthz;1poBceP{d-T8;Fs06l=~DxwiriE0raM)a9;A) zqWxoLf;6}XKqA3ET0`#+E+*gqRpwViKAjOLiSyEmE1n@_f?P$v>M>lW_*FiroZU44 zvTN5Za;Z2=w42MLUxoe{FUdm6f^3Zc?5Ci?NzuRO_19>VA7%u0T3fYRubhptIQ5Zx zfp0|V&xUCIk5Oi!#eaBqndVf2gI3o1Se^VCxPjX6H!$-=CNsfyY;=^LosW;N?Quh< z_OJEx>pcoJf!LlBaS@QjyT<+@0s82BTSJTt!{4k5BL1FLH3LGWQ!>7j06l}qC7EMo z@`doL@E>=tku$s*x=_IP_CN0Y?|o(h1u}HS1Vk*~ z`?tCKzYg=?H=alaGALZm9Af-`EEnf@A(%z+ROn;q|K70wxI2q?!SiyZ{Qs9ZwA7nD zTFQWAeE6^iUMI($oD8M%+j-P!=Bp$c);OlkqYd`%NNhGAJ62R!_g~UOg3QJ-8`B~# zJxPz%7txTZ+On>X&%;ud$2*%nFB1@0tajfK0z4O%P2%jNLjCT@>5SK0c+=<4pOart zAG{*ESw9b8np@S)FbsMOmbx{h$W13Wy|LRb0dd<~9xTdRsOE~K7ZYv_I6K|WLqfMc zU(ULI{d$mrx0;$-mm#FdUCyxDG9@Z%R=|5_UIpvmShtW+ku4McZZMHz9Fvc-cJ2|u z*7ET17^Oq^CsZaTCPF}`GT}7F2?vpn3?sQkMW>FlBgJjAQE=Hvdi8@DUr0`K&tQ8F zDzWOwvO7ULmDgIO81P?$F{>p*Rd(Yi73Jlkjg5^%Y}!R`{EUo@^{N@-W~ySCk?qMU zyL>~t)lprL0|gb;Qt>Ew9B#a39x3J_W5{KL-Rb78sq;H3uhBu+jl-$vy=H@UC(BcW z=Wt&JHz}}lylJ}Qi|?ss-&c}r>dy9yN|&r#~d8n!3?V2)t;RmAE2Du z=?3$V28IGl-z&kxhxr-)!c&tTll6qelp`~Z-mY{G6GO)()icqWuI(@Sar(jnvLGsT zb#;mbh>Xavd7%!>U}&UJGcqY5)i41iOLo+>W?Bz-S?DSp&Qlh#F@Ps1cKOEEHLLHR z;a@urB{KcpjN0E)15J%?9~`u>fef0==c=`2e_7bSyg}yF6*;^<#T!wY`q%Ub$wsTT zKdtW^8H%^Ge29zFTF#Ua6s+m_^yyRg#Y-gLF%#AqxCcQH{pvl#V6|^)qTW0s2@V{i zbdO(rP03YEgg>q^A*5~E?Grgz9)JD%b<aC>nlvz zTrGBgUE~EYU}BYX>YIcv&;YMtWkKV?uB*K9fvwSo)%Gj!QOwp>$M;gR)=)9u{l=pB zLa_6lSpR^$-QC6B;@yn16YEz5wy%@myfq~e*}4c5k(N{JYE@QN7V9E%oF_BAq9Nl@mm8V^-gDd1LF65ozzJoK#k`M>>>(Q>AY6{_v^-K*M9pQt=@R}M=4SV}F>CsRM7*^L&9 z&X^#Bh8=NsNW~A7ZFifH`#1iqi2lLx*FJhb7gHhW_O^wm2_J;r(cwNAbZ#=7*EpTW zQo)eu-5omvt~2DJX;?N3n!VAg)Rys^UhU8^YE%HbL1PN{~QUW{WK5o34r<&0$UGBf|q{^JhX~}ng z4Ge}Gvg?%CfECGe>jb)ywr*CsGwG1F@JoiwY;qGDp2cYT(#hOs=0 z5GBdJUWHEdxIr)+r>%%?k_^@gr4#jXQZX~snK)v!DJ^b3o%TdE4eq!)XGvC+xNE3BV0n;1)vUlD-PSqj8gAxg7#OX+sp0lph7_JK!01eDV0 zzP}bJar#6PE>uDNo*1oeYg?3Ial_Gpi={EsK_BFYkA`$IXZQ_iz$3*7*D?JPXZD6_ zbYqF)=bi*5l->Rxz9LYvjy#GxNu;}X)Ntf;SCp{rAtQhj+mgBKE>j=%9w_(q9@;(| zi+^S6+SF5fo0fHfw#uC?kO#Au?AQ9pXS9Gmf7I+OgvyBp6~r8#MFEnKbrq1V6Lq1fdu-DxHKPk4wJXtS&Q zmItzQZj_81CR?WyjdyV(Z;O>Ja;$;KuU(gI_?;BqE#Q!<%- zLY#Y~NPG381+;{@6`?ywo0Fe^+_ANCP-8RrvjV90;mSCLhe-(OrV6>GS=9$!$U;}V zgT8mhlgH>x%SA*&!0Ubkatoy9R75R$kdM4?8_@Ikl%Kj3eMwoG6K}% z|B7J9fknx9SeQ=O?TsKOJ8L&!LmjdDG|VAuAcB5Yad?{9rX7B?$*fPH*vj$O z#8l{I-A?l1_Py?e#cniasbJ0r;3WxU<7zwQMPtL;q zpxz!YViNu9YL^skTizjqaQFVetFs&zh;GyiSoI{a@E%L#b}DaKY&w0qg z#RdO%Q&n`(I7GfWNnOLzFSexWC1y!=^1C07W|+$GgXjF?!nC5SZkx<_OV_wmULJD(!aw{_bToGTE`(k`4h z454j?0g!7v1E8_{L}PHb#hzptgQGI@c7vW&K}6s8GV=#jJcfBO(5eOk^;4^EfxeQ} z_jXU|AkHRKwgES;B;T8G=>l?JU0KvRn<2YX;I8avcTCgC%YFA)-zh8 zwYYrnQ1Li-syy)YE`E2F-rvl@zXns1kBQ_cW5hE8PLJr?Dn&eAN(SLyhbYmeq^7l9 zTp?6YzwnELDdiw1Cyx>fI6YCWnekbrgmO}+Pio>*)-QK=t)2jk;K-vE_o}(XEX!=h zPfjfyv^*GjE52-{c!TL3fq2QGN1bxXFcHVZi3)4MF;1!{>{1#bC2xw#2?n24J5JZj zNnU2EhhCYHvMykdTi1e3JN)~R`5F}(V*pTj5`q=`A54A^MMovHt`&T`x1@lRa>dJ)VZaz^y{YT-(J7|X_WY8)TYpmVqlzn4w`peQ z7-7A#s!hjZV~zPCeaZtRBwhA=28#6lwSzN7i8u@@ZQ{iXp3yas6dP5DQtJupbaoZu zGm>V!X1uccs;fjVUxiM3tl}IA#^RB+4j>aI*;W_aSI3kg1DT(}IA;a59A&AvP_nxM zMW{O0rKh9|FckA{HIbaoC@CAc22z3aCHsWLWpFok1@Not#v$4ph1{`bi2bsU71QN67&3KR7u4>d3pH@SlB{6 za&2S7(Ou4qKWDdB5M>`1tyZospeg-w6qz}>Jo(~Q)PAdJ%Zb2!Hd#i`H z|4#I$lg5JtAiU&HFhfFnF$(2xt92&WM(cqXEiDFRh`-q@6+grSpp})k*~ouDD_}~s zz%AW*Aic!L-P`^g)txTcH8|%lv;wwj5k(x#A1;vQ zH9CD_&rvDTZ4F`dcQ9l|6VfR8Z%7Vv=Rx?OqdxOlkDy}z!>jBtGF;HokJ;|G`M#Ny zbUT=3;XVNBU#cf`W=V%GlD1E0Nng&sm&Y{sqI<`!S5J6sW4eKsP>f#4Oc9*VV%h_S3w6DFz6n24HPijED^HccK6boMOaGHh4mOsV^~Wh42)mrKPQ_+meMu zB!YwNLL)C32uq&rJCIOoag1jD%@j*Av`EUy$(1x~@w_@R?84?CbQ6~5e*P4-c%vpw zo@tS%*Z>5z{YB;pKc4R5i&V~?EoB6}59X}e*%4?u-e?F9ra#Apm6qL~T)GnLMTBp@;YHe{qT!A)k=I?G3v? z>8$&U&63IPJQ+|xMV@Cp5+u9qq13y5RNq?yT7EQXV`R!N%M`99@0p=!|D+3%>C{7CsYKY{mSHoJ*Yd5M&PTV=pl zZucp*F8r`gXRoK^_AR&G3K`6^jK$ucFClmDSUMtiOcLA|-pNiu0zz_Rp6hhIY0_im zJuMG-J$04K@zkGnV@G_J$)A7YwtH8F<9g*sJ!i*vAHNCwvAZpwOP+@IQ8oTtScuou zi9oQlZv%E-K%Kg;(!uifrV|9RDSGp0%GvSf*SCc{du25S0q3BOt)a!Dm*-d_b4*4* zL%~$T2mqdQ+FLmuCB#%*_Cvs$ZQZIfs9VtzU!o?Is1DENB;R)tkc4$IRT$iUL6aV0_PI zI4{wHT@4gP6GFzjzNx7y7N5zZ+z60fw8EYn_Iz;_U}IUXP~6gj<6~m~$6Zrd`?|TH zjBrltUZdQ_$ncDjgB`Rxv|@M|I#Pbh?6VPk)x_O41H3bnDzW2c6#5n&aAh` z*W7!0`*?i0{AdJ4P0n6h>uAyOuo$57Qu?3VU8u_LhjHt6^!3%iK&d*HC%MnuvsMK1 zx~*r9GN+FaEe*q!M(M}>4!oP8kr#aqN__=7IPWRvgO6i(5xtA48+Dc)0hrhPGU106 zoy?m!Sp52i$kvaMH@xA0FaX)B5)PDo`gxqiE1%WPWgo6hPCp0bE!xe9Sb^tiK-~>Q zcW`r4GD|H-8)KCn1tD0U&o3|2310o!)9Ea9wjkL1GXb_7<@eJfY>Hzw*`)PMgkNAQ zFTFwfp=fh^zJ9@vOF`9S!*dtcAdq9Ew=9O; zYU9hLvKEeYuk}w^0z%2j-h%F&n1h}@>WLZm)el6=V+&5p#}J&Rlw+xWQL3)vlB>Bp z=(QfTn4L+hrY6dtVO&YTl!`3!y$qs-PZ9ok__fVDwm)6qcSZ&>7HYywIXp`j09h$& z1;!~~wg~NF*M;+SaZO~)M&2~2U^6!W*s0cQ^rGKo;tLtB5q$x3U7+)=6kc$jY=$1s z@sRkat{*Zz(ZHP#}|~wtp&w#Mz*(B45OFqr_n{RAjR;_R|y1Tg=?WlC?^){qFAQk+MVb z!nzHBam2h6f1?r1Q=C$4U8qEebYJ_vooU4D-P*D_QIX%<8Oxkl=%R>JGdaNrXjYZP z%XzAD-{j-X#xUnl8nY~Hv?7jrw7~5wL^2S7pZhg-ICgw!C_qbgq zCoODG{E1IbE12pd>>6+U4f;VPe9qKMk&U>1tBin3{T8zLtbW1D?YB7(+IJlH(c?^a zg~sm7HX0M(Mz8IBkF`!8LRJM+@6uiEncacCO-63Dks<4X#kuz!3qAv>6b*_cAn+=(m$XsHV%6~Wt@fw`Lb=AkrHV4ep9dz*< z7og4>FGew}j<_z-7V7@o5bK@fI0UC#uhT5@Y6{OzOh5hseW)F zZiPTCrKt3ee3L2nd6Hh2=wnGP1YuBR>k;rs2IViGk!bJ1b%OzX>zQ}I*uibmAJfIU zh*$&iT;X)g>Ud3@d>z26{m_kEdC9``sIUxs2h3SK4{5>a7?a*Z7*lBo9+$P#^X`m| zJ$C=_sVAAY24>P!KYY#u6f`kDe5gauW6{yV_^Id7dpM1Zez^{pyAk)hnR0@kG=%C{ zEY?I5<$kN_d9~ZCPXIL&tc;9jP)MZ@hH2!!Q-^l?8#3|pYo}A4oY{ZQTTeCgKiO`t z0ZYZP4ga8pG!B9RFC&A>N%bJI6xG(&_0=BN`2C z1)NMAjfHiXAe`f*1H6$V;kBwa%x>?b?E$fHk%Iihpm$}d#~LU_X~yfb`OlD z$G8tf!QiDx#R0|Yu3+8o*fw?5^6l5>Y8deG)vH(E@j@jPr&Q$f#9<1A)O`(|@$9-& z7cX9{AbGvuWHnXme4V@H#3jTcrJGhqUx-V;JZEuvFgsj4aT%PzWo#Swx*Ukx^BqY2 z*%ik#X7ZjyDw4*YY&2|gMgKrEE8N|or$koSB@VWl#=u9&RL> z_^bpQ33{U{PJncU@q%wb?~Yikziy9+zGU!&NdLnhq0~E0FY~XaXnl?abRqJGC%gTl zt)IQg`igo6_76Au)i;$@9&(H}Fuy6+$`BWh{D-8aDfflCPLJ-HCSTIe){c&j$w2z* z%=*hKq6Q{O9-XtceMHNt!Cb7W_(~lRGQuZMwZ}+0(5>mf6fWrnHgevU2> z#S3wc6zq9gC5FcziX&BRWqR7s$`opEjZ(?f*;X&tA8nOW@QMq#tzPJL?f&C5cs#a0sU7{E~bwqv7bt&eK1d%wpDG$AOOflC6M2_bBC6S zO4m4Ee!#R1(tMP+J>MA{Y3JTGr$rbo03Kpo16Cm$uk}o%MT-3k&NmwP7#chG(Mo`# z6`)PXT~&psPqj0B{v6Gt(6+CfDu5X{kOuZc{Zca!5W&u~q9W*|p`oG1J!rI2-0N!v z!;tnyb3(>d`{vDCKxQ(|tlNa?P<*)ZbfG&@yFnmr_xb}F`(x}XLbkA)@rt+?c5g-5 z;>z)(;c9)4bV(p&<~6Lcb+RYQBUn*O5!-ANXK#j_Bh1-hMIn%W_y#az!@|) zYYnTkGicrmBVD0uag??jb{Hv#R6LYzdWz0TF|>{>e>j}ypIa5{b|{Bg_6|GC76rDeMOhlk;*&&|+^Q-}4Y!3H|MD zdMc}4VllzFRS|6+HJk^!{!MyKsoASsrMy7)c*oSmDbG0*#!UE>lH6P1I!+lr0+53IO=g>O>f zaD97kuP1R^H<)3U(3)~&u^7=@uNsnn_kMQjys=2k>sk@1IKo1TGc2IbqpPKVrY}XP z>Nr)q{pRHE&5u6!$&9SUc6)ebP`>7KpldV0CYQgt4_#j z2QtH}nIq_e6+m#%B7GOgDWONl5!|f1+M(ABMt^pzj_W$P^G|(H`Ci7pHINjV&O@b? zi$OL>;YuUA6Hk_DW+Am^QL!oLddPBtZ>;Jo>gnatYWeR0rS3JVu%k^bmMeaYoU-FPQHAbcFY2(y&2lS(txs0)v9XppAk1)~5>b ztcR@vw4=4#giyR(f`dgZlERxmj1eYr0by3^j`8fd`Rzt~yQB^uqRwOO#rWb7JH3{r zNwVn{`MZ*ZV|AAaEki^PMxx($>n13E>mS5oZN>dD^$7snS~+^}wQDS$r;hV5x#!Nk zvc9)^=P?A~-*#4~LE0U^DN9IRV<-yAI>nB&je4*BC}mGQJ#C+IPfK&-R4dNUix3sW z;%@O}lsd@91M&t;L0w6yqxg(`uf*}Pq2_S#q{UxqDW3~R8TDyCE8QhMO8_B^ePfYp zG?gj!l8+tJbpj-Ob+qGql13{pYG0rslQ`L8bXa!1D>8;eO^XK{14`$|8?~F~4_t&)< z83wlo#xU1v0hFIzU-kZD+l+cFU5eGm61}pIKeG5^i#UYU8JL)uK&9CP>NL%BEK1|^ zQ;WqJQBhHwLG{6tF+JVXF-IPV1aHjNkJer$UdP-o*D9ml|Ny6Q_hjD9YOSqaQ_k)zQG=$b&=rNn3 zKBcjk*zn|8wNnBZFS(23`_3_Uz|83C*y4@oqtD)Y>_1@mOBN-=aMx3RCd$l*K9eKOZIiP@r z%>eZHZQmtoXtDrk4nEksk#%a+NEU)uX&G_xBa9i>}V;*>*S{b9?f>N&fV=*P`Em<4^y6oLT{!9@Z*r5 z{Gr^omVZg5o#Fxs;6}6n<&kop_mu>8^t2+fC zw`~?GgCIUV!K|V8lDWLo!V0Tqo<-MEWaBK|(aCiNsUY`}s1B?^7qXECZ4_b}9uXc6 zD~vG42Z=8ArP1>EpB(yStOCN{!DpKf$Oh=fxv4ywON;{Y+6@6OOnqd;coVfeH8tgz z!O8T<<2%5cxR(Iz>`ET4(sDw*Jx8WA%KtY03S*`a>hbp>RkW~-WOGI50eNPlZ0+}Q zL7|!>bgEs=BL{JSh(uO0DAa9CGrn{kKNq&J_Ee9s(g$T`W^#0%__+Z9!~4OQ{d9d* zYPB^{eNDI8Op%yulOPysY1;q<6xFF^g#Vx#lcc^Gl^XHGWp3Sky|mtK#pQWwjX)Zp zTr%bi95N8Ih8O!U6~Geq?|#oe&f7l9cL+IIguxu*OAvcQ|q+g}3>gsd4#!F7?R9N}b z4-}`i{rG}2tWt1ucJ1%#?dv*7gPe5n<08T{w6Z!yASdhew@u@uS`qHuU;7NldN_(b zUJJnmh^>3OIy<^NHG6oUbfBI5=WII9Y#mWb7cc z8wLRgp<1mZ^Q^xFmx62z(yYhb7nN}M`1nJNZ(Pp8E18osKaL?lXYJvY>Nl!!$D1wT z0ApYArtOm&QEi7Uz}$ZY*oIVFC^*>5Y_-#48(F;-2jPVZx6Vp@?0Qp zobf<9998@*zI64Fm3=&8#f>Eud6ecWey$_YTfhL1#P!GDT*2Oi#Mb0Abtb zn6|=f66k92q>7SK$q67mcn@S4l_-etj6fr}_}A+ZcO^DlfruW9HIM!g2D36w3~ftis>F}S@s;LM+bqfW+9XLxzprXL{aLv1YS>FKE>MR(+0 zRrgeS5za%i$_cc|Mm90~NC=31;;C=3nVa@e2q~@4DIoi6Q2bds!}dlaBwWx9g#V+* zpHe`}^cyRF%mpD-t258n8s##Ln8*AeXs7K5#Pk>XSvt?DGUL;0i%^e5I~LQ)N-*cS zY_j$Bbh=LjRTM`pGmxx>X$c+7OwItQLgz-0^+~}vYF)c9aObU#gD?}G26@Ck@ebrp z5rI=zoa3_+f<4y0tFL!NKN$Ve+G^JoUSp8RW!xobU*+m!Y@rklYr{@X0L_r8Fp6vqtiu$1Tkok)utFJ~SfOoc4 zBc%4|rF>wWP76emMQ72dezfjxP#M9s?=C!rVdoLDsX7BA+UKdo=2v zw9IOSFb;^XFP_`w3Lt$bZ0VS~qxO)@ihr2Qd~I_xQyvi)-?uqvaofg@1a6WL+P1%SP=j@A3TrTo zsH*OT5z`BtlT2On4`dA&bMj8nKG4IWT8UFWkvPu*<)$uUN(Eij{>m>_SM3kcaZn&~ zI(^)7Dn9a|1)NNSHME3lA;P+KN#1$c8CbwBZ|G}!{`6`fRkf_|k7>Sx8$P-8c$d;s zRm`>8Uq?g3(ic;clb$*h5s;Sy3-=`EAr4VK*P~F=~2RNa=|-elJUZH$Yt7jXvf;i`)x?}{YAN;7>c6Jjt998 zzoZ6#kmSF9lw2v8?F2Hf%}^j~lmY$mnu=b(%2pfXUh(ZIo+Xelb=MmE@Y2xyWCb>@gm41#9Xfeu^4NRUav}@sZN2t~H~mj$XOJ>e4y)Cj}ClQ8)KHQL4E-ewNzO7DmzH~F~i3>8L0pb;0mYQmq=aIux z={fuL?M+{s?gcR0g%^%IA3O^>A2(Q8T6$CN@l51>K?R(_LiV^0ByPl6+`7do6&uoj z`|8p_mb6SanfT%CwoBw9LEvz{sxS2PXsKq^a~hy(9RSIqr-_vxg_anA7hCpLTL3EN z^Nm1<+d8@}efqmMD(&JrL6)Oa&CmwvQ$)4rK(+;@@(J7P3Q@W$lsFVSPpkxpnfe5G zURU8j&3+RsZ^~^)i;gBMtDEZFxtkAvda#ZM>l-t^sZFi(i4#&a{rcv58K4tJmNboA zyw|r%>dSQvkZp!ZCqw^L?emKOjPnWt!sF@vLD{?0oUK1b2Ry3*L3d(<+e*1?2$><% z=lESJE~6*L<>V*2A)&`F00zi+J?;9_md$bj1dlS-)81NuoX3AOMF8!^jjJk>nQ`iT zczJWW_J?!ExA0iycikr+4VliK8IqOnw;rUS_YUeIhJGS*=AEZUiMmboKLCpFHGSTr zm4WE}%bWF(B-k-03=_*32;@nY?y5va6xyxdHe%ON!W8Mx8RcGE_Y4sgcl7VbAtHv2 z3fA-`FMS&welTj3;ljhys3MO0V&l5XBK^ne{4|3P$WLn7lB=uH$oL<=$MKc3EYPz% z{Ms#A;cYUwwD=)QPeOcQeO_~YO*}aYd?t?-w+3-CxTVZ3OdmJ@fFWRxT6I!!$KD5#x>q(%XN$ueL}!bgTOYUpe3m za4lL%BuaK0uDY;?L4~^IMd)pbwA;pywCB1ep1a+l^*s^ zJoqPYPjoZsk=au!hucgryBkmHj)8q{(C?&>@&=k$^=+nZ35`Pfq*i;Z4-6(y@bDxU z8STj04ZGXcP0mXB_QWS*c&KVVT3;y?_A-6%^LFsthgWtRREao!-8EW9g-hv`uF<4y z9ps@2CnG`%Le$MO%#~}G;q=skr>FMB(w@G81p(!g14s{rN4Bq2!>nZVwH~y5m>7ux zNiDQN9Yu?@-a6ohJ$WM|e1A4qE+>%>pXR=jc5JMhwjW(61D?nG`unl6ziPo7i*v}Z_QN-(w=Je=pq zW}aKbJh40dwJO^Y}ml)i4KRfA&i zqX(nq6#+mRErJ+G2zq@1(vc(+%nJwQ$$NG+O~;FKbLM-JaRko|PB^R`QE0KJAbN6g z(~)$4WBm^Z?c%Z5vCOJ8;w|#zmg`^W^BW_*I$l=FNG0Al@yaSi8Wwv3xi9;Gg?Qba zkSg7PoB1kflVb+Zv3r4m=7jd|R6Ol@ zZQ=k~MOvp;X5dr_wgV(i%~V$X4soT{s_et=aEhjw)%SPXl~puv( z0tM7JcaLFE9uwvJ;WVD_vC|qJPe=E1Edxet%&2n9ZHJ=GPi=3zx~7rQ3s^i~;U3Q%VRF+SXOuNndc1Yo}AH}hW%N4vUk;h-AUQ5SbyHgI< z6T$8G{7FKp=>=UPrO6?s7xfBjJ_QmYK5~JICTh9OjU|1GlA5o96vYx@pG`YU^7fg2 zgU9;Lmu5iwbOY{CoL5dK?GyG=l*H3$^S+d)ck%_x4%cjwpc<5agSr?_phrYTGMIFl z(bPV!GM(yH;rpVR3kW)6uCM^aa=-DmIk<4Rp=Sp z9dWAp{$3Ptc8v1yK8w276scRJweqeS(%CbmoNE0J55JAubT7>0 zq`^A!pXl-{Pjn@r&Ro(D3BgTUfZ!+t(0vLxOiXI=eDIQAyp!r^qGyL_EGeF9$e-xB zqh7JN-~B!e0Y;M#WUXJ&1)=PRT@ucioi<{rIaQUs>JcleUD$9LYTioDMs#RSi2upP z*qE#Tq0)xrqRj$!rRrs9$u$TJQM~Bt>ZV~p%)7(`jyi{@9M1#AD;2PD`Hp-OrNesM@pymcXsTFi?4XQYo`8nmf{W<1NF@_ z^)pX95sg*@34o1-RxXr_$A{LU<;dd(&u#!Gx`n{q&Z(CO>BM|03rV7lHa5=`JtVV3 z5tXy@+m8vpR>YH88+a<%}=UkTHXV{zZ01y}?IunDc~h zm)s3wn1kkrRmLzl);_g(T@ycNI>UFP?sT%eDUXy^pfLxs3LJ)c-Iv2M-i+{rnB98x zy&3A8y}##>*mkbWr6Ck6>iMwaS>Rw6;SPwb==Lzc0p6Q{?vNszn;qRqGMp}A`YDiZ zaz8pc8uR7Lm#a|6s`aG%fq_thE}Vq=zF7{%KLDwqA+}Pt6^(4k$DOa76`F5xYkisl zzL<=r%XybBHJrI+<4|^A+sV1p`h(BD-vd|W(b`p%)l074QBH)VZq266o#W$-m&zb2 zfT4r*GG^-5ctzTNwu0c*dHd2j>KNEb8zy=my+a6qV)DkYOvzNeGnqRDH}qze+g_#l zz7LtLbn8)(5ai+tNv$u6>=pNhR5c(F>JMpQn>;0+yPAlmQFY*G%pag3Fq?ppfu#x% zJR>pd#rAQpdr9(8aK1inlg95Xb{6Lfs^f#ryO8cOxdid-9$RW^>KT;(F%0Xc0S}Og zq^IM|Sc2PLX^)_@YXp!?(c8Cga1 zUg$Z6s?ZdUUAF?bE;+(W=KaQ_=T1^_YNB{!Q%tM01;F`mdiJSlEd2h+d z%Wn^ODkg;U@GXz8EM*cTnQ8JeH!aW%g@B}_bgged1K?*V5i9QtZX@UsIxAX(OX^ed!V^42MK>mE--n=SiO z_=oKz+)(9y>~N}Q{l;FtLs<`WAP)^D6I}jWnfBMC?)lZo&B`TIhg)Rtv2jnZ0HPPO zy+<;s0uJ_FPYZh(uV7qEO-(;6=I7nWu^NH<8+)fvsY;ItQHZjBwwlJY2LM3~?bvE} zvgi9inD%;~pt%lT}5)y6kU^ee{fy2tX)Ptz2Ty^k+>Cw|W2o7y37EeR8$PZY~j zAFl4N?9BLXPGd$iRVfagG@dQ6t(xF$p_Q7Onk23 zKW0k(I4Y???NOi6$UXHDrLtdBEPCm>;@AMc&*gYhF8~*leQj$?#*wfG;j}?sKVBbe zjVU;Y#7i9kYi;HuC(?Wp5O^?p_Y0R)F-eEg?&rrpJ_lLXADu+ArB9bp{lmV!KyZh9 z3%~*bzJNq|a|l?k(rc(%XY=N)FPE;}xy|ZMs%?3gQx9;1B=kUvVvtl`nlKs2bEz^> zJ8q(|W}ilV>@Fl#@5#3y%7yRpScM?6bF*XrgpGEFAvW!W_}i@Yqm5{a4IXo`AxHn@Y!JgzPgJ{1ekFjBP0C?dbqUV5cG%?8 zZh6ulJ_$1ON8^?zUOETBpG4nq&MO4t?ogvQzsB~T70-R6s8AX&`}1r$aH0#KPm@@r zH8v;e-HXj^W=4y358~|OQkg{jY^9EYeW~>l(0@&X)Wlp@p-|{BW0Z4ro%>=}$Td2j z8WL9fj$2mnh}`mlfq?=h#e|a4F~~$Y(<8vu=2e&E;jkF?k&80tNmBq9s5pKv{T$Wg zh-!wS&sI^&s}u)2K&~F8D9)P;;ZFNjTV@E%44b z*TL(-$j&86Y4Y5#FvULL+^+#61SZDM*|)0N0+Q_)`B^(J>LKL2U!tC%)!BStC@CqK z<)0rM99%yC0d}~Y9l0?U5db73(inHqDy)KCTm`UkRXS%S?EZqMD1hip^cfMyRe=p9 zB^;5!S-TUJPOb@ce2hn@)6fr?VU0@6L9`L|yM~W(<3`o?`onp;JKzkPkPdQiGyc9-Zd3<{m)wTqPb~r}1e(rw<$wRWAAc(CEo?x3gliPI+4wT6) z!D6m^wEqB1KYa|e$aB)3VBMpb?}n)2$_2OuX>Xi=r41wAkZQc8wROY!f#pcKu{ZyR zz4r`gI_tKF1wj-9L_wshh;*VLy(%IqQlxhjjPzbZM-)_=NRy5ry+pcn5D^Kz_W;s+ zNgzOgyoZ^`nNgg3|M$!L>G@;~$uFnubI#stue}cR?cl^q%;vFc5%E%13IsU7N09dd zb+?{x+0&Ez`~=htK4!oFK9#0d{odPhKCDk)E5T3fU@bqxx>~VGpp5;!HRHCQ7Ctmzluu_>h%QYBs&+T~X4F0=5$s;@Tadqd_v9YnPMc+2%FVT$opa>vv11Sx ze1UkK$@qZJLr8ux@yWbsQtL2pL~Z%CvXX)xW6|PxiQ|TVWZ6E*d@@T2E~yi|e`j$B z`-zNRXdDAJSF%ow+%qqXB%p#m-Ys}G!xB4p7|(5n`!h=C^*e?>stqLR?KD2CisyEAFH@gt3T0WcS3Ud9(G)!%Tej5_QMEN>E-PR; zgf87{!*um!o9i&*S83@}_0+%TsDK~1_Alrq&LEuWNnAlm?u8ZP6OVkzd5l{Fpe4-S zUpolXn0_q1{AfBRi&g7kFXt-#e0!q0tUSxft&h6CFAxb?V|mw5=U5d2-(YeEK;29< z155HX%kWf@1`j=<<~$)}Y@DM-s$+YwHXR^XqM zsJGpy@y@RCa!TE@#LOC?YR;~n*!;YwUHV|p;FNtIf%e{7Z%nO(xS&o}nCJDpryKd_ z0GC{>=aM)_c|z(j#C?XLWh;J+e+^f$N|~%+td)zlStD{9 z-ZRMPNFa_iwEfbZW$M(?u4?&1RuLV)*%N_lAcD?&T9_NPWdw>+qb@d1oYghi_K5Uu zym9J^{!?==7NL)y0m*XR-&3?{PFoKDsT*($g&{X>WB~*DdLbBA>efwZ!dWenr0`31 zLA>L!=F-ntqJrp!?TU%N-6%yW1Byg2tK6Gui&J03%&aOll>2~p65bF%?FCt-pl)F( zOg(mgvnu5DYL%3pfADT-VB;`DuK?hPNKFvXW9alh?W>UdW^X%&mrmji$Y8j;0?!!I z7#`Le-BSO3Q2Dth~nIIMs#Qv#tK?{>es}Vo4$W`Z4=rOOPwL$`k|N0S&fKv zz{peXKKH4j1W9w)qeT7KDZ_{h_lCXphKrEHE2T1$I>QAkVIfQ)%pNd&lUi)aP?ndm zPrSc9n(Jw)Js7^;Gdi|<9}u7qx{8xE3d)S`k5s4RnZj)2=(;`57mc7(oCRG7)Pwmn z6roh&2UCSO-qK*+Ki!)p_KWqMw1k`HgKW!XA#c0-fEQdf)vGj?2z>Cw9>_2++)p_2 zQQgUX0p15?v|SY=I3T$(`A(RC#~P8+Wr! z-|Uk)XbNtanoIMVlwUsNI{AUv`j>MQ#%*ys+X-$fT33Bs37FD}{Yz`* zPoz|7i$K5{S$W%v<9Ta>I5rLBXx#CX7G6%1EVo>hk9pp7M$;UGF?5*-iJhr1FMt&F zcRm?N)h*KsP3c1!XoZo46 zjt4Im!Xx4=9N)=7^)fxM`~0g+6@1%Ubq^zldZPq!3*AB0^3o7}?ffih#H)`_g|)O2 zb~oE%AZ9fpTsX&xLGm=FR|z$9k%8OI{9K!3qwSDOYcsJ2rsyt`VX?(N1ySsJ`mFM2 z=0LwG)nWa?5*5;&vgV@r??QrU*rJjg-p_syTn*ey}6Wq*5*HVvqoPt2P zmSr9f^p9mdttiDv?>fvV>oFVetpBDzfDm}eW?mXf3~o75foP&>wMSmB3*d)%&AqGT z>@tIWT>{@Xs!|DUoeYeA?9!Ol=--!3| z($EK58su7C~bNuuRNpAW@TcuI*qJ*tYP z5PAHZFhIF+)UPfTq60vjJ+@EeaXW^@xJrW!1(1G^ATgneE#MxRd;&Ob%-g{tWo6~J z&LHYh4x;5h>rYB|{*q5*ejis$ZWxhy0GbhgAn`4O702KI^d6*e7HDAfcJ|8vhZ7># z_pqW;a1`Lip&J~kI&GfT9P|AT@69D1%O2Wmua=5zu=MqQ`SQgX0XZ%U zM5b77O8I>wmH-9Q<3Pm=e|qL))amK?D+VS85f*2S)k>(lCGInnf=IV!2ZR^Lp+cW8 z(C9B#?&6OWF*bk2XP=m;cC%vKdrf;{)J6UUF<$)8stI=ZyMcVOR>{MQoXsp&gRh4& zjoVIqkd@Uyd~(TDwsIvs?}R%_*Dy%>Bs~pq zX40K14Nz&e5h9K+QKsi(o>)c+#sJsXe6>LjVY==&sGB*@ZgBLh@r;!i*AL zI(3h!eni|#`UF;MUI^ZX+h?G^)x!GpN+nB?DgLk|(SrJ9?B4y-xiXSgGHUu=q>e$~ zAvR%FV=3l@Hi=V|TEk0SX8Q~<-z3kl;clyuebOhLYWDU|Z z|I{G-k)ru?GkSF84NHA|A{HHh4J6LxQl%4k5*E?xr&fU_bN}}7QDgKScvTS>SoYtS z2A-5zy+*0#DM}LkhUgvca;W05$DZtaqzQ*T3TMI#@%C;eHHfdwz9t(7N>XyJZCd1p z*{*kK>y*B)hT^q_LFxK_mrD`?(pL9p6OX(8G%|nx%H{FzE0HuCEzb>ftE%jYk1IRY za+95MLR$@8d4CO?t}sC$r1-)<`TTDN*xUY)o*69a_B*W$K#z;}&i0qp-fwE(S9Kfl zohUcVF68#yHY@HW&f%iKk4rymOFKvK^K)x)`OZw^55sqkH?qdcuZrWHz2)8U!I${u zrdUL>_dxz4`&QmdQkjOrI4UtJ8OrJKw2LPb;*y`C6>gop^cKwKzq4+M^87Ytm5`MQfnz4WINHr;dNEq?yroYGFpRYP@;?w5dL#9>KDm|Pq%F5lm z))b&n{>f}p+aOWd(%b7{?Q>fqLngOJA#S&CI}#P&<^Sim|1ro?0bq12D9%Oymc1dB zl#4%l;DCx9<8LL?@r9`vPOqC2MPg#s%X>neyofisop;yK9_(`pybqU zJDd4iXV>O7ur3B$)w$mxV?SH;KRN*ZFrW*JC-z+T|MZ#P8eK9VxCIMwpnu1f{JH7> zpiv&~2|Q9~Qd?h{{!gFz-FVVJ1Pzs?r`mn~e{8A%kech7`Eujue*dmdKff2u1{%s7 zOzd&%|Jc-65+HYIZ%F%dzkk=KpWl-O6pt+`Cnk34 z)p>L*quYvu2+YiGh(cm?aawQ-mYF&?ufTW0%i+91_D6a)#|V1j6k2U)2(NM|emJg^pHgNzdbMMYM z#q%7d{m8hJAnd1jRaJMjow}5?XH28N^8dVbADT`F1K9JH$WmJPe#6*TxN^CpY5foy6v( z4**|f0Xdmpne5nRc3z$nP_W_(3JT&b+nI?~eE$6T97A$g?%ebI+v)PSsY1Nzrp9_R zl7PKpeSI~nPzsg_jRz9vudU?VGFMZ(a&_k^#DKyeK7la@0$;NWISJW#y{tDUXs4;) z0Xv7viC8q7=hxC=EX(fO%0wVGx@W0(dnu`Q%)~~_#c$nmSP7*_Mf#pN|6EUkJ*BE$ zFCua!0<|f)&)MDWYequ6f7@f_@ne<*@#OoL^P)qSXy|l0kpj12DGIYOWlOQuRQDRc zVC(vowB{!m8P%5d;NuYgzCe>n z3xT9)mqmVvU{F|V*2?Fo7U2|CGEiO0-bBIIUama6;5f?v3c0?I&{6g;oTaFSnR~v> zY`KepH#Kd--4bK2P-{qz5nD=0y+{{hx(u)0_~ho$o>d}dZroa2f)3(6GMyd#hgMHJ z`Ay}>3OOJl(!Lt1qU(dx16r#o+YyAaqfkM`K1qRMBI4lOkPWZz|?1M)yH|q{ps$ z?U(hPpjAhk*PU~AW)n3;Gr6PJvi3~69)(rUbI*k(Mn|1u4_T+{h~(tORDtI>FX9mw1HICrOsc-Qum)n9qbAT|(cG(E1QvvE4Q3t(yKB z_$Jf!oG;oE_Paiu*6;KS?E9l<%u&}DzAkED+;(;tcAw#wGGoNtwVHzUjO2@p8E3FF zMk@=eso_!QRd0`ZG`@b<$SC$i!MZ8`$?(>=k)i}&)y9{mgR5cpjI^$z!rFuE&OmSN znWJh@bbMI@8=l7ct0K6!!<;J0*y!OKG(lObtgscucI^`P7~w=A1)*|K6m+qB2@-{A z(#m%&vclCpmJiC#VBK8Ckm`3Kq>7>&RRzlX@}h{-Cg)n_OzJ%HJz4RWCKGY zW`p~x^rZ0W_ZjtW%!~A>Z>tsOUSEzovZs2VJ9T6Ced@W*_`D;316zzxrj&z&!{+yf zfKq|peLzbyd`o|OQ1yH)Qttl!jq34dBrD%qT9$fMrHk!s`T&w7s~9JgKL$wlHR!Zh zE0JDRPn|J7ng_JS7umxelA+%o4Ms5I zHOF{*1u>2GfaZ%*=Uv{e1j*MfaMNjVzD)7SkD{or&jl zhE%tM5)ky=$T$003~YHbe-;xE=G#ErT??1boCJ&_}%(h-N`^jN!|4Ib<+(GwgtrQ_iTwq16`Z2%7V0z;&Pcs z(49^r=`B6}Y=cBr#+}dF)ophLX#%qnPeoex6Z*!)Feu;Cmr<>--t84cpgi6{8Pws^ zQsams6^{mu`MlBN{vP`cyqJX01x^*GKHb8hK|jH%2xm9ecDEh%Vkuo=?}C_P2tR$@ zUr(y>K>VPCTYWT4&m{iR6aVMl))9(tcP;dW$1Xa%2cHepwFmIi%BM(i#w$=?gy#uk zeTWz@bccG(XOus1ty)ZIPSYC$HQ{CA`5ccI7Of3ZhYKM#V@2jGW<1_qx(Z}8T zQRt3jP6%)ME2Dw%dlljRGxqt<^vWxH3wE@Z*`Aef1hZt%oGM=v>vip2Ftv}N?ML>gGtFTRi$ZGca zy2duOG#yduVF=SZ+kNyo5@dNX3tl+F^|sE7Sg)$_+G0VyJn)eI+3B*?s;SqDDr4@m zGm!*J9L)ik+kH{Z#!K{G6M9fAxd5GeCKqR05Y;r}D~yDzy*+q}U4z%2@TK+6^fryO z%y`!Jc;~de&5$(Egz4MkdJB?cF>0YPLysibP(s~hnxRgsQ}d;z9Nt~u@i>*0iI%F- z8(5CFVRS_Aow{@j=ic@&+~J{LPXj73loGYInfHWNSzuL`M0 z_Tl<0-?w448Xy~^QG@Q1^KCT^w&ObR7$$&4)J){ghn&1MEIC=;Xl7^cR+JW}$*?xS z2hryQM;C7I`flFvTYwojm~DRJq!-YBuN)0Qp&*koO6k1vaTOq9?!=4~kMUNez{40l z%nS$X>X~~N95>f8&J4e69)7#(2z+J-Tib_v5^6b9E*5R5(xy7+&8vvr+vSz7XLAjy zl%TG1?bG9G@>_`2H2TVeNcPqUVLQz6Fm2ig=DB&_bB9@9T2ADSD!PoX%Q^Um1b%d? zVVO7V{rrW9sUnL776G%XHt@>VBvg&=dy7iOS<+a8n?*(!w8N=&M4DF{qO-CM1UkJ> z5>s*d34}J7S}iAfj&d97_K4(knweJ`CabvnlMQlOH+z2L7826nPQ07V%|R@=-erD{ zd)4`?ZlOi@kmE#%qzt2nLmPwPiuMcz%CmM6?tTUSF6JpL#Qcc&Xd{7Ff^w?9{yVYO zWB3B+-)JP~kbF3cXX`xb*q;Tmamz{qG-uByM|G<-^aG~dS*z-unc@3#a=tAvKyLPx zn`w)8yRDz!754;_!n@YY&2@$I(bBu)wB*hnFhk`BP(+iEk)ztA+QgK8Km<{1eE%+% z$`!NdJd$pmnDbhN=6yutTWlXCWyXo@-WjUfO`PZbhzwk9o%CSN&MCNeoo=s7_B<2H zBvAQ#cRwekm7saHcf6!qVG**4KKmgqU(s2rX@lP@AEDsJnZ1jANw|p#&Pb0`QsONB zv3_dGPf#AM^NCvr{{1hM_fnsu{V~xf zmjGXAMD__+bfCyQ6`dP`uUx}Z-pMJcvcYL=A;+SZ>L%$lm1icrhEHteMLOmkHd`#s zt7v-_VLn}!4Y$t6bzG8lmkkk{pc=0D1e}Zu!fPegGF|yM4IR~?$To>pQOv92UKniC z$D18eX;-Mp&|AP%H!Hu#Kh;&kKX6uma$1dvGH!i-c0Y$u={06kHj$he;&J z;zfkJwP9UH_L17MLs&0wJ^8OYaDD_|hwg1W+uDFp2sdt45?2P#yqYc_8(9cSD==-s zvvK|i1Y)6tv8}1;)mvXS|0$+pdOlT8AI+R@E5f9CW^z477%LdQfSL&e?K$ zr+TlZtj5Ma%BwhFgFn@>y<)4hU;O>c(D{kiT+0$vItJN+6yi~`%B~lC9>ch@9-3;ekJV(XaXyERcg~r|d{CcWfO&lx6H`|?1 zI_97ons7fMQSp0 zGf6zRA38Q@Qs|0*kA*fzB$Cd!x{W$w^OFs{#Tg7)t&nZ!+7Wn1)sR70x6QZ&q1ZFXi;IW4*!TZJA;2Nn!A&J%I= zPIVm+Y6zuI3c|sb=hLQ8sU7$~V6L{_X`P@n7qu9SK!DOilGJ z7C}dWC}`GD^+2-cmzZfLj^n^f!d8h`SI{q+J6f@$M0R0ncOrN1XC5bFEZ(zFk_c!Y z$IIdrc#WyFbHld1Ge>x4#z(D)p0U~98pOTvg&pTwHTQ78Pvo_|;!mKYjj;I@qwz+O zd_0?q3b~~CJ52J?aUXMdRmn}IC-(A{Kp)>LPrG>G^TNVHxurb{g{l{{7&vp4NMlAo zqoi;}R@Z)-sc(o_#QA$u4sZ9 ziuYPsS+Z6aKyVT%kqSgcRhYTEpGG(l3+!n)a$4g$nKAb_&QBmJON20@lYz?A8o9_P z9fG@BW_2Nwdhf1bZ)V~+AqRP+#2E(fRnYa$b8ouxYxdE$_8wVx6}B=TD43pk$%gpk z3X9nESdX@pkD&H(t7ev6;@l~m$aZ5V~ooy%VK8hPgjdqJ|iTP$p)9D z<`X=OxC-aCdM)=W`*=r(9N`sK`MdhmcwQS@-Tu8pnY|GL#4-Glb46;V>AM-lR6;8` z@rGm>qkQQN68qaFl}v*AA4=Y)3y1L0`*RxDeCRH~N;=_QQqZjsH`!@dcT+-7_9ecRohR`!T5Gbe%{ z>jg=F09i?v__RTHBtfozKbL(Jl;oJfWDxa-(ud^74mtZ7%!Ch5D8{{kE=TXll0u4{ z+MU;GcbB7jH@@j;Q-iIZcC*+ja>r-|+lY*#%1(b5ct>MeJcZsprtFCpP9Jl?{4iSI zY3}2K`h=a*7!OoJCqBSiG$i9?Q5HJzj*c*$xw-h^(I1YRRHTMAe*LgbMi)ab^jOzy zU`mdc+xKSfCIl1PyWd*^Xh^-2;a}U~H>EPQ87@)B#hTFEX5WZdmSiiDvIZimvGLt( z8ER9c2|{^Va{0DQt+OG<>+ZisI8C^kO%CW%= zW}9r?Vn(iNyQgVgGM2_CLJg;Ut**9=D+$S4Q0qy&T6cW$*=SFB@;bVN_G3CJnU!6tcu=fc7-uK@FbcRL zYb#@r_j@MFDO4mV!2{FJb66dR4YQO}^>cY_V7*3;pur=&O0nVJhFf zR{312hpPNcgM4Wl_7DBTe6@lByV1Csw4{%9TMIMjT2!03m4x-eoT$5rsS3ssOLijD zQjP~f5GVXK%cr2NqnSrR(RD!!s=N=IM^-)NKJ~yfn2`1p8oi7FE{b^jyB3Q&=hb;6)Hb;T*F(=7J1LywF080~OtJG?w|ORp$z)5leQ zns1CGR>U+)`wVnvf?0a1wkBexwx)8`OKH?oWUA6WMo+kNL|vACG9k85!$4^~s%oQx zojX&}BAr`3kJ6xQQ9w6_7uSnsEN$6k->n`z6*;}h!crY+>ez3$7G2o|&BpHt-+UP% z;aGtodPQ|b#&vLlK+;G)D4jQCXN0rbAgnHQ#=Vt+laJRUXL@~MIDN48&O>zzI*9sP z%4~P-KDAhbBr9m>!^PQt3!S`bq)S!x2@wco<|c z0KWSKf_YEr4{ zJ>Nf}jlYg2A#d-Rnwnh>$5u4=<;%&s(JT-MQO`eo){c z$hr}U+;8EY-(nK0cej!#H@V@LfI*h^yN_x$ZaX6fx}1@PxX4n#Y_^Ow%tjre4vy{6 z?z}=Sb2bR3;K5>sxwM*$$C)&%Myp;mHW?it33!7xpagx>K*?lNt8&tit|cgK!Fh8_ zU2mtTKPhw}OyREh|-2M|%p)O8DDNv&;HoBr>L34|ZeOQ?X1(}5yitR4kCnxkUMGQaD?*c?Tc&l^HIFWRe&B3}Dnzj-wF zUjCs4P`>QVO;EYpzye~<{_oym0pFL)mta`=#>Tw^l&r6$D~=n+-@2Jll@g|>Tf7^o z&S5<(wgJEyd9|5-7gz~L?E|fnL3`g_^|8q5EZ%~g6O!69mJ8Z+lqUR29~Y)F&zC;V z$WdxtT$nW%&A!Umk|O(jA#&92m_>m4S4y@1De8<9h60^A^`jhN$4{PPbYI$9$XS|8 z6G>lR%RmRdet=@)x07udb#|vhjaN0tBH&K#=k4Wl8H#TNRm3h}HFKt7&>fR}y@)q{ z{|tiuu%$NcS|?K|nY{f=+MbaT zsYK*k+4tpEnVWQMbr!>1W?p}oYDKPl5k529-&Z?+%i}wiiRNILx;dw}`>lhel9Gpa zx-6U#lo)U+-X~jQykNcQDK~T$CgyraOD{VA`?jqY*wSMyr43Z4p5|n#ktU;0lBg7$ znc{|G+S3gTdSN;J^V*d`j`BCF4RnT`!|e{klEOMf->ANaVc6$%-4bas9)*1RS@a7g za+5_qhbdk2drTwGeC_=_*P9w;S3b?AW#uegXy&DAVn42&;AU$v641U}RM~hmcPIo0 zlz}!;C-mQ9y=fDJgfgc8YJoM(x&>g{{cjKZKck=@R z0y>}Y@(;ylOaX!QdY;7aPTk%LNP=Ao{nUU-z-~2a#*!7EpC>=XI?GTMy7kmHdxTmI+8HPjGIjPbn&Iz=i@ zLUoE3a&UF$fu1J16Wp#?FEh;TnEZl*PHdevGOcS^v_B?GXT+YIyqSKhwJW6IeyMG{ zcrnLBf%D?SlGkNGdo-{yK#`BWbVgcF|Ek_3t%7k!`Wi}x;Y(idVl~~kolwZEy z)UT=5`)E@x2wtjRwp<2SImNQ=jHYVyH2IO!B!W2JI|{>(qw^{wOD|&}ib5i)(O28} zt*q4QsP*44w-w*SbA`__W>SHgm@mZ}Y9HrkuX`A{J4NxzFN z<+&p7{FDIQ8??Un4s<`}h#IYTt=rkm5jQ(b7gvg8Y5*MHH{3MX#fq0kFK08`rn@~z z9ZCt)6Bpx%Ax@%%W%2US<#cd%_2`!*n44L0bi0mvHiygzGvj+6kKCUnFYdLIv2pnB z8=@yX6BU#QF6jCDBFi5qRvRZs8KZ)KE9!sd2zOf4_# z9m-VZPxC=I@jDAwM`8;XD(*!N8)zhm^=jnaohsJgr+c2Ro+obF;AOR{vDcV*j%%?a zD$4EKO%FQm?$&<1**LxN^Nf*tVX^%tgts&x@R(iq$uGq*0;P~_Ks#r_OREZCru^GvB#%uiz+I${^{KnQAn7-Leey2*)o^Cm70f2~KZShAN>Ak8X5 zra9)m^D^Bf^$SH01P%J1JaOxrp}zeN9w7@dTr!Bo0a+$ZW(eNEMQ^zg$gbt$^CH2q zVp?zYjp4oyX6G?4f9SDPO@@N8k#yQ+3PwpUB$L%m9~h#fb+&Ov%u8oNF;)#5TRj)H z4Zw2Y_BajL=?h-!zRSJXR<8ra(vNSrpo}P37tjh1#q7KGJ`x+v6Zav4S3pbhOZvLw z#@xewZ!{BCUiS*y8DeZil8=>YSq26cyOv6qB0WkkkQ95qk`jesx8!tE^m&r?#m0Dh56c5x-R5d}%DYg4yeR#vt-tccy&iKqlO7Y_Fz98|}8 z7M#8oy=jVC;_zaH+1PuKiy7;t!*8+gUI99T7qOC@=`m=(6Lrwyh6b<}Dp$57+S{}k zoOV8(hT>$T9(}GNH?XD|VcYm*qG#?lVrP`h>orB%{{dmS#4%b}I-%ZoHOzdW23aBO zyiESeXEsoBjxWipT2@mN3R6~Ant;@ha*S4a1r8DW`QN z@LqH}k02ktxSP)b9Z?B^KX657x=jht?orgd&q845q(kGZUO@xeN(!tlYqYzX4bSV~Yi$1{CQd*uY;eWF*voywYU8ilGto3*CW zv5GoyNV_nxq2@^BMn>ISd#f}=jq=!st(sr}ml1x0srO5vV$VFzg`&&Ot_nut1_C>4 zEHn*&o4erwB+7X6$~o?%yeDrd5`rnqVtzz!u}o-I76;}$CBHERXK~rf@kDSli^CAO zTP7J&Hubh1DA7m?11YL_eSMfEkYl0%GWAAF3%%K_Q`6J@nsuu&=6O59Y-|}fr9#WT zlg-7JW%1YsmSMM^2YNyB&fq!qF@9@kXc$;r5#7?Rux@sssHC==Agr0P-d$~oTvmlb z8?TI@#(mi#E$v`M&6+s z(TuAw=}cbMGsrYbP@0@IUSkq=H&7{tZO(hN90H7K8v`52aYgEVN{1DKY@b)XWw3|S zr)2#X$mr?S;zN6fwU4FZGAJtAwl}&r%{(>%%JMQ6J4Kymcjm*;e&h$!{r%T|?gyQh zSGPT<<)@j@NS(zgF;ew6792H0RSC|cTb6TEa%!c^=XZ!IaWf|pZyqPhim)_|F@`5( z9!I*NVk2it9jiZ@s_?o>?v7J$IL-6tT5{Ta{xqhe^Hm-2uoFFUiXF|RZ<#SaRWLBl zjnj;HNI)66GAMW_r!Vt#5@j}An^Pk`eloMNpT=H(P+zX?c$;v=Mf585e!Dg@C$*Ue zA{y6W0#!8M`OQ|{cn=?E-DJ8X5r$&6JBDf!IuKObjig zna9<|MYR%)Z{p#FIs?e(yy~Hv-;czE_peY;^rm=eV_tk)Tv$$3 zL7K1VBJY=rYz$@h#g#dtF5@Wb@5eNcMPrN@t5?@*oec~IVjlIs3EiM`SLL{Ow||G3hN18x8~licOIb0)uvEioYlFpHd=aK+buETpiF$IAQvF>k(L6^ z;^VD^IC~P}7L{g@)_hQj3#Bo`+&$`^%pTs0E&TPB{t-|RjIu+4cjeFrTTmHha0tmW zHGcW>0ntj=TYiz~LEpE!NFo8Nk?po_MalS#NdKZV!p~{CF%!w17kcbWM@Bi^S`Qj8 z6}!d93!t;xJuhr6N5Nn0E$<~3OGvbyz`Uv^N^qPhxk)kxGoIR2Yi0>b8$9+Pzj*!S zYR!&-Roi4@xxc@$048w5EQmdye6-YI1et5S8${EarN(8H2(udlSZnpXpy5EmjJgJ; z&zpz+235OD@ikQx*llTUM)FW+v{!!(#Wg3iQ&5FlN^VU=`(ZwKmyE{Y(H8_98R#_` zk;}cV9J!i<>c|Y^^M~&(h>z9zl9ik2ZuSjP`Q#eXPxsyw)ND3_qi+TvcUZRa{Uc9W z=kvSCVXvEwBBrZW6Zccy?%Fu1K&LFH-Ps<+3r_2g#PAC$drx zldb0c+A*5f1p%#CU8lkzG+gWo^x#=&-%8j~Pd=FYB5vXaT-NPs?&v1-`h zu!alW4*8=-BI(Rsz}W)R12^jK?mmuaZl2yQS>uHbuf7Gs_VK4lND9mKa+8S_a!;yW zVZ|<0Kk6#H8kX6~gyEPgjDw8uAl{n}$HNgQl{8J7V7En~L^ z3L@1LEbfWkiErayl;qqEXObuDrl#DbF*h$}6nCR^!K_BD3cB9*^v^k|rIONg;N%#% zGXDPCp(8G>6&;mbs#q+*_OZoSs-`j{`)QgP{@&1Z?_1;LZ(?eu^ZLRDUfne!e0(3T z)^sRNPCT4E&zMD0HokYRE=o7NJJfP8hXGp&b4K;X~XyF#EG8mFPQ#U zR5EJA{Iq&@>K zAbG=;U9 zgxf5^D&&9GI1TaGEM*$Ex9!@MEjWEzhqoGBfYtM7TEgSs{=g%p`p=onLMnG~&i!t3 zYq$S;JDYH5M;w|xY(IssExSVRadcH5{;m(tm5XqfsNJ^DbqSqS4%%KdW=%=`Pq_3& zsvR)M>t>3Xq^G~JdMnHO-T0}Qe_<3MRs zp>-`Y%u7vITYS{pNGd=MHj>LC+sBSsoL!pZPx87aH^fSg&u|Gmo0&56 z_|b#kqzV92xq>ObR4V-lDhBRK0Tu}rwkO2^T{+n|6)A9iyIUq!J0{Bgq)^teRU=sj zn%x&aKK&O#SWnOUA|g-Xvl!EFyvbwu!IzUdW2P+2NlsHyNu&*FlZRa?`}8kGNX01* z(Vl-j_=o-c@rzRZ=YcS&c?d+&|40kK2fgc0n)u?QC&^Y_TSqPds&>{oitio#XzJ)c zUykQanqN9$`kRu0Kk^x8KoQc0#LuaXzpTpbu+|K}%F0D_$#Apca!XF#bFGwa!Ee5;5 z73Y#kpFR!Lhqe>=dN7G$@9bvPCS$!Qn){3&Uf{d;6`y%+@soGx{o+{7)W>5J zzoh+Yt?<*QB0<^I4pmfSWVKlTUUQCd+e-=i8uAlGrL>d!*|Qp=rtjlaB?P#_n2=JsH!Uzq>T6tg&OZ-ehb z18d7;HDefX8&+JU{cKyPUH^^9QTy)lyLAV7Z|~HHP;*&+TA{_ilX8!Pi~nx1YuM0n z8Xyf*aj1TE@c58YYDPoP9<;M`H|3_m(xr}wnL_csxKw%2R_KSh^jw1NoWh74qrTxb z0~Zv|x{+Sp^)E->AxlcMCVi==dZ_%mXY*t8#|yvsnI@UXYQC6es6NLRPSyFiE=^JA+FQuX=-;`!Yy`GXnFtc)`2I_-wg1pLH&9)K zqDJoFDvbPnhyIEc(kV@5G2se3Eqx-b))F~QZ+<~fItCBhSlFO8bS_(H6x>8t*oqfE z>9=#ANqkrqS)!BuHuefZIb7;-rv7fD9P0;5qJyC(9Rg)=XXKMm=G?nY?km-+iV2mD z_-)q`buhO_IRz6PN6jl?LnS1@KAl8mxd;E8b6Ez>zk@f2y=R#4GU}b6;lWE- z&wTtt(>FUg&u*Q?S0|wNkkFYIXev0C=vYa5#-t4V%Uybz^`F~?gCq#nE5_cTzWkWa zA7Nbv@d#`-KFm=>&-)X*dXhUT^uoPG#MSdznpZAgBzd{K+#p7QlBxW%M}f*%`P_!P zmbff-?8d4Cey~_#JXzs6(H3JpR>N-9s59e*d2*+j$$u(55;(*UPh_aR`tfuB2{*k9 zPk}4AE}Ma?mzZU0fQ2~fxSW%kw@A6`wS4K~%)QY_%tj>z#_X1gi7E9j5*0b~! zCh^|PZL@viH!+A-V?7M5bwbG`u!ltc=l&Be;K@2WYab{6Lk~dK_KJG-t8}F3XS)SX&6Ct0C z_58z>9}AuZy`&=*2>B^N$bA+B%Q6q1{Id~>i`l<&MjEveE6_3l@T{UyStx8C)1EqzOS6 zl@vIBf-hJPB;RWBj2XV}V2^@emP>M3Uop#L*b#H@bNq1C(NP0WVzGSj8*1dAmXdT8um@s@P5=4c zA<*u??8B{7f)n$_Rmj~jX=wPCQ1$52Gp|HkIL--G~+|-X=8qqm}tNxEc_`X z3gr-&aC!XEpU;RNl!sOz4ji5`nUMJ8T}+CTM8JBf5^_1keC-~D8-bTW#!^XqgyASz zVYo;kdC^~c@*hSi^bExP!PkhM_{1t|XJl}rsK1wh{;`BJe|NAuqr{?!a#(qJAy|x~Ff`2RpH7w%P{_#a8UK~A z^0%qXf!cFf*(hx1qt9q-z=lSMjGElgl3G>gH9^h`N9ua!2tTd~j&QhYpP z^L)pmlZA&0oYL&qgk+K!4v*{OA<6%or;gOaDs$!frutv8o(@;MuqIV%;mpo6QiHDI z_b+xR)ry6*pt2_Ph7F>J`7!ld++FzidK!PeyC{)~5|4&GXfc{{SCk5&u%X98iSf2` zHqO(C|9s4fC<2hGtuT${pS}JUZ|a{PvAKAtH)C>bj`-JE|7V8|4eyt(I3#$Npkk8$ zAAS#juuACR)%P+r2aJ|na0d+u>l%$&OAUQ{D=)mShyx=j^8f71wbh4uB>jnfKk(aM z?c(p2r=QON+@fy=rI*rNW)t4M{$O;ycRsp`R80+OM&7%cYV3ShJNMo)qiG5CqZ|wC z2PFS#|F}E&36ZgPoko8@>t9~gULqjVwV$M70TrYQ!LNISZu`$YR|75PAQk*igOg%O z)`Bbqy^gPK|2jUu3>N@RbqLW7EY$=`C2DZ{=IiS5i}L0_8YOnvsCLaxm49icjF2e5lyz$!HMzp|BPCag7>jrb56{kx%a=$xepoDMehP>VM}cq zBdCf##}6-#^*o@Euri93|KfW5#%M1-qVswE<;vIyRW>$)g&`n|n+q*S8AZ?&8Mz~O zHEe2OQg32mHXFqt#>Vgdb^6uKS^1Vic}T|JN#@$VLlf10xBI^~7mpzBR?>{BpE2T@ zU>nC^iHD1$l|IBgK98Ftt3oZo#=!(|=vAs*Wtmp_Fioqs0N>s+_w@YVb`;DGNUOoZ zJm}xu6!o`7{P8L&jBrE1Y9RtUTHYiNu7Y#S+?dL&KIJ@$Q`+D|ea#wW{hLY*R8}-! zb=fxhCHx-U|H)1Uv}zmFvinbLQ-AXJqx>Z6H!F9wDfOzPyBF%e5|1#YQ^oX>~MWyhECbftI#3;YjgI<2vpj!7?bHN zal!IW*`hz6Ha>u#b9;VZQhN38Cj8hNNbzaP_`6c9Q+uPttcwzFV6$HCnk!g9l$3Ni zJ$Cgx^`zh5)SmBauD2Lt<94`*H)B6bp51Bkc8f9hjdEA^hf2e$sVv*jT^YA;1_{az z&nxJq$GdjolVu3Xla3`?m(caJS2u?VSaAxEdhg|L&eUI5Znwd7o92oQ$7=Fam0ZcL z?s{2P+%BYzEj#+uI)WCEY?-vd8gl}LuUUnbqksmbh;v3b?d$L-6u(7i`V;=ku z`#a<>P6m^T|KtW8E_fdSVpVmz)UmCF1v%Ll<-LjaUBdXyg6HpBdqwE=57cTZf;^Rf zm0ZbZ_m#@Wxp~*`!y&D24+=AtKFei9k#$6mlissv#2yYZ)ktO{G|rb0d}w zLNBw&e>A@j6?k9K%f_o`#F{&-&xW>lEOS`tIT=6!;$nu^7Y(ljBb_ zL3PiZ8r&+yVOmwaJN>`TW3^;lNok&?f%IlJAi}5R?1v@U{r`|}(UyCmCD533?2DMp zE4|a2cjtoA`tNzcA5ZPNr!WppkN~upmGdg~EX~A>c~f_#Z8U7jzxT>X&7PKFAR!mx zSF>g7fJux!dkC~{{2^my^@|n<)@Q&Hb<^ppVk3Jy)nSP+|0o%v`HlCrWN}>CU zVg9;O;a(jJI6s#bBA8IP;=tgw%oX}puZ!!2fIywHn~PSe1NL0?J;Yh0SXBH=-MNe< z_Rg0`fwYv)u0xSY;As9JmT699G0uGP^|i0$tfNmz?%0901X)rQS=yE+o=9d??ho1X z>I5Gpxn~5PfUnEQ9$9d#_{09i6UCiNMAv}80{D>T#Dx7$Tt?I>HtHXm0F(h#w)*EL zh4$x;{lzbTUODi36;i(1>`G$qyzJ^e(kiZ4*;~6NMDAegg_1^^=aZONQahV%XA@Fq zE;RO5Krunhl|Yakmf#LLw|L3>Xi?uiNlH#&@%bbcuv3a% z{9I9d=Tui=wN$iBGM^5SI=ExWm?2|Rhy^Uu+5Xs1@-2Cc*;zuQ>bhBf^=aNn+;@;g zI5x@u&dAT7dEIiw51XDzSM*ME%aoInj?(I3C2x5zt~vuSq~WNXLR#_oOwEpkDmA@X z593-G`MY8)kh3ggz z_^UHj8l7cho?!@8bZ{kR?oS!JmCV7}FwxHIj8@lsa5j%)e11-63^1HoK%Yhd+$bUD zG_O{2j;aWQY7&am?&S|kk3QRXat8d`zaL)nv%>uJnap9mIedh0Z*sIM)g72l7XPUb zvmGYC$BWp$zL7G@ahR)hyUuCEx%GH74BIBaDStGaXNt9XM^R<}KEAYN_IJxRF(G7* zkgW@1Q5qkkrwQURZa`@5JI|Q_xXKMQH*PFoEf|19?aI!29I0pVhc9PYscW~%^^k7O zIwy&;Td_O@4Dx58ZGngVxa zvex=~yWCopfcLyb%j+48Ac{nkH5`Nb0F}NE;ZxyIJsx(Z&EG2Y%px>$ zdZa7+X6)1#c!)r%u4G`|gNo;9TavG)^5!cZZC}N!N^)W67nw!|v%ef>BSA(&Q^Pfz z72ALynu(-z*Q2NhcX`}ad>$W(^(@u-z#`cwTOmVrhUnsG2#(?$RtXm-x~rjC;N5>R zHd;6N$;jsi?4Z8M7U2@M7xyB#`|Vk8>qPxDpKxY>f~jkLK;qxvTp)4MfXSWZ9LzySHUDQJRL7t7@WrN8-{bDj4t!K ziD@wm7)kbZ=vONZi{W=N!qdg)EU^0m69M)`X+I&9b$Om~UyN?J< zhsUl+R_VB@7G#5F1tuU}JICGCmg8nb)N_63cYkbb^EYGLX1?xr@u&yzR_JXgv`86f zMJ$|K9*!NK1ZwO&B&9nZMNCYqnha&p6u9*~e7vvVVGF*V;Z?mr&`)Dm8t6vjgc}&?-2Ofm zRG7wP9<32X!i7fbr@oVOmd~c;EMK3wXx0HMZ^cgDcPbH@=wO>eLwgQ$eYk~YQ^nN} zIwv*eM5Rkbuz?E)+!&`KkIea$H)tN_dbMkiR+h-@IOtL-lxOH>t?pAi4e@TpCLJfg z@!^k+a>9qF5r?yoEE7gBx7@xqryXGIHdtisw#h4% z9o{TVaUWHy=(dtB-*_G)gd;f2eSEAqpgOt4yb^zsZ@YzuKdY+la*&8r+(jlui?X1l zt+DD(v|w%8$@Qp#3trZan0;@@b1*x6_(3eMrWUaT1?yYh*`^j`E0Dy#31r~ay$HT+ zBVN7GIA=5;n2c<&3CJ3x(l4LaGl^8!#p%7>+=JMqPHJSpxFM^U@J=#gLfRiAUD6~K z%V9KTLuw;C4coXZ{khSCuFq=FAyoF~jmv|X{B;y0PNyD9Ie+!&eWss^OL}9qA-7kp zib`Jm)E8w#Hk`~#PtK~w|1c0Kq6dLq6dUOnf%fgVN7~=rl1CYxxd<+KpWHUg#$Q30 z)idj?r#>RLY@H){kLWW=dWe&*QE%G-`qjiJNk>nAe1;Ci`C+96Nt|XrX}cpW%j?P< zRL^FnuL2#k5h&M6O?P!|z=;!*1b8sBPRmr6`%CajErUK`v<3RkMN_;j{tHyD93=tr zfBC}C*q-ljS_fIb{SR@b!-+!$-lZjb zILC@6G*fVo)y;is(UxwB;7~pup`By76^I|1N>-d&7(s5n-3zG_KLpLbOn(F}AYwI; zD)|1Aw?MH;*v*qS)j(wTPela282y7X7}0zhPDyf^{v_GaGD>ZAP)8u8A?Z0j0Y8#R z*V*FIvqT(IhS@rkhQu`dwzJ9nYep6g$N#tdw7pGnV*f_-1l@|5q+6=0acxKtJDu3dh+ zWp;r^`_P2zXv4-OV$KPOn*$gRle;;mW^igagUuXhA_Sv?THd~g{nb{=*V~dz!W9pd9NT0?^vvnR@yRUw1*{bmDrZE7z*lt4|;42^?y}^ zmhKZj+0cuyGB8A+vR3#?9#dgyZFxe_s9)?+)9CG#NpadD1#6qkv$|*Z2=Qp~Q?BFQ zK}@AqG>u30spw{FU}e9BTcCF)A2nWKVM^y%wmL&X>SU12zhXlm=+r}Z zc3)F5VLym#vF$aQEG!N&Q4O$ySgT3=wV(4>&dsnWaj0<|w$ep-PQnBEC56k;UC6Mt z3Gv-f*k-y>{E%+ZqXlZ41pe-!c-*?I^mgJ2q!dJMMy3Nh?G3dd`j+LX%ufhAYI=iz zP=<-D0y4VrpzX{dk{_S_dBOUDtlGoLkhjZyNs7a=$Y0H4Z8-PY-9sy_t4Ga zb7$*Vybb(JRN4^zhu2Uj+cFd&-p<`0#Jdp=5U;;#1oCzDIqs5;5)FOpD3fFyfqSii zkIY}Ej+c~tQ$KmHr{APV3YVr)DfXe&?!DrCHDUHr5O>a_8!NI zLG6u@3?Epx&Ebho?MY3W@|LxRiaNvOx# zazRGYz}{i~hzB}g;;YC&C~?g{?hJ3gV8v4agsj+PZ5(Z7XxL+DLwM=^p;X&QyJ4q7 zIn(j@6Qi{HM+pGy?vtEGK+rd%P)@HSz`^2v!x-!K*Ego@;_D=@C_?&~;W+2yZ>TlGrOj&Zbts@1ym z!;W=~(1qZqkxD_A#E5ay24_4sdzv1>-l7rKm1SJgLmqPxZ9V-Qq1Q?3H$FK`86$gr zR3Yw-O z#4vU@e&@Ny`1WE~Mi3f9Ejac*ZqnPQ+qQA3s-! z8B5jpyql6@9pZR-pt^i8CWBueyg~?pf;ZP-oX*1cbKhN^X`zQW?Vq;)_E;h0bAFqc{>M!61)3VQlt(cINaN5&T|?$+bvTjL+J zdz-1@{DAGfC=_iGJdH2oytss;;I8DF`SJ(pHS?`y-j>>9_6u}~qCqhY6W^D@}czY@<@6HV(I9H=eP1B*wU;3K$`1LR@1Z+I|A2 z{AdjrY{BQ$4rT##v4A%_#`ZgA-bC_fJHTJJyBi5wwk*1@GIf;p<`Xi007?!=-2p+x!(fQZT@I<%a zX%zj++X{3zX78DX>b$1UcXkeKAqnHMFUOS}@b{lOnv{If?^A?rRbu;-N`dTNVecS} zUO0~|HUCg%Odt0A$hAB&Me)6wy%tkVA228NJdL7|@e~H3b53P7O%f}s^<*UQ zKd+(SjQ1GzI_gOfAK7lx*`I|~f6g?%LrPJr5c>)^={(0cSaf>)_RC3GPNjFx=b{n2 zQ?J4sQjop9y;oh=Cy%KB$KgQPXnB!Lzz80Zyz=STDvg#0EN8u{;fS;a9rm#1&6!Az zV5XD7kd0nx%l@JEGkg`+1=3pQ-aSgzA`xf5I<-JgEKN>LmBLJZ4(Dte!B>v#=*?Fr z=FLzu4cN_I!Vz()NQ38kW1$zWqZ6Z}Q36j^GNCGnDN~ek)y|;m-6J9r%zji z%?R~$zj=ULy<{9VC`njc5XKZ6P9503^2?)+!{q}T1IqiR@h>j7lY6+8Urpc-Z4(q< zvh1vlSYx7N6Gz?#LV&A7_z&Qk9@u>=`G`e{wI`U0>F3Ca1(?Sj^tq}%yw%YYXn{-J zl_R>$>+7X$A7fCTO}w%ynf+VCg-7R*1(yx?rbnd+9GoT7KV_VObO(RjT@S=e@MEsz894TaQkJ( zMD0AlhOSP!7S;Gb2yc~y@VF&hE`@2r4fBW9=eiYGYe}0!BpxqyD9#Y@Aa6^?`1Mn^@QhA_^Tt{?LngVnk_qlp`PPq8`5j@u}7H)z!Qu8A4CwP z&y-r~D{gvU@SeZz)vrexH3F$D+)kJYmPKnL?%3Jdo z#hQTYOe?Z@C5BUZdo{10_c=gUmbs#;b8n|iY~8;1#CH*2mt7_+v9~o*8zMIU(NUev zpR|eFKZKVeqN(u=pZ<;VygWWgW9S9FbTt)ty*qNUU~&dH!?(0QT4GvIkgU_yCh)ZY z!8Oh9zU@}M>qHHLa~aY!r6K3fnP9SDf|$i{!N0g65(@?`1OrRtgiMAI9ycW z*?GpA@ukRx5Mx45`kr6U^#j7h@Qot91*?vJ0VbgR%)aEQ1`lCxnZjAbIT1-C0G1il zXTSJz<;ro~o=Z~x%48>#q23{qa;}FGvbccK)gBf;3WN&0LfBCh+x}>5fM5Bzu{e8h zMpQwfl-KPP<65A%eum>|&=9}Q!p);hn|8nfWcX|aRp3yw`Hl~=(44$H6{UBWdb`QD zvegm#AyWINd!qK6bAx~bB+QX##DU}D#UkW+Z6pQBj;s%#@i!UYP%tz!ESnCbs}+}) zv#}|jgc0a7RLA9KIx^a?cvwMxGL9*;y`&JGo_`atK}%8Dj;BydFmR48v;vssi8IQ7`1#}Qds7>n2@aiEZK#5TeiGXX*qyMLb+~{l zE^M{O-kCa@=&+E#U4KHcw&N&u>!J;L2i>w~lVO`8Sq9k!a8s-K~~@ zXy89LB%x`B!B6hsvB6p?b!iPrgYED8B5d_cQ{K>C(ayE9miGMA-FbU_8XGRua)kah zptXgI*$lBe2}%4m(zrS8`2kce4QqZbh%aPDoJDu=f|uR1aSYmdcgAom8SGCNsh~mDX&b_-mOokU?F-vK#df`_U71wLucfmM#2_qUMW8KiN7Q~$vy6fWb zr-h%c`8vH>!k91_F(zJ_3ID@Ogw)PaLRN6rFf#19L6ltbE=H4*5(jaZM=_?^^1VtwFSWW;M}h-eYtW!5zoLTe9N@0vCk~x%5L_PB_mCfECRA4720( z_ujobG$#Vl2_IU-78PVV#@QWR5iA>ApOPu%czM@5N?XK9ulEp1|K-rYiE>YS#jXAo z?Gk4*SDl+%t814AVF1I0Zj%tefKlmOgA1r3FDKz)=o(M=~sl&6;S zU;nZV-@af#84q6nxEffu7=A1Yer?0pUXgsH!qwGfxBSFdS4J?!QI0VB52QZ5y`?m* z_qVr-7;AbE`pm+;&hg7@*(}+|(_WQwDBX>`0}YeFBwVWDCF1LIWYrC)wLSB1ND$WR zpYK%O^$|gyrCncNAD9>@F2BAz0ceDe2A zJ$G5{K`6ba703}EX-qN(CJnXyy3fdr0e4$OUzOZ zLw!h%b!d1s#EMgpd6?bzq0A*p=h;otti!LP3Q0FN6=eW zJA_=#EM#+Z_QilXoZ}yvwWYL<6%uuO4W}nRT&__?RLkN^Pw#Vp#l-g7jJdeO6dk|i z@eWkmpOF-N?lA>Qd|^g{guuQpe_YFZo`&ZdO(PHEn9oaLK3^NF7l*YC4H|)`Dt?wf z)~nA+m@;mhExXaJ^qU0IG|G83RYt$AtVTF*eVsF=6O^$YeEo%op;9S19`0_t)#ZqP zeN5_90_uyuzv3N#YH3BbtIWdS!MaqgM*?o_TZ`UtFb^k{P9o ztzXvG&%^33;Eva7`AL!NbFh~X#cinj?m&Yx^`F`{_h^*&%cb3rmUkz;$LKQNP*D%% z+xR^d8R!s5Eq^zGbnA0kUZkO?=>b?IJ(`KZhth$AAf^^{rTQ{ z0Jq+Fh~W(57y6QhTddk-b|w=1`op2w203U_yL-vfD^@3;L8PF^H;WX^mG?B?S)_#F^Acmfq{XQI_aTB|L1-AkBkQMAIaRA z`k1nc95j8RT6-j){W@b@ZBfyDZI+|5p5c^%ZamA~6Z}K#x=RGytnbxIfDtB)9r#rRGR*t=RUf}tPSBL zEhKPNX6gF2$qn}DH%{D+Uv{j_8%_dvNDRqSIV?L@@zUL(A{AeqI9YYob}G#uN>P>b z897o#suBNPErte>RBkE7XtH_h^e_Zn_}%8zfs)}lSI@im1)F*e#i;pG^8kE%NW)no zaH>szM3j`=;S}I}yY*cJv5J%KYz&{Fa5ZcSUZKnViBvB@dE|?uWNPI#$qBzO@b3@% zMSMYd6mltFOPEoH|3TgT!)+c0zF<=rA^(TJ{=$ggz5`OB1Rm04jRI=Izj5R*8s_Jf zCDR=G$G;ssf~IC;1>f$=sI3{Ipu1?lr0E>N;#xN_S*m*Q9Ir*X(AzO!aMqpw{@}A} zUXCF|tL_R}qVW3?YYkg-R(Au(ZH>%9TfGsu!}fAew$@VOo9xW=QkmT*LjPt=COA?V zoD8G^_ZR)?6YzrPA3#ce=IDb}{zZQv{mGD>rJyxpKT?MgOiFkl?L1uPlh(pnVmT~P zmVI~0aY`hS%G=w@fT;*dB-_*^GG=>yvn&Czzfh7QbP&CA`T_7 zHhI!Nr*ZcIDVv`)a3`1$)pzQO@{QgUZa^FoI*1_u;fCTo?eOY!C6cMO`81paIMUFj zu6ErRDM8%e`qfO0!L1a{1N*-{<1u|DrWOP z87aSugp8dX!%kPv%M4!`4s52DcIcQ5AFfJuS?u%iM(K+fuVJM7?KAin>!j%0wZSU$ zFTbq}bcP(@yO%26qzC-)pIPeo>rcguQ2azPx5oU@6l+JU3dji4rfBx{V~VbEL{)nNwO{#G>s@+X)MO%_?^^oD844Rhy)8o{%`fGJrp-Egfd0J1|flZ*_1- zuPsWK1ZNNY-6y~9I4duStE;P(`kmZdJ*m!n84Bc2vO#v|*@1HNU`&q4IoXN@Z5A&} zTDjm4lV#26r6z8AVc@XE4@x#6TNKAr|NLqXs6NG-#P;;F{``Wie!3CJBW;R^%xka` zA^Nwx@WTY$KO@ITo%bcJV^1E$RGfUD|}Zsx3p@4UEhywD^vdp{DFs zEZl8K&wz=(oFaKTm3r&(DFFf3WvHcAV*+Za@v?8ZE@J~b1d$V zd8vgTbXhyIDz@T+3z_{@&w&uf?%%)P&1Y0CA#@$)?dVUMe{yQCGI^v!Gc=N1ALb9vLl#%POO}7)G&Hs& zToZ#L7cc!P`erB3UN^t5T$rM5G!mhYk$(Z=C%f06I$t(FW#W|SVqTTGw%BMm^%O^FWGvBdlbIh{Jj`Px2)J zfSiXf@*?eo!K$a9nwM&t6PvWz;^5msvTtveoxOK55LcA1DLJ_ zU^>(frpu!Qn9dw&fomh5oT3*}-Krr&F3%3FCGFMayzJ}@YO>2!R{nAfO6YjsWCgtQ zccEW99eVrRNcG8czp692K#+-v$waYP*HhU@&0K3r*l>{;FDC0XNSNaG1P6n32W?Qs zGyM~{@o#3l)U-`YDe6olOyew!N*k*3_^%uAXp;>s*pWggDho@HYg6ln@eO+ZCWaZFd)r1wI7|KsI!tVJ!zFB@}(*dDQ|Gq zmlRmd$D->cs-z0IcW`(H{pCSZXjXTjvPG{}sZ}Z$9WMU$%7El?F{mEyKQrOVis?ycBC$P>j9Kg-DX2tYVEGHC z*)QA;O0hXkm<-Tbt23-~1*2J(xe zz_D#R8}099EK&l9Yvc8+Q!D&Yaxqv#wMQHjx8=z@Zur+L0t?|}khOjGYVEwQA&m?N zMV+gJX_#?^u_IIwR<}wL+rdEN_Sb7n&83zf1?i@+pUxjh zblq(r09O*bb@m6({CV*(nT$$e^;3|@u*(Ghv17;LQXVXOJhR$@1-2Z!7}`Q7c@x6r4j|d*s_j0KpDv$9iL_agh|K7mrby$>6h#I z)-^7Dxi9AW*f;6ufNt!ug_$;%!Ycb8Yoa;p0{Ae8M~+_n*=q#|RdDjg##g~;Pr`x` z(NW;7K1fkG(>NkNd0_6e`!{?vLW-R;i-+Ndo+i%qeDb}7K774&- z8Ut4IU{Sti?h!s?wUoC2e+S|{RzdpsLVIuTnckk#*MKTLwM=wZE?e=(yf?>0HR;0Y z=&NePW4#2dDI(-0CPcZ%!a?LQQi+&HIFe;Y^x%y!ci{hW)Qs*Bk>o^6cC(vq%k&pT z@d#cn?o57W@zVDhGd!{f-pAFefB+t?H^}{U^{l-l>bLsdoD8DzSE(S#P+%vqo5?fp|`;;bv?khZSg z&dw*UCsu|RNJoizb_q8X$%*VNU#w6t;LVBwD`hFI z&X~FU*D9ayud>as_3x{E+y~4rBMgcI%PeT&N9=9^L$j6!foXDk5Q>iML)v*5t-=S+ zDWg03$-qBX1OXeD@D8*1xl2VnHw(!#n{kW*Ng!P)JjWZFIU)L?125`=tMEMHwEgDP zb7)JWHJ!s((pW9%TIs#S(8aSr`6n)l^WhM3wWA6ATRR~#l#eqGkrZ~s%=b(!pr9^Z?E$7kqN-wlgiL;t9ek?>v{mt}8Bjh53P=P&pRoURl5uI^dW0csi#T&wv_>Dtoy z(Kh74*PEm1Z0{HWX+(hspIq8T+vtEFN}hQRUAPwc5_soE7q9t|5lPSOC4?y44BXm& zK?D1sbOy%n4&QgEtDilnEzFW%*xQ+%9c!qra&t!w!d=YF(2K5J8ZF1gH;1`>fQi(fHL?2PW&9@O--r!5L-`kK#~;QvDchR;H`I?v~mJ&#ryPBHmAYnm*`Sw73YS|j`ZdE(t|K2G>}A(na#dnY~XKs zn%|ak?n?VWENn47334?C6k{phwS&1dW8g7Y(6nSg&?j!u$yPai(LCzxoNyY3E@%iK zZcq4UHpnJ~oP9gx!?V%}yY)v)Me`Gwt`l9%T@(rFg?Rzp ztwvW1vI*iv{0g1=*rKGQ;bJ?J?d6$7LQQ)ul@7f@hUeby1s-c+5;$taZsF))Y-~U{ zitns`#UrF5pBqOxIu5yK*##gLY>xlfwNyR8OjLa7`5~x37W(sr*OimcbYXdA)@|@P zNh_7jilw~f((6JI4kZwGJf+WZv$Gy0EMiI8*iakqUc}FjNEW>&KK<&njnrmS_eSi(d~>Bj z@^M#J-pYjSu}TgwMv*@~YNgc;0?QOB;8Og)RgI?s8&%%fH6Z`Dz5A6Ubnn(Nfe<~l zd-swCa(=G5C+P5V@$1pAZwyjx5p4GI@%=2@;PLBd#>z?+`6+8fEPkv+I>rqH6KB(R z()M)66y7?-#v=dCI6^mkm$HqM60s zGN+~dmz|$aup8e+y>VM{pQeH|T+4QH@iIImryb{ZGA!l07)MbojtiP-nE~N-)^hjR z1OI1VK|Lu3^%7_~Ke)@R{<3v6dR_**-moNu@n8|jfuEA9`j9?}yNmuAgZaAHiV$n| z%U>O*U&-*RyX%((sGKc~zu$pd{LABh-mM?M^AZ9Q0!oJqFaKZsWD7`;y)jDi^ZP$v zncOR2W&gg+zdQ3UoBa^I|8?=N%>1j({#DKY+L?bnfd31l@vl4cuW$CRqxo+L@c);1 z=2ZH7D$V~E^8uM05EVs^`>xH0UdbI8MXqC9fJR&uN;6tIvcgKTillYHoHE^DHOpvJMytrb8h;oE{T~T#H{T{lMa7+|Q#5f`yj zXG$F%zgF+jJy=^9QP%ZbfR5-&TeNNVPES+$=QimwYH5aqR13q`%^wijYv0df#iNvV zcgb+~6A5oo;U*pjK$t>xAWI{R%@Y2#+WEUj&3b}_KhYD5w@7qZ_q(n2#FHUQ9gR zf3H{5$aqa-uA9(u8TVb|zEEOqJ?m+g28TzboV=tJr4pN;oSb6`HXN@S=FYIz$&C|q zu5X#~n2%_~TOB;8@J=$`H_g)Qz0?2N@c~i*4yPM>Gzbw7me&>U# z8!l|Tz?kujp*{M|7ZmX}t;tSB%3v(5pi(JSOz8*@9iIeotRo{Ho>TeqOJwAUE}QbX zz4^*zS6A!|Vm+q&cC!hh4D%`+vDzQK-r_6l>|A}&f9R!j3c#=US8+W3ImPmKdewm* z4g{eHw(Swzm}}&B$kF8Y;Y+!J^&X>DC@KhEy$5}&|EY7tv+|u`Jab+(&WkQ=KSQXH zMO^>1Y^*BnXls{r0Ga^_lTVt;Tq^#KJo!hObn>%$2@s~Ma%~sQGOo-ilbEdUxEs38 zO*CO9O_#z|Rh9Da2if2!fk4T*D2=n^_Z0i@ci&M;_QVbqYC7-PLWAsQG=+g;c8&>H z*;Qky{?Yqf-c!fV=^I@wwv_2FCY%Z09>qUhQ3`vUL^hyGA7I#I_&}?)+I6Bn;K^ym znXimV`nZEMUgMd47;R_xz;9`@-vs**NhMo**^~Zc)ZT`>P2P5c#!=y%tYzUx`DW+} zUQBmuY!R_}WCSzZDNlE1agD{O%DvlvMYlllP~GBWO~86drhEi1#!=?+nUv=Tx30Vb zG|f~h&Hnct1n{XRNP2M6S3P^sxcK5K(&oH@aypcLw{%8@5&VjD9RY4n+M99ypb92-F4J;d@@uwl z^H};cLYPNvC@L<5UFAJ-;#IUhFA%KiUBM zSpj&||G{27j3&E_SgA9?qg@D>UZpE#uFQQ&DKu7bT{)aNWs&IaX+H0io{OxSwU8Cc z$+CuMx;{SB-0N?&^_39QOSN`j9o#Om`WJF4{79Vt69;%%llrhYPL6lW1X=XHQ9!q) zVoGqtkv>gG89uf99Z#^>x_?1N0)VhhI;dxZO84aw!+UrHek^r-Z@ocnJp_S!r75jd%> zdd!Cr>$zCake+8)RpCL{!PElB9o#YkyRy)Y3o2;wR>=Y0jLpgOR=^S|E$Gi$6e2O z+*NaDidR{Aa5qnqUmB5?TT;RrkecgiLHn2}+berrNO&5t`qmz4ZfMjc75EgWW|VZ< zRF6e(%lH&;s`K*6d}naKgipfMP6dH#px+qq(~Cc+z(#88+kRPtR`1ML^YZfU@jn8& z%S_Fk`Iwu_RPC|7&fCL5>lacspOqb(p&TcS?^NUmuNHTyWGgsJRO%+J!LwhsA)k0z zG9qJ!=m|`f?go%!m7eiH5q5k?{Bg@|uYnn(D@HCoxM4%wdUjW=h$WXQha5JQ*UEor zy0@a@rILb_$6j%f3VL&=rYd}?h5xd7JWz@7RCgNPD`^5t9hm%nu2FiH{=V#i+Xs^S zEuFpt8ug|(R^RaadZ}neJ!4^NGYeGijU4+ z`74-v)DRUNn-{r2!k7rIe*9Sk0j}|xF_I_~@efZx>x$U4AtTtDwcA9AlKaN}fjcAM zCUAh~Hef+gQ!NS9sRuK_w+K|IE*M<{Z6^&m%+k`Ru% z_+=G_QNl4kBKAVICj`}$`RI)+u?aG~u@03E|LJAp$abeM#kp$_{;EX)=vs$IUPg#7W$h%ddX24+b;=rDh882zcK$>`o%%kK zipYlcrlX$$g*Q59X#-GLA5p)XOk@$3!HmxV0oN5K9}5Uh}N(E%bfq($)NCO z0D|dHfa6h$2~nylRv)F4et4I*Qw?5zT~*es-90gx0Jb1zz25Q~lS60cj-;`f* zeOP14|1PouT8W7@H9FsqF1WD_-T7kW&bRY91ZfUb8Ik8cx(uESQ6)|(L;Q{5j}OoW zn;9VdVReYs_`q*U4zx=KOnirjr)bm3zP&5BnBcNj9J+!*udUoTN%amSRHPxK5+-=> z?mo!r@EJ9QFZK46KAI$wG=3W{%Qv?~_3EnlOe+m*o$r0BvgRC%kJ2ECi@w4fJurGL zBYxL>9*gZ=m}zC~*mkinR=fgXF(TkA8~Dq{#b=63gkT6a_;@2s!uAsrVrQhyD*vEG zxslB4fmHDn3H)~w-=NqZ%pECc+9q)$AhS4y%VSjUs9f?JjidhTr6lSpwnBy}wsgE5 zHv;OrKu0Vks8g#e1a(-0Cq%;~@#0RnioG*V1WSNBT6zbqmS7-)i5<$MywycdKrhm#F%DvRngRQ+e!CCAkA9O%<~sg9uS~op?PlY|xA- zl-Q+`S968dZ_uUf;((M*fV)9bc*R31!0=6}na-$be26)1v^9zVuO_XyAg|3F2{@Pq zAX+5lI%XThqaC$b0h}{nbwL`MMu3-=zTEK+R2+oCiV7c13)WifZGRn02rTaIKIJ@& z>ROUA)5vHx-&^bU>rdM5bj>{x=gUT|3Ey6YEE1(*=*S`L4?q0Qeto@f;dhY6J<_bK ztN_#2*b*);{u=AYK_MY|z z2Ee(8`65ian}-kxLdefsw(kLFOG44V%EYJF1H8%q@Tc{QL7yHdwVBA>_`#@JCF?{%p2+;H|cSPOk)0-KpiiO}2P8j$= zA=&99I8<$knFcCcR#VuV8+~~ePB1p3BZi#{pyi|&V2oLHHiA27D?$! z8wG|x--~qoY9i*=cZl1qWD!6oRdw8Ra{mbrqZuoTm`b@)?4Q$jr&U=(s_zw75UyBZ%zb=1`dD=Nk1Ud$*l_ zlvTid0=`EvByb??&4u?Py`^Sd$)>^5+aH?1l6zl~HjYKY#u487*=v|X98mor>K@gxW|za`J4J!koFA5EPqc*OB!;}Ng!wQ#Y# z!uMAF?LOU7@=Mv4&*Fq>*7!GuMlEKr81 zv4frpP%N34l11Wlh34-lA|NRNcYA^nSvSgG5?SKHb7Nb^u~n%S5iT?9Qvg801qg@zO5D@q33B4hw# z+iO&t<~l(aV#4o{I-MqBSa+`h+yVzq|Ze%?gblboz}dcBcIrHUqkRQ zx;CU3aaX(?BAWz8r!)1;-1zR}v7*R;CKVLoaPa{i?wiMMXPBIuYt_>2>blo0FoU4~ zW3l2}+eMyHfwQ(;Z`_*?&Za!dFF;v;eyllvZQ(Fa=wkR2mJ^mj=A5DZBu%yv=e1+d z3?0-FpzXJ^Ig)O3a0tuCorXlu`SA;a=>~d^8@xc4L`TqJcGIkdV;`P(%hPi_w?`bI zv@;)Vc;0!B)6ih!lT4*eyrlc)H0n%{S^oo(kIyGp2f}P47a9`4^*J{+(jDZ6-3v-x*~4yLaGK$b9<%ozu+Ch(TY2ejPwZ+RavGMT zS#IR&g3rL3j|6Wh5Gv|dkt6)WwBw;;>|>!CoOPl@Z{D=JEF-L2Fl$4-17}k3$N_fD zd%kN?8^C0QM)_B@js7yXTusax6)pA1H=|#;>p_~TZPEJWh$#heJg)Lf&w&}JywE|rTV#xd&EPKY3>`G+edEOke^*^O`7 zdiD{~kz-a#eS#4|n>KRMa!$)(FWd+D)|OT$zpdE0Z;bM1VP`$OAF4mhposYmT-Ye( zh0xzHe{jRzqHs=Bgozo*Lb#*bQHlC=hI=jRS0~VwxSb&-DPTw$FZ?-jUCH`oUy>)}0Q9pEgpRGx_uNj$auk=ALa}aB?^)VTxWirVpA~@P6|++JrTGX8BY$pSNR@S|hMp4BZ2bUKyvyG6&IDb+9Kt#Q$OBUQFN zSy+UEMONk#4J6)pMc(rNO@+|iPTAx@lgID@{@#8U&aeI+&|I%V5@!)t^Gf<1lS=vc z3l-Ty`;E+zE5{*(CitRdyw(&PBpf_55E%!P2c`mP(hg$_xF6NrtgUU7mnq%E*Y})w zv`5!7){)do9cNxzJ&%tW;isUZW@g5UKDBIvK>lD2Z6fJ+fh=T6+odHKl%T7JX#ZOk z@)WjWol(`drlvG6xE}=};qfF?%D31MFnSB7tuey`z##{ZpVel~uXUh&v<*)HknJ1y z(Vh)q{z-_@#O5ODbvNRj>E`cm>E%TqdRufA%u4b%{g8C*tEY>}JNMnJe4M)R&hCJ1 z*+Uty{W~ITezo~9PmP6YUa*YZW7c*Xl73($MWw5!?>R1>`bZy0<#MQ+dd#~&xJ~?N zd8plpTlp&m#;q{fSu@tZ8EE&qPw3tW0 znj$_0W+V~zVmT8fF1|e-lSIgE{d%VDuY#xW&VMd=+7Mczh7FZm5B$J4WD5ML@bcrMtTkX#wf( z?(R4!0@B^xap2H-IPiYC_v%%z_j#V*de{5MyVmoEYaP#*^WA&To|!%Knb|W5N8v41 zLMbM69~E&J3n&_P_F>g7WG5`cOunssMPg>>PkD*G5X+7(M{7}ltxcRV#pa#TRZcVJ5gFAwjPl$Ly%luYO6 zoYybrKR)CTFPM;8Vjf}i$)p>3UsriA)lE&C0$=ul&t1CvE$#R2M?&wRIG*`CGTT|@ zDwR?esHqYe$(!A=HOA#LbR38>MipvMx9d*QO?9wvx&mjWJf}+l;4KR<62nw@gnEO% zV~pLj+1ve868o}9agu%xxTRWq^_j@t(LL3AD{EgeBB#kO_ot?&#$5#*eOsvY#_RyP z0Z!ud)VVl|%8q%W_g_12k90>^cvFPzg9@j^Tq9N_k=uIO0C}Uc(B63IJ(S{Fv$jRB zdzn6@^Go)Mf3k~;ujtfH@7{YXJ3B8%k&^D(%#s*SSS#IvhGWAG0o$R@O3gJKD%SIVSZtF5Wr+ z?BCd$iS%}IuihJBj)hhhGDW{f&c1QE({qRJVrO(trLxM#MSD_0+_9jg@`TOK#NmqN zWT&J!Kgg1S>hoKoIBdO3GfU_K$i-g%^h^mDW~uO6tooW|woONDbD?@PhAsia4%2@dR^(DJ|Pl*JRnv>?4Z&*&b*85xx^w0_st_IjdUJYUcaqJNgN;8t~-m@a@niYbz{H#(SCc`P~_(@@bGikH(viDwM*Et7-_A6Zp!tWwV_g0h9{W?iJ+~zD z3>)}#KBj2oWIvG0r;`U+zQ$LLR5YC!@ z*N7KQur68dxqN#n4VA!#9LdpfQ-N)w&ah4Ad8V9xmtg7enl>Js2%l?><;_9|P2kuM{>+kZgpf=2ZBG9G-t*rBfeCTGgplA-A z%$rQh(y>1|VTpV9cv*2h|Y>^q0yJGkB6pE%-vDTkK{;L+*s_R-!R3_ zR>C|U&~N$N$B;3~->8>6qb!@2nUZNGvWob!`0l{kHQzAB-I+n)w9_!%Sz|P-lgZA7 zh#c)$E|@p>9k<}jDE}co7VSG_DE1&0RzyGxC>bLj#7QcxO%1;4a=-5<-lB46$K&8= zhov^rZ;MFlYqhCV!5j84({a$&0^zHmrW_hu0!tbr$sE6?G_{q81*<5qh6XFK*_lI) z#X%14n>;mNCV1P2^KPqdMP1O=))9VD$2@bjGVDyQO0FIQo`Od&BLs-I6vaIBRaW$A zxQi9nOk3ApfLW#Q!1qu}MtoduG(R>STOnj0Y_A~X@1Qib4k6r$J#3M9)Iz3OS2tyR zFj{whnsAk77&m_ZWX8*DP}s`qU1eVM>dLv{)ZcO~_;CIzhC^6l@OyKfZ@s~`Uh|5j z7DnZKN?jc76O=_fuiRSKc*vU@oX^{NjPR;;3)NTd10*LnH}iS+>n%0A)r;WRE65q! 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%0DBsAeYn!gMz8b?GQ!djHIz_@#wGi8x zZM@paPIfbz!yZc!1tZ&R4pX`>e(`rV$Seecg3EyEpZ}pbKT-dGkUAr259dqJkqbdz z=1qAEZxulieSIS=;92W);m8E1@)`i3CvW-udC=9>H7IK?0`A$~z4|A$4|$uD5QBLR z=3d?=a(7GQ8i}oAPULlRs)IszKs-|QTG6y>!M(8zYwxSf3y*-5du}Q5+peLNo#_c} zSPsCM#PUp|$wlYw+f)fd!(1o=D(7>>dspCXb!ko0e{oW}=L4Z9%EP$$^~ z2cY`+IXO9b^#CmfHg?Qo!P7V%z3v#BZEPUcY@rT^C1r+OVyBLzte)7MXg|v)EM7>E zmgs&sAgEw8HLBVb8iv!_AD1E~Derrq;0~EYQiI#xV(Ze#3gFsJ*OECI@isMi(2N}(_j1_*&6}()Ft6VLqolRh$ECKXee94 z{uE&Dd+8d+?SJRm{<~%zRs%+?iw{MBD~G3~q!f_Jumg|MbeX)m|7RdR<(yyH&#@u2;9);v7I5hCP053+XPu1SyCwf4E8*8;f%k^z`RxaFNHZLUD0g7#<-X~y3H~3>P2`D?giMb>RrCm~txnF2)*F1kHQ0RXWwyn&t> z`cTlEJ#S52)L3c_nS>K$EVA$*gpdU{R$lH2P-&xTl}bikeHHDbt-i54aVWSl#zLvU zyqdOl(oGCpA!qz~#koOd)_;6=ad|n4l&$tsm)|=nt>%l2Lk*B2=)6`By`=*^Tt~xV z-~arma;BI`O(c;zKx8-Abq%)u`ScW%pK|S00KH2<=N6I3fiBW-T5_?M4~r|3+kYD*~2o%ED}PaT2nGp zs@?wXa04hOZJP$%Aw0VOF_Nd3f{0%0i`f~QP6d^M7~Iv4`<1iDML{{gd!moo8gMhS z^Mt>@<)OZ<2E+B_`_^q5E8LwZZWK^ZM|6Ew)i%ZH1omvdnC# z66RB&-yKuB1uh1uk9~Ymka%)k(na*#a^wAem~^^_xhsX{F$CXOSAHIoWQ{;tNCfW0U{I01{PCH_)~rS2m5(nJ*_+>_ef zNgl~NQLUl|R_e~>YHg_Q=22@Ucjc|lsb|_}uc4t^H2cBn3|53 z<{9ICH>Pl*n{|5c)z}=x#`G^M<%TU^kGisSCnYqwY4dx0j7{@a0L$++@<4YVjm-88 zv=Gq>i``=p8{6OSl0Q1%O_a-Ok2iAP8DUY4EVYf7%bwUiJmujDh_Qx-Zcct|GUHR6 zzCdcRw%ZP(?dV~;6P8aKVmDo`8<sA7=~GZH(lPrRsJ?xf%;S z&%7A$1@4r>l85*6EAPH?eFnIkZN!#mY-Hz|(du>TH-qX79m&NLY6R5ny{k0lDlh1T z1fbX$!-fuz{7Ni(~rO8ztD`h@5eQG|0 zJU(e3nq|nO@Izqb5BDf#0}1z(U^>qo#pHa{n*VPH&ls6;mm!lWPm@7c7O!8AfhpsO z9gW3x`G&`QKHZ^k5m;Y+hELtXN#ugV(g|blQI(^=46>VObUyLLq*Lc?s=6U8rzb8h z{t-WD|2__*g+IQ~puuZ?k>U-CjbnB9Aq@XH*z?S~8^R;vI1d(`?DoQ_@6X!xWg3Et zt6AT)Nv9tM#ka^kA1|WLp3_jdkx5nlI=DhnWx}fBb#>xWcDF2CU=*Tc-o8}`0l3n5 zkjXv7{VKhvGSVDnjp1^9SUCvdco<3!$)WX-9+5fH*fck$i)v!=D|-<*yF;aD2aXZh zk+|H;?znyl`0GP%uScMZ)lE}v^4UCrLz#9X6Tk%QOO22Uela z?g5jfHf9sn(_oXXDk-Z2VCZrZm z+~(sArgaRwSaQR2H63}QVrA6xo>r|cAu8R%`|Ad6`u@QIOb!=kx?fQIOsTZ6PrIWk zft^G2Cf0OfbhLhihB$vL9fC|4yUqH?oX$`Z=E|s-gr>`WBHTtANKvrUrI6?#LN4|< z!49>G1o>vSQBnJhfqbrp+5;=x0cN9f$?XKucnZPBJi7`iwoHehp$?-J#@6$3ZHap_ zaEejt)V3>mmX7p-Axd$xgEo#()C&Kr`Iasb-3LjTjz*&72uSv-ZYwlr>Jm~gGUQ#;)G`_?lSGCQ)yf}M^jx9aFh4dKP4yk{o02_vpl&w z!3*QK0NRp>h7XxXH|%#(*Nb-1&uG+I>58zy>qbhYuIL9U9+|r;Dk@gh*E{E4a4t}L z-E9$1WXH&L?R`$u6$b_2YN!QU(79ZhDBs6(z~eqG$EUaUsw^Uzl7Ggd@ihcr2*dO1 zrnN6VWmyX!D%bG5d-w`+*5)lbIn1+`2$VUOgC5*u6uB3c|2?i#0wCTL0OGw>nAgX1 z<${V+f}L4hjZeB?lCXJzf^$O?T{2T3!U+Jm_41_B#FM#ABLtH{S*C0OBaviq5xM|U zsR1$=NQ=ypG0&5V*J)nCz+*9!mHD9X%>D9g?E#Kx?OtAfQJ$Ufz;#(0jtq5WLYOkk z7t_{-WZ(}-*zV{@aRBWWK^jKCh^g3}5+by9Wt%NWTGHG4Y;}8?x39ErS+jZFL>)(iwXpEW zV)5qgGb+Rb&bcxAYc_-a6h&*(9B`>rxv0OlNHG#xv;Q&fW)&-OIe$#nVFgnsf& z@ivPM4FY-KEmXn=!Kiw}whuVBU&IWUR2%@v?3B=DJUH2fBlKPpnno8Y-*jXW!Msrxa}38ti9|>!R}_ z6?8pYiB?$ejqEV&caIoKF&`i(@6=oCO_VTx8Ii}!cE>*3=cd#uV8`m|>&M@Vkq{Bd zw;k5cXZ-N$pWg4!xb+QBJv3s!ve@~=g)$ zaEHJhP(~p=qY|cheHuem-E+{>y(ORA=oN$LOdzB>`VL4`Pk0_Jfn<4k4dQnvadDgh zm67826>t?CVYgrS?LV@1#6KF(bu2zArj-;&dVO{Tsim{nO~J--SV^jM73^!!Ca+_O z@-_spsU~Mh$vB1AQ;5aP3zV5>NVDGhVagb7t@b&l!~9GyW+uGnG}P798mB6`Fdod1 zw^duOEpNF(Ny?75w$;LtaP;ETkv=4y_BBxJJXjITS~JnrAmZH^;@)=vs-U&dLLj;m z&c}B7MWD|AL)lwKMH#hWqk^D>fP{c_cZhU%cS(bYbaxCbHMDehcO$KIcXxLVopT<~ zn?Jtuz3cpB)|#2c>}T)$zOUMVhgG2svgoTY#@95W%R7CwzVH_HhSPO)Wlb>m+F7F< zi9mp1v_s>z?3fTFGR0{dA*c0lnO}nzA>prnU+a4EG45_bV`*`jZ|e9N7y8miKB8B+ znG_~ltf&@@>D>lOqv3Jnpg5C~L$e;V_?Wz-ZQX9dhyKZF9C71R8&Gra%YFORWPZ5w z*vhc)Z|F0tX1r#TK4r;MDY!?38;#B7ww^Jrj6;CjcC`t2R#e3Ie1B}sE21zAvXxOZ<#w~f_gp7`T9Mx))`rp7g#82HPl!S zP8vKI+bjw6FN4G~+ZC1^>K6Dl^nJWm!Kx;ivVXeX*q%1JZJ^c1FA!MA)#PBMERpagTSuH{NL$2TJx1;g7Vh_b^ z76HT1r#-|G~7=l3Q+Rs=f_)o_^p&7)g=}| z!H&=OM$zGAWo2}JaoO3~#q~RTeE$AdJV7DUpu%CPLxnCG6`3(81(Pse; z19qd+a{f}kZT-5bXpf6 zHL_n^-5OT+8;M!?O=TZRbD4G5ZjTgwCT7gLHd;~NZp1gzkJi-;fca9l>F?{02a z+CTs+u$zRRe?FXuESZ9wGaSafo7iT$_NtuWSsNawq2sn9kdWy9QUB!E;p2*izN@LS zgG`TF!=k;8wyWpW27isfp>bWB8zh<3o!Cd&8H-P&vBrDNyJ?!np5Mij$BAq4W)|Pa z7MP4I(`Grp_Gew~pLOWgICjPha6h7|RgbMU>A*{;pyV*f$X(G%kC~Zk^Z(7GgBkMC zHM6Oc)DY~LJU^<4RIRKzKK{TG1$`93;cTQ6E+{b8uIad4#IG!4n&&jTtCD~I&TC0u z*tA&pttZs(IqJ>#b02AWKi~TL+@`ToW$Kwyrfa1?37^NHe+h%qI?q&2+b@D4MI0e2 zZ_wW0U}4=^9PBu4>>X}WNoH5L)R~tLH<#_~MO;7}12)#guE`_&h<%>uEhA6OwTZb? ziY7u*9i}H-3d|2{1QVH((n!{$7Fq`FyTR!E$hiCX&POTIy`arAd$v z4HQ#H82})zL~d+yZPP(P>TqPJDO0(NoWc<|898}wU<31OI+g9Xln!%XHs|N(A2J;3%#=pJBc=wq&5oc_qHF{R@%CXI`~$*OC)-W6{X z$bbqu0*+dY)e~~aqxbDj%qnrmZF^Jm-!QMjiic-1$Gz_>XsK{YUnnlE=9<5*Gq3sV z1CC=OCWEKo%oG$cw!{YR$a{%;K@$uiE#(NH{cP&31aa1?USm^IH}c+I*3kV4Db#nP zZ2m;c-C0M-WOGWXx5xjOF5s(@DRC_efc>BG-zB+n6(r&js%7e1_qAQV{Dw?o)WSS7 zQbii%qh+Zb%&>olGTL3A7h&j@j`AK&UiX;Jy<7O@A#4p3=aCuBl8btHTYvI2b)o*C z&zsopt@?`qMyxwbGE1$z|Fb&azpMALG{8544jFk%N(nv;(0o#ioUU7m zIV?pd`LTU9l8`qu*{@veVYXz!@3cSunmxj;Sh2KW2jL6igAwp#u)uvkjN;vN8O`oe zFQ}Ydq<#JInq0{un0|IcL$UZKO}W$KxUSvsA!bxju(~Uz41fody(;s{p}F>hX70HaW;T@718Gd7*tj zS)KZ$>#;UUX!LzuFSN;VvD&3^#bJ16s8r@tQVKS|<{+^I&yo%{JSrvQNjF zRhw6f^8iZ7DIkASX=z}sEJd~|ALwq8KeBS%ll?p?I!vh1=h@;i`q{ODf}YoDt-iK` zL3)f0|Gg!XqG)7K`^!zyUk~}Wig)Z}mL1{-NhrJQiS12`adC0qfvoAREh8*k(~62n zx8s~Jrq3P)-+>m2P*~IQasAJah=PO!a_L|Il%Un*UBf!6srk&}akXFS4T!TQ7O%hm zHvE~^{~&S;QdT{CveZ}!(FX%OpymGcG@5JzFhSCBa^8X&bsG2p4e9MPK!UYr zXYa%i|Mx=vADgr)XFn=LmnvttLsKsp?$3G3LR~<4!DMU-O?#snQ58p1xX*!SUeeqO zL3^$M3@0?t_dvIrK7BUVzz+~rj-Mk^v>V8ZG$Z|u1&T@={EyE)Cz2_0y(d%F7jk+Q zs!A(D=5FNYemb7=c|MfiI?7yLM)>>6P0cv3^{kZtx-@cRM9L~FK5iwK9DWnreE(<) zBrRIX$-9%E{xX(5wC#vuPo%oOY-l2dm@H>Yv`{r9f& z8qvydBvQ#}uwsjagxlu0-qd z>ed8`tV>R3{N}Q*3sW`dw6YEUud&45zke@o?@vaPNk$?YgwU^aBO%0L9F@@Eq}1%1 zTEIH;GzwmIi(Sr>PH8ZI+;yL<9djRJ=4_Ncg|=5l)G2(Gjvbh8lcGZ_91!~!DHES# zwvw+34}qo2!=Sy~w7G3sA*UK_Fl_`yioO*T-)Lbyz{Zw9Tq^&xz9!cbq2r}~WVcXZ z8pTByRi@?zZcbRlgb)-_c!*}u%mmm6M3i&)_;&>az?I(JxwTwfIq76872Pag1_Kf5 zxNe!>sx?a`#hr5Dh{4ZrW<-w5#E5ktX_l|>OTU!!gtt;zJaq&<;%)iO<^$R-&=UZ@ zH=|#Yjzx4v08?K&i;)Dj@?4zx*RLc3U!qm#p{<<&-mZPHd7*>TQk8_^IGfLW1p_Pe z3gHzD$tyVDSMOiJ{$Ky7gNL=isafhQ_=?6T`wEOVf@uHRP+CdpeSRNnPI}tn!otBa zj=M~as3F6`_Jvf^w+jHj4wyHjNZjY_rGsfs>!`=f@~fQ$1$;gU8d51Xal7p8oK=&eoNWu<<@rS`U= z>LgXFgd#-u!_S{-dXiIw*%gteMk@${rDuQPd9-Pw-sG!QCRXK%jU1&Gg-Z@pK6U2f zY?6VTBo_(qK~hw6=UM8;Pz3j3GZTo1w0s16JY#)wvc+ZSy=VRPg{GseEoF87p(pCI zkrReVX{6=Q&Qm$BKaw}J*4Em?13^XOqbF>azNr1ab3t1hUtT30D}{}GnS#`DnRe8W zrly|v{o<=9&zl(}zotfw2IudZ&3$!q#5%5LgSmJ{!#sw{*}`WN3G=D|`4NM#GC5f@ z5<+9U(rnz~bTIjXMlA5Iw5+U-5-x_Peb%HOpHehc(tLa6VQ`}>I2c%Av`Ky2){9=x zIumRRD8KkBBWqs-e&P|3q^5Yq@`cCkd|e}&hAoDV7~4B%3>B}ZZ@ay>-{>cKa2NXY z+?>w)OCXAp4(tH-kn;PVi~b7c-_HiX;*;c9C81x9$NmNc>S}HHGNPiQmQLxt6BEj& z=#)tK71;XjCyVu!`_0(uf($`IooJ~QdMzqJ<@tD1+DBro4l?MJQ>)p+Xlio!se=!E zTZi+SE-ok)rO1}TfMi?~Ey`$d;qWTuGh;cOxMzEcq>8d}{o+MI7{B~Vu({F9Iw;7{ zNKaf9Nf#QWzWLc$F?zC@r}-QtK80W`l_0ypj|ZF|b&s_HFmg z4VD>3O9|sLDjkM?I!CDMi9~pH16_H!>G-jE9NFOdnMRrio5wdAhy?8|T#>o_vVQ6X zAFg0nR65@11!UOaBllCmnyD<2Io{O#!{YGq?{MY>S2WF+9zCyJ3ot*aVYbMAlr{UK zdDCoKI5du2c?&m_5}?Cuj|1u=Jq=yCnqQNg#xN! zBgMGTU@I>P_?6!qMBL-zl0V7WqAirsF)=w5IdxT4MLqhlPVfLvl~emF zyQ->6TFkmX)wtF@ZZck0^$Jr%8T9TuaBbf{dW5;P@vjtxE|YzNNF~u&{h7_0zpFYV z%=we5D@8kwrnusZ+wvTG@vRr=n2x%7c*~eShODd5SPXO&SQ9Fbt>j=RO~g%Eo1fjvL#NM!m0Ze zA8KoUO-@SswegqG2=6XTiB$Ih*hf~>mI%1WDP29i4glBVG*C((8n20sRb{CWC4G|Y zR4hfrq-yoI;&hTp@5@f*AMV$uxe)4}-iO9Ib0F}*{%14&&r?^M8|GYWVbDNGm2IuJ zS3(*=lCogjgcAvVbbMC9#;96T#sdD$4^jy-xpG6_fi3o(pP&3EU#Awll-FncsV~Bg zpVC!3!MUWz!y*Bfmf#=f^4N+R^Moy!F&jeIHRbY+qBS+>uns7eW57LeeI#8mI+DZ2 zGPE^~e;m0XNK#GIc(lj-tFd`C+SC$nP7Sou225nlohW8wW#Wz|wpD&=mMb{RC)b&G zXOtWzIV8L8q&U7*wosYXPJ}BYR_Uc(e*BWa{*Jy>`%Pb~zKIDH=H;NZrOIR{ZQth! z%iNs}c2kqkF5e{L*fj$_R7C8qEA-Vb{Gn%%^Bs+{76aZ6^&t!%_Uvah68qX1I|CJi zF?n}r*F^dl;Zo@o1=Pjjl%G^MJ7ymRe4esh@X8ApcM%8qZ7^_lHr3UsT|nW$_>}1A z=+Xc(^@RX~*~H=!7X0Gs6Sk|A*0=A}98(lC$i%k>u+0jYysoFCk%YWtN(dKK$H!L0 z(}|E}QVcK`5TcCtygxxMxNYr$rv1Z0JN*!lwqG&<6!Xc`{iO{66eLNPC1+$1@c~hw zFpsxq9c5EuZ(IiZ`+xg;Q;x;9x3|mW=)NutGW@^R)&DwTfv3XHMOw)IPqW@B5yuJz zTxVC8`!=|`kwPGItg5~~KKck)XoN0p)l>_9jL$Uga$+Lyl)b%QcxJqn3aEZNIFt#k zZcO8e^R-84=gS1<BL$vs~}X*cbT_Z$>(LT$-tee0-*mVb-Y6!B+cdJ@+ueYJ1fUM$1VCYwscSks=q zCte*@jF{|0LW0twY~7Zcw$9R5Vh3nL5;M089WJ5*ZD6G)-vN)|v2^DBnE>1Er7B3z zan>5a>*ZN7j!dSx$pxL#WB>)Z_|)TNyJB(LX{hz2LjqFKCqA=>eK$aX66SG~VftpL zY>i-(|7@i&sFg{IpUM$*GShYA1=^(;)Bi+Fdm4vjuMU<@cko`l8V8*ofA`w89pwky zNVH&@qr*dn>*|@f2PUnWJWM1#7mg} zA1A@$XPEcO4Lcf*fj58?jFVs$1H_^lqOCM9e}?ShVFsn#;J&E4t#tvr9_lPTK?TZ zahp>4ky5SX6C|Ux?@%XY#b{$`K}h74TX?}Twd0tM5k=`gIiG(Iq=h3;v0Vh_rII#{~Q9)_evqluMpmU z!iJHRm8C@r))UV-1BCKlwrd(Z#l-`^Twu9dRqD6h=`v|Zhd6BYqMX1ALEujK#_Vsi zuo^<$J@-1>e2Uy1DC~?Ym$0bHad73~q=qfaraRXXRgN_cG`C5a=yR_YCCl`FL9@`b ztVE}`rkfqHc3Qct7@LTHCL$fi1u%*6D+KoBqagDPysq2s`S3wu1`&+6hxy$^2Vuw! z;FPNLbO#5n9blUWnVFLQAs~kA6Ut);nm%6QEjb}V}$eg(+}gf{Z|2TWRlEMaNjH{@#`5Lv-w#5lCX&$YyV3AY2TsqXq4 zub~V{N=d;xT57b#?_L}oRS?TS_SqHA8TMkpmL>frmT5!)@H?y-%VSCR+uPqMH)tUi z+F#4=RaI4+01d@SFp&`;zh7<4%JQ`?YceGIci;R!OTDjeF~+AsaSPQIg83N-xZ{(P z_-=RLvre83bh_XPFV~^ zC7zluFqdtz2_?)I$#&mGJL0vh&HsAlx2ksHM5Su>fly0&rq{t<1p@`sE6-WV zj1HSzKII{oiGRh6Oo-uOc&W8M?12tCy=_HM$QbmmEP&-nY1I&88>P4G7ZKvV9h0EY zq(&-Qt-@QD34_GAoqZwN95KV)=es#uTExKq%MZl7GZDHrDDDZlnDxQB#Q~%{8Xvbm zYRBTJ1VylC9_$xU+^84_=#P=i@aQIFD-Ek%2TgNF5ysGB7ivzI||zEZgu1=uahhnWOh8_a-9V z!a6jSl!S^h9i`&rI_d&SV3Falz-*c{=jw{f?w%g_q8o9Jk26DmZMC)wfLh#LU*ZVw zBnX*6#dEeytFQmj?e5&L5b%MyP|tm&j}nQeC!E^Y*cgjoxdmQKYj!$-{8?=SN#=~H zv;oQ0+;0LI46g1jjM8lbSb_*Yz5QQv^nbRxP*xKnF2$mm4Y^_4tRx8?9UVU}uMX*( zCc6z-Y(716GirK`itujICj3K58y|oIB<}6&lSFq01jTq)fT(j>bc3Beh?44|;da_< zaXP$={Rk=0c*lZhqXaWHH+D5$1GmBbS^RV1-9=?&>CmV$W?S@QoztrQ{%?_la_i)f zF%8U(_zWKWEmqrEqlOkxTSpmexed7m)_*UY}w$nsRI3PMOvMAMQF@>R;U z3!b~eO9WSN^RQJe62{O=`((?F`60iJR8@@W7ej>%_k-k1uYn^>_hb8U`|;maIdXY7 z%vavp_v_gycalm<`-)EIEPSwHR*`x>a7=A0f3|(BK)nv^(J$GuTL>4PqstLn)%IG^PmUI6Pbe8( z9;-|+94$tl3z^}Ef&=5oj7r?=X5f8p<#q3ShS~z?RvFQC9xmfcskx#epAiEq=6+Qs zEUE(P!#7AHWp@Vdx2JjxkzsQUbG;4ORbw)o+<;BIxP!@q!C&;-)PYkVr@qsw5y{yU zwwdj8j^X68RFP>^tK=<-`amro5gJI)%C7a0%i5Tlx)3rrCHuChFXv1eX$)d*-cg0~|9!5lAo_-=xPBQ|MS}%I z6DJX@rlVJ}QWTK!f&D%=jqQnk5YP^3i;Dn4a%D_awz^{=zYW6&`h3equ^0_f$0Rv3 z`Aa0ras`-*8mTWGMX#4OG$fqv?-%W|%h%iL(6-1CfM{JWZ#0T;R6QWaRV^%{ugiGF z3uKN0hYuw$vi+Z6DKFm4{7R_k+HmDxO>&^Jd@h(%vqn#dZxX=cH#eEi_F5Y8YCQ~b zp{Q_D)HxLWZny=j850yl|t-0bFmPI>i{f z%jAiPyx0GXmnunwc!F6Vm-_MLDB&caPfpl`it{Djd`gTj19|2N8^*i1f%!@WdF72dVZ3#3MJ+fq z4@-H|`Lo8eEyL1+edhD;7reGEm4&VwJLZy+VN^Biu0DI97<4`h=$?z!%SZqGGqO-+ zoM*wWEP)dr!eE?I{j@~;k^T!fJ@{SZrC#ef(bAOsKyCJ6)+A;jUpG6ug$RE^J|!{e zr`n0F(nrL5&$Ubt!^x#_ty-Uv;m%YbF^bxUfY`_S>5Mn;aHH)31%Y1xBOv0J_x8TN zxKQRnok)rMrrk-Ur{eUd`V&3CWDkBF9rEjy)f^A!b7ft5^4=Ej%D!mrY_o zLEdp+CCX;>lc=Ld^n;A@uM<9%1sbiZkGo0$)9Mwismf#}q0h5G6L+VE^y@}N8q4grI{;Xf3{IEV^SLxgLltf)1DDxG-FdcYBuhx{|9*mnIAMX_%?U7! z+>ZmksP|VbC{G+k_#FE)5(w+5rGVmVr$rccb9Fz+h6VEb1#2bR%NwAXOW;aH;gq2}795DnaZ27IQ>;vqF%C1z zwqD!nQs*4!kDbkaqn2h!-t~3a!;>eqp>%O zot)YWTG_{42|n7pmDAKeogdFA+Wi#I)6iJxJ8Ci`9Z1G*+p=GO=>d5NN5lQ{Mcs+1 zaWTAtKxN7G!hcI`mADCTfP7hQm2c`-ARboiCalsJ-z2AQ&Gcz`_#l7g zx~xcrF*KITRe3{keh2kxrJmbaj~Ag#vgNt}lu)6XI%1V`Hsk zA_>swxk1%}GkjLAb3PT?%ItVbdjik(rtpu@5J`Qf4;f&v`QWH7ZaCbpi<@U7woo;l zZ;Db+3HJlknNlH8y?**UY6x72(|UqRr;AY`A+HMq^;mLr^!s+;0<$pyJe>KeoLyOI z3!^0lexZ&^;|IAkQ*Dr7v*$n;m`Trq^adKW_a)4D+M$CKJ@{NEUUtf{m{(6AsJD?mv8R? zxgmHw%+N#01V>Cp5^oh#Q zs`7o9c^9p2^Gas0lp+XIb(G)AOfVGCsU0|cqT7j#2$8&zski!{xA z(xVpQT(J+HJ=dg1qZ9Wf=z{^`;%Ud394;y!WsG>azhKUJs4b}teItsBzkgQLQ#;af zX>h(iho8GW6$HkP?nIL;V@@MUum#|KNPd0T=YV9hX@Nkt2 zS;QmZAU-P}G(9)13Ll>MT&2|`*qa;7h4-}8jQ&)qOGyPCmSE97P3Aq4(Xv zdI&$S0w){lB0xHr5y6IrRgKgVluc$Jc>dM4{Z*h7nToUNdq!ZwMT~`o71{|&Bjj;1vyqc~ zhlUusJu)9V6;H2`2FQ4}8~{hTnG-2#+WTr;3(-=-U^vH9TLu33T9>XPDZ9d0C0OSe z!|aTzUjfGpL)-7~n9_VcJ6}+rDSr&&zn(GPar&)T;*t|-XrsS$(PE30@gD5q5XyhC z-~?`u;-`)|0=MQhj5hPoYSGGZP4%WwSCpv)Bv3x!#Y}Ri@jM9=NA*-@GgTrF{mGuU zya`v6KXTT5x#xdrdn-J1p?KcIULUMR@wrl35iK|W=!#Iyny;zT^-rsgF;3+>AtWN1 zi;TR2*=9Nx=>u8v^d78a`(aB8tn9J@$5idrc7x%O8e|`|f*NFG{hpbb2DT?P_mCm? zT{?A0&YC1LQCu1qzpo4yxD8}dp#?R$=`}dS<@oa9+ZBAo;8e+B>pZHkNkd>$W>lwY zsReNk116X&9*xMkOK~xBMXX+-*gDF_LQrI%O-Z&e>w`hMC!f7Vks5``&lW>J#|LVI z$TRQDvyp9&5>Lm|fu*GuB6lmfUYz49#(B^sAYvt``#unZMYj~L9Lz^<;(a}%0T1ZO z0ysr$fg}N=QDBa$%t^S1t5(L*2d|10gIR z_BJSVa7YjAOi<%kQ4~sZ^!YR6rRy1?;uWdNaevQAyz~%$=)0iDJ*x$D3HG-`s}*^a z;&Gb3g%*h)Q=Nr?kC@0d(xWHlJ65n`xwRXc6&KTTxXLqqz%l3uy=!@I1Xk15+VQQJ z<5}NA=l!|yros!a=B4k)m!BK)V#Ho56dCV?6%-^aLNRDQAdO7a3-Nk-rT84VWR_)e zgfM!xv08b!D8AEgBa5^s_g?|^aTo^(Y_m~E941jOO=3NgjoC_N_&g^V%_<6Z1XWsY zUfg*!jrns&v5m~=?jgw^VP1220vuw%_#RP?m@1}ryPfo|0t{6(&Uu>eqh zm-0L+r_6mWU}g~!hC+o#JfnOx>x8ZyE}Qu1MCoocx!-Zpfg(q@f5#z_6iuG^J*>?3 ziI6{^iarP21OP6%5V`w#NDzg=;g3oQUGN|!KOhEo-M>L(UzNgBsc z#P5MMV*?)t?d&A=0j63(1(QO?vrpfDuPtYxj@4hY1acfVjag6L8O?uaAic@5>xzfT zWLk*eN8n&vwVimPm(neXz2#!1z!M>@g<6>@=q;7!k`rw)J2&6-k!g+{RBqiC%t}t5 zTEAs{dS*jntVf;AohVVoS`#Q3L*Wk^Cou51;N$!)D4NMqFy6R@w)PTny1I=&gbfhg z{k8+0g6Ebc<_Zi|AL8ShN|9*FbIFL!@Kn>Izhe1S7TlM2ieUP;7ruNhG7o3Eo?U5H z;{xuD0RwksyC}TEP`SyoV3kPE28qB*;1gB|=E{>0Z2{G861(LWs%G;|Jmp?mNXfx7U~wK{=j4PUfyMWl zo0=HKGO{})at7VMXA@x%5=BNtsAI5`q33S~(?HVb+*!AuCvAb@!6>?Lpy%!q?!l^> z{EKHcUDok*u__-%xW01oP?7i*UWO#c_gHGZdW#tfr>!87Dj}OG z_9$DvChzCw&HAsOa5sSy?kS^U3;!_K#*8~ifPUuZqZaAeFMJLwUtW>{B@#5ae?Y%k zA25VCodOgAe;)^FR`)8E0Ul=<2Q=&iGA+oJ(pz5xj}}*cUJoC8P3_BHzPUw6e7k)M z<8841);n|k7TJ4kUyv6F7Wqe~H13Vqt?2DFd~*7nkk72cjfp&IF~usvj!3h_OgYa@ zMY5y8g6wh@MroFHq-5T|5T;ytD|L8SRx|fhw!IvnS;<~7uPip&aKhsyz}VqN+suAi zU2HX~*JwD-KdwqL6 zXE{F}`aq6X^Wk4@K&;Fq!`sq2PFT$%-)=n6MW8oiwb~3F^rr+m2U_j0R-vfiVlnD{ z7tu)sAt-StNMRKa@TPAzB0yG|h7*^f=wzayIqxQ7QRdyLjylF7^~+asKD|*weX*a3 zKphfT>#VDt+2tU{2l&nU54V7Zgt zU!2isdJzazJ1Ni&PJZyIam!>0j61DVbU*$4vJ-0}7bKzR_nk^p?f9a1`bWAV@oH3O zutxM!2;W(+wJn+LaopB!3T8Fvh`2W+F^SpidT?ldie8zjF!1e5xcEkU`G9k8Kc|Tz z;G>lhg}QFrC;}Ck_49*4KGtF{E=SCs<}W)#9t>L|N&hBo2QMQCz;yI!VbST1{GfUe z9P81ive&ePpdiapsRq2P5$kt&KkIF)L%7{f>gw2h9JCVoUig$XHTV5Q{NC>F?SW=y zXSItXyKd3}OS`W{TlEk&HnxhBQJ(;ISpHp2B%hfB;68k!Lp8S9_mCQ%&#tMNjKqzC z&n6`$l>njq+^>5dCcl{#)F^?%)>t+iTr$g5p%hE&Ga=;=bra>$5sj-+==_$c<9B@QJs+qF`! z)J}MQSQzA_-OYkxEm%MEVi=Q&&%LHs`t@MSk)Cs=6&T!`JAND(!~-SWwHlpPyA3o* z9ej*xL1#E;SAi-Dv?|11OY3av`n3)6yd!jrufmk96C;wmZs(8)|67n?w$ObIWFz`8 zOeTfC?hM99JwHFwM<+o(Y=4~mS%MEi)dFDZN%AlpW(CpJQZ6+wr()5J!aSP1ee|mk z(G8hkDk`d=_4A^|-fyIDAzzdKw$pImjrfpE7qaGrtuO0$ImQ~-+=4RJwtOaA!!-N@ zc6MC)!wAF7Z8gk45~!{7gCt;=R`i&Vex8>y6yFS1ed6Ty9?dnnJO;TMq+Xpq{d{^G z#k*zKrq-~zfxU#W2EU&8jW!66l|Qi z(r3+JTA1_TFOnNFQ>Al1T8L^Z<@vY*t{9w}*;EmH*^}!_fg!6LJ_u%Xwp>@}V69+X+ zK7?!O&HG#JJ(5u!QuS}J(-(WL+CE+!?Xq$W2ODc@lAg@dmQSU8BX7^0dSx9XN zytG|LDraVJ!c5wZEss3KhK7yldUqWAx+1pEbW7mo z`C*kRxR|8(f=Rz~)S+w}sP5Ra21?42&N~$YE_x_4q#0P9W#W_#hG3=(*1n zQ8zRHPUE#wKb4e?0fE?e#uT?|VHH&GRTe*dXY6 z7aE%S38%?N@KZ%DH1-w{6s?^B2v7Syw3aY)tdX3l;;1E|yu2K4r1m*hQ2;DLIv}a8 z8j#=TNG9As!N$f0e{zPk*r>ZK@U1)K+ZA_K_+7ZKt&7k`m7ZN&2_aw%5+?iBKpfbQ zDo#ZI`bcTsV@9CFcsu2hU1laoLC2E>Vu zo5o#=r3=tDvxpDK{&hsz9`)+t<01am-04l%FXTT~LRl#9e`nAbq&~BsbiX*)-L?1(1;*VyW1^#1bMWvqH=|gg zH@t%TXVqOm{JQsUpGS(c*+wl`bdIA1rYcJTuBxzU)2Q(I-t`nd`mNMN#0H{jK}6m8 zCB4MATCzez(aZC*vu%Ng-9Y!iU1L)yo>aJ~VR$C`9DN9nQ9b|@Kp~DedW1nJv)*2V zn#de~_)P93yublqabKEg*D4a$rOxFs$=s=!WyX#m%sDIEelRTdYYsoH@^3Q70C}73 zDNhwoqX%;Q$O?&DdwY4B@)nMU0PEbgo10JP;<@VZjyhCI2?NW4*L}1TQI9!uVPQN- z6^HpmH8!Kd$r_b-NuPDKS?Hill7VBZZ^fR0&xtMX>5QI#z;LyAR%G+H!B0o>`lI#| zuUbx+0PKaPS6(;G)eBu z-4RewAVse?iSQfDz=tc*j5xl*!9j+fLIGiXqSDH4GJZhptQK&4d>EBNT2fdKaj$+$ z`Iu|V67uCCa@cevGXWVc=ojnEvutSzt~;*}nurK1jnG!~Ae(D^ZhlWfjt?k_Bg#fdJ>Hs@~|HbIZ6EV@b2?DK%G? z%4Ixv*|HrsP`vwy8|%dKSQO+(E9p_vBCfeSil}CmhAT`0Z5@{$T+Tk$?hs~pja%^Gp9?+nwsKgip`Bf?+SHuJaX`yibOWOY8 z9v;o`kdz{)ci$Apq_&GLqm1^UjF*7nk7z%qjTJ(7;13tS3)tl2Y06xC0JCGN6~h^r ztCbyFC+Gd#DUH}KBS6|piJ|T=zL%w4_r+aFNr@XtRzK7xMyVyXj&h#EM1B}6kRA%_ z2LY z`9b;{Tf7mfy5q1C1rJs{?HC;yAN%)_Tc0WGa_5(kq$K398l+q3{b%JHkE3hB*9kuM zi8S~z`q!xXU^tU^CDjdW9;@L3zxHU<@s$&=MwkD5H^tNy%)GLhV}22-!#pTw^1?v~ z3*!%|(HpaA%t1Zjm5ald*~;Njf3o5^#1HKwr>1rVChl%j)@`(eHa+RHfR<9QgJaawlS`Vs5{mZe*-%jm~5iKNuA<2Ko@-iP|{gzIWvQHWoRx z%|jMdiLye>_svAFp=O=;uP~!d&!DGL>#5Y%n*KXydfsrwV@e#IPEL) zZ+jbb<>C3*7xZ9Z*|Cy8_Vloc!3-!wT;6ZlS;#z+Ed^d`hI>()oU3$ZqhlXSoh3MOIY z?~og1VQHL9vAsFwcB}Va2Q!KvZBX-ti)HbUPDrSI*_B`?>>J7rC|OlItO~g>P;^sF z9i;NaN$MMJoE+yYt}DY4LuzGQTJM zRa{&w3=sAX_`n_ahK`qF`uO->?|684LIH(GMub)07!_zem02PJPdz+Sz99rG7tUvQ zLk1T&PqDp&(JG$OZ~5Bf70f@oU-kc&u#$w8X~ID{HniQmQWO$0FJZ=>H&y}4+LtHq zg}alMy2TV3Ja6Lc+o>5qj`};0A=V@RH|{?_fgRQ`)tg7;=GesI#*cpxE~8SHFumiX zvHHP{u6y-8{5`w?#8mi?d_{Tvs{Y#Gn8C5QrhnI&$B4&XCa*?_40)cW8%=R>eXpuI zzuUaHu8Kp-!7&3{=QQJIc!%hVkoU@v3f(9P38he)>K{1AO$o!gzhz5^B4=4XPJJpS z*7WrNtV}|!k?{6td7s*&IsGHRN}cihG)U`VvhR5DLtWIFMTEdj+JS++oD^Ako3==M zNPEiFw*vs6Mc4w$wLIqut1Z5PcLu5#TcmGHVRo-PeC}T$x*QJ4<%KA^!EOL~v*vSo z_89m%pXuHzK#ii{IPBEQqK;bf8{t26@+X16cSlm8yADm=Q3@tQ35=lXwqwGZ;`CQH zB4Dw42S3KskMG|{zW||hROZC+<^Q5Je1$;Nz5AHnDzd#XxhkWVVfvduHY=MrPIR+tzgRnPRSg@B4uv6x6Rm-jW32g-lk>>~ZC zTb3T%{)JO^Xiv`BfGfrDAW)X&yU42JT9X{pQ3_|EW8mD9Z2>DIBRyg&a88{D1gt^M zSH%eP{w@$Rpm*e8w$(&INTPtjx>+b$AM47sb&k3}-Y7zht!+2J1g|*7M)XuvBi|n1 zb}X5Ww*W9YO^4mM7K7i?-9+-Xee^$ACBGoVtn;bs%C?(D1F^AyfPixV45snAr&=Vj zHh{xs)SgBT6iZy=j&NbpYjW5D--y3*LH=j+_zGcPHVY7QrKhD4`1ffo@k}<~5LTRF zjT0l(fne{veyj=J`K>A5dCi<=zk2nL-SrCgB<>X|DE)rKH9e!1#ptf<=N8o($ncz( zhV63mS3gnM*%jWWy_fNym4&TP!*^$c?53)c0Tpi@COe)?=tvv7ZWi0dAGOC)6TJaK z_%c8~QQ>1ZQJQ2g)z>kvm5P`8a>dQI$|phnD|!q80T$5?Wel$?X=HD~taA}?A2$l| zjZo%A^Nlm^ICF%#ZD~k~#?4&MYI7uekGGYrA`H+5epsT49oTnY@(#OjK;nc8vH>$4UfVDXPzLjv5s5hzrvWdtZqYS zct3Tbj^(P_?X^|Up-n)c)-ZNhYq~_lr;sM;H2NgDWal}BsE{o&I*fXc4bEyDDL)}g z$}DB}HEm8f7eJQsl?$d=>AUjvxxL2Iuy*556Ny6E{oOR46fqgTiH?kBM z_qN{I6JBQT-aI`OvhwXCz`aoVu5sQyJMJAK;&}^h+|JAy_*kou-mLe){`1YR;8G%e zKT(hI8O=aF$b!iyu6ro;Q@&taxIqe1w&VJ9L?tD)?mPr9p-uxVh4Y4iDZO>yy>1>x zlygEueNM52gEa3R3dB#=X4d7G=4CT(mlp=^23lNJz$b?#iEpJ@qWVe{P#PG!L~BBK%FgZHqoaX?svT-#eb?w$=3vu3;CWo}Ao$ly0tAaw_=6Awl$XZT6BKtoWlJ^d0nTZz5VVLbs6i z?32^i>W^XS%m5W6M!Z^&FRWi{szg+o0|Wr(5Gzb*A~r2+Us5$OV->V*Zy&sTFUXi$ z`z6M76wmq7G0^c?7Tj9O`GDSV$)tA>3TXs?{^za+{0yzFhU_HcB?#-h6BPB%Uz!nU zKI(=Y`Z6cHtdwvd^fu7L#th2v+8f7vVe*wPevq2CibelgyHL{;hLc&<*vQc}hC1?qe_~G}Tvo{R$m&bL!XT7|3JrQ@e#c=#|cYJW#;Z!D){}rFZiK=!LCzBF0$9GE`TXA3+>ots=-#?Yh*IHL$6c$Nv8!z1*+R`##F$y0Pz&Gp6pBdfD|KYwocK)Tx-PK*1cURp7}LUzXn%7_6f?ta{Pcq~YLyr01U*+vyt z)yYZEn{Di+7P7v@f~0O8=4|(82?!dP3qW+`=u2fBns~Su0C{D(yXvyWEZPxS4?ruk zvpTvqTHPL0@>{+$QsvU%ioi{b3K)7RusBe}!%g@~Ahg z6v_ev3*i8pz_eiWfk=BsO!jx(-yhD;MR+|oN)#+Iga7asky*`|Y z3NeClr+Fp?X6=+3a<%`mwD^i;0kX0Lnr4qXbgjR|Y&`bW{j;dI!2vgl(|=h0MFbc? z;yLVKMZgWL=}mDP6$-n0dXN^&6{|$e~bb zY^7RuV+M1M^eisjE|mD@^+WxU(yHdyP*F0d=vHP20ot5{LsK^2)Snk(oLZ<0Rzf^& z0I0-h!G=kEyBTts_<(eY6hBMd*qG2tds=$_`wz@_ZglG4;kWmuDU~%GrhK+ZTuJ9Y;uKMMOAj{nxyS z$@_;JNDk#l7Z(8rybb+qR9Sv2EKn_m?y8JA2N~ zoY~z!pHH8(&5i56@I_XnoU-2OQ4UcynzHf|7dFem$t8@Z*|ksOqeLK9LP6Flf{NkBE*_HTXannLOuGK``x)HA zxL<8GuB4qwI{M|%#>R~}PSN3BJpEAQ86@>&Q>FjrZp$hEkKQ18pLePLgc?QJ!+p9B=VRSU~p*G9-SNA5PZ($BIDpxFboU054#5?AzB(Whq zKdF+tH$_XNWS?8L9fc9+Y@5D5PYwg<$K)kufw>q31r;SOC;fsWCzCd>DH&}Y*{b9| z+3=PWEyQ${@Y}%`1Ns0wmbuhJ4TSTBJ{ISMirc8^SyklvnLX5dl6EE|Z$*W9y{Fd~ zq_%uXNdtBcnBd#l$mGTLOV1~Fyrh(?L_}p{vTOFH(ed}IQcBombMJV1M{p|xyiB~? z?RS^1-b9u2eembj;4ne$%YCK+a^`y)#_O!u-_=#fRT`Ry z!);tg`@mpfYFT8do??B9xKGHyz|@i2=H(ghS2G-~dtY5i#lbji^WVGo0rc_#N^;wn1_cXnhwQBR-rsOW;; z&Sen>Q+@?aR{MJD?Dz)yIoD=`1qS3qHj)EFYO(Y?l&`-c$vfO;6iE;%8KLG?L(SJ# zUHp}qr#}Pj#LY`!SRTg;B8JTj`ct8Nl7Iv2f_7#>bw(U-Y>*u8E1kDYQ`3H7{+ z@1i6|Iwo&btj{fLF4uJ0pBH(auIr$Ac?V&xDq_qkxj=n6z_yJ#RLc$#V-A@pBPs07 zR;*|!_&TK4almx>B}t*H)FpNtmB-d&m0-8AW!DA_jQ#|oJJ&_Z^#ub~GlleyrLL9y zq-1-Xt^y#l^74aV_5P>ug}-T#&P!t09n19yrAE0_#b9W_3V zjU1XJ@*?%-HfK}b=o5a0v(h}asAk$sPJ*`T{_UV21NYUMITA=ZUITACT9teA$ASe; z;z#P_r%E6cBg$nV9IP4F`tZQrS(Fio{p^?;{~b{kgtYfy-HxVt30UL7LXrK_7(xQ(kZXo*G_111XP6V%i;BBxcAOA7x#0JR;WHL`>`-b_SeeVB#IRAB#{`p<-;yohx zvDV@WwV-RF7)IT+Jn3v9VpVtM;|$U7kZEie|Il%gWYyx@Q33tNdQUK+lyW;9MG`mI zwv22aklVG11c1cG!8LhyTWpHE(fHaw;uxPR3MwVg3Dm?jnD7Z0p2CdPJqv z;-r4AfT}s zyTu)8`F-EMpG)h&RcXPDuSWMKr{s2i@^os`Sj=7@*`k)QHx zS?xhG-0f1xuqe$BY(Mr*X`ZyI+#NUNRoy~dy&pFYfcjd*LAehF{y!|tzpT>xhm%-d z^GW%V`Y~wN%}NP z)`GHHRYP@$cRseozK`<3^){^f7$MSdszyEJY*`gb#aOWRC>cP&#QE{s!PqiYMV8xQ zOpe+1UbAW~pKxDR(PI$0zU-#!EHS6D=$FUi{Hbj~RS$5GC=U0W#8~R;u4e z$xYGN#13*f7|#yI@Icq7a@(9cO$7FIjk+5ay>Ge2C;iApTDm`yBs4jH_GXuilr+P^ z$**nA?nvg5N;#u^Wyeu{SeGTLo)fCWZF*1d9p3V)VA$PWFSHtpVi*R@^P?>X+zl!o zns`E7%dI{e;Z8k~EX^p=5HT}n#B(ZJy*!&v@KFf3Dq@%Tq;gUoS!m*!7FKB+C&EKA z^75YeYJ$B0hE4ysEBr6(&YMCi^FX%BY`X*4A#jR9BP%N|Ac2Z%GKYVp1BiS9RRUv& z)%EquPU=5pb&|5QZQoh zFB93QlgJw4r*&lBAil=CJ7_Dr;)bO&R^cNOuXOQKKhr_0S0s>pSEE%p8mp|5O;L_n zk;?hLy+vxu)7N6x({#Pu<8??H{90#nz!#mYW;SCTeQ4TJI~Lz&j*42fNI~B!SGS@t zIMP;e=qH#m2oceO@KjKfNbr^?UXE-4bWL5#f6yBkVu$l8X6GE)~l#F6IkbbV&xHa z3M84=iQ+e&C#!GTd$9?TY{tjME5QVqE8~%B^JS+ zwMR7R$-I0NGzmz_uzCJJyf4pAxSji>}wAZ)5u8@w!>v z;bM}PvtixY5bteKl5{DNJFmIi;5!S0>AfWb$<+FT+wMraoZDqBzt(un|#_@I;6%K=rq*U141-kr%$oWStY{zr?k7?U#^JXiJ7MwgW_ z=i|cV-qAI=t+2X^U#M$0Q6YlRbR~*TDy`;c={u5bw0fzOpQ~ge)6BhJWyze=8Sict zAUj}zkrWUSe|!O+B$F>JUq1eSJxS(4yt^!G_Qj%7!Fct4T$vBFs*NQ_4>167+J!+g z#Y+xg;t<1RZ`&p|l8WhOB+DJ0YC6A9d`&ivQodjR*3HP~fxp2YT$BrssfiAfBS26w zJz7&R7ddx^A&=ee68h1GgQMn&w`qfT@-1$EDFsBF(X67FhJ16?DUxkt% z>l<8_(luxNs=B&#vD{f9DJfzFW2sy@>ez0Qq~*1r_`pJ_3Hg!xPwW?(Mz?LuhFKi6 zb#XFOZ|`={`(5wS??#Djn#ixhxRt;B(9o1BPi|bM@031RHtDSW1`Y%?Fv!GM(m}w| zg)NQ8bG0QuKR|MIC;%4AV(K9Cj)=jV^FI&bI5VXFTP02F^WcrlrN!_UJJrCQjEshm z&lN;-0yzJ-*q9vt;Z4>D*V$nY@z2|3ItND*(61WvL^vxfDyy4&qSdscH<^8c33i{} zLw7-PHYe}8Gp1o+|jK-06Iye$UW~R@;u0SZ#Zyl#^{{_LLkH z5;c;jLt?GS0V3cu?e1c>B}LEqw|aojmzUps7Pml!#;QQzhpx7Ly`m`jW0wsiSNMcW z3r(VevGXY95srw^TV<8S?Untavc^40y~jrngJ&(`rbnegC$?bEa;e|D(SVC9h2>iQ zt(#lNBPu#*^49 z#!A6;!_+vOEOPv0##%uEg@3=)UM5H)($WoI==J;Us_ple>lY>`Ckq|(qxJ&bjz}ua z=4j4PDV07GI#dDFKSDsZhlX%4G8xUgi|gry5|`TsJuZF;dT7YJ8`TXfNu*n@u6n8p zZ0RDwZpOuY2dEn(P!tskUmD|UJP3KN6JXJ6!~B`;L0MZRW}7A32pudr%2pR$%oY#Z zF`q(WGv1b%UaoewiguxvnsuaYp`tnfqk|xz=iYy&W%TWfuAS{XH$cj78~v!@>c#$V zgAxF@#p@qXLV{>+<&@i#8K^Tcfh(RB^B>$~o4K8pbNIqo85Gb)I;j8oXH8>%Z$9%u z5h@FnpeRvMGwzdzdu*?cbXr`*rnx!0P?5i;(pR(N>Z8VqhIG%j7!AQ-PF6e|pG zRSE8J5>F7bjPqm^SI`}Pai|CUGx}pAkn`%56uvoW>sF~A6xqHEsNbZ%?i$!Mv0a9- zDSy$`mQ+igWa1C6v8@UI4qJuZ`@y?jB2!2(*7p-ErY+#(y9!x4`4!z9gYg&^vepn3 zm>FsSiXX?TZ5&R5Q|J5y@XeozKHU+rgib(k*VwE$t-q=ouhZ@$!o1 z>#;v9OD_3bIiBJW^bg%l^-!3!iM)+5(>F>BqSwRTkh5F$lUnv!zL-X*e;*&-&Qe_T z3#u+VEySm+p~p8EL(ZG)kvI|&h~V@SprIR zkerIzE)CG}`gV6^BGahmb{>=g02`Y}w^(%>rTT*KmkNiRPQ`HgE-sCcH`xU401i&F zF=9pqLQaZnqfv{r=LtrVtnD_IEpT(&f!q)GlGVa$-1dDZfOa1)NS^11kvgh~zCWjq z>iQ?Ui-e_M;ESN%00W`<_F&4$&B^J$0FV<=e%xC@yM=K507@3ky) z_jN|DzOy+Q3Xf0gM{mfP;XXy?G$(Q`KoTHQ8han5b8tP5NItA@HO&MM$QJWhF)l1h zvRSLID9h8EZ8U*_f*$JX=~W;b0@T0_|Dgn0N{?gw!~Y-}{ez6ve4A}G5a1qHJ>>TfLo;pmOEmNkL82){8F z6#l89k3OO+EjQEkGwyZi%AMcDJpnOoGi*3v z50)B10-g4^*C)cyDNx@*K>l4Y+!w&Jy^%(gMt5UP@Z9sLSe(8-kFMF%Zsl>>2G!y7 zUga074-Jj}QGC4o(NgoL^X*M>mP%>fqOy!kw_@2;-p^q!#3Qcs^TnYZ^j8P`!N*)S zERWx^B&hH((qkGzS>C@iE7Ha0cn{OLEUVUR-FL^D^u8BR`c*SY%kONoVa={%nvnF9GLKXx z{#?;63@}~ydbA^$Te>}Th|o|PAq8}M&KJx<1{;~3)0juNV)H8`N4B{(50tH8naaEI;^Bkk-;!E!0@n-$a+hu{-A^L~ejp0*!02D${aBKz>* z0M4UFFm@kQ&m7pe48Q~Ubs6x4^%xi!c&M(dJTD-Z&tLvFx%vYWSY%8-V5s|{m6XW` z_wz^4WJth0mNH;$Z%9CBo%>zxg-y~ut9=JD6W5PlHVC32zUG6{tiKnAWd0pIa`W)g zq&x7|sU@4qSDYOkQGNlKk&3!$fGkkIWD4^G@;}e;|IZCg_WFQCyJNmWC&k1cR+!yI zcd|wM>9B>MZ%ACUI~EweN6C4h%5QP*2RxHn4u8?QS(jBV=JpxhQ}b6>(5u87N^~Wd zEff`lmP~y;%?_;E(js53(cW7tqX(qYhC6WXKdhxr zNb_FZ8OQs>DYI>7g{$mK`jpnMEhH<4Xbe18OEYP?Oib)wrJL02A$H!H&9I%h^TU|N zoabfouHc*6*siFnDtx$}K1JT`bF$w;!@5FPWCdpJLA#Gov%Mq~NKnW=N9Z&)qExnV z*AK|@6@<2uaZ*y1Hk%1 za>1|nQI$kILH2wN#m6wxW|L8<*JBRklo2zT6=8+Jz z-fb4L$i(v3ouak3f7Ib%e#x87%=5u@T+)(LHxio3BY8<$#evuC3wKd)K60SVU5?W3 zM~h2nS^kQ|v1EDSqX!_0DLuyex(43`FKXsqvDFjera&qpxUg-OHLm)jY)vx^*ku>; z%SPv22`c=1@)a+jG|#Ud2H)cFb$*09dwF`>3#xcmmQE+{tKaNb3ET5$tM`PZAl6|d zeGPU=ZI;4x>@t}Sa(gdxmsZ+V>4{jINZ5!$?_z?9OP{sxz@0~ulCsS;qvT(+Wk}e^?Nf~_wlhyw*r6xIrp_&W(bcGYKzqX zSgYFmekjY;wFF-$7EAjCNN_PNy|h5sCjHYrW$|Bg@z4Nvu7>56p4f8l)O08^k_g6g zjbLazk|0HECG;n|&_$1dLFr&%#7PMbrvo*+8`bysOeY;)*c|r$c&p7$-HfiOJ@0Cy zt^(-myB$`)u|;fhZGAfg$)NHWpL}Au*2s!j$txK1k9k_UIk}0{2zW1OM#SG!IDo;x z{!(M2g;I(6SCQkLPh9Eta7iPgq9;{~1XvJnYJY%K$5SMc(N+;T2tyC_f?R05wcJ?^ zqg?2{ZdZ2R^M39l)FokPPMRinaH5wDc&D7r@^u1qN^W-c#{s~dXqzV-uy%NQw^ld> z?49U?IfB$7gesB#`+~{X99)nSr-g)AQWP@V9G-QXS+S+GJzYStqAXm;r0CqLa4}+3 z*W{=CiFoWvzSO8-cD&h+a`_GE;UNrkn>_culf~mCt(j^#TpoQ@qN29kVfJCqxb5Qf zAEd0raL!`#?v%Q*bn>n#q${RaOjqgTS>%g{@O#y`#Ob2#Zt^^fkFIZDN)#?Ef7dII zrTi{Y?v|}HDX~ra#!Rzyq!_aHJ5)OTbW)dK&_ter-cv)_54^g3@u!mcl`1Ps)#hy4 z5h}~;)nG7Jf83k90iMfbWG51o35IU9GTSA#2s71{`&*m)JG(6M2!D+coWQ|+<;rS0 z*ZKYnsZ!w>(X5anff@o!}ETP4hD=d{&1pUTXZ%in)+_C={g8T9A{Rai?4 zGy7TLJTF?8VntO^BuQjvrk{YhS4$TN>}utoalW~Iwb7H2k3B1$w*K6=_*M2s**v$G zM-As~u7VhHK!8uq;0+BTOYuw@Y0%~8_n86IPC+v`oj0|VlnenwKa0?=`o+u^7h@$Q zr8;J2X2tz3(_MgJmeGDaDNa0Mgi#9qAMFHc$#p=&s0|Y9%jW=Nz$Fw4`0J+#@Tkb^ za;k&24o$D$R&-M4v<1xoP$Q6e8-sxZexhy}2(p_erP>|sEJ(6A7GUbW)PLuCnM77U zo>&-lUU=XZ%#Txz_427QkLOk?aJ$oTh`FC>FH;&kA;@W_NOGYjfYq3+x~d z_>UMw$U!x7b_0L^Q=bhGqbQ9`U;%KX!9mI!rKTN<`hv-(X*4^PBW7dVUzmQEF>?tF zfaT=2r&A8l%0LnYH|9}5j$;IJ%uQfBv%E_Zjdk6@Igci$myfY#SIm_*OxetuQxJli_q&=jHs<<`*g2pf zxhFH&W7D6bAx(x&IF1yqIi`xFUwN1hBwhIyfjcFG$J)V!VrJYKz8uu7w-LF|`Mm}p zeuIZBgk5U2aJ_sA)ka23C=5+vf+TzAD`wxmG;1d)vRPQ{EOsY4!I^`K1^5fq*&c@` z_|Cb#ttAL+qFHQmk2KM`jh0G^!VuPXuUnadaX;-d%UT>vkK6jwIG{f_7x*?dt66hR zQgAZj;5Ib>^5=dp4PXH%8>aWs)!x_$AgHi-H5f-Z@$utFt>k>cY%ynKB(?9SKuv`L zxAh1(g5$nJM6>egWd33en)`MFE-cStVq(idD}I52q)(5J{QE|rLBVF}2zLOwqp zmLKCPUNI-*H6wOT(!6MfrAsx?w!8ed;kmC^_qqCT8MO|5DP)?!63 z!Ur`ex*cyraw<`v)zq+pi25wrIQE&s+Tr)RO;}R6VZEtYO9N zekywVC<#`QK_ny_Odia3@KY&G^GwSTl>6--nuX{-gH}qAFjrFQ1MU@9d7Ac{-RdS^ zD;A5ZsHrI`{*fZO5eGY3lZ4xY<@M^+L*j9x!wu8fogr8MQf-}WPa8y*PbxN#dA6vo zBzvIz9;4lOTxSJO$EqB^ZWmf{E!$n(%~Svg{Wf}Rq$a1NkI?}W}Bn0}w-!uCJP%&K9_I#;}C6mtsT0)~|Q+sd6X%KG6 zJ6L@ck}0QAr)|brD2vs1t5_J-`Y??$Ac!|-flLTg3s2pTXxb45D6Q<3kg-Vdr7CUGxaVl zsgr^`0Aia}P*6}&p>HS)DCp=%@3vOv`~m{*4D|FrgPv%tSM2TVhA-~!q~8^o39Z)4 zu0uCYS6Vc)$~0=30abh=d+-3DF8B@shiz4$jqC(F1lR|sixf143l2l-4S0xnJIA}< zZv;-*wE=qU0*#|foh~nY_ZGw`(2~5@(WiTR36pu^34ZU+cH{O;To$XXO)xbh^Hq9g zD1+*Wk^0fj+l|jqN?>M`Sy#VUbo;-Uc%I!zEi|>LJF5jCyYbO7z!+n!{5*Io$8>cb zNY_F#GQuLUSVfbuI;yuc`Po|FT_#!YY}+BYXA*;}YJZmeCzX_K48F}=-fFM?8S_W{ zQUng7+3}9-;IO=X`u$LEyn=uFb0~u5*!)Ocr^oU>5xZtW-*678rvC+0X$KE|dv2r3 zs~(muclI$h-{x4yr*Bt@d*xS#{(q43DAp(`&4!KxQ&SpX1`)20qw*3fMA^;fxM^jT zm|dwk+o10r&MNu+jnde+Qk%^zpQ>~9g=Mw8KcvUcuzX{orN6Zjum8%qpLCQmwc|;8 z_)9xI@h5i2#oc;!E|I#`4N50`z-)9E0Sp2E49jK$hKlOW)mLnrVYLU+h1)YM%bB{G zN&7x*h^{@>xbNR7{Z(jPFp8e9$rwuuBM%jOFuU}+Q<(3l4a4Q<_HNqBQ?C-RYsR#% z$%BI(Q4I9wgF{0`@^%c|#K3v5F)?GWeuas{4pT!*KD#5EyVyloC$p2+H~*@2msD`X zv1`c|mM*oa&{8hCMEJa)0x1npI&YZRE+3vlfM=VV-SgFrc2bH63BwZ*b~fL5!%cH` zQHr_wp-JQg9{B-@7gWS6Tk3R;x2M&OI4HHo7}mhF_i+K7ZUz)&TMI^}O8oEd)d_k% zmoHP2+lW%zYa29#Bli&}*1@TyH5;f~0je(kLM2}MV-e__dDl05De^BPS204;8hdRI zoKMRi6SB{(Ty-Q`eRB)v=R1{TerzA6?y;L+!qCiBmXDp5m%bLh)t8nrOrN{ z*8*b4Z_V1{(Ci}&EMsSv>$~jiWnqM@s;fhsH)D8e`ti0KHc!bRWUj>D-IUUrE><-C zxi+=jWYg+%!&WMPn^c~8uW?1>;&Pm7-XAxGveK^A@{?^}4G;T&VxARJ`npKU9{v?o zTCnNxmw*T9-0T`+(;ld6+lwScd4iu|`N85M_L}F1N8*<6SQs2Xjx6`ci>~=E0X!}W zm-{Z&;9xa4UmnzQ3E3vcJnB5$F)kQ>?iADEeaGN7x9{3woM5H9X0o<%r1Ng7_{0_Z ztwHcWJzghsIT_^^mWnDGMpN@{qKoTxa^2_tDr2m~f)lHmG~DIqJoYQ)nS7dA#Sa}* z=-e&@@J5mv?rm>(P&!37W$mk!3e$*~5f^9Xbs3;(PhL zbT91xtxVUOH}YhCJrWiao4{)vY$E&vID5U7T|N|VqU8$!2@ZzeW*a!&cn?MTqWF{~1uHOV+p;l*#)QWy?to6j|lRm~2V z4AqSHF*U>Y5CXot0gqaC?f(8f0qbV?pUx={K(6*`-^Qs!@)P3Dm|gNwBT%R4 zT&s{EaDxcOii>g~_fU3vAc zX~u}>CC8=uN3$uClF_fWxM3;uX&3>yoE&{cLJ}Pzft%<;vQqVkwp1<> zHdMhutSh=(&6LBOw4vgH)9n;v};;P!Y0oxMvWR$BeEJ-(7iNL|R4T5@E*HEb6tI}Of1 zKcqV5$95CnQ_Onfx*hw84rn>ESUO6twldXEl~Hz(&&o>tvDZgy`Drk=9GS9`yR*|9 zvSZgwMg6Dj-he0$%f?r1@tV|t3_-tfH2pQAuj@g_?&~g{!O(5Fv*W3Q!LFhU+*y%g z)hq+!GqMM`ld1_%orVhT(O?^efJ-J?~@avVk#O-*?aQ{M+ zjdlSneoWvYP-K-p!4CaL0Q&&7|IK^TM}va)Nf9pzx@d4O-_8jY*3z`UZKKVQRqyWz zb|dP=iSU#WDOxi14M8P1ICCN@ySUXTYsNdPW>GDsey_;FGrzsPhq=vFbFAH|iPl6O z6ZuFOhmq7r(Ee$>&PDLoLxu@on1}RqojudwgID1r&mYJz2|`AlEK37f%QN)kVfm@% zx;h%Gr<0Fs6+3tR)Jt_O%4@sm$<;*`FY}h3`vf1sJ~g);{W38+u;nBGA(HU~zdo|u z?`5HfBozWUe(eytW!jx>$F>L~rEoAXOAf%%j;YLWy4)UsLy#^1II&HFj*gx$pNz8| z_KB1|-m2gNu?rO+BqTdc{rATyNo1T_+amx-&S5$kKK%k{IS4I#4>JWvv zZ{&20hP>TZ1lN3@aVJQ7?^z!0#*In;9+tv$r$>*JkSU_xN1AzIN+m1w9CH z4XiuO;E4SP9jt;9B29>hMf}KWd!xYCqb#lxBpI79rS!NHaQ?w09fn=l9SY^)sU9<* z#(VCR+g)q`rW?xaeYcdxS)1Tf$r*AqLBs{jGl>9KvZiJNa`J(+#;<0R5VJy{A|Ige zK>j{?|MDR$%xf(qFTp9FqFe55OX*49kx33yVlrT9U?CM+g4*y2yG!TdN1SbME3oTy`Aw~B zI70Bx#VgdIL9TtBs?hG>S*kO;qeDE8d^9jH$Y1k(bAJN7|1>L#x#9^y%n?5{@X$fJ z#56vF-Em>rXige*tDwZpcktS~`cL1v+FN_ov61oTpE+n@|Wkf#W8cTs|q~Y}V%b z&GM7BOw7zQbPNoXpGd{9kVw)-=XSOL%~VkQ)cbEP;Ru@?V}Je-LY2dq=;~%8KU2^1 zB|T?>ZK^y~jDX0wQo4%da;*WuRWS8#;&v+${bC0zeRG~J zHv{Yj3>6ad%fjT*)<;0xni=eIMfAlrf`cI()wXsXhCf z<*u)<7p}S_n_5#m1#nxPZASSGwBqIF)jMVidd{h^GqIG3nm7zyyTa*u1~wv|gy3-iqsOWkZIS11P7H~7Mzah1Y?5U+RwtA%8YNIU?TF-60NkeRSM0f*dBp4ZSydHgTvPK9ZYhY5uxv4uH&m0Y<>?SCCld_y$rlr5% zZ}+{aqrq;_K{(gA-k@%9wj4Y|Om=EkHc^`Wrlj;h6%1oA%VYF3Sx2>4*CtE=I%)Ec zx32>{)(`oHBQ2ll(F+6&iC2(Zo3XJ4v4LSZk~fD$W^T0X;^LzAUat3DHpkOvUV2BK zN^lrzqa!2cWjsqjYF$Y+Pewil{TNVGJaar>|BY{lr7H>N6XK45*76&GSp&rnixoK& z2uRlbyTvsGww(YhJDp|emXvP zYHc<;Se~1m#Tw~1()W?<8B(irnz`Do(LgqpzWq4gZ}1~8Dt&-Lj!8vbiYySwIwSoE zh!V4qM{p!5oax7wXhacVCdnDt~W+K?{|EdoI*QU+@>4K>*;A7mN(L* zk4XDG*x_2iHC!ME@gr2~M2`&2-Pu^bx#BWbLAcy%yAr2Jv0*gJj;lP!J_Va?C;&&rgc^_EPsnMAqr99nWxQarL3W!cl&kU#q6E4$H@_{qfh; zTg75K3Cf>+@o+C^4Nib>pF`QpnPc_cjt7y{Y6|@ zaCH&%KSfUzkVf>q+uKxRC@hw?@3WfmQ5%s!Dll4X)KE&&la-E6NlsR&w0GwzSwK!h zR(gHsA^G&@F)YTb$nz?@x2bwiIj+`P-i%A&4?UP!2|bs4dhSDr<(R@MsCd)|q(Xq1 zpIs`x2(5Q>Fhv@Zq^P1&NHqH+ev1vs_%rz7WD}|%%q)LaBt|r62|Y+2!5RQms=|gs z9b%G<_(G?94oDzwm;b`!jOA6?*Icx_pSF{lDUt?{&HdWwh69ej;amKO*Chx9kk1cl zicigCfD-zvDh&uR7ju)vMqP-v)tL>*FrX_d$~sRW6bmH9*0Ca5Z2U+UMI>|hToCpV zH1ectx$6*+V6IO#OCav2xu>hNj-2^VR>_PT0qsdie#gwdk84s3w=94w3Jux%^IN~k zLUfP=`ix*oS1^SrIxS!oea`#PC)P?l@;c*ZzN~43SY09B`niS$aE+1>>p#P*dY!vIw0FyF26+&fI z$*azplpPn?(>1Z|+vITX6JWc6KFJ3tMmx~F9)ATXC1}OS1Xx!zMG~qk35gM%hRjm) zG&1F}T@+3?l`@0f9etUFqyYtP>`-VMa(M=r!C`*hBz0&qVRYIMOQI)J^|E#>o1ExP zPzr#FqWD=NB=nM8pdHbwDj&RlG`1uVH?P338~B6B77F^rh<`fcDTl4I=nv&*$Ex5v* zoLF7uJ^@O41*B2NT&8hbdn+rEm*bi-t#K2@KEP#&%P53wYHEtjKOp4fH*DNZcUn=A zN!jc9kCn0*jZ90N`4D+Xs{IAYbW6l}c1`QiNhEx;QM;z8Sg4CCN~Ho@e{(4wyIkso zAo`QDwp9&X!O4QFX;HCFAr~snS#FRSg}eBkDzwY0J$oJ#%P~MYa64MM9qp*5a?$zD(#L?Kod+dq zq4Bam$#mhitL}Sgv34-XBn=>1Ex=EfRLx}>l{1DpSy))&Ye-pfu?!3iF}vQf2n@M6 zh5ve9$5EgV5ZBVoNDKEOD&$empOT74x(4Gf;Sa^^&v??SYn5Cqgo~0C2(q*|n?zUI zJfg*d;N&R^7=pa2?ORqATFQON(GlP%EDGSB#kfAZ8`RUriK!^gdT{y1SuEspFj+hz zDW#Va>k?)FPv&Wqby4BEp@pG^WS!|;=pl<+@^=FH?Q*jU=23`$DoJMWGApzvT>9cY zizkp$7-c|DXwz0_c?-g)zW??AmZ1cX6?Cto7ehY02K1+u)|FJC>8e`f&#tp>JI0te5Rm{%fyE|XQ}S#Z+CPE6lyf< z-xwLGv;pBs?e*+fuN%rqU$E+$Ko??z)Ar*>q~g5nG_8T&BtN4#&oJA z6U99f6B8;v0zY=6U{i&<5)1CNStXiqdT>goa*zAl+e^1}f9EFMuLqtMIUx^3=2H!G zY1aTlogyBU+XYD?E+HfH-fecJ@z)k9n}9RWs+BtqfEQIfhM2M!?lc+f&WVE}OJb-x zTx1JOGE7f-WYT*vA2&d#{cpsnFI{%XJ5o6y)WH zMyNwWVnq;HM*2_dbXSF=ZNgQL#9dNC8$>lex~c~JGKMXWtfZiQltvD+bF|o*g&~6- zz3AvW-iPM^-8}iPWh&+e5ENO{10jO0QlU^Z*k;!| z3w2okm{JVDTi6R9IfP7A=Gz1jBtlhIeVRIl{bB6b-j)A4sF?(wl7hmymgmdO0i{wY zD<|MDoV)l5X6w-LWYK;Z=x(r&>v^A7J_B+CE1bZS<-}f*^%Xxhc^l{odajP|mYKHW zg%2w#_72}&U+Y8l*x1-iBgy(4C1TXzT4gIB&3qd&vw`C~&F!9vIQ2C$DcW}UWKWUk z!z=&;BW0aZ+n6ZKPc!8{A$)hY<`QYW-8~L{P=c_NDU&|(TiVgeQ_d?0bTTOEz42;?ARyT2LzNoz1!f`n@3P#^I#*$wt zs`yA)))!N8X8dtplg+jT)k0?Hj$T=z(1~@H;M3v z_856#$BG>knZv8kWH6Li-{|*bi4k;@A+HkEwWQeV%wI^S)y0|nyWAOu`q>bLPG4Wl zq(Jh5lk!So4`Tc(lu(e;xh^3L3@wD}EY{SkmOf>S4oMZjooVz8_)~?my2r<($mt?J zEwCf$zKq$27J26wdUx8@iox}35@S;RSmcjR#m2T^3@BLHcE$~R zmvHFmZ6P6iNBe?-QRNxsHz+D9dTJH9rt%R#={dE8c31#3ESOi5wITcq-R2<>L?EV? z<>cg+fg#l^2y1VzZ$CY@2EkTu_}7%}!$S(k-JGM@>-i4PH&MLLu==-zXrZvSwzh0S zq{A-FZWbmcqTNMtOUnC~peVb$J3Aj8CyH0WK|zkVum!74+rshc_1R>Tlai{=J}Gh4 zJ~CaSyuwV(l|0%5b_u0~sL(e+P=D|98B(Y4&_cUr5rq$P+BZ|n3nn$|MKt6#cJo_< z5dEq>a<#=0Vs+}NV~S;5o4^-Z3sL7)Ph(1aWP#s;zLR*2j*U;=(||eN*V zz~8}_n%yL03knvL+v!hYqu(eut~x4zZJfenyr_1$oc!`@`+FaZzkrvgt%&<`HIigd zjdeyIPTPW`E}MKXINRp?4d!}TeI2WE2*)ZzFJOwkZ6JFwF-G>*NptCP4Fv@&#qT$T z1uvN79w6x-xza{P`MV_JNN|V$@F53lIxG~Tu=HAaObKVDF5uF9A)TK27MVL+2zkQp-6FWPgg+-1o@*l3ld2_kW7^V+Df=~piNUm=l?#9 zA0LOx45|*Oz_T910&HXj^Sz=QYwIjl9v_YuY6Ogi6A>Z0u%r@b=@}#XoFc^PB1My@Gzn9OG5ya^J6m6_u5lI{6Y2%{I&S2gAusKHphz2nck=SuN!uFU1@rE^n`TC2a^HYtF0Q z%<}eLeJvn4iKxzt^^?sV);Zo^(jXYztUOoRTy_InJfOeoKKLQ0ZS5=5u_5@YC^6!o zned0Pd0D)Z$_fV4oApAGaE_KGltnE4p0?tNh_k4~PuprEY!0UB{t>2Co$m1zEp4|; z5k;)wIU4VR7^CoE*ro}2^)@kp8WhX>(8ixo5ggqJzLr?gezJdcqU>1LlNIful5s+e zG(c%DLL62J`PZAzt4DNx{c7+~z5bix@J2O5c0}DidXG*TTeGz&3VE&I-c9fDc1G_q zyL)~wm0)l_sPB?}Tc7iKCEMOe2}kq`zvu6?NBNPgp0{kl|I($o%}PAqktztK$I|7n4MwEija6LGdy6Qp{?yeMu%h zh(36OS#*vts}Px2L)21`>|m}MENz=J*=tLGO=n6Uzw-dvI!c=LW3rvIWW>YGbi(l0w*_U0I=zZ`?epkqM$J%{H-z zbXGvhC9pA?%t-R@GnGg$Xi!+`wj5pjn>bh>O4{9dykG1EfD~G-cYXbEy;C?iCI<)t zlr4M1r%#`_HGz2|F2e1-XI@_3n!dh%si=g+a%Q9Nx=fdTZn-U`b=)%mF_HT7I^_q2 zEamFt)Xm3}nhihMAp*3OtMvNFtU^-7b~R!~78ckZ4rfX_yc=C;uL;knC@6~AAUU3< zbI$-tK%i^gek0^ADHqsV*U(@DWymXNRxB`8vZ~O@q&l8MS>UTa+XQ1SS}?HW_#`40 z+hfOx97E91uvU7>=X)smS-nV{cWs(3?DE5Lgom=r|)nc0EX*k*^<-}7%hKi z0WxObn>iWPkGJP0Jz^zd^X!d2VA)Zvjk%4y9#R=WK;I4|LD+>5zeUvPu$bAh18=;w3rT_CeP zO&u`5O8xkR`oV>mn|t*hz&Mwq(`cMKpRe=TTJ_s0+ZDN8Zi|lle1u_tz8s>Ru^9o& z62yiiYv_{wf`EYF4nU1cD(~{N#{q)ZXB>Kck!wKP7x{pb)AV~Leyb5X8(WoNEFKE; z)X%tP)uo%2hEu~dZk7+r;Hqzyae}?I2qZ*F`e~bRJLVJZBLeQo$Z^?}D;nl{sc{}< ztd+^1?$PUbJZ*#ldY$TJhUdp!EqGW8aj~1?$e@zvVO315y@W=On2x6>%RrXzn>TIw z!+HhD;zGJo1|JZm*~4*dC%1eXZ~>G}9N8$-MM4-gFgNZivKwbnqRu9InciapIqZQh zD2joHX?B!yyBPI>M_H?QZ*hn&pDzgjz?bQeN)BdbB~iw;R%hGUH>i+Oy0E``44G9( z=eIEVt7_GJ?VM&<5D(4N{moPzb^bQ%HA?6%P?&h7DOqL z?(S}p?(XiAmhLV=knZlz2Ohc`X^`$ly1Q%N&Wy9?TkoFzt^H3I^26)C;yjP@2$_hK z`sC_LrROIWM3FdDQ(wJ>GlY7&gI@31<;SSxoEV8(*&+xQ=<)Dr-`?VFlL8fz#&7j7 zM;lQ zo?kTx=K?OT*gxLCoc+RQF&pl1SsmT( z|7J*MPU_{UZVYYVzhSM3XbWr$z$sVUjkHk&Nq%YJn_fAj+;-l~%~Znmb;Di8 z6!)7l#vEE$N%CJi-rByl7ZNgoc0JP1%h3m5ivltcl?8DZF&0pytpK!Ib14*$u`t`E zt@s3qloEd$a%6_h8dBqwV=w7{{qz8)8ZHort_UO>O&tSp(rJ8Jnk7VT;T8h!=YYoM zW(%jw_~6pyjX=RGfIb-c*?gthIpHHKKveg~Ww&us^0NQJ=QRMTZZqVTA@%zqAdr-y z{b$(W`zHw((D2FvVUxoesb==}RlNX*w7l8%6pRKJ56(OIYHj^YlZmCm!pa)wPvtlU znC@W;4A@;X$N@LYLO76Kg4bwpqBbM1JOKTdiU255^(p+mKK-dz zOXEw63k&E>b8k)qEjVR_cp+*s7&5s5?^}WVvF1nD-#xJMy6K=oM+e~ThR-aK%rWE! zkoywSy_vVVROkkRi=A4X)W!5;qm%cCX-1r?rVCNnDQI42r~KD$?+ts0P;$oO1HP+| zs3&}`tuunH+`i67$^6t&*~Levf_sR9iJ>`g&m`xTh;jeEzMgJ^KTpF&>**;l%aA}) zeQ#f~>4NRo)DByYg_RLu7RuwCSo$W-Scg5x@}XUr24AUZu{aJIQKIs}YNk}RjO)1a z2wSud71pp4370rj=xAOW-yhDzb~mN^en`T6fs+eGQ`(^1kY$? zmh-mgx=<{w#5#p8g90&diT}?W3E=hLBl4r5%q0_IfceFZ;X`Cnj*mxV{U?C6J+)m7 z2_<=(>W^p~c|2(-?FKle9>NB1&021BjQrvXw7QAG^}uMoR`Ly0H{EV8kZTP}y{Z^$ zQqAB4+1aQT!ABf?%VrE(cmq{{V%l7|dpK9ofs2NA6|jKFu^Gt+AX;x(<)<8fS1tkD zs)}ebnHk{NLY$?}NZgg~-?5dPuCI5Z#P}6wOkIa_iuw5PAqw?CvtBw~s#w2PH6{q@K4fYUz&fMOwuZAKJ^R2BJWW zSEJsQQBnmCBR#!|H$RaH+X4v*iN@)5o5!``v%W%HdlmiP4e>+bTQGXoYKx4u7H8Jt z9~km#(tw7VAw52vtTkdY$pR1_2D+^6OJ*k&`TXX0M3K( z+3Jp>f&vjLyniR)y_{y-4w1t@2M+}q$t{r(C4}b!w4R?6FoIE&RzT_%^+C5w&L<}) zCJ7DTSEa_!8YEIkqxH1(^t`r^B)qCMj{vuE2@@Ti`Z+77)W>`07MMr^RV=IbK4<4z z+>>|KsAaMEoIC63mQMR(QR)46D!S#`CdP)Z;L^T`*7Vb@0hIEoVRGLw#x?CvIWsr1 zEwbLuX}Ti~{4yb$^+Hzs*}lcQzXNaYz;bl#MjoAEs>F#{edR9&33L7M zfI%Xxk)aGK`wO2CbC#T=H($~4!C`84|1J*>mWrDX$E(IxlJuGq9b=Hf#Rh!R6~cV& zORk}&^Q6dLR%+@H+J)4Hr?8dtL-*&un+6BoPnxnpnVo?^MJuu{f^>VL4BfE;Zf*_T-@Jq+oyG-6{%@SD?Y%(kMg#snm;7|JghuhvX#9ZN0a>3a>xef(|WKehQ z^lOS0V=si;gc3f#E$7n$6X-1=0`C{fYMVnK16>l;5?+lLrkg;+=!gINB18DznWtDG zPc=3W@B7B0%Hv)SbfT;I9uL8Y9A~7uRp(W%LeO@K-VI|X@ECBilq{i+ zhn{+Vcs@Hu1`+6%-fkqEK>hP9;8RAQO^ubaMrOr6-(?q#p+cW5GzXm?m0jLmIOEaE zA;Nx*5NHdgs;Q~D2W;BQr*+>UzqOx1hYQ4MDN9L913AUBe)^=M*~i8=_`R~#9(c<> za=M=A*fxJ`>}UeGubwa5r>)9{wzgU1C?OvJ(E*;ohc39a=aZIGg7;mCFMxuW7<1}d zZHach5lTzdsa;Bm4D;|G%hvELszhpZVo6IkGdm@S{bhXMH*`xo28 zx9tGW=<Kw?S{;b)s<@tQKwVzow_O>c&9u&?o5cWx+}i_3qghq1bz zu9p2$W|A}-Qur$kJ=Mc4KGAIFEKHB5VT8wlhv;%d^nRCOC;omkl6u5Rb=S*PJ%?|t zQbmg)w!?PHdWeN(B~v!-5_xR7Rbg$qRzf}t-(%4ci1C$+>+7GocHY;(J!G+-rK3Nk z*wv;=!2tK>pYh!@M~Fdpl34CX2GYU3J>cDxezNQ#Mu~PO@O`t%Dls zs35~VmWq?n?D`s)TZt(cYO?UEvzO(`wiS}?I)(#pyYc7;QlUxko%0WRr_|QgMvIO~ zI|@DZ?_-DR2MneXpyCDbAC-BbWwX(KidkB&JUs9W{iGDAkK-d>2Wkc^gpcvWXesjU znk8Pvp>WjBUmv9`PQ)##q0JcGeS~?clwsB~GD;@It?pxMSYx+#w?tMd*JTs9;W7RL z1mg5tjy`m0Qm<%{4wKgG@P1&>A9@x}Xf=7xgo#tq8DeGGy0sF$e^+)tcY0)D<^