ipfabric_netbox 4.2.0b4__py3-none-any.whl → 4.2.0b5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ipfabric_netbox might be problematic. Click here for more details.

@@ -6,7 +6,7 @@ class NetboxIPFabricConfig(PluginConfig):
6
6
  name = "ipfabric_netbox"
7
7
  verbose_name = "NetBox IP Fabric SoT Plugin"
8
8
  description = "Sync IP Fabric into NetBox"
9
- version = "4.2.0b4"
9
+ version = "4.2.0b5"
10
10
  base_url = "ipfabric"
11
11
  min_version = "4.2.4"
12
12
 
@@ -1,2 +1 @@
1
- from .nested_serializers import * # noqa: F401, F403
2
1
  from .serializers import * # noqa: F401, F403
@@ -1,19 +1,19 @@
1
1
  from core.choices import DataSourceStatusChoices
2
+ from django.contrib.contenttypes.models import ContentType
2
3
  from netbox.api.fields import ChoiceField
3
4
  from netbox.api.fields import ContentTypeField
4
- from netbox.api.serializers import NetBoxModelSerializer
5
+ from netbox.api.fields import RelatedObjectCountField
6
+ from netbox.api.serializers import NestedGroupModelSerializer
5
7
  from netbox_branching.api.serializers import BranchSerializer
6
8
  from rest_framework import serializers
7
9
 
8
- from .nested_serializers import NestedIPFabricSnapshotSerializer
9
- from .nested_serializers import NestedIPFabricSourceSerializer
10
- from .nested_serializers import NestedIPFabricSyncSerializer
11
- from .nested_serializers import NestedIPFabricTransformMapSerializer
12
10
  from ipfabric_netbox.models import IPFabricIngestion
13
11
  from ipfabric_netbox.models import IPFabricIngestionIssue
14
12
  from ipfabric_netbox.models import IPFabricRelationshipField
13
+ from ipfabric_netbox.models import IPFabricRelationshipFieldSourceModels
15
14
  from ipfabric_netbox.models import IPFabricSnapshot
16
15
  from ipfabric_netbox.models import IPFabricSource
16
+ from ipfabric_netbox.models import IPFabricSupportedSyncModels
17
17
  from ipfabric_netbox.models import IPFabricSync
18
18
  from ipfabric_netbox.models import IPFabricTransformField
19
19
  from ipfabric_netbox.models import IPFabricTransformMap
@@ -32,129 +32,202 @@ __all__ = (
32
32
  )
33
33
 
34
34
 
35
- class IPFabricSyncSerializer(NetBoxModelSerializer):
36
- snapshot_data = NestedIPFabricSnapshotSerializer(read_only=True)
35
+ class IPFabricTransformMapGroupSerializer(NestedGroupModelSerializer):
36
+ transform_maps_count = RelatedObjectCountField("transform_maps")
37
37
 
38
38
  class Meta:
39
- model = IPFabricSync
40
- fields = [
39
+ model = IPFabricTransformMapGroup
40
+ fields = (
41
41
  "id",
42
42
  "name",
43
- "display",
44
- "snapshot_data",
45
- "type",
46
- "status",
47
- "parameters",
48
- "last_synced",
43
+ "description",
44
+ "transform_maps_count",
49
45
  "created",
50
46
  "last_updated",
51
- ]
47
+ )
48
+ brief_fields = (
49
+ "id",
50
+ "name",
51
+ "description",
52
+ )
52
53
 
53
54
 
54
- class IPFabricSnapshotSerializer(NetBoxModelSerializer):
55
- source = NestedIPFabricSourceSerializer()
56
- data = serializers.JSONField()
57
- date = serializers.DateTimeField()
58
- last_updated = serializers.DateTimeField()
55
+ class IPFabricTransformMapSerializer(NestedGroupModelSerializer):
56
+ group = IPFabricTransformMapGroupSerializer(
57
+ nested=True, required=False, allow_null=True
58
+ )
59
+ target_model = ContentTypeField(
60
+ queryset=ContentType.objects.filter(IPFabricSupportedSyncModels)
61
+ )
59
62
 
60
63
  class Meta:
