Ejemplo n.º 1
0
 def test_get_job_filter_filtered_devices_raise(self):
     """Verify we get raise for having providing site that doesn't have any devices in scope."""
     Site.objects.create(name="New Site",
                         slug="new-site",
                         status=Status.objects.get(slug="active"))
     with self.assertRaises(NornirNautobotException) as failure:
         get_job_filter(data={"site": Site.objects.filter(name="New Site")})
     self.assertEqual(
         failure.exception.args[0],
         "The provided job parameters didn't match any devices detected by the Golden Config scope. Please check the scope defined within Golden Config Settings or select the correct job parameters to correctly match devices.",
     )
Ejemplo n.º 2
0
 def test_get_job_filter_device_no_platform_raise(self):
     """Verify we get raise for not having a platform set on a device."""
     device = Device.objects.get(name="test_device")
     device.platform = None
     device.status = Status.objects.get(slug="active")
     device.validated_save()
     with self.assertRaises(NornirNautobotException) as failure:
         get_job_filter()
     self.assertEqual(
         failure.exception.args[0],
         "The following device(s) test_device have no platform defined. Platform is required.",
     )
Ejemplo n.º 3
0
 def test_get_job_filter_base_queryset_raise(self):
     """Verify we get raise for having a base_qs with no objects due to bad Golden Config Setting scope."""
     Platform.objects.create(name="Placeholder Platform",
                             slug="placeholder-platform")
     golden_settings = GoldenConfigSetting.objects.first()
     golden_settings.scope = {"platform": ["placeholder-platform"]}
     golden_settings.validated_save()
     with self.assertRaises(NornirNautobotException) as failure:
         get_job_filter()
     self.assertEqual(
         failure.exception.args[0],
         "The base queryset didn't find any devices. Please check the Golden Config Setting scope.",
     )
Ejemplo n.º 4
0
def config_backup(job_result, data):
    """Nornir play to backup configurations."""
    now = datetime.now()
    logger = NornirLogger(__name__, job_result, data.get("debug"))
    global_settings = GoldenConfigSetting.objects.first()
    verify_global_settings(logger, global_settings, ["backup_path_template"])

    # Build a dictionary, with keys of platform.slug, and the regex line in it for the netutils func.
    remove_regex_dict = {}
    for regex in ConfigRemove.objects.all():
        if not remove_regex_dict.get(regex.platform.slug):
            remove_regex_dict[regex.platform.slug] = []
        remove_regex_dict[regex.platform.slug].append({"regex": regex.regex})

    # Build a dictionary, with keys of platform.slug, and the regex and replace keys for the netutils func.
    replace_regex_dict = {}
    for regex in ConfigReplace.objects.all():
        if not replace_regex_dict.get(regex.platform.slug):
            replace_regex_dict[regex.platform.slug] = []
        replace_regex_dict[regex.platform.slug].append({
            "replace": regex.replace,
            "regex": regex.regex
        })
    try:
        with InitNornir(
                runner=NORNIR_SETTINGS.get("runner"),
                logging={"enabled": False},
                inventory={
                    "plugin": "nautobot-inventory",
                    "options": {
                        "credentials_class":
                        NORNIR_SETTINGS.get("credentials"),
                        "params": NORNIR_SETTINGS.get("inventory_params"),
                        "queryset": get_job_filter(data),
                        "defaults": {
                            "now": now
                        },
                    },
                },
        ) as nornir_obj:

            nr_with_processors = nornir_obj.with_processors(
                [ProcessGoldenConfig(logger)])

            nr_with_processors.run(
                task=run_backup,
                name="BACKUP CONFIG",
                logger=logger,
                global_settings=global_settings,
                remove_regex_dict=remove_regex_dict,
                replace_regex_dict=replace_regex_dict,
            )
            logger.log_debug("Completed configuration from devices.")

    except Exception as err:
        logger.log_failure(None, err)
        raise

    logger.log_debug("Completed configuration backup job for devices.")
