Backup Configuration
+
{% render_field form.backup_repository %}
{% render_field form.backup_path_template %}
{% render_field form.backup_test_connectivity %}
diff --git a/nautobot_golden_config/utilities/config_postprocessing.py b/nautobot_golden_config/utilities/config_postprocessing.py
index cc8600735..0d49444dc 100644
--- a/nautobot_golden_config/utilities/config_postprocessing.py
+++ b/nautobot_golden_config/utilities/config_postprocessing.py
@@ -57,8 +57,8 @@ def get_secret_by_secret_group_name(
def _get_device_agg_data(device, request):
"""Helper method to retrieve GraphQL data from a device."""
- settings = get_device_to_settings_map(Device.objects.filter(pk=device.pk))[device.id]
- _, device_data = graph_ql_query(request, device, settings.sot_agg_query.query)
+ settings = get_device_to_settings_map(queryset=Device.objects.filter(pk=device.pk),job_name="intended")
+ _, device_data = graph_ql_query(request, device, settings["intended"][True][device.pk].sot_agg_query.query)
return device_data
diff --git a/nautobot_golden_config/utilities/constant.py b/nautobot_golden_config/utilities/constant.py
index f1f5db283..371353e3f 100644
--- a/nautobot_golden_config/utilities/constant.py
+++ b/nautobot_golden_config/utilities/constant.py
@@ -27,3 +27,25 @@
raise ValueError("The `jinja_env` setting did not include the required key for `undefined`.")
if isinstance(JINJA_ENV["undefined"], str):
JINJA_ENV["undefined"] = import_string(JINJA_ENV["undefined"])
+
+JOB_FUNCTION_MAP = {
+ "nautobot_golden_config.jobs.BackupJob": "backup",
+ "Backup Configurations": "backup",
+ "BackupJob": "backup",
+ "backup": "backup",
+ "nautobot_golden_config.jobs.IntendedJob": "intended",
+ "Generate Intended Configurations": "intended",
+ "intended": "intended",
+ "IntendedJob": "intended",
+ "nautobot_golden_config.jobs.ComplianceJob": "compliance",
+ "Perform Configuration Compliance": "compliance",
+ "ComplianceJob": "compliance",
+ "compliance": "compliance",
+ "Execute All Golden Configuration Jobs - Multiple Device": "all",
+ "nautobot_golden_config.jobs.AllDevicesGoldenConfig": "all",
+ "AllDevicesGoldenConfig": "all",
+ "Execute All Golden Configuration Jobs - Single Device": "all",
+ "nautobot_golden_config.jobs.AllGoldenConfig": "all",
+ "AllGoldenConfig": "all",
+ "all": "all",
+}
diff --git a/nautobot_golden_config/utilities/helper.py b/nautobot_golden_config/utilities/helper.py
index 675081cf5..d2e538b26 100644
--- a/nautobot_golden_config/utilities/helper.py
+++ b/nautobot_golden_config/utilities/helper.py
@@ -173,7 +173,7 @@ def render_jinja_template(obj, logger, template):
raise NornirNautobotException(error_msg)
-def get_device_to_settings_map(queryset):
+def get_device_to_settings_map(queryset, job_name):
"""Helper function to map heightest weighted GC settings to devices."""
update_dynamic_groups_cache()
annotated_queryset = queryset.all().annotate(
@@ -189,7 +189,16 @@ def get_device_to_settings_map(queryset):
)
)
gcs = {gc.id: gc for gc in models.GoldenConfigSetting.objects.all()}
- return {device.id: gcs[device.gc_settings] for device in annotated_queryset}
+ if job_name == "all":
+ job_name = ["backup", "intended", "compliance"]
+ else:
+ job_name = [job_name]
+ settings_filters2 = {setting: {True: {}, False: {}} for setting in job_name}
+ for device in annotated_queryset:
+ for setting in settings_filters2:
+ is_enabled = getattr(gcs[device.gc_settings], f"enable_{setting}", False)
+ settings_filters2[setting][is_enabled][device.id] = gcs[device.gc_settings]
+ return settings_filters2
def get_json_config(config):
@@ -314,3 +323,12 @@ def get_error_message(error_code, **kwargs):
except Exception: # pylint: disable=broad-except
error_message = "Error Code was found, but failed to format message, unknown cause."
return f"{error_code}: {error_message}"
+
+def get_inscope_settings_from_device_qs(queryset):
+ """Wrapper function to return a queryset of GoldenConfigSettings that are in scope for the provided queryset."""
+ inscope_gcs = []
+ for gc_setting in models.GoldenConfigSetting.objects.all():
+ common_objects_queryset = queryset.intersection(gc_setting.dynamic_group.members)
+ if common_objects_queryset.count() > 0:
+ inscope_gcs.append(gc_setting)
+ return inscope_gcs
diff --git a/nautobot_golden_config/views.py b/nautobot_golden_config/views.py
index f055bdc3c..70cffba76 100644
--- a/nautobot_golden_config/views.py
+++ b/nautobot_golden_config/views.py
@@ -118,13 +118,16 @@ def get_extra_context(self, request, instance=None, **kwargs):
context = super().get_extra_context(request, instance)
if self.action == "retrieve":
context["device_object"] = self._get_device_context(instance)
- context["compliance"] = constant.ENABLE_COMPLIANCE
- context["backup"] = constant.ENABLE_BACKUP
- context["intended"] = constant.ENABLE_INTENDED
+ any_backup_enabled = models.GoldenConfigSetting.objects.filter(enable_backup=True).exists()
+ any_intended_enabled = models.GoldenConfigSetting.objects.filter(enable_intended=True).exists()
+ any_compliance_enabled = models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists()
+ context["compliance"] = any_compliance_enabled
+ context["backup"] = any_backup_enabled
+ context["intended"] = any_intended_enabled
jobs = []
- jobs.append(["BackupJob", constant.ENABLE_BACKUP])
- jobs.append(["IntendedJob", constant.ENABLE_INTENDED])
- jobs.append(["ComplianceJob", constant.ENABLE_COMPLIANCE])
+ jobs.append(["BackupJob", any_backup_enabled])
+ jobs.append(["IntendedJob", any_intended_enabled])
+ jobs.append(["ComplianceJob", any_compliance_enabled])
add_message(jobs, request)
return context
@@ -283,10 +286,11 @@ def get_extra_context(self, request, instance=None, **kwargs):
if self.action == "bulk_destroy":
context["table"] = self.store_table
- context["compliance"] = constant.ENABLE_COMPLIANCE
- context["backup"] = constant.ENABLE_BACKUP
- context["intended"] = constant.ENABLE_INTENDED
- add_message([["ComplianceJob", constant.ENABLE_COMPLIANCE]], request)
+ any_compliance_enabled = models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists()
+ context["compliance"] = any_compliance_enabled
+ context["backup"] = models.GoldenConfigSetting.objects.filter(enable_backup=True).exists()
+ context["intended"] = models.GoldenConfigSetting.objects.filter(enable_intended=True).exists()
+ add_message([["ComplianceJob", any_compliance_enabled]], request)
return context
def alter_queryset(self, request):
@@ -407,7 +411,7 @@ def setup(self, request, *args, **kwargs):
"device_visual": plot_visual(device_aggr),
"feature_aggr": feature_aggr,
"feature_visual": plot_visual(feature_aggr),
- "compliance": constant.ENABLE_COMPLIANCE,
+ "compliance": models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists(),
}
def extra_context(self):
@@ -431,7 +435,7 @@ class ComplianceFeatureUIViewSet(views.NautobotUIViewSet):
def get_extra_context(self, request, instance=None):
"""A ComplianceFeature helper function to warn if the Job is not enabled to run."""
- add_message([["ComplianceJob", constant.ENABLE_COMPLIANCE]], request)
+ add_message([["ComplianceJob", models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists()]], request)
return {}
@@ -450,7 +454,7 @@ class ComplianceRuleUIViewSet(views.NautobotUIViewSet):
def get_extra_context(self, request, instance=None):
"""A ComplianceRule helper function to warn if the Job is not enabled to run."""
- add_message([["ComplianceJob", constant.ENABLE_COMPLIANCE]], request)
+ add_message([["ComplianceJob", models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists()]], request)
return {}
@@ -476,18 +480,18 @@ def get_extra_context(self, request, instance=None):
context["dg_data"] = {"Dynamic Group": dg, "Filter Query Logic": dg.filter, "Scope of Devices": dg}
jobs = []
- jobs.append(["BackupJob", constant.ENABLE_BACKUP])
- jobs.append(["IntendedJob", constant.ENABLE_INTENDED])
- jobs.append(["DeployConfigPlans", constant.ENABLE_DEPLOY])
- jobs.append(["ComplianceJob", constant.ENABLE_COMPLIANCE])
+ jobs.append(["BackupJob", models.GoldenConfigSetting.objects.filter(enable_backup=True).exists()])
+ jobs.append(["IntendedJob", models.GoldenConfigSetting.objects.filter(enable_intended=True).exists()])
+ jobs.append(["DeployConfigPlans", models.GoldenConfigSetting.objects.filter(enable_deploy=True).exists()])
+ jobs.append(["ComplianceJob", models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists()])
jobs.append(
[
"AllGoldenConfig",
[
- constant.ENABLE_BACKUP,
- constant.ENABLE_COMPLIANCE,
- constant.ENABLE_DEPLOY,
- constant.ENABLE_INTENDED,
+ models.GoldenConfigSetting.objects.filter(enable_backup=True).exists(),
+ models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists(),
+ models.GoldenConfigSetting.objects.filter(enable_deploy=True).exists(),
+ models.GoldenConfigSetting.objects.filter(enable_intended=True).exists(),
constant.ENABLE_SOTAGG,
],
]
@@ -496,10 +500,10 @@ def get_extra_context(self, request, instance=None):
[
"AllDevicesGoldenConfig",
[
- constant.ENABLE_BACKUP,
- constant.ENABLE_COMPLIANCE,
- constant.ENABLE_DEPLOY,
- constant.ENABLE_INTENDED,
+ models.GoldenConfigSetting.objects.filter(enable_backup=True).exists(),
+ models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists(),
+ models.GoldenConfigSetting.objects.filter(enable_deploy=True).exists(),
+ models.GoldenConfigSetting.objects.filter(enable_intended=True).exists(),
constant.ENABLE_SOTAGG,
],
]
@@ -523,7 +527,7 @@ class ConfigRemoveUIViewSet(views.NautobotUIViewSet):
def get_extra_context(self, request, instance=None):
"""A ConfigRemove helper function to warn if the Job is not enabled to run."""
- add_message([["BackupJob", constant.ENABLE_BACKUP]], request)
+ add_message([["BackupJob", models.GoldenConfigSetting.objects.filter(enable_backup=True).exists()]], request)
return {}
@@ -542,7 +546,7 @@ class ConfigReplaceUIViewSet(views.NautobotUIViewSet):
def get_extra_context(self, request, instance=None):
"""A ConfigReplace helper function to warn if the Job is not enabled to run."""
- add_message([["BackupJob", constant.ENABLE_BACKUP]], request)
+ add_message([["BackupJob", models.GoldenConfigSetting.objects.filter(enable_backup=True).exists()]], request)
return {}
@@ -562,7 +566,7 @@ class RemediationSettingUIViewSet(views.NautobotUIViewSet):
def get_extra_context(self, request, instance=None):
"""A RemediationSetting helper function to warn if the Job is not enabled to run."""
- add_message([["ComplianceJob", constant.ENABLE_COMPLIANCE]], request)
+ add_message([["ComplianceJob", models.GoldenConfigSetting.objects.filter(enable_compliance=True).exists()]], request)
return {}
@@ -591,9 +595,9 @@ def get_extra_context(self, request, instance=None):
"""A ConfigPlan helper function to warn if the Job is not enabled to run."""
context = super().get_extra_context(request, instance)
jobs = []
- jobs.append(["GenerateConfigPlans", constant.ENABLE_PLAN])
- jobs.append(["DeployConfigPlans", constant.ENABLE_DEPLOY])
- jobs.append(["DeployConfigPlanJobButtonReceiver", constant.ENABLE_DEPLOY])
+ jobs.append(["GenerateConfigPlans", models.GoldenConfigSetting.objects.filter(enable_plan=True).exists()])
+ jobs.append(["DeployConfigPlans", models.GoldenConfigSetting.objects.filter(enable_deploy=True).exists()])
+ jobs.append(["DeployConfigPlanJobButtonReceiver", models.GoldenConfigSetting.objects.filter(enable_deploy=True).exists()])
add_message(jobs, request)
return context