Beispiel #1
0
def get_repository_working_dir(
    repo_type: str,
    obj: Device,
    logger: NornirLogger,
    global_settings: models.GoldenConfigSetting,
) -> str:
    """Match the Device to a repository working directory, based on the repository matching rule.

    Assume that the working directory == the slug of the repo.

    Args:
        repo_type (str): Either `intended` or `backup` repository
        obj (Device): Django ORM Device object.
        logger (NornirLogger): Logger object
        global_settings (models.GoldenConfigSetting): Golden Config global settings.

    Returns:
        str: The local filesystem working directory corresponding to the repo slug.
    """
    match_rule = getattr(global_settings, f"{repo_type}_match_rule")

    if not match_rule:
        return getattr(global_settings, f"{repo_type}_repository").first().filesystem_path

    desired_repository_slug = render_jinja_template(obj, logger, match_rule)
    matching_repo = getattr(global_settings, f"{repo_type}_repository").filter(slug=desired_repository_slug)
    if len(matching_repo) == 1:
        return f"{settings.GIT_ROOT}/{matching_repo[0].slug}"
    logger.log_failure(
        obj,
        f"There is no repository slug matching '{desired_repository_slug}' for device. Verify the matching rule and configured Git repositories.",
    )
    return None
Beispiel #2
0
def config_backup(job_result, data, backup_root_folder):
    """Nornir play to backup configurations."""
    now = datetime.now()
    logger = NornirLogger(__name__, job_result, data.get("debug"))
    global_settings = GoldenConfigSettings.objects.get(id="aaaaaaaa-0000-0000-0000-000000000001")
    verify_global_settings(logger, global_settings, ["backup_path_template", "intended_path_template"])
    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_allowed_os(data),
                "defaults": {"now": now},
            },
        },
    )

    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,
        backup_root_folder=backup_root_folder,
    )

    logger.log_debug("Completed configuration from devices.")
def config_backup(job_result, data, backup_root_folder):
    """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
        })
    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)])

    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,
        backup_root_folder=backup_root_folder,
    )

    logger.log_debug("Completed configuration from devices.")
Beispiel #4
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
Beispiel #5
0
 def setUp(self):
     """Setup a reusable mock object to pass into GitRepo."""
     self.repository_obj = MagicMock()
     self.repository_obj.path = "/fake/path"
     GitRepository.objects.all().delete()
     create_helper_repo(name="backup-parent_region-1",
                        provides="backupconfigs")
     create_helper_repo(name="intended-parent_region-1",
                        provides="intendedconfigs")
     create_helper_repo(name="test-jinja-repo", provides="jinjatemplate")
     self.global_settings = GoldenConfigSetting.objects.first()
     self.global_settings.backup_repository.set(
         [GitRepository.objects.get(name="backup-parent_region-1")])
     self.global_settings.intended_repository.set(
         [GitRepository.objects.get(name="intended-parent_region-1")])
     self.global_settings.jinja_repository = GitRepository.objects.get(
         name="test-jinja-repo")
     self.global_settings.backup_match_rule = "backup-{{ obj.site.region.parent.slug }}"
     self.global_settings.intended_match_rule = "intended-{{ obj.site.region.parent.slug }}"
     # Device.objects.all().delete()
     create_device(name="test_device")
     create_orphan_device(name="orphan_device")
     self.job_result = MagicMock()
     self.data = MagicMock()
     self.logger = NornirLogger(__name__, self.job_result, self.data)
Beispiel #6
0
def config_compliance(job_result, data, backup_root_path,
                      intended_root_folder):
    """Nornir play to generate configurations."""
    now = datetime.now()
    features = get_features()
    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"])
    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)])
    nr_with_processors.run(
        task=run_compliance,
        name="RENDER COMPLIANCE TASK GROUP",
        logger=logger,
        global_settings=global_settings,
        backup_root_path=backup_root_path,
        intended_root_folder=intended_root_folder,
        features=features,
    )

    logger.log_debug("Completed Compliance 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 = GoldenConfigSettings.objects.get(
        id="aaaaaaaa-0000-0000-0000-000000000001")
    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_allowed_os(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,
    )