Skip to content

Commit 50ade7b

Browse files
committed
Add function to load YAML files
This commit starts to remove some code redundancy from the startup scripts for easier maintenance.
1 parent 3717b74 commit 50ade7b

30 files changed

+690
-832
lines changed

startup_scripts/000_users.py

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,37 @@
11
from django.contrib.auth.models import Permission, Group, User
22
from users.models import Token
33

4-
from ruamel.yaml import YAML
5-
from pathlib import Path
4+
from startup_script_utils import load_yaml
65
import sys
76

8-
file = Path('/opt/netbox/initializers/users.yml')
9-
if not file.is_file():
7+
users = load_yaml('/opt/netbox/initializers/users.yml')
8+
9+
if users is None:
1010
sys.exit()
1111

12-
with file.open('r') as stream:
13-
yaml=YAML(typ='safe')
14-
users = yaml.load(stream)
15-
16-
if users is not None:
17-
for username, user_details in users.items():
18-
if not User.objects.filter(username=username):
19-
user = User.objects.create_user(
20-
username = username,
21-
password = user_details.get('password', 0) or User.objects.make_random_password)
22-
23-
print("👤 Created user",username)
24-
25-
if user_details.get('api_token', 0):
26-
Token.objects.create(user=user, key=user_details['api_token'])
27-
28-
yaml_permissions = user_details.get('permissions', [])
29-
if yaml_permissions:
30-
subject = user.user_permissions
31-
subject.clear()
32-
for yaml_permission in yaml_permissions:
33-
if '*' in yaml_permission:
34-
permission_filter = '^' + yaml_permission.replace('*','.*') + '$'
35-
permissions = Permission.objects.filter(codename__iregex=permission_filter)
36-
print(" ⚿ Granting", permissions.count(), "permissions matching '" + yaml_permission + "'")
37-
else:
38-
permissions = Permission.objects.filter(codename=yaml_permission)
39-
print(" ⚿ Granting permission", yaml_permission)
40-
41-
for permission in permissions:
42-
subject.add(permission)
12+
for username, user_details in users.items():
13+
if not User.objects.filter(username=username):
14+
user = User.objects.create_user(
15+
username = username,
16+
password = user_details.get('password', 0) or User.objects.make_random_password)
17+
18+
print("👤 Created user",username)
19+
20+
if user_details.get('api_token', 0):
21+
Token.objects.create(user=user, key=user_details['api_token'])
22+
23+
yaml_permissions = user_details.get('permissions', [])
24+
if yaml_permissions:
25+
subject = user.user_permissions
26+
subject.clear()
27+
for yaml_permission in yaml_permissions:
28+
if '*' in yaml_permission:
29+
permission_filter = '^' + yaml_permission.replace('*','.*') + '$'
30+
permissions = Permission.objects.filter(codename__iregex=permission_filter)
31+
print(" ⚿ Granting", permissions.count(), "permissions matching '" + yaml_permission + "'")
32+
else:
33+
permissions = Permission.objects.filter(codename=yaml_permission)
34+
print(" ⚿ Granting permission", yaml_permission)
35+
36+
for permission in permissions:
37+
subject.add(permission)

startup_scripts/010_groups.py

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,35 @@
11
from django.contrib.auth.models import Permission, Group, User
2-
from ruamel.yaml import YAML
3-
from pathlib import Path
2+
from startup_script_utils import load_yaml
43
import sys
54

6-
file = Path('/opt/netbox/initializers/groups.yml')
7-
if not file.is_file():
5+
groups = load_yaml('/opt/netbox/initializers/groups.yml')
6+
if groups is None:
87
sys.exit()
98

10-
with file.open('r') as stream:
11-
yaml=YAML(typ='safe')
12-
groups = yaml.load(stream)
13-
14-
if groups is not None:
15-
for groupname, group_details in groups.items():
16-
group, created = Group.objects.get_or_create(name=groupname)
17-
18-
if created:
19-
print("👥 Created group", groupname)
20-
21-
for username in group_details.get('users', []):
22-
user = User.objects.get(username=username)
23-
24-
if user:
25-
user.groups.add(group)
26-
27-
yaml_permissions = group_details.get('permissions', [])
28-
if yaml_permissions:
29-
subject = group.permissions
30-
subject.clear()
31-
for yaml_permission in yaml_permissions:
32-
if '*' in yaml_permission:
33-
permission_filter = '^' + yaml_permission.replace('*','.*') + '$'
34-
permissions = Permission.objects.filter(codename__iregex=permission_filter)
35-
print(" ⚿ Granting", permissions.count(), "permissions matching '" + yaml_permission + "'")
36-
else:
37-
permissions = Permission.objects.filter(codename=yaml_permission)
38-
print(" ⚿ Granting permission", yaml_permission)
39-
40-
for permission in permissions:
41-
subject.add(permission)
9+
for groupname, group_details in groups.items():
10+
group, created = Group.objects.get_or_create(name=groupname)
11+
12+
if created:
13+
print("👥 Created group", groupname)
14+
15+
for username in group_details.get('users', []):
16+
user = User.objects.get(username=username)
17+
18+
if user:
19+
user.groups.add(group)
20+
21+
yaml_permissions = group_details.get('permissions', [])
22+
if yaml_permissions:
23+
subject = group.permissions
24+
subject.clear()
25+
for yaml_permission in yaml_permissions:
26+
if '*' in yaml_permission:
27+
permission_filter = '^' + yaml_permission.replace('*','.*') + '$'
28+
permissions = Permission.objects.filter(codename__iregex=permission_filter)
29+
print(" ⚿ Granting", permissions.count(), "permissions matching '" + yaml_permission + "'")
30+
else:
31+
permissions = Permission.objects.filter(codename=yaml_permission)
32+
print(" ⚿ Granting permission", yaml_permission)
33+
34+
for permission in permissions:
35+
subject.add(permission)