61
- model = IPFabricSnapshot
62
- fields = [
64
+ model = IPFabricTransformMap
65
+ fields = (
63
66
  "id",
64
67
  "name",
65
- "source",
66
- "snapshot_id",
67
- "status",
68
- "date",
69
- "display",
70
- "sites",
71
- "data",
68
+ "group",
69
+ "source_model",
70
+ "target_model",
72
71
  "created",
73
72
  "last_updated",
74
- ]
73
+ )
74
+ brief_fields = (
75
+ "id",
76
+ "name",
77
+ "group",
78
+ "source_model",
79
+ "target_model",
80
+ )
75
81
 
76
- extra_kwargs = {
77
- "raw_data": {"write_only": True},
78
- }
79
82
 
83
+ class IPFabricTransformFieldSerializer(NestedGroupModelSerializer):
84
+ transform_map = IPFabricTransformMapSerializer(nested=True)
85
+
86
+ class Meta:
87
+ model = IPFabricTransformField
88
+ fields = (
89
+ "id",
90
+ "transform_map",
91
+ "source_field",
92
+ "target_field",
93
+ "coalesce",
94
+ "template",
95
+ )
80
96
 
81
- class IPFabricRelationshipFieldSerializer(NetBoxModelSerializer):
82
- transform_map = NestedIPFabricTransformMapSerializer(read_only=True)
83
- source_model = ContentTypeField(read_only=True)
97
+
98
+ class IPFabricRelationshipFieldSerializer(NestedGroupModelSerializer):
99
+ transform_map = IPFabricTransformMapSerializer(nested=True)
100
+ source_model = ContentTypeField(
101
+ queryset=ContentType.objects.filter(IPFabricRelationshipFieldSourceModels)
102
+ )
84
103
 
85
104
  class Meta:
86
105
  model = IPFabricRelationshipField
87
- fields = [
106
+ fields = (
88
107
  "id",
89
108
  "transform_map",
90
109
  "source_model",
91
110
  "target_field",
92
111
  "coalesce",
93
112
  "template",
94
- ]
113
+ )
95
114
 
96
115
 
97
- class IPFabricTransformMapGroupSerializer(NetBoxModelSerializer):
116
+ class IPFabricSourceSerializer(NestedGroupModelSerializer):
117
+ status = ChoiceField(choices=DataSourceStatusChoices, read_only=True)
118
+ url = serializers.URLField()
119
+
98
120
  class Meta:
99
- model = IPFabricTransformMapGroup
100
- fields = [
121
+ model = IPFabricSource
122
+ fields = (
123
+ "id",
124
+ "url",
125
+ "display",
101
126
  "name",
127
+ "type",
128
+ "status",
129
+ "last_synced",
102
130
  "description",
103
- "transform_maps",
131
+ "comments",
132
+ "parameters",
104
133
  "created",
105
134
  "last_updated",
106
- ]
135
+ )
136
+ brief_fields = (
137
+ "display",
138
+ "id",
139
+ "name",
140
+ "status",
141
+ "type",
142
+ "url",
143
+ )
107
144
 
108
145
 
109
- class IPFabricTransformMapSerializer(NetBoxModelSerializer):
110
- target_model = ContentTypeField(read_only=True)
146
+ class IPFabricSnapshotSerializer(NestedGroupModelSerializer):
147
+ source = IPFabricSourceSerializer(nested=True, read_only=True)
148
+ data = serializers.JSONField()
149
+ display = serializers.CharField(source="__str__", read_only=True)
111
150
 
112
151
  class Meta:
113
- model = IPFabricTransformMap
114
- fields = [
152
+ model = IPFabricSnapshot
153
+ fields = (
115
154
  "id",
116
- "source_model",
117
- "target_model",
155
+ "display",
156
+ "name",
157
+ "source",
158
+ "snapshot_id",
159
+ "status",
160
+ "data",
161
+ "date",
118
162
  "created",
119
163
  "last_updated",
120
- ]
164
+ )
165
+ brief_fields = (
166
+ "display",
167
+ "id",
168
+ "name",
169
+ "source",
170
+ "snapshot_id",
171
+ "status",
172
+ "data",
173
+ "date",
174
+ )
121
175
 
122
176
 