Ejemplo n.º 5
0
def config_intended(nautobot_job, data, jinja_root_path):
    """
    Nornir play to generate configurations.

    Args:
        nautobot_job (Result): The Nautobot Job instance being run.
        data (dict): Form data from Nautobot Job.
        jinja_root_path (str): The root path to the Jinja2 intended config file.

    Returns:
        None: Intended configuration files are written to filesystem.
    """
    now = datetime.now()
    logger = NornirLogger(__name__, nautobot_job, data.get("debug"))
    global_settings = GoldenConfigSetting.objects.first()
    verify_global_settings(
        logger, global_settings,
        ["jinja_path_template", "intended_path_template", "sot_agg_query"])
    try:
        with InitNornir(
                runner=NORNIR_SETTINGS.get("runner"),
                logging={"enabled": False},
                inventory={
                    "plugin": "nautobot-inventory",
                    "options": {
                        "credentials_class":
                        NORNIR_SETTINGS.get("credentials"),
                        "params": NORNIR_SETTINGS.get("inventory_params"),
                        "queryset": get_job_filter(data),
                        "defaults": {
                            "now": now
                        },
                    },
                },
        ) as nornir_obj:

            nr_with_processors = nornir_obj.with_processors(
                [ProcessGoldenConfig(logger)])

            # Run the Nornir Tasks
            nr_with_processors.run(
                task=run_template,
                name="RENDER CONFIG",
                logger=logger,
                global_settings=global_settings,
                nautobot_job=nautobot_job,
                jinja_root_path=jinja_root_path,
            )

    except Exception as err:
        logger.log_failure(None, err)
        raise
def config_compliance(job_result, data):
    """Nornir play to generate configurations."""
    now = datetime.now()
    rules = get_rules()
    logger = NornirLogger(__name__, job_result, data.get("debug"))
    global_settings = GoldenConfigSetting.objects.first()
    verify_global_settings(logger, global_settings,
                           ["backup_path_template", "intended_path_template"])
    try:
        with InitNornir(
                runner=NORNIR_SETTINGS.get("runner"),
                logging={"enabled": False},
                inventory={
                    "plugin": "nautobot-inventory",
                    "options": {
                        "credentials_class":
                        NORNIR_SETTINGS.get("credentials"),
                        "params": NORNIR_SETTINGS.get("inventory_params"),
                        "queryset": get_job_filter(data),
                        "defaults": {
                            "now": now
                        },
                    },
                },
        ) as nornir_obj:

            nr_with_processors = nornir_obj.with_processors(
                [ProcessGoldenConfig(logger)])

            nr_with_processors.run(
                task=run_compliance,
                name="RENDER COMPLIANCE TASK GROUP",
                logger=logger,
                global_settings=global_settings,
                rules=rules,
            )

    except Exception as err:
        logger.log_failure(None, err)
        raise

    logger.log_debug("Completed compliance job for devices.")
def config_intended(job_result, data, jinja_root_path, intended_root_folder):
    """Nornir play to generate configurations."""
    now = datetime.now()
    logger = NornirLogger(__name__, job_result, data.get("debug"))
    global_settings = GoldenConfigSetting.objects.first()
    verify_global_settings(
        logger, global_settings,
        ["jinja_path_template", "intended_path_template", "sot_agg_query"])
    nornir_obj = InitNornir(
        runner=NORNIR_SETTINGS.get("runner"),
        logging={"enabled": False},
        inventory={
            "plugin": "nautobot-inventory",
            "options": {
                "credentials_class": NORNIR_SETTINGS.get("credentials"),
                "params": NORNIR_SETTINGS.get("inventory_params"),
                "queryset": get_job_filter(data),
                "defaults": {
                    "now": now
                },
            },
        },
    )

    nr_with_processors = nornir_obj.with_processors(
        [ProcessGoldenConfig(logger)])

    # Run the Nornir Tasks
    nr_with_processors.run(
        task=run_template,
        name="RENDER CONFIG",
        logger=logger,
        global_settings=global_settings,
        job_result=job_result,
        jinja_root_path=jinja_root_path,
        intended_root_folder=intended_root_folder,
    )
Ejemplo n.º 8
0
 def test_get_job_filter_device_filter_success(self):
     """Verify we get a single device returned when providing single device filter."""
     result = get_job_filter(
         data={"device": Device.objects.filter(name="test_device")})
     self.assertEqual(result.count(), 1)
Ejemplo n.º 9
0
 def test_get_job_filter_site_success(self):
     """Verify we get a single device returned when providing specific site."""
     result = get_job_filter(
         data={"site": Site.objects.filter(slug="site-4")})
     self.assertEqual(result.count(), 1)
Ejemplo n.º 10
0
 def test_get_job_filter_no_data_success(self):
     """Verify we get two devices returned when providing no data."""
     result = get_job_filter()
     self.assertEqual(result.count(), 2)