startup_scripts/020_custom_fields.py

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from extras.models import CustomField, CustomFieldChoice
22

3-
from ruamel.yaml import YAML
4-
from pathlib import Path
3+
from startup_script_utils import load_yaml
54
import sys
65

76
def get_class_for_class_path(class_path):
@@ -13,47 +12,43 @@ def get_class_for_class_path(class_path):
1312
clazz = getattr(module, class_name)
1413
return ContentType.objects.get_for_model(clazz)
1514

16-
file = Path('/opt/netbox/initializers/custom_fields.yml')
17-
if not file.is_file():
18-
sys.exit()
15+
customfields = load_yaml('/opt/netbox/initializers/custom_fields.yml')
1916

20-
with file.open('r') as stream:
21-
yaml = YAML(typ='safe')
22-
customfields = yaml.load(stream)
17+
if customfields is None:
18+
sys.exit()
2319

24-
if customfields is not None:
25-
for cf_name, cf_details in customfields.items():
26-
custom_field, created = CustomField.objects.get_or_create(name = cf_name)
20+
for cf_name, cf_details in customfields.items():
21+
custom_field, created = CustomField.objects.get_or_create(name = cf_name)
2722

28-
if created:
29-
if cf_details.get('default', 0):
30-
custom_field.default = cf_details['default']
23+
if created:
24+
if cf_details.get('default', 0):
25+
custom_field.default = cf_details['default']
3126

32-
if cf_details.get('description', 0):
33-
custom_field.description = cf_details['description']
27+
if cf_details.get('description', 0):
28+
custom_field.description = cf_details['description']
3429

35-
if cf_details.get('label', 0):
36-
custom_field.label = cf_details['label']
30+
if cf_details.get('label', 0):
31+
custom_field.label = cf_details['label']
3732

38-
for object_type in cf_details.get('on_objects', []):
39-
custom_field.obj_type.add(get_class_for_class_path(object_type))
33+
for object_type in cf_details.get('on_objects', []):
34+
custom_field.obj_type.add(get_class_for_class_path(object_type))
4035

41-
if cf_details.get('required', 0):
42-
custom_field.required = cf_details['required']
36+
if cf_details.get('required', 0):
37+
custom_field.required = cf_details['required']
4338

44-
if cf_details.get('type', 0):
45-
custom_field.type = cf_details['type']
39+
if cf_details.get('type', 0):
40+
custom_field.type = cf_details['type']
4641

47-
if cf_details.get('weight', 0):
48-
custom_field.weight = cf_details['weight']
42+
if cf_details.get('weight', 0):
43+
custom_field.weight = cf_details['weight']
4944

50-
custom_field.save()
45+
custom_field.save()
5146

52-
for idx, choice_details in enumerate(cf_details.get('choices', [])):
53-
choice, _ = CustomFieldChoice.objects.get_or_create(
54-
field=custom_field,
55-
value=choice_details['value'],
56-
defaults={'weight': idx * 10}
57-
)
47+
for idx, choice_details in enumerate(cf_details.get('choices', [])):
48+
choice, _ = CustomFieldChoice.objects.get_or_create(
49+
field=custom_field,
50+
value=choice_details['value'],
51+
defaults={'weight': idx * 10}
52+
)
5853

59-
print("🔧 Created custom field", cf_name)
54+
print("🔧 Created custom field", cf_name)

startup_scripts/030_regions.py

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,26 @@
11
from dcim.models import Region
2-
from ruamel.yaml import YAML
3-
from pathlib import Path
2+
from startup_script_utils import load_yaml
43
import sys
54

6-
file = Path('/opt/netbox/initializers/regions.yml')
7-
if not file.is_file():
8-
sys.exit()
5+
regions = load_yaml('/opt/netbox/initializers/regions.yml')
96

