Skip to content

Commit 195d9c5

Browse files
authored
Merge pull request #13 from k01ek/develop
add routing policies;
2 parents 5accdb9 + a09f6a4 commit 195d9c5

18 files changed

+479
-36
lines changed

netbox_bgp/admin.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,30 @@
11
from django.contrib import admin
2-
from .models import ASN, Community, BGPSession
2+
from .models import ASN, Community, BGPSession, BGPPeerGroup, RoutingPolicy
33

44

55
@admin.register(ASN)
66
class ASNAdmin(admin.ModelAdmin):
7-
fields = ('number', 'name', 'status', 'description')
7+
fields = ('number', 'status', 'description')
88

99

1010
@admin.register(Community)
1111
class CommunityAdmin(admin.ModelAdmin):
12-
fields = ('value', 'name', 'status', 'description')
12+
fields = ('value', 'status', 'description')
1313

1414

1515
@admin.register(BGPSession)
1616
class BGPSessionAdmin(admin.ModelAdmin):
17-
fields = ('name', 'local_address', 'local_as', 'remote_address', 'remote_as', 'description')
17+
fields = (
18+
'name', 'local_address', 'local_as', 'remote_address',
19+
'remote_as', 'description', 'import_policies', 'export_policies'
20+
)
21+
22+
23+
@admin.register(BGPPeerGroup)
24+
class BGPpeerGroupAdmin(admin.ModelAdmin):
25+
fields = ('name', 'description', 'import_policies', 'export_policies')
26+
27+
28+
@admin.register(RoutingPolicy)
29+
class RoutingPolicyAdmin(admin.ModelAdmin):
30+
fields = ('name', 'description')

netbox_bgp/api/serializers.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from netbox.api.serializers import CustomFieldModelSerializer
1111

1212
from extras.models import Tag
13-
from netbox_bgp.models import ASN, ASNStatusChoices, BGPSession, SessionStatusChoices
13+
from netbox_bgp.models import ASN, ASNStatusChoices, BGPSession, SessionStatusChoices, RoutingPolicy
1414

1515

1616
class NestedTagSerializer(WritableNestedSerializer):
@@ -68,3 +68,9 @@ class BGPSessionSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
6868
class Meta:
6969
model = BGPSession
7070
fields = '__all__'
71+
72+
73+
class RoutingPolicySerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
74+
class Meta:
75+
model = RoutingPolicy
76+
fields = '__all__'

netbox_bgp/api/urls.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from rest_framework import routers
22

3-
from .views import ASNViewSet, BGPSessionViewSet
3+
from .views import ASNViewSet, BGPSessionViewSet, RoutingPolicyViewSet
44

55
router = routers.DefaultRouter()
66
router.register('asn', ASNViewSet)
7-
router.register('session', BGPSessionViewSet)
7+
router.register('session', BGPSessionViewSet),
8+
router.register('routing_policy', RoutingPolicyViewSet)
9+
810

911
urlpatterns = router.urls

netbox_bgp/api/views.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from rest_framework.viewsets import ModelViewSet
22

3-
from .serializers import ASNSerializer, BGPSessionSerializer
4-
from netbox_bgp.models import ASN, BGPSession
5-
from netbox_bgp.filters import ASNFilterSet, BGPSessionFilterSet
3+
from .serializers import ASNSerializer, BGPSessionSerializer, RoutingPolicySerializer
4+
from netbox_bgp.models import ASN, BGPSession, RoutingPolicy
5+
from netbox_bgp.filters import ASNFilterSet, BGPSessionFilterSet, RoutingPolicyFilterSet
66

77

88
class ASNViewSet(ModelViewSet):
@@ -15,3 +15,9 @@ class BGPSessionViewSet(ModelViewSet):
1515
queryset = BGPSession.objects.all()
1616
serializer_class = BGPSessionSerializer
1717
filterset_class = BGPSessionFilterSet
18+
19+
20+
class RoutingPolicyViewSet(ModelViewSet):
21+
queryset = RoutingPolicy.objects.all()
22+
serializer_class = RoutingPolicySerializer
23+
filterset_class = RoutingPolicyFilterSet

netbox_bgp/filters.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from utilities.filters import TagFilter
55

6-
from .models import ASN, Community, BGPSession
6+
from .models import ASN, Community, BGPSession, RoutingPolicy
77

88

99
class ASNFilterSet(django_filters.FilterSet):
@@ -77,3 +77,25 @@ def search(self, queryset, name, value):
7777
| Q(description__icontains=value)
7878
)
7979
return queryset.filter(qs_filter)
80+
81+
82+
class RoutingPolicyFilterSet(django_filters.FilterSet):
83+
q = django_filters.CharFilter(
84+
method='search',
85+
label='Search',
86+
)
87+
tag = TagFilter()
88+
89+
class Meta:
90+
model = RoutingPolicy
91+
fields = ['name', 'description']
92+
93+
def search(self, queryset, name, value):
94+
"""Perform the filtered search."""
95+
if not value.strip():
96+
return queryset
97+
qs_filter = (
98+
Q(name__icontains=value)
99+
| Q(description__icontains=value)
100+
)
101+
return queryset.filter(qs_filter)

netbox_bgp/forms.py

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
APISelect, APISelectMultiple, StaticSelect2Multiple, TagFilterField
1313
)
1414