123
- class IPFabricTransformFieldSerializer(NetBoxModelSerializer):
124
- transform_map = NestedIPFabricTransformMapSerializer(read_only=True)
177
+ class IPFabricSyncSerializer(NestedGroupModelSerializer):
178
+ snapshot_data = IPFabricSnapshotSerializer(nested=True)
125
179
 
126
180
  class Meta:
127
- model = IPFabricTransformField
128
- fields = [
181
+ model = IPFabricSync
182
+ fields = (
129
183
  "id",
130
- "transform_map",
131
- "source_field",
132
- "target_field",
133
- "coalesce",
134
- "template",
135
- ]
184
+ "name",
185
+ "snapshot_data",
186
+ "type",
187
+ "status",
188
+ "parameters",
189
+ "auto_merge",
190
+ "last_synced",
191
+ "scheduled",
192
+ "interval",
193
+ "user",
194
+ )
195
+ brief_fields = (
196
+ "auto_merge",
197
+ "id",
198
+ "last_synced",
199
+ "name",
200
+ "parameters",
201
+ "status",
202
+ )
136
203
 
137
204
 
138
- class IPFabricIngestionSerializer(NetBoxModelSerializer):
205
+ class IPFabricIngestionSerializer(NestedGroupModelSerializer):
139
206
  branch = BranchSerializer(read_only=True)
140
- sync = NestedIPFabricSyncSerializer(read_only=True)
207
+ sync = IPFabricSyncSerializer(nested=True)
141
208
 
142
209
  class Meta:
143
210
  model = IPFabricIngestion
144
- fields = [
211
+ fields = (
212
+ "id",
213
+ "name",
214
+ "branch",
215
+ "sync",
216
+ )
217
+ brief_fields = (
145
218
  "id",
146
219
  "name",
147
220
  "branch",
148
221
  "sync",
149
- ]
222
+ )
150
223
 
151
224
 
152
- class IPFabricIngestionIssueSerializer(NetBoxModelSerializer):
153
- ingestion = IPFabricIngestionSerializer(read_only=True)
225
+ class IPFabricIngestionIssueSerializer(NestedGroupModelSerializer):
226
+ ingestion = IPFabricIngestionSerializer(nested=True)
154
227
 
155
228
  class Meta:
156
229
  model = IPFabricIngestionIssue
157
- fields = [
230
+ fields = (
158
231
  "id",
159
232
  "ingestion",
160
233
  "timestamp",
@@ -164,26 +237,11 @@ class IPFabricIngestionIssueSerializer(NetBoxModelSerializer):
164
237
  "coalesce_fields",
165
238
  "defaults",
166
239
  "exception",
167
- ]
168
-
169
-
170
- class IPFabricSourceSerializer(NetBoxModelSerializer):
171
- status = ChoiceField(choices=DataSourceStatusChoices)
172
- url = serializers.URLField()
173
-
174
- class Meta:
175
- model = IPFabricSource
176
- fields = [
240
+ )
241
+ brief_fields = (
242
+ "exception",
177
243
  "id",
178
- "url",
179
- "display",
180
- "name",
181
- "type",
182
- "status",
183
- "last_synced",
184
- "description",
185
- "comments",
186
- "parameters",
187
- "created",
188
- "last_updated",
189
- ]
244
+ "ingestion",
245
+ "message",
246
+ "model",
247
+ )
@@ -3,11 +3,11 @@ from netbox.api.routers import NetBoxRouter
3
3
 
4
4
  from ipfabric_netbox.api.views import IPFabricIngestionIssueViewSet
5
5
  from ipfabric_netbox.api.views import IPFabricIngestionViewSet
6
- from ipfabric_netbox.api.views import IPFabricRelationshipFieldiewSet
6
+ from ipfabric_netbox.api.views import IPFabricRelationshipFieldViewSet
7
7
  from ipfabric_netbox.api.views import IPFabricSnapshotViewSet
8
8
  from ipfabric_netbox.api.views import IPFabricSourceViewSet
9
9
  from ipfabric_netbox.api.views import IPFabricSyncViewSet
10
- from ipfabric_netbox.api.views import IPFabricTransformFieldiewSet
10
+ from ipfabric_netbox.api.views import IPFabricTransformFieldViewSet
11
11
  from ipfabric_netbox.api.views import IPFabricTransformMapGroupViewSet