10-
with file.open('r') as stream:
11-
yaml=YAML(typ='safe')
12-
regions = yaml.load(stream)
7+
if regions is None:
8+
sys.exit()
139

14-
optional_assocs = {
15-
'parent': (Region, 'name')
16-
}
10+
optional_assocs = {
11+
'parent': (Region, 'name')
12+
}
1713

18-
if regions is not None:
19-
for params in regions:
14+
for params in regions:
2015

21-
for assoc, details in optional_assocs.items():
22-
if assoc in params:
23-
model, field = details
24-
query = { field: params.pop(assoc) }
16+
for assoc, details in optional_assocs.items():
17+
if assoc in params:
18+
model, field = details
19+
query = { field: params.pop(assoc) }
2520

26-
params[assoc] = model.objects.get(**query)
21+
params[assoc] = model.objects.get(**query)
2722

28-
region, created = Region.objects.get_or_create(**params)
23+
region, created = Region.objects.get_or_create(**params)
2924

30-
if created:
31-
print("🌐 Created region", region.name)
25+
if created:
26+
print("🌐 Created region", region.name)

startup_scripts/040_sites.py

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,41 @@
11
from dcim.models import Region, Site
22
from extras.models import CustomField, CustomFieldValue
33
from tenancy.models import Tenant
4-
from ruamel.yaml import YAML
5-
from pathlib import Path
4+
from startup_script_utils import load_yaml
65
import sys
76

8-
file = Path('/opt/netbox/initializers/sites.yml')
9-
if not file.is_file():
10-
sys.exit()
7+
sites = load_yaml('/opt/netbox/initializers/sites.yml')
118

12-
with file.open('r') as stream:
13-
yaml = YAML(typ='safe')
14-
sites = yaml.load(stream)
9+
if sites is None:
10+
sys.exit()
1511

16-
optional_assocs = {
17-
'region': (Region, 'name'),
18-
'tenant': (Tenant, 'name')
19-
}
12+
optional_assocs = {
13+
'region': (Region, 'name'),
14+
'tenant': (Tenant, 'name')
15+
}
2016

21-
if sites is not None:
22-
for params in sites:
23-
custom_fields = params.pop('custom_fields', None)
17+
for params in sites:
18+
custom_fields = params.pop('custom_fields', None)
2419

25-
for assoc, details in optional_assocs.items():
26-
if assoc in params:
27-
model, field = details
28-
query = { field: params.pop(assoc) }
20+
for assoc, details in optional_assocs.items():
21+
if assoc in params:
22+
model, field = details
23+
query = { field: params.pop(assoc) }
2924

30-
params[assoc] = model.objects.get(**query)
25+
params[assoc] = model.objects.get(**query)
3126

32-
site, created = Site.objects.get_or_create(**params)
27+
site, created = Site.objects.get_or_create(**params)
3328

34-
if created:
35-
if custom_fields is not None:
36-
for cf_name, cf_value in custom_fields.items():
37-
custom_field = CustomField.objects.get(name=cf_name)
38-
custom_field_value = CustomFieldValue.objects.create(
39-
field=custom_field,
40-
obj=site,
41-
value=cf_value
42-
)
29+
if created:
30+
if custom_fields is not None:
31+
for cf_name, cf_value in custom_fields.items():
32+
custom_field = CustomField.objects.get(name=cf_name)
33+
custom_field_value = CustomFieldValue.objects.create(
34+
field=custom_field,
35+
obj=site,
36+
value=cf_value
37+
)
4338

44-
site.custom_field_values.add(custom_field_value)
39+
site.custom_field_values.add(custom_field_value)
4540

46-
print("📍 Created site", site.name)
41+
print("📍 Created site", site.name)

startup_scripts/050_manufacturers.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
from dcim.models import Manufacturer
2-
from ruamel.yaml import YAML
3-
from pathlib import Path
2+
from startup_script_utils import load_yaml
43
import sys
54

6-
file = Path('/opt/netbox/initializers/manufacturers.yml')
7-
if not file.is_file():
8-
sys.exit()
5+
manufacturers = load_yaml('/opt/netbox/initializers/manufacturers.yml')
96

10-
with file.open('r') as stream:
11-
yaml = YAML(typ='safe')
12-
manufacturers = yaml.load(stream)
7+
if manufacturers is None:
8+
sys.exit()
139

14-
if manufacturers is not None:
15-
for params in manufacturers:
16-
manufacturer, created = Manufacturer.objects.get_or_create(**params)
10+
for params in manufacturers:
11+
manufacturer, created = Manufacturer.objects.get_or_create(**params)
1712

18-
if created:
19-
print("🏭 Created Manufacturer", manufacturer.name)
13+
if created:
14+
print("🏭 Created Manufacturer", manufacturer.name)

0 commit comments

Comments
 (0)