15-
from .models import ASN, ASNStatusChoices, Community, BGPSession, SessionStatusChoices
15+
from .models import (
16+
ASN, ASNStatusChoices, Community, BGPSession,
17+
SessionStatusChoices, RoutingPolicy, BGPPeerGroup
18+
)
1619

1720

1821
class ASNFilterForm(BootstrapMixin, forms.ModelForm):
@@ -208,14 +211,34 @@ class BGPSessionForm(BootstrapMixin, forms.ModelForm):
208211
'device_id': '$device'
209212
}
210213
)
214+
import_policies = DynamicModelMultipleChoiceField(
215+
queryset=RoutingPolicy.objects.all(),
216+
required=False,
217+
widget=APISelectMultiple(
218+
api_url='/api/plugins/bgp/routing_policy/'
219+
)
220+
)
221+
export_policies = DynamicModelMultipleChoiceField(
222+
queryset=RoutingPolicy.objects.all(),
223+
required=False,
224+
widget=APISelectMultiple(
225+
api_url='/api/plugins/bgp/routing_policy/'
226+
)
227+
)
211228

212229
class Meta:
213230
model = BGPSession
214231
fields = [
215232
'name', 'site', 'device',
216233
'local_as', 'remote_as', 'local_address', 'remote_address',
217-
'description', 'status', 'tenant', 'tags',
234+
'description', 'status', 'tenant', 'tags', 'import_policies', 'export_policies'
218235
]
236+
fieldsets = (
237+
('Session', ('name', 'site', 'device', 'description', 'status', 'tenant', 'tags')),
238+
('Remote', ('remote_as', 'remote_address')),
239+
('Local', ('local_as', 'local_address')),
240+
('Policies', ('import_policies', 'export_policies'))
241+
)
219242

220243

221244
class BGPSessionAddForm(BGPSessionForm):
@@ -268,3 +291,27 @@ class BGPSessionFilterForm(BootstrapMixin, forms.ModelForm):
268291
class Meta:
269292
model = BGPSession
270293
fields = ['q', 'status', 'tenant', 'remote_as', 'local_as']
294+
295+
296+
class RoutingPolicyFilterForm(BootstrapMixin, forms.ModelForm):
297+
q = forms.CharField(
298+
required=False,
299+
label='Search'
300+
)
301+
302+
tag = TagFilterField(RoutingPolicy)
303+
304+
class Meta:
305+
model = RoutingPolicy
306+
fields = ['q']
307+
308+
309+
class RoutingPolicyForm(BootstrapMixin, forms.ModelForm):
310+
tags = DynamicModelMultipleChoiceField(
311+
queryset=Tag.objects.all(),
312+
required=False
313+
)
314+
315+
class Meta:
316+
model = RoutingPolicy
317+
fields = ['name', 'description']
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Generated by Django 3.2 on 2021-04-27 06:18
2+
3+
from django.db import migrations, models
4+
import taggit.managers
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('extras', '0059_exporttemplate_as_attachment'),
11+
('netbox_bgp', '0010_netbox_bgp'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='RoutingPolicy',
17+
fields=[
18+
('created', models.DateField(auto_now_add=True, null=True)),
19+
('last_updated', models.DateTimeField(auto_now=True, null=True)),
20+
('id', models.BigAutoField(primary_key=True, serialize=False)),
21+
('name', models.CharField(max_length=100)),
22+
('slug', models.SlugField(max_length=100)),
23+
('description', models.CharField(blank=True, max_length=200)),
24+
('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')),
25+
],
26+
options={
27+
'verbose_name_plural': 'Routing policies',
28+
},
29+
),
30+
migrations.AddField(
31+
model_name='bgppeergroup',
32+
name='export_policies',
33+
field=models.ManyToManyField(blank=True, related_name='group_export_policies', to='netbox_bgp.RoutingPolicy'),
34+
),
35+
migrations.AddField(
36+
model_name='bgppeergroup',
37+
name='import_policies',
38+
field=models.ManyToManyField(blank=True, related_name='group_import_policies', to='netbox_bgp.RoutingPolicy'),
39+
),
40+
migrations.AddField(
41+
model_name='bgpsession',
42+
name='export_policies',
43+
field=models.ManyToManyField(blank=True, related_name='session_export_policies', to='netbox_bgp.RoutingPolicy'),
44+
),
45+
migrations.AddField(
46+
model_name='bgpsession',
47+
name='import_policies',
48+
field=models.ManyToManyField(blank=True, related_name='session_import_policies', to='netbox_bgp.RoutingPolicy'),
49+
),
50+
]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Generated by Django 3.2 on 2021-04-27 11:08
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('netbox_bgp', '0011_netbox_bgp'),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name='routingpolicy',
15+
options={'verbose_name_plural': 'Routing Policies'},
16+
),
17+
migrations.AlterField(
18+
model_name='bgppeergroup',
19+
name='slug',
20+
field=models.SlugField(blank=True, max_length=100),
21+
),
22+
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 3.2 on 2021-04-27 13:17
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('netbox_bgp', '0012_netbox_bgp'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='bgppeergroup',
15+
name='slug',
16+
),
17+
migrations.RemoveField(
18+
model_name='routingpolicy',
19+
name='slug',
20+
),
21+
]

0 commit comments

Comments
 (0)