12
12
  from ipfabric_netbox.api.views import IPFabricTransformMapViewSet
13
13
 
@@ -20,6 +20,6 @@ router.register("transform-map", IPFabricTransformMapViewSet)
20
20
  router.register("sync", IPFabricSyncViewSet)
21
21
  router.register("ingestion", IPFabricIngestionViewSet)
22
22
  router.register("ingestion-issues", IPFabricIngestionIssueViewSet)
23
- router.register("transform-field", IPFabricTransformFieldiewSet)
24
- router.register("relationship-field", IPFabricRelationshipFieldiewSet)
23
+ router.register("transform-field", IPFabricTransformFieldViewSet)
24
+ router.register("relationship-field", IPFabricRelationshipFieldViewSet)
25
25
  urlpatterns = router.urls
@@ -14,6 +14,7 @@ from .serializers import IPFabricSyncSerializer
14
14
  from .serializers import IPFabricTransformFieldSerializer
15
15
  from .serializers import IPFabricTransformMapGroupSerializer
16
16
  from .serializers import IPFabricTransformMapSerializer
17
+ from ipfabric_netbox.filtersets import IPFabricRelationshipFieldFilterSet
17
18
  from ipfabric_netbox.filtersets import IPFabricSnapshotFilterSet
18
19
  from ipfabric_netbox.filtersets import IPFabricSourceFilterSet
19
20
  from ipfabric_netbox.filtersets import IPFabricTransformFieldFilterSet
@@ -29,29 +30,29 @@ from ipfabric_netbox.models import IPFabricTransformMap
29
30
  from ipfabric_netbox.models import IPFabricTransformMapGroup
30
31
 
31
32
 
32
- class IPFabricTransformMapGroupViewSet(NetBoxReadOnlyModelViewSet):
33
+ class IPFabricTransformMapGroupViewSet(NetBoxModelViewSet):
33
34
  queryset = IPFabricTransformMapGroup.objects.all()
34
35
  serializer_class = IPFabricTransformMapGroupSerializer
35
36
 
36
37
 
37
- class IPFabricTransformMapViewSet(NetBoxReadOnlyModelViewSet):
38
+ class IPFabricTransformMapViewSet(NetBoxModelViewSet):
38
39
  queryset = IPFabricTransformMap.objects.all()
39
40
  serializer_class = IPFabricTransformMapSerializer
40
41
 
41
42
 
42
- class IPFabricTransformFieldiewSet(NetBoxReadOnlyModelViewSet):
43
+ class IPFabricTransformFieldViewSet(NetBoxModelViewSet):
43
44
  queryset = IPFabricTransformField.objects.all()
44
45
  serializer_class = IPFabricTransformFieldSerializer
45
46
  filterset_class = IPFabricTransformFieldFilterSet
46
47
 
47
48
 
48
- class IPFabricRelationshipFieldiewSet(NetBoxReadOnlyModelViewSet):
49
+ class IPFabricRelationshipFieldViewSet(NetBoxModelViewSet):
49
50
  queryset = IPFabricRelationshipField.objects.all()
50
51
  serializer_class = IPFabricRelationshipFieldSerializer
51
- filterset_class = IPFabricTransformFieldFilterSet
52
+ filterset_class = IPFabricRelationshipFieldFilterSet
52
53
 
53
54
 
54
- class IPFabricSyncViewSet(NetBoxReadOnlyModelViewSet):
55
+ class IPFabricSyncViewSet(NetBoxModelViewSet):
55
56
  queryset = IPFabricSync.objects.all()
56
57
  serializer_class = IPFabricSyncSerializer
57
58
 
@@ -66,7 +67,7 @@ class IPFabricIngestionIssueViewSet(NetBoxReadOnlyModelViewSet):
66
67
  serializer_class = IPFabricIngestionIssueSerializer
67
68
 
68
69
 
69
- class IPFabricSnapshotViewSet(NetBoxModelViewSet):
70
+ class IPFabricSnapshotViewSet(NetBoxReadOnlyModelViewSet):
70
71
  queryset = IPFabricSnapshot.objects.all()
