Skip to content

Commit 9d6bc9d

Browse files
authored
Version 2.7.0 (#82)
1 parent 295d7c8 commit 9d6bc9d

File tree

10 files changed

+87
-21
lines changed

10 files changed

+87
-21
lines changed

.github/workflows/commit.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
strategy:
3232
max-parallel: 10
3333
matrix:
34-
netbox_version: ["v3.6.9", "v3.7.8", "v4.0.7"]
34+
netbox_version: ["v3.7.8", "v4.0.7", "v4.1.1"]
3535
steps:
3636
- name: Checkout
3737
uses: actions/checkout@v3

README.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![NetBox version](https://img.shields.io/badge/NetBox-3.6|3.7|4.0-blue.svg)](https://github.com/netbox-community/netbox)
1+
[![NetBox version](https://img.shields.io/badge/NetBox-3.7|4.0|4.1-blue.svg)](https://github.com/netbox-community/netbox)
22
[![Supported Versions](https://img.shields.io/pypi/pyversions/netbox-config-diff.svg)](https://pypi.org/project/netbox-config-diff/)
33
[![PyPI version](https://badge.fury.io/py/netbox-config-diff.svg)](https://badge.fury.io/py/netbox-config-diff)
44
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
@@ -9,8 +9,10 @@
99

1010
[NetBox](https://github.com/netbox-community/netbox) plugin for Config Diff.
1111

12-
* Free software: Apache-2.0
13-
* Documentation: https://miaow2.github.io/netbox-config-diff/
12+
* Find diff between the rendered configuration for a device to its actual configuration, retrieved from the device itself, or stored in DataSource.
13+
* Push the rendered configuration from NetBox to a device and apply it.
14+
15+
Documentation: https://miaow2.github.io/netbox-config-diff/
1416

1517
<!--about-start-->
1618
## About
@@ -45,7 +47,10 @@ This is possible thanks to the scrapli_cfg. Read [Scrapli](https://github.com/sc
4547
| NetBox Version | Plugin Version |
4648
|----------------|------------------|
4749
| 3.5 | =>0.1.0, <=2.5.0 |
48-
| 3.6, 3.7, 4.0 | =>0.1.0 |
50+
| 3.6 | =>0.1.0, <=2.6.0 |
51+
| 3.7 | =>0.1.0 |
52+
| 4.0 | =>2.6.0 |
53+
| 4.1 | =>2.7.0 |
4954

5055
<!--install-start-->
5156
## Installing

netbox_config_diff/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@
88

99
__author__ = "Artem Kotik"
1010
__email__ = "[email protected]"
11-
__version__ = "2.6.0"
11+
__version__ = "2.7.0"
1212

1313

1414
class ConfigDiffConfig(PluginConfig):
1515
name = "netbox_config_diff"
1616
verbose_name = "NetBox Config Diff Plugin"
17-
description = "Find diff between the intended device configuration and actual."
17+
description = "Find diff and push rendered device configurations from NetBox to devices and apply them."
1818
author = __author__
1919
author_email = __email__
2020
version = __version__
2121
base_url = "config-diff"
2222
required_settings = ["USERNAME", "PASSWORD"]
23-
min_version = "3.6.0"
23+
min_version = "3.7.0"
2424
default_settings = {
2525
"USER_SECRET_ROLE": "Username",
2626
"PASSWORD_SECRET_ROLE": "Password",

netbox_config_diff/api/serializers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1-
from dcim.api.serializers import NestedDeviceSerializer, NestedPlatformSerializer
1+
from dcim.api.nested_serializers import NestedDeviceSerializer, NestedPlatformSerializer
22
from dcim.models import Device
33
from netbox.api.fields import ChoiceField, SerializedPKRelatedField
44
from netbox.api.serializers import NetBoxModelSerializer
55
from netbox.settings import VERSION
66
from rest_framework import serializers
77
from rest_framework.serializers import ValidationError
8-
from users.api.nested_serializers import NestedUserSerializer
98

109
from netbox_config_diff.choices import ConfigComplianceStatusChoices, ConfigurationRequestStatusChoices
1110
from netbox_config_diff.constants import ACCEPTABLE_DRIVERS
1211
from netbox_config_diff.models import ConfigCompliance, ConfigurationRequest, PlatformSetting, Substitute
1312

1413
if VERSION.startswith("3."):
14+
from users.api.nested_serializers import NestedUserSerializer
1515
from utilities.utils import local_now
16+
elif VERSION.startswith("4.0"):
17+
from users.api.nested_serializers import NestedUserSerializer
18+
from utilities.datetime import local_now
1619
else:
20+
from users.api.serializers_.nested import NestedUserSerializer
1721
from utilities.datetime import local_now
1822

1923

netbox_config_diff/configurator/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,11 +177,11 @@ async def _push_one_config(self, device: ConfiguratorDeviceDataClass) -> None:
177177
conn = self.connections[device.name]
178178
response = await conn.load_config(config=device.rendered_config, replace=True)
179179
if response.failed:
180-
await self.abort_config("load", conn, response, device.name)
180+
await self.abort_config("load", conn, response, device)
181181
return
182182
response = await conn.commit_config()
183183
if response.failed:
184-
await self.abort_config("commit", conn, response, device.name)
184+
await self.abort_config("commit", conn, response, device)
185185
return
186186
self.unprocessed_devices.remove(device)
187187
self.processed_devices.add(device)

netbox_config_diff/forms/general.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@
2121
from utilities.utils import local_now
2222
else:
2323
from utilities.datetime import local_now
24+
from utilities.forms.rendering import FieldSet
2425

2526

2627
class ConfigComplianceFilterForm(NetBoxModelFilterSetForm):
2728
model = ConfigCompliance
28-
fieldsets = ((None, ("q", "device_id", "status")),)
29+
if VERSION.startswith("3."):
30+
fieldsets = ((None, ("q", "device_id", "status")),)
31+
else:
32+
fieldsets = (FieldSet("q", "device_id", "status"),)
2933
device_id = DynamicModelMultipleChoiceField(
3034
queryset=Device.objects.all(),
3135
required=False,
@@ -56,7 +60,10 @@ class Meta:
5660

5761
class PlatformSettingFilterForm(NetBoxModelFilterSetForm):
5862
model = PlatformSetting
59-
fieldsets = ((None, ("q", "platform_id", "tag")),)
63+
if VERSION.startswith("3."):
64+
fieldsets = ((None, ("q", "platform_id", "tag")),)
65+
else:
66+
fieldsets = (FieldSet("q", "filter_id", "tag"),)
6067
platform_id = DynamicModelMultipleChoiceField(
6168
queryset=Platform.objects.all(),
6269
required=False,
@@ -84,7 +91,10 @@ class PlatformSettingBulkEditForm(NetBoxModelBulkEditForm):
8491
)
8592

8693
model = PlatformSetting
87-
fieldsets = ((None, ("driver", "command", "description", "exclude_regex")),)
94+
if VERSION.startswith("3."):
95+
fieldsets = ((None, ("driver", "command", "description", "exclude_regex")),)
96+
else:
97+
fieldsets = (FieldSet("driver", "command", "description", "exclude_regex"),)
8898
nullable_fields = ("description", "exclude_regex")
8999

90100

@@ -135,7 +145,10 @@ def clean(self):
135145

136146
class ConfigurationRequestFilterForm(NetBoxModelFilterSetForm):
137147
model = ConfigurationRequest
138-
fieldsets = ((None, ("q", "created_by_id", "approved_by_id", "scheduled_by_id", "device_id", "status", "tag")),)
148+
if VERSION.startswith("3."):
149+
fieldsets = ((None, ("q", "created_by_id", "approved_by_id", "scheduled_by_id", "device_id", "status", "tag")),)
150+
else:
151+
fieldsets = (FieldSet("q", "created_by_id", "approved_by_id", "scheduled_by_id", "device_id", "status", "tag"),)
139152
created_by_id = DynamicModelMultipleChoiceField(
140153
queryset=get_user_model().objects.all(),
141154
required=False,
@@ -201,6 +214,10 @@ class Meta:
201214
class SubstituteFilterForm(NetBoxModelFilterSetForm):
202215
model = Substitute
203216
fieldsets = ((None, ("q", "platform_setting_id", "tag")),)
217+
if VERSION.startswith("3."):
218+
fieldsets = ((None, ("q", "platform_setting_id", "tag")),)
219+
else:
220+
fieldsets = (FieldSet("q", "platform_setting_id", "tag"),)
204221
platform_setting_id = DynamicModelMultipleChoiceField(
205222
queryset=PlatformSetting.objects.all(),
206223
required=False,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from django.db import migrations
2+
3+
from extras.models import Script, ScriptModule
4+
from netbox.settings import VERSION
5+
6+
7+
def forward_func(apps, schema_editor):
8+
if VERSION.startswith("3."):
9+
return
10+
11+
if Script.objects.filter(name="ConfigDiffScript"):
12+
return
13+
14+
obj = None
15+
for module in ScriptModule.objects.all():
16+
if module.python_name == "config_diff":
17+
obj = module
18+
break
19+
20+
if obj:
21+
Script.objects.create(module=obj, name="ConfigDiffScript")
22+
23+
24+
def reverse_func(apps, schema_editor):
25+
if VERSION.startswith("3."):
26+
return
27+
28+
if qs := Script.objects.filter(name="ConfigDiffScript"):
29+
qs.delete()
30+
31+
32+
class Migration(migrations.Migration):
33+
dependencies = [
34+
("netbox_config_diff", "0009_configcompliance_patch"),
35+
]
36+
37+
operations = [
38+
migrations.RunPython(forward_func, reverse_func),
39+
]

netbox_config_diff/templates/netbox_config_diff/configurationrequest/diffs.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ <h5 class="card-header">{{ diff.name }} - No diff</h5>
7777
</div>
7878
{% endif %}
7979
{% else %}
80-
<div class="alert alert-warning text-end" role="alert">
81-
<div class="float-start"><i class="mdi mdi-alert"></i>There is no diffs, run collect diffs</div>
80+
<div class="alert alert-warning" role="alert">
81+
<i class="mdi mdi-alert"></i>There is no diffs, run collect diffs
8282
</div>
8383
{% endif %}
8484
{% endblock content %}

netbox_config_diff/views/configuration.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ def get_extra_context(self, request, instance):
114114

115115
return {
116116
"job": job,
117+
"version": VERSION,
117118
}
118119

119120

requirements/base.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
hier-config==2.2.3
22
netutils==1.9.0
3-
scrapli[asyncssh]==2024.01.30
4-
scrapli-cfg==2024.01.30
5-
scrapli-community==2024.01.30
3+
scrapli[asyncssh]==2024.07.30
4+
scrapli-cfg==2024.07.30
5+
scrapli-community==2024.07.30

0 commit comments

Comments
 (0)