71
72
  serializer_class = IPFabricSnapshotSerializer
72
73
  filterset_class = IPFabricSnapshotFilterSet
@@ -79,24 +80,23 @@ class IPFabricSnapshotViewSet(NetBoxModelViewSet):
79
80
  raw_data._raw_delete(raw_data.db)
80
81
  return Response({"status": "success"})
81
82
  elif request.method == "PATCH":
82
- transaction.set_autocommit(False)
83
- IPFabricData.objects.bulk_create(
84
- [
85
- IPFabricData(
86
- snapshot_data=snapshot, data=item["data"], type=item["type"]
87
- )
88
- for item in request.data["data"]
89
- ],
90
- batch_size=5000,
91
- )
92
- transaction.commit()
83
+ with transaction.atomic():
84
+ IPFabricData.objects.bulk_create(
85
+ [
86
+ IPFabricData(
87
+ snapshot_data=snapshot, data=item["data"], type=item["type"]
88
+ )
89
+ for item in request.data["data"]
90
+ ],
91
+ batch_size=5000,
92
+ )
93
93
  return Response({"status": "success"})
94
94
 
95
95
  @action(detail=True, methods=["get"], url_path="sites")
96
96
  def sites(self, request, pk):
97
97
  q = request.GET.get("q", None)
98
98
  snapshot = IPFabricSnapshot.objects.get(pk=pk)
99
- new_sites = {"results": []}
99
+ new_sites = {"count": 0, "results": []}
100
100
  if snapshot.data:
101
101
  sites = snapshot.data.get("sites", None)
102
102
  num = 0
@@ -112,6 +112,7 @@ class IPFabricSnapshotViewSet(NetBoxModelViewSet):
112
112
  {"display": site, "name": site, "id": site}
113
113
  )
114
114
  num += 1
115
+ new_sites["count"] = num
115
116
  return Response(new_sites)
116
117
  else:
117
118
  return Response([])
@@ -11,9 +11,11 @@ from netbox_branching.models import ChangeDiff
11
11
  from .models import IPFabricData
12
12
  from .models import IPFabricIngestion
13
13
  from .models import IPFabricIngestionIssue
14
+ from .models import IPFabricRelationshipField
14
15
  from .models import IPFabricSnapshot
15
16
  from .models import IPFabricSource
16
17
  from .models import IPFabricSync
18
+ from .models import IPFabricTransformField
17
19
  from .models import IPFabricTransformMap
18
20
  from .models import IPFabricTransformMapGroup
19
21
 
@@ -193,3 +195,67 @@ class IPFabricTransformFieldFilterSet(BaseFilterSet):
193
195
  transform_map = django_filters.ModelMultipleChoiceFilter(
194
196
  queryset=IPFabricTransformMap.objects.all(), label=_("Transform Map")
195
197
  )
198
+
199
+ class Meta:
200
+ model = IPFabricTransformField
201
+ fields = (
202
+ "id",
203
+ "transform_map",
204
+ "source_field",
205
+ "target_field",
206
+ "coalesce",
207
+ "template",
208
+ )
209
+
210
+
211
+ class IPFabricRelationshipFieldFilterSet(BaseFilterSet):
212
+ transform_map = django_filters.ModelMultipleChoiceFilter(
213
+ queryset=IPFabricTransformMap.objects.all(), label=_("Transform Map")
214
+ )
215
+
216
+ class Meta:
217
+ model = IPFabricRelationshipField
218
+ fields = (
219
+ "id",
220
+ "transform_map",
221
+ "source_model",
222
+ "target_field",
223
+ "coalesce",
224
+ "template",
225
+ )
226
+
227
+
228
+ class IPFabricSyncFilterSet(ChangeLoggedModelFilterSet):
229
+ q = django_filters.CharFilter(method="search")
230
+ snapshot_data_id = django_filters.ModelMultipleChoiceFilter(
231
+ queryset=IPFabricSnapshot.objects.all(),
232
+ label=_("Snapshot (ID)"),
233
+ )
234
+ snapshot_data = django_filters.ModelMultipleChoiceFilter(
235
+ field_name="snapshot_data__name",
236
+ queryset=IPFabricSnapshot.objects.all(),
237
+ to_field_name="name",
238
+ label=_("Snapshot (name)"),
239
+ )
240
+
241
+ class Meta:
242
+ model = IPFabricSync
243
+ fields = (
244
+ "id",
245
+ "name",
246
+ "snapshot_data",
247
+ "snapshot_data_id",
248
+ "type",
249
+ "status",
250
+ "auto_merge",
251
+ "last_synced",
252
+ "scheduled",
253
+ "interval",
254
+ )
255
+
256
+ def search(self, queryset, name, value):
257
+ if not value.strip():
258
+ return queryset
259
+ return queryset.filter(
260
+ Q(name__icontains=value) | Q(snapshot_data__name__icontains=value)
261
+ )
@@ -0,0 +1,23 @@
1
+ from .schema import IPFabricDataQuery
2
+ from .schema import IPFabricIngestionIssueQuery
3
+ from .schema import IPFabricIngestionQuery
4
+ from .schema import IPFabricRelationshipFieldQuery
5
+ from .schema import IPFabricSnapshotQuery
6
+ from .schema import IPFabricSourceQuery
7
+ from .schema import IPFabricSyncQuery
8
+ from .schema import IPFabricTransformFieldQuery
9
+ from .schema import IPFabricTransformMapGroupQuery
10
+ from .schema import IPFabricTransformMapQuery
11
+
12
+ schema = [
13
+ IPFabricTransformMapGroupQuery,
14
+ IPFabricTransformMapQuery,
15
+ IPFabricTransformFieldQuery,
16
+ IPFabricRelationshipFieldQuery,
17
+ IPFabricSourceQuery,
18
+ IPFabricSnapshotQuery,
19
+ IPFabricSyncQuery,
20
+ IPFabricIngestionQuery,
21
+ IPFabricIngestionIssueQuery,
22
+ IPFabricDataQuery,
23
+ ]
@@ -0,0 +1,38 @@
1
+ import strawberry
2
+ from core.choices import DataSourceStatusChoices
3
+ from core.choices import JobStatusChoices
4
+ from netbox_branching.choices import BranchStatusChoices
5
+
6
+ from ipfabric_netbox.choices import IPFabricRawDataTypeChoices
7
+ from ipfabric_netbox.choices import IPFabricSnapshotStatusModelChoices
8
+ from ipfabric_netbox.choices import IPFabricSourceTypeChoices
9
+ from ipfabric_netbox.choices import IPFabricSyncTypeChoices
10
+ from ipfabric_netbox.choices import IPFabricTransformMapSourceModelChoices
11
+
12
+ __all__ = (
13
+ "DataSourceStatusEnum",
14
+ "IPFabricTransformMapSourceModelEnum",
15
+ "IPFabricSourceTypeEnum",
16
+ "IPFabricSnapshotStatusModelEnum",
17
+ "IPFabricSyncTypeEnum",
18
+ "IPFabricRawDataTypeEnum",
19
+ "BranchStatusEnum",
20
+ "JobStatusEnum",
21
+ )
22
+
23
+ DataSourceStatusEnum = strawberry.enum(DataSourceStatusChoices.as_enum(prefix="type"))
24
+ IPFabricTransformMapSourceModelEnum = strawberry.enum(
25
+ IPFabricTransformMapSourceModelChoices.as_enum(prefix="type")
26
+ )
27
+ IPFabricSourceTypeEnum = strawberry.enum(
28
+ IPFabricSourceTypeChoices.as_enum(prefix="type")
29
+ )
30
+ IPFabricSnapshotStatusModelEnum = strawberry.enum(
31
+ IPFabricSnapshotStatusModelChoices.as_enum(prefix="type")
32
+ )
33
+ IPFabricSyncTypeEnum = strawberry.enum(IPFabricSyncTypeChoices.as_enum(prefix="type"))
34
+ IPFabricRawDataTypeEnum = strawberry.enum(
35
+ IPFabricRawDataTypeChoices.as_enum(prefix="type")
36
+ )
37
+ BranchStatusEnum = strawberry.enum(BranchStatusChoices.as_enum(prefix="type"))
38
+ JobStatusEnum = strawberry.enum(JobStatusChoices.as_enum(prefix="type"))