Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package orthos2 for openSUSE:Factory checked 
in at 2023-05-04 17:10:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/orthos2 (Old)
 and      /work/SRC/openSUSE:Factory/.orthos2.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "orthos2"

Thu May  4 17:10:28 2023 rev:6 rq:1084715 version:1.2.169+git.a693485

Changes:
--------
--- /work/SRC/openSUSE:Factory/orthos2/orthos2.changes  2023-03-25 
18:55:51.282820227 +0100
+++ /work/SRC/openSUSE:Factory/.orthos2.new.1533/orthos2.changes        
2023-05-04 17:10:46.964438100 +0200
@@ -1,0 +2,20 @@
+Thu May 04 13:39:53 UTC 2023 - tr...@suse.de
+
+- Update to version 1.2.169+git.a693485:
+  * fix: run isort on remaining files
+  * fix: Remove unsupported cobbler_server from django admin panel
+
+-------------------------------------------------------------------
+Wed May 03 13:49:46 UTC 2023 - laurin.fael...@suse.com
+
+- Update to version 1.2.166+git.1eaf582:
+  * Refactor Domain-CobblerServer relationship to 0:1
+  * Fix circular import (#201)
+  * IPv4 and IPv6 internal machine object attribute needs updating when moving 
domain
+  * Use get on clean_data dictionary and consistently remove self when using 
the variable
+  * ci: Add isort linter to github actions
+  * fix: Run isort for more idiomatic imports
+  * Add architecture validation to machine admin panel
+  * Implement naive FQDN Change
+
+-------------------------------------------------------------------

Old:
----
  orthos2-1.2.154+git.40b86d2.obscpio

New:
----
  orthos2-1.2.169+git.a693485.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ orthos2.spec ++++++
--- /var/tmp/diff_new_pack.btdVvT/_old  2023-05-04 17:10:47.724442550 +0200
+++ /var/tmp/diff_new_pack.btdVvT/_new  2023-05-04 17:10:47.732442597 +0200
@@ -12,7 +12,7 @@
 # Please submit bugfixes or comments via https://bugs.opensuse.org/
 
 Name:           orthos2
-Version:        1.2.154+git.40b86d2
+Version:        1.2.169+git.a693485
 Release:        0
 Summary:        Machine administration
 Url:            https://github.com/openSUSE/orthos2

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.btdVvT/_old  2023-05-04 17:10:47.788442925 +0200
+++ /var/tmp/diff_new_pack.btdVvT/_new  2023-05-04 17:10:47.792442948 +0200
@@ -3,6 +3,6 @@
                 <param name="url">git://github.com/openSUSE/orthos2.git</param>
               <param 
name="changesrevision">f0a52a1538932125ce7b208da99ed73f08955ea0</param></service><service
 name="tar_scm">
                 <param 
name="url">https://github.com/openSUSE/orthos2.git</param>
-              <param 
name="changesrevision">40b86d2e9a98629b5745f842f2f43a80ba41947f</param></service></servicedata>
+              <param 
name="changesrevision">a693485533889750f553759487e456d86799c6c2</param></service></servicedata>
 (No newline at EOF)
 

++++++ orthos2-1.2.154+git.40b86d2.obscpio -> 
orthos2-1.2.169+git.a693485.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/.github/workflows/lint.yml 
new/orthos2-1.2.169+git.a693485/.github/workflows/lint.yml
--- old/orthos2-1.2.154+git.40b86d2/.github/workflows/lint.yml  1970-01-01 
01:00:00.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/.github/workflows/lint.yml  2023-05-04 
15:32:01.000000000 +0200
@@ -0,0 +1,20 @@
+name: Lint
+on:
+  push:
+    branches:  [ master ]
+  pull_request:
+    branches: [ master ]
+
+jobs:
+  isort:
+    name: isort
+    runs-on: ubuntu-20.04
+    steps:
+    - uses: actions/checkout@v3
+    - name: Set up Python
+      uses: actions/setup-python@v3
+      with:
+        python-version: 3.6
+    - uses: isort/isort-action@master
+      with:
+        requirementsFiles: "pyproject.toml"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/dmesg.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/dmesg.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/dmesg.fact
     2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/dmesg.fact
     2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = "if [ -e /var/log/boot.msg ]; then cat /var/log/boot.msg; else 
journalctl -xl | head -n200; fi"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/dmidecode.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/dmidecode.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/dmidecode.fact
 2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/dmidecode.fact
 2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = ["dmidecode"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/hwinfo.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/hwinfo.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/hwinfo.fact
    2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/hwinfo.fact
    2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = ["hwinfo"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/last.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/last.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/last.fact
      2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/last.fact
      2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = "last | grep -v reboot | head -n 1"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lsmod.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lsmod.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lsmod.fact
     2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lsmod.fact
     2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = ["lsmod"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lspci.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lspci.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lspci.fact
     2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lspci.fact
     2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = ["lspci"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lsscsi.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lsscsi.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lsscsi.fact
    2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lsscsi.fact
    2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = ["lsscsi", "-s"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lsusb.fact
 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lsusb.fact
--- 
old/orthos2-1.2.154+git.40b86d2/ansible/roles/add_custom_facts/files/facts.d/lsusb.fact
     2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/ansible/roles/add_custom_facts/files/facts.d/lsusb.fact
     2023-05-04 15:32:01.000000000 +0200
@@ -4,7 +4,6 @@
 import subprocess
 import sys
 
-
 data = dict()
 
 command = ["lsusb"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/docs/conf.py 
new/orthos2-1.2.169+git.a693485/docs/conf.py
--- old/orthos2-1.2.154+git.40b86d2/docs/conf.py        2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/docs/conf.py        2023-05-04 
15:32:01.000000000 +0200
@@ -12,6 +12,7 @@
 #
 import os
 import sys
+
 sys.path.insert(0, os.path.abspath('..'))
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/__init__.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/__init__.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/__init__.py    
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/__init__.py    
2023-05-04 15:32:01.000000000 +0200
@@ -1,22 +1,22 @@
-from orthos2.api.commands.base import BaseAPIView, get_machine, getException
+from orthos2.api.commands.add import (AddAnnotationCommand, AddBMCCommand,
+                                      AddCommand, AddMachineCommand,
+                                      AddRemotePowerCommand,
+                                      AddRemotePowerDeviceCommand,
+                                      AddSerialConsoleCommand, AddVMCommand)
+from orthos2.api.commands.delete import (DeleteCommand, DeleteMachineCommand,
+                                         DeleteRemotePowerCommand,
+                                         DeleteRemotePowerDeviceCommand,
+                                         DeleteSerialConsoleCommand)
 from orthos2.api.commands.info import InfoCommand
+from orthos2.api.commands.power import PowerCommand
 from orthos2.api.commands.query import QueryCommand
-from orthos2.api.commands.reserve import ReserveCommand
+from orthos2.api.commands.regenerate import RegenerateCommand
 from orthos2.api.commands.release import ReleaseCommand
-from orthos2.api.commands.reservationhistory import ReservationHistoryCommand
 from orthos2.api.commands.rescan import RescanCommand
-from orthos2.api.commands.regenerate import RegenerateCommand
+from orthos2.api.commands.reservationhistory import ReservationHistoryCommand
+from orthos2.api.commands.reserve import ReserveCommand
 from orthos2.api.commands.serverconfig import ServerConfigCommand
 from orthos2.api.commands.setup import SetupCommand
-from orthos2.api.commands.power import PowerCommand
-from orthos2.api.commands.add import (AddCommand, AddVMCommand, 
AddMachineCommand,
-                                      AddSerialConsoleCommand, 
AddAnnotationCommand,
-                                      AddRemotePowerCommand, AddBMCCommand,
-                                      AddRemotePowerDeviceCommand)
-from orthos2.api.commands.delete import (DeleteCommand, DeleteMachineCommand,
-                                         DeleteSerialConsoleCommand, 
DeleteRemotePowerCommand,
-                                         DeleteRemotePowerDeviceCommand)
-
 
 __all__ = [
     'InfoCommand',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/add.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/add.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/add.py 2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/add.py 2023-05-04 
15:32:01.000000000 +0200
@@ -1,19 +1,19 @@
 import json
 import logging
 
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser
 from django.http import HttpResponseRedirect, JsonResponse
 from django.shortcuts import redirect, reverse
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine
-from orthos2.api.forms import (AnnotationAPIForm, BMCAPIForm, MachineAPIForm, 
RemotePowerAPIForm,
-                               RemotePowerDeviceAPIForm, SerialConsoleAPIForm,
-                               VirtualMachineAPIForm)
+from orthos2.api.commands.base import BaseAPIView, get_machine
+from orthos2.api.forms import (AnnotationAPIForm, BMCAPIForm, MachineAPIForm,
+                               RemotePowerAPIForm, RemotePowerDeviceAPIForm,
+                               SerialConsoleAPIForm, VirtualMachineAPIForm)
 from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
-                                          InfoMessage, InputSerializer, 
Message,
-                                          Serializer)
-from orthos2.data.models import (Annotation, BMC, Machine, RemotePower,
+                                          InfoMessage, InputSerializer,
+                                          Message, Serializer)
+from orthos2.data.models import (BMC, Annotation, Machine, RemotePower,
                                  RemotePowerDevice, SerialConsole)
 from orthos2.utils.misc import add_offset_to_date, format_cli_form_errors
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/base.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/base.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/base.py        
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/base.py        
2023-05-04 15:32:01.000000000 +0200
@@ -1,5 +1,5 @@
-import sys
 import linecache
+import sys
 
 from django.shortcuts import redirect
 from rest_framework.views import APIView
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/delete.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/delete.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/delete.py      
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/delete.py      
2023-05-04 15:32:01.000000000 +0200
@@ -1,16 +1,18 @@
 import json
 import logging
 
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser
 from django.http import JsonResponse
 from django.shortcuts import redirect, reverse
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView
+from orthos2.api.commands.base import BaseAPIView
 from orthos2.api.forms import (DeleteMachineAPIForm, DeleteRemotePowerAPIForm,
-                               DeleteRemotePowerDeviceAPIForm, 
DeleteSerialConsoleAPIForm)
-from orthos2.api.serializers.misc import (AuthRequiredSerializer, 
ErrorMessage, InputSerializer)
-from orthos2.data.models import (Machine, RemotePowerDevice)
+                               DeleteRemotePowerDeviceAPIForm,
+                               DeleteSerialConsoleAPIForm)
+from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
+                                          InputSerializer)
+from orthos2.data.models import Machine, RemotePowerDevice
 from orthos2.utils.misc import format_cli_form_errors
 
 logger = logging.getLogger('api')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/info.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/info.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/info.py        
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/info.py        
2023-05-04 15:32:01.000000000 +0200
@@ -1,7 +1,7 @@
-from django.urls import re_path
 from django.http import HttpResponseRedirect, JsonResponse
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine, getException
+from orthos2.api.commands.base import BaseAPIView, get_machine, getException
 from orthos2.api.serializers.machine import MachineSerializer
 from orthos2.api.serializers.misc import ErrorMessage, Serializer
 from orthos2.data.models import Machine
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/power.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/power.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/power.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/power.py       
2023-05-04 15:32:01.000000000 +0200
@@ -1,8 +1,8 @@
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser
 from django.http import HttpResponseRedirect
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine
+from orthos2.api.commands.base import BaseAPIView, get_machine
 from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
                                           Message, Serializer)
 from orthos2.data.models import RemotePower
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/query.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/query.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/query.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/query.py       
2023-05-04 15:32:01.000000000 +0200
@@ -1,9 +1,9 @@
 import json
 
-from django.urls import re_path
 from django.http import JsonResponse
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView
+from orthos2.api.commands.base import BaseAPIView
 from orthos2.api.models import APIQuery
 from orthos2.api.serializers.misc import ErrorMessage, InfoMessage
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/regenerate.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/regenerate.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/regenerate.py  
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/regenerate.py  
2023-05-04 15:32:01.000000000 +0200
@@ -1,15 +1,15 @@
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser
 from django.http import HttpResponseRedirect
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine
+from orthos2.api.commands.base import BaseAPIView, get_machine
 from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
                                           Message, Serializer)
-from orthos2.data.signals import (signal_cobbler_regenerate,
-                                  signal_serialconsole_regenerate,
-                                  signal_cobbler_machine_update)
-from orthos2.utils.misc import get_hostname, get_domain
 from orthos2.data.models import Domain, Machine
+from orthos2.data.signals import (signal_cobbler_machine_update,
+                                  signal_cobbler_regenerate,
+                                  signal_serialconsole_regenerate)
+from orthos2.utils.misc import get_domain, get_hostname
 
 
 class RegenerateCommand(BaseAPIView):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/release.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/release.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/release.py     
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/release.py     
2023-05-04 15:32:01.000000000 +0200
@@ -1,8 +1,8 @@
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser
 from django.http import HttpResponseRedirect
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine
+from orthos2.api.commands.base import BaseAPIView, get_machine
 from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
                                           Message, Serializer)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/rescan.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/rescan.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/rescan.py      
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/rescan.py      
2023-05-04 15:32:01.000000000 +0200
@@ -1,10 +1,11 @@
-from django.urls import re_path
 from django.http import HttpResponseRedirect
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine
-from orthos2.api.serializers.misc import ErrorMessage, InfoMessage, Message, 
Serializer
-from orthos2.taskmanager.tasks.machinetasks import MachineCheck
+from orthos2.api.commands.base import BaseAPIView, get_machine
+from orthos2.api.serializers.misc import (ErrorMessage, InfoMessage, Message,
+                                          Serializer)
 from orthos2.taskmanager.tasks.daily import DailyMachineChecks
+from orthos2.taskmanager.tasks.machinetasks import MachineCheck
 
 
 class RescanCommand(BaseAPIView):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/reservationhistory.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/reservationhistory.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/reservationhistory.py  
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/reservationhistory.py  
2023-05-04 15:32:01.000000000 +0200
@@ -1,7 +1,7 @@
-from django.urls import re_path
 from django.http import HttpResponseRedirect, JsonResponse
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine
+from orthos2.api.commands.base import BaseAPIView, get_machine
 from orthos2.api.serializers.misc import ErrorMessage, InfoMessage, Serializer
 from orthos2.data.models import ReservationHistory
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/reserve.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/reserve.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/reserve.py     
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/reserve.py     
2023-05-04 15:32:01.000000000 +0200
@@ -1,16 +1,16 @@
 import datetime
 import json
 
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser, User
 from django.http import HttpResponseRedirect
+from django.urls import re_path
 
-from orthos2.utils.misc import add_offset_to_date, format_cli_form_errors
-from orthos2.api.commands import BaseAPIView, get_machine
+from orthos2.api.commands.base import BaseAPIView, get_machine
 from orthos2.api.forms import ReserveMachineAPIForm
 from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
                                           InputSerializer, Message, Serializer)
 from orthos2.data.models import Machine
+from orthos2.utils.misc import add_offset_to_date, format_cli_form_errors
 
 
 class ReserveCommand(BaseAPIView):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/serverconfig.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/serverconfig.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/serverconfig.py        
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/serverconfig.py        
2023-05-04 15:32:01.000000000 +0200
@@ -1,8 +1,8 @@
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser
 from django.http import JsonResponse
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView
+from orthos2.api.commands.base import BaseAPIView
 from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
                                           InfoMessage)
 from orthos2.data.models import ServerConfig
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/setup.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/commands/setup.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/commands/setup.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/commands/setup.py       
2023-05-04 15:32:01.000000000 +0200
@@ -1,10 +1,10 @@
 import logging
 
-from django.urls import re_path
 from django.contrib.auth.models import AnonymousUser
 from django.http import HttpResponseRedirect, JsonResponse
+from django.urls import re_path
 
-from orthos2.api.commands import BaseAPIView, get_machine
+from orthos2.api.commands.base import BaseAPIView, get_machine
 from orthos2.api.serializers.misc import (AuthRequiredSerializer, ErrorMessage,
                                           InfoMessage, Message, Serializer)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/api/forms.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/forms.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/forms.py        2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/forms.py        2023-05-04 
15:32:01.000000000 +0200
@@ -1,21 +1,21 @@
 import logging
 
 from django import forms
-from django.forms.models import ModelChoiceIteratorValue
 from django.forms import inlineformset_factory
 from django.forms.fields import (BooleanField, CharField, ChoiceField,
                                  DateField, DecimalField, IntegerField)
+from django.forms.models import ModelChoiceIteratorValue
 from django.template.defaultfilters import slugify
 
-from orthos2.data.models import (Architecture, Enclosure, Machine, 
MachineGroup,
-                                 NetworkInterface, RemotePower, SerialConsole,
-                                 System, RemotePowerDevice, SerialConsoleType,
+from orthos2.data.models import (Architecture, Enclosure, Machine,
+                                 MachineGroup, NetworkInterface, RemotePower,
+                                 RemotePowerDevice, SerialConsole,
+                                 SerialConsoleType, System,
                                  is_unique_mac_address, validate_dns,
                                  validate_mac_address)
 from orthos2.data.models.domain import validate_domain_ending
 from orthos2.frontend.forms import ReserveMachineForm, VirtualMachineForm
 
-
 logger = logging.getLogger('api')
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/api/models.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/models.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/models.py       2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/models.py       2023-05-04 
15:32:01.000000000 +0200
@@ -1,16 +1,16 @@
 import logging
 import re
 
-from django.core.exceptions import (FieldDoesNotExist,
-                                    MultipleObjectsReturned)
+from django.core.exceptions import FieldDoesNotExist, MultipleObjectsReturned
 from django.db.models import Field, Q
 from django.db.models.functions import Length
 
 from orthos2.api.lookups import NotEqual
 from orthos2.data.models import (Annotation, Architecture, Domain, Enclosure,
-                                 Installation, Machine, MachineGroup, 
NetworkInterface,
-                                 PCIDevice, Platform, RemotePower, 
SerialConsole,
-                                 SerialConsoleType, System, User, Vendor)
+                                 Installation, Machine, MachineGroup,
+                                 NetworkInterface, PCIDevice, Platform,
+                                 RemotePower, SerialConsole, SerialConsoleType,
+                                 System, User, Vendor)
 
 logger = logging.getLogger('api')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/serializers/bmc.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/serializers/bmc.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/serializers/bmc.py      
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/serializers/bmc.py      
2023-05-04 15:32:01.000000000 +0200
@@ -1,4 +1,5 @@
 from rest_framework import serializers
+
 from orthos2.data.models import BMC
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/api/serializers/machine.py 
new/orthos2-1.2.169+git.a693485/orthos2/api/serializers/machine.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/api/serializers/machine.py  
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/api/serializers/machine.py  
2023-05-04 15:32:01.000000000 +0200
@@ -1,10 +1,11 @@
 from rest_framework import serializers
 
 from orthos2.data.models import Machine
+
 from .annotation import AnnotationSerializer
+from .bmc import BMCSerializer
 from .installation import InstallationSerializer
 from .networkinterface import NetworkInterfaceSerializer
-from .bmc import BMCSerializer
 
 
 class NetworkInterfaceListingField(NetworkInterfaceSerializer):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/data/admin.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/admin.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/admin.py       2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/admin.py       2023-05-04 
15:32:01.000000000 +0200
@@ -1,21 +1,21 @@
 from django import forms
-from django.urls import re_path
 from django.contrib import admin, messages
 from django.contrib.admin.templatetags.admin_list import _boolean_icon
 from django.core.exceptions import ValidationError
 from django.db.models import Q
 from django.shortcuts import redirect
-from django.urls import reverse
+from django.urls import re_path, reverse
 from django.utils.html import format_html
 
-from orthos2.utils.remotepowertype import RemotePowerType
 from orthos2.api.forms import RemotePowerDeviceAPIForm
+from orthos2.utils.remotepowertype import RemotePowerType
 
-from .models import (Annotation, Architecture, BMC, Domain, Enclosure,
-                     Machine, MachineGroup, MachineGroupMembership, 
DomainAdmin,
-                     NetworkInterface, Platform, RemotePower, 
RemotePowerDevice,
-                     SerialConsole, SerialConsoleType, ServerConfig, System, 
Vendor,
-                     is_unique_mac_address, validate_mac_address)
+from .models import (BMC, Annotation, Architecture, Domain, DomainAdmin,
+                     Enclosure, Machine, MachineGroup, MachineGroupMembership,
+                     NetworkInterface, Platform, RemotePower,
+                     RemotePowerDevice, SerialConsole, SerialConsoleType,
+                     ServerConfig, System, Vendor, is_unique_mac_address,
+                     validate_mac_address)
 
 
 class BMCInlineFormset(forms.models.BaseInlineFormSet):
@@ -101,7 +101,8 @@
                     port, dev.fence_name))
         else:
             if port:
-                raise forms.ValidationError("Fence {} needs no port, please 
leave emtpy".format(fence.fence))
+                raise forms.ValidationError(
+                    "Fence {} needs no port, please leave 
emtpy".format(fence.fence))
 
 
 class RemotePowerInlineRpower(admin.StackedInline):
@@ -238,8 +239,6 @@
         fqdn = self.cleaned_data['fqdn']
 
         if hasattr(self, 'machine'):
-            if fqdn != self.machine.fqdn:
-                raise ValidationError("Machines must not be renamed. Delete 
and add them if needed")
             # We do not reach below check, but we do if we would allow 
renaming at some point
             if Machine.objects.filter(fqdn=fqdn).exclude(pk=self.machine.pk):
                 raise ValidationError("FQDN is already in use!")
@@ -255,8 +254,8 @@
         """
         cleaned_data = self.cleaned_data
 
-        check_connectivity = cleaned_data['check_connectivity']
-        collect_system_information = cleaned_data['collect_system_information']
+        check_connectivity = cleaned_data.get('check_connectivity')
+        collect_system_information = 
cleaned_data.get('collect_system_information')
 
         if collect_system_information and check_connectivity != 
Machine.Connectivity.ALL:
             self.add_error(
@@ -264,27 +263,30 @@
                 "Connectivity check must set to 'Full'"
             )
 
-        hypervisor = self.cleaned_data.get('hypervisor')
-        system = self.cleaned_data.get('system')
+        hypervisor = cleaned_data.get('hypervisor')
+        system = cleaned_data.get('system')
         if hypervisor and System.objects.filter(name=system, virtual=False):
-            self.add_error('system', "System type is not virtual. Only Virtual 
Machines may have a hypervisor")
+            self.add_error(
+                'system', "System type is not virtual. Only Virtual Machines 
may have a hypervisor")
             self.add_error('hypervisor', "System type {} is not virtual. Only 
Virtual Machines may have "
                            "a hypervisor".format(system))
 
-        vm_dedicated_host = self.cleaned_data.get('vm_dedicated_host')
+        vm_dedicated_host = cleaned_data.get('vm_dedicated_host')
         if vm_dedicated_host and System.objects.filter(name=system, 
allowHypervisor=False):
             self.add_error('system', "System type cannot serve as a 
hypervisor")
             self.add_error('vm_dedicated_host', "System cannot be set as 
dedicated VM host")
 
-        mac = self.cleaned_data.get('mac_address')
-        unknown_mac = self.cleaned_data.get('unknown_mac')
+        mac = cleaned_data.get('mac_address')
+        unknown_mac = cleaned_data.get('unknown_mac')
 
         if mac and unknown_mac:
             self.add_error('unknown_mac', "MAC unknown must not be selected 
when a MAC is provided")
             self.add_error('mac_address', "MAC unknown must not be selected 
when a MAC is provided")
         if not mac and not unknown_mac:
-            self.add_error('unknown_mac', "Either specify a MAC, or confirm 
that the MAC is not yet known")
-            self.add_error('mac_address', "Either specify a MAC, or confirm 
that the MAC is not yet known")
+            self.add_error(
+                'unknown_mac', "Either specify a MAC, or confirm that the MAC 
is not yet known")
+            self.add_error(
+                'mac_address', "Either specify a MAC, or confirm that the MAC 
is not yet known")
         return cleaned_data
 
 
@@ -571,16 +573,14 @@
     )
     # enables nifty unobtrusive JavaScript “filter” interface
     filter_horizontal = (
-        'cobbler_server',
         'supported_architectures',
     )
     inlines = (ArchsInline, )
 
     def cobbler_server_list(self, obj):
-        """Return DHCP server list as string."""
-        if obj.cobbler_server.all().count() == 0:
-            return '-'
-        return ', '.join([cobbler_server.fqdn for cobbler_server in 
obj.cobbler_server.all()])
+        """Return DHCP server FQDN as string."""
+        cobbler_server = obj.cobbler_server
+        return cobbler_server.fqdn if cobbler_server else '-'
 
     def delete_model(self, request, obj=None):
         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/management/commands/dump_db.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/management/commands/dump_db.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/management/commands/dump_db.py 
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/management/commands/dump_db.py 
2023-05-04 15:32:01.000000000 +0200
@@ -6,7 +6,7 @@
 from django.core.management.base import BaseCommand
 
 from orthos2.data.models.domain import Domain, DomainAdmin
-from orthos2.data.models.machine import Machine, Enclosure, NetworkInterface
+from orthos2.data.models.machine import Enclosure, Machine, NetworkInterface
 from orthos2.taskmanager.models import DailyTask
 
 USAGE = """
@@ -110,8 +110,8 @@
                 self.add_machine(d_obj.tftp_server.fqdn)
             if d_obj.cscreen_server:
                 self.add_machine(d_obj.cscreen_server.fqdn)
-            if d_obj.cobbler_server and len(d_obj.cobbler_server.all()):
-                self.add_machine(d_obj.cobbler_server.all()[0].fqdn)
+            if d_obj.cobbler_server:
+                self.add_machine(d_obj.cobbler_server.fqdn)
 
             query = Domain.objects.filter(name=d_obj)
             self.queries.extend(query)
@@ -135,7 +135,7 @@
         for item in query:
             item.tftp_server = None
             item.cscreen_server = None
-            item.cobbler_server.set([])
+            item.cobbler_server = None
         self.queries.extend(query)
         self.add_machine("markeb.arch.suse.de")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/__init__.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/__init__.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/__init__.py     
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/__init__.py     
2023-05-04 15:32:01.000000000 +0200
@@ -1,20 +1,20 @@
-from .machine import *                      # noqa: F403
-from .enclosure import *                    # noqa: F403
-from .architecture import *                 # noqa: F403
-from .domain import *                       # noqa: F403
-from .platform import *                     # noqa: F403
-from .system import *                       # noqa: F403
-from .serverconfig import *                 # noqa: F403
-from .installation import *                 # noqa: F403
-from .vendor import *                       # noqa: F403
-from .networkinterface import *             # noqa: F403
-from .reservationhistory import *           # noqa: F403
-from .serialconsole import *                # noqa: F403
-from .remotepower import *                  # noqa: F403
-from .machinegroup import MachineGroup, MachineGroupMembership
+from .annotation import Annotation
+from .architecture import *  # noqa: F403
+from .bmc import *  # noqa: F403
 from .component import Component
 from .components.pci import PCIDevice
-from .annotation import Annotation
-from .virtualizationapi import *            # noqa: F403
-from .bmc import *                          # noqa: F403
-from .remotepowerdevice import *            # noqa: F403
+from .domain import *  # noqa: F403
+from .enclosure import *  # noqa: F403
+from .installation import *  # noqa: F403
+from .machine import *  # noqa: F403
+from .machinegroup import MachineGroup, MachineGroupMembership
+from .networkinterface import *  # noqa: F403
+from .platform import *  # noqa: F403
+from .remotepower import *  # noqa: F403
+from .remotepowerdevice import *  # noqa: F403
+from .reservationhistory import *  # noqa: F403
+from .serialconsole import *  # noqa: F403
+from .serverconfig import *  # noqa: F403
+from .system import *  # noqa: F403
+from .vendor import *  # noqa: F403
+from .virtualizationapi import *  # noqa: F403
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/bmc.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/bmc.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/bmc.py  2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/bmc.py  2023-05-04 
15:32:01.000000000 +0200
@@ -1,6 +1,7 @@
 from django.db import models
 
 from orthos2.utils.remotepowertype import get_remote_power_type_choices
+
 from .machine import Machine
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/domain.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/domain.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/domain.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/domain.py       
2023-05-04 15:32:01.000000000 +0200
@@ -4,6 +4,7 @@
 from django.core.exceptions import ValidationError
 from django.db import models
 from django.template import Context, Template
+
 from orthos2.utils.misc import has_valid_domain_ending
 
 from .architecture import Architecture
@@ -35,11 +36,13 @@
         validators=[validate_domain_ending]
     )
 
-    cobbler_server = models.ManyToManyField(
+    cobbler_server = models.ForeignKey(
         'data.Machine',
         related_name='cobbler_server_for',
         verbose_name='Cobbler server',
+        null=True,
         blank=True,
+        on_delete=models.SET_NULL,
         limit_choices_to={'administrative': True}
     )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/machine.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/machine.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/machine.py      
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/machine.py      
2023-05-04 15:32:01.000000000 +0200
@@ -6,21 +6,21 @@
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.core import serializers
-from django.core.exceptions import (PermissionDenied, ValidationError, 
ObjectDoesNotExist)
+from django.core.exceptions import (ObjectDoesNotExist, PermissionDenied,
+                                    ValidationError)
 from django.db import models
 from django.db.models import Q
 from django.utils import timezone
-from orthos2.utils.misc import (Serializer, get_domain, get_hostname,
-                                get_ipv4, get_ipv6, get_s390_hostname,
-                                is_dns_resolvable)
-
 
 from orthos2.data.exceptions import ReleaseException, ReserveException
+from orthos2.utils.misc import (Serializer, get_domain, get_hostname, get_ipv4,
+                                get_ipv6, get_s390_hostname, is_dns_resolvable)
+
 from .architecture import Architecture
 from .domain import Domain, DomainAdmin, validate_domain_ending
 from .enclosure import Enclosure
 from .machinegroup import MachineGroup
-from .networkinterface import validate_mac_address, NetworkInterface
+from .networkinterface import NetworkInterface, validate_mac_address
 from .platform import Platform
 from .system import System
 from .virtualizationapi import VirtualizationAPI
@@ -699,8 +699,23 @@
                 update_sconsole = True
 
             if self.fqdn_domain != self._original.fqdn_domain:
-                raise NotImplementedError(
-                    "Moving machines between domains is not implemented yet")
+                logger.info(f"Domain change for: %s", self.fqdn)
+                # TODO: add error handling (checking whether the signal went 
through)
+                # Not removing the machine from the original Cobbler system, 
because there is no easy remove signal
+                # and it's probably not even necessary
+                # Add the machine to the new Cobbler system
+                # TODO: check if machine is known to us, and also a cobbler 
server
+                new_domain_id = self.fqdn_domain.pk
+                self.__ipv4 = get_ipv4(self.fqdn)
+                self.__ipv6 = get_ipv6(self.fqdn)
+                from orthos2.data.signals import signal_cobbler_machine_update
+                signal_cobbler_machine_update.send(
+                    sender=self.__class__, machine_id=self.pk, 
domain_id=new_domain_id)
+
+                # Sync DHCP on the new domain
+                from orthos2.data.signals import signal_cobbler_sync_dhcp
+                signal_cobbler_sync_dhcp.send(sender=self.__class__, 
domain_id=new_domain_id)
+                return
 
         if update_machine:
             from orthos2.data.signals import signal_cobbler_machine_update
@@ -711,6 +726,7 @@
                 sender=self.__class__, domain_id=domain_id, 
machine_id=machine_id)
         if sync_dhcp:
             from orthos2.data.signals import signal_cobbler_sync_dhcp
+
             # regenerate DHCP on all domains (deletion/registration) if domain 
changed
             domain_id = self.fqdn_domain.pk
             signal_cobbler_sync_dhcp.send(sender=self.__class__, 
domain_id=domain_id)
@@ -750,7 +766,7 @@
     is_administrative.boolean = True
 
     def is_cobbler_server(self):
-        return self.domain_set.all().exists()
+        return self.cobbler_server_for.exists()
     is_cobbler_server.boolean = True
 
     def is_virtual_machine(self):
@@ -1114,8 +1130,8 @@
     def scan(self, action='all', user=None):
         """Start scanning/checking the machine by creating a task."""
         from orthos2.taskmanager import tasks
-        from orthos2.taskmanager.tasks.ansible import Ansible
         from orthos2.taskmanager.models import TaskManager
+        from orthos2.taskmanager.tasks.ansible import Ansible
 
         if action.lower() not in tasks.MachineCheck.Scan.Action.as_list:
             raise Exception("Unknown scan option '{}'!".format(action))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/remotepower.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/remotepower.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/remotepower.py  
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/remotepower.py  
2023-05-04 15:32:01.000000000 +0200
@@ -3,7 +3,9 @@
 from django.core.exceptions import ValidationError
 from django.db import models
 
-from orthos2.utils.remotepowertype import RemotePowerType, 
get_remote_power_type_choices
+from orthos2.utils.remotepowertype import (RemotePowerType,
+                                           get_remote_power_type_choices)
+
 from . import ServerConfig
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/remotepowerdevice.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/remotepowerdevice.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/remotepowerdevice.py    
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/remotepowerdevice.py    
2023-05-04 15:32:01.000000000 +0200
@@ -1,7 +1,8 @@
-from django.db import models
 from django.core.exceptions import ObjectDoesNotExist
+from django.db import models
 
 from orthos2.utils.remotepowertype import get_remote_power_type_choices
+
 from . import ServerConfig
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/system.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/system.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/system.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/system.py       
2023-05-04 15:32:01.000000000 +0200
@@ -1,4 +1,5 @@
 from django.db import models
+
 from orthos2.utils.misc import safe_get_or_default
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/virtualizationapi.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/models/virtualizationapi.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/models/virtualizationapi.py    
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/models/virtualizationapi.py    
2023-05-04 15:32:01.000000000 +0200
@@ -80,10 +80,12 @@
         Method returns a new `Machine` object and calls the subclass to 
actually create the virtual
         machine physically.
         """
-        from orthos2.data.models import (Architecture, Machine, RemotePower,
-                                         SerialConsole, SerialConsoleType, 
System)
         from django.contrib.auth.models import User
 
+        from orthos2.data.models import (Architecture, Machine, RemotePower,
+                                         SerialConsole, SerialConsoleType,
+                                         System)
+
         vm = Machine()
         vm.unsaved_networkinterfaces = []
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/scripts/dump_test_db.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/scripts/dump_test_db.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/scripts/dump_test_db.py        
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/scripts/dump_test_db.py        
2023-05-04 15:32:01.000000000 +0200
@@ -3,8 +3,9 @@
 import os
 
 from django.apps import apps
+
 from orthos2.data.models.domain import Domain, DomainAdmin
-from orthos2.data.models.machine import Machine, Enclosure, NetworkInterface
+from orthos2.data.models.machine import Enclosure, Machine, NetworkInterface
 from orthos2.taskmanager.models import DailyTask
 
 USAGE = """
@@ -40,7 +41,8 @@
 Modules = {}
 
 # General also includes taskmanager.dailytask and basic arch.suse.de domain
-Modules['general'] = ("Serverconfig", "System", "Architecture", "Vendor", 
"Platform", "Serialconsoletype")
+Modules['general'] = ("Serverconfig", "System", "Architecture",
+                      "Vendor", "Platform", "Serialconsoletype")
 
 Modules['domain'] = ("Domain", "Domainadmin")
 
@@ -99,8 +101,8 @@
             add_machine(d_obj.tftp_server.fqdn, queries)
         if d_obj.cscreen_server:
             add_machine(d_obj.cscreen_server.fqdn, queries)
-        if d_obj.cobbler_server and len(d_obj.cobbler_server.all()):
-            add_machine(d_obj.cobbler_server.all()[0].fqdn, queries)
+        if d_obj.cobbler_server:
+            add_machine(d_obj.cobbler_server.fqdn, queries)
 
         query = Domain.objects.filter(name=d_obj)
         queries.extend(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/data/signals.py 
new/orthos2-1.2.169+git.a693485/orthos2/data/signals.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/data/signals.py     2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/data/signals.py     2023-05-04 
15:32:01.000000000 +0200
@@ -6,12 +6,15 @@
 from django.db.models.signals import (post_delete, post_init, post_save,
                                       pre_delete, pre_save)
 from django.dispatch import Signal, receiver
+
 from orthos2.taskmanager import tasks
 from orthos2.taskmanager.models import TaskManager
-from orthos2.utils.misc import (Serializer, get_hostname)
 from orthos2.utils.cobbler import CobblerServer
+from orthos2.utils.misc import Serializer, get_hostname
+
+from .models import (Machine, NetworkInterface, SerialConsole, ServerConfig,
+                     is_unique_mac_address)
 
-from .models import (Machine, NetworkInterface, SerialConsole, ServerConfig, 
is_unique_mac_address)
 logger = logging.getLogger('orthos')
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/templates/admin/data/machine/change_form.html
 
new/orthos2-1.2.169+git.a693485/orthos2/data/templates/admin/data/machine/change_form.html
--- 
old/orthos2-1.2.154+git.40b86d2/orthos2/data/templates/admin/data/machine/change_form.html
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/orthos2/data/templates/admin/data/machine/change_form.html
  2023-05-04 15:32:01.000000000 +0200
@@ -0,0 +1,37 @@
+{% extends 'admin/change_form.html' %}
+
+{% block extrahead %}
+<script>
+    document.addEventListener('DOMContentLoaded', function () {
+        const architectureSystemMapping = {
+            's390x': ['zVM', 'zKVM', 'LPAR zSeries'],
+            'x86_64': ['BareMetal', 'KVM', 'XEN']
+        };
+
+        function filterSystems() {
+            const architectureSelect = 
document.getElementById('id_architecture');
+            const systemSelect = document.getElementById('id_system');
+            const selectedSystem = 
systemSelect.options[systemSelect.selectedIndex].text;
+            const selectedArchitecture = 
architectureSelect.options[architectureSelect.selectedIndex].text;
+            const allowedSystems = 
architectureSystemMapping[selectedArchitecture] || [];
+
+            if (!allowedSystems.includes(selectedSystem)) {
+                systemSelect.selectedIndex = 0;
+            }
+
+            for (let i = 0; i < systemSelect.options.length; i++) {
+                const systemOption = systemSelect.options[i];
+                if (allowedSystems.length === 0 || 
allowedSystems.includes(systemOption.text)) {
+                    systemOption.style.display = 'block';
+                    systemOption.disabled = false;
+                } else {
+                    systemOption.disabled = true;
+                }
+            }
+        }
+
+        document.getElementById('id_architecture').addEventListener('change', 
filterSystems);
+        filterSystems();
+    });
+</script>
+{% endblock %}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/ajax.py 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/ajax.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/ajax.py    2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/frontend/ajax.py    2023-05-04 
15:32:01.000000000 +0200
@@ -4,8 +4,8 @@
 from django.http import JsonResponse
 from django.template.defaultfilters import urlize
 
-from orthos2.frontend.templatetags.tags import vm_record
 from orthos2.data.models import Annotation, Machine, RemotePower
+from orthos2.frontend.templatetags.tags import vm_record
 
 from .decorators import check_permissions
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/forms.py 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/forms.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/forms.py   2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/frontend/forms.py   2023-05-04 
15:32:01.000000000 +0200
@@ -8,8 +8,8 @@
 from django.utils import timezone
 from django.utils.formats import date_format
 
-from orthos2.data.models import (Installation, Machine, Platform,
-                                 ServerConfig, System, Vendor)
+from orthos2.data.models import (Installation, Machine, Platform, ServerConfig,
+                                 System, Vendor)
 
 logger = logging.getLogger('views')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/management/commands/serialconsole-ws.py
 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/management/commands/serialconsole-ws.py
--- 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/management/commands/serialconsole-ws.py
    2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/management/commands/serialconsole-ws.py
    2023-05-04 15:32:01.000000000 +0200
@@ -1,4 +1,5 @@
 import sys
+
 try:
     from ptyprocess import PtyProcessUnicode
     from terminado import TermSocket, UniqueTermManager
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/admin/test_machine.py 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/admin/test_machine.py
--- 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/admin/test_machine.py    
    2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/admin/test_machine.py    
    2023-05-04 15:32:01.000000000 +0200
@@ -1,5 +1,4 @@
 from django.test import TestCase
-
 from django_webtest import WebTest
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/admin/test_machine_views.py
 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/admin/test_machine_views.py
--- 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/admin/test_machine_views.py
  2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/admin/test_machine_views.py
  2023-05-04 15:32:01.000000000 +0200
@@ -1,5 +1,4 @@
 import mock
-
 from django.urls import reverse
 from django_webtest import WebTest
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/user/test_ldap.py 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/user/test_ldap.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/user/test_ldap.py    
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/user/test_ldap.py    
2023-05-04 15:32:01.000000000 +0200
@@ -6,6 +6,7 @@
 
 from django.urls import reverse
 from django_webtest import WebTest
+
 from orthos2.data.models.serverconfig import ServerConfig
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/user/test_restore_password.py
 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/user/test_restore_password.py
--- 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/tests/user/test_restore_password.py
        2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/tests/user/test_restore_password.py
        2023-05-04 15:32:01.000000000 +0200
@@ -1,6 +1,7 @@
 from django.contrib.auth.models import User
 from django.urls import reverse
 from django_webtest import WebTest
+
 from orthos2.taskmanager.models import SingleTask
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/urls.py 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/urls.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/urls.py    2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/frontend/urls.py    2023-05-04 
15:32:01.000000000 +0200
@@ -1,8 +1,9 @@
-from django.urls import re_path
 from django.contrib.auth import views as auth_views
+from django.urls import re_path
 from django.views.generic import RedirectView
 
 from . import ajax, views
+
 app_name = 'orthos2.frontend'
 urlpatterns = [
     re_path(r'^$', 
RedirectView.as_view(pattern_name='frontend:free_machines'), name='root'),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/views.py 
new/orthos2-1.2.169+git.a693485/orthos2/frontend/views.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/frontend/views.py   2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/frontend/views.py   2023-05-04 
15:32:01.000000000 +0200
@@ -25,7 +25,6 @@
 from django.views.decorators.csrf import csrf_protect
 from django.views.decorators.debug import sensitive_post_parameters
 from django.views.generic import ListView
-
 from rest_framework.authtoken.models import Token
 
 from orthos2.data.models import (Architecture, Domain, Machine, MachineGroup,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/settings.py 
new/orthos2-1.2.169+git.a693485/orthos2/settings.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/settings.py 2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/settings.py 2023-05-04 
15:32:01.000000000 +0200
@@ -14,8 +14,8 @@
 import logging.config
 import os
 import sys
-from socket import getfqdn, gethostname
 from pwd import getpwuid
+from socket import getfqdn, gethostname
 
 from django.contrib.messages import constants as messages
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/admin.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/admin.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/admin.py        
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/admin.py        
2023-05-04 15:32:01.000000000 +0200
@@ -1,9 +1,8 @@
 import datetime
 
-from django.urls import re_path
 from django.contrib import admin, messages
 from django.shortcuts import redirect
-from django.urls import reverse
+from django.urls import re_path, reverse
 from django.utils.html import format_html
 
 from .models import DailyTask, SingleTask
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/executer.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/executer.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/executer.py     
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/executer.py     
2023-05-04 15:32:01.000000000 +0200
@@ -6,15 +6,15 @@
 from queue import Queue
 from threading import Thread
 
-from django.utils import timezone
-from django.db.utils import InterfaceError
 from django import db
+from django.db.utils import InterfaceError
+from django.utils import timezone
 
 from orthos2.data.models import ServerConfig
+
 from . import Priority
 from .models import BaseTask, DailyTask, SingleTask
 
-
 logger = logging.getLogger('tasks')
 
 PRIORITIES = [Priority.HIGH, Priority.NORMAL]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/management/commands/taskmanager.py
 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/management/commands/taskmanager.py
--- 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/management/commands/taskmanager.py
      2023-03-20 17:05:03.000000000 +0100
+++ 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/management/commands/taskmanager.py
      2023-05-04 15:32:01.000000000 +0200
@@ -6,6 +6,7 @@
 
 from django.conf import settings
 from django.core.management.base import BaseCommand
+
 from orthos2.taskmanager.executer import TaskExecuter
 
 logger = logging.getLogger('tasks')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/models.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/models.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/models.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/models.py       
2023-05-04 15:32:01.000000000 +0200
@@ -1,6 +1,5 @@
 import json
 import logging
-
 from hashlib import sha1
 
 from django.db import models
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/__init__.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/__init__.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/__init__.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/__init__.py       
2023-05-04 15:32:01.000000000 +0200
@@ -1,9 +1,9 @@
-from .machinetasks import RegenerateMOTD, MachineCheck
-from .notifications import (CheckReservationExpiration, SendRestoredPassword,
-                            SendReservationInformation, CheckMultipleAccounts,
-                            CheckForPrimaryNetwork)
+from .cobbler import RegenerateCobbler, SyncCobblerDHCP, UpdateCobblerMachine
+from .daily import (DailyCheckForPrimaryNetwork,
+                    DailyCheckReservationExpirations, DailyMachineChecks)
+from .machinetasks import MachineCheck, RegenerateMOTD
+from .notifications import (CheckForPrimaryNetwork, CheckMultipleAccounts,
+                            CheckReservationExpiration,
+                            SendReservationInformation, SendRestoredPassword)
 from .sconsole import RegenerateSerialConsole
-from .cobbler import RegenerateCobbler, UpdateCobblerMachine, SyncCobblerDHCP
-from .daily import (DailyMachineChecks, DailyCheckReservationExpirations,
-                    DailyCheckForPrimaryNetwork)
 from .setup import SetupMachine
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/ansible.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/ansible.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/ansible.py        
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/ansible.py        
2023-05-04 15:32:01.000000000 +0200
@@ -5,20 +5,19 @@
 passing ansible collected data instead of self called functions
 '''
 
+import glob
+import json
+import logging
 import os
 import shutil
-import glob
 import threading
-import logging
-import json
 from datetime import datetime
 
 from django.template.loader import render_to_string
 
-from orthos2.taskmanager.models import Task
 from orthos2.data.models import Machine
-from orthos2.utils.misc import normalize_ascii
-from orthos2.utils.misc import execute
+from orthos2.taskmanager.models import Task
+from orthos2.utils.misc import execute, normalize_ascii
 
 logger = logging.getLogger('tasks')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/cobbler.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/cobbler.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/cobbler.py        
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/cobbler.py        
2023-05-04 15:32:01.000000000 +0200
@@ -42,7 +42,7 @@
             logger.info("--- Start Cobbler deployment ---")
             for domain in domains:
 
-                if domain.cobbler_server.all().count() == 0:
+                if not domain.cobbler_server:
                     logger.info("Domain '%s' has no Cobbler server... skip", 
domain.name)
                     continue
 
@@ -53,19 +53,18 @@
                 logger.info("Generate Cobbler configuration for '%s'...", 
domain.name)
 
                 # deploy generated DHCP files on all servers belonging to one 
domain
-                for server in domain.cobbler_server.all():
-
-                    cobbler_server = CobblerServer(server.fqdn, domain)
-                    try:
-                        logger.info("* Cobbler deployment started...")
-                        cobbler_server.deploy()
-                        logger.info("* Cobbler deployment finished 
successfully")
-                    except Exception as e:
-                        message = "* Cobbler deployment failed; {}".format(e)
-                        if isinstance(e, (SystemError, SyntaxError)):
-                            logger.exception(message)
-                        else:
-                            logger.exception(message)
+                cobbler_server = domain.cobbler_server
+                cobbler_server_obj = CobblerServer(cobbler_server.fqdn, domain)
+                try:
+                    logger.info("* Cobbler deployment started...")
+                    cobbler_server_obj.deploy()
+                    logger.info("* Cobbler deployment finished successfully")
+                except Exception as e:
+                    message = "* Cobbler deployment failed; {}".format(e)
+                    if isinstance(e, (SystemError, SyntaxError)):
+                        logger.exception(message)
+                    else:
+                        logger.exception(message)
 
         except SSH.Exception as e:
             logger.exception(e)
@@ -85,23 +84,23 @@
             domain = Domain.objects.get(pk=self._domain_id)
             machine = Machine.objects.get(pk=self._machine_id)
             logger.info("Cobbler update started")
-            if domain.cobbler_server.all().count() == 0:
+            if not domain.cobbler_server:
                 logger.info("Domain '%s' has no Cobbler server... aborting", 
domain.name)
                 return
             logger.info("Generate Cobbler update configuration for '%s'...", 
machine.fqdn)
             # deploy generated DHCP files on all servers belonging to one 
domain
-            for server in domain.cobbler_server.all():
-                cobbler_server = CobblerServer(server.fqdn, domain)
-                try:
-                    logger.info("* Cobbler deployment started...")
-                    cobbler_server.update_or_add(machine)
-                    logger.info("* Cobbler deployment finished successfully")
-                except Exception as e:
-                    message = "* Cobbler deployment failed; {}".format(e)
-                    if isinstance(e, (SystemError, SyntaxError)):
-                        logger.exception(message)
-                    else:
-                        logger.exception(message)
+            cobbler_server = domain.cobbler_server
+            cobbler_server_obj = CobblerServer(cobbler_server.fqdn, domain)
+            try:
+                logger.info("* Cobbler deployment started...")
+                cobbler_server_obj.update_or_add(machine)
+                logger.info("* Cobbler deployment finished successfully")
+            except Exception as e:
+                message = "* Cobbler deployment failed; {}".format(e)
+                if isinstance(e, (SystemError, SyntaxError)):
+                    logger.exception(message)
+                else:
+                    logger.exception(message)
         except SSH.Exception as e:
             logger.exception(e)
         except Domain.DoesNotExist:
@@ -126,12 +125,12 @@
     def execute(self):
         try:
             domain = Domain.objects.get(pk=self._domain_id)
-            if domain.cobbler_server.all().count() == 0:
+            if not domain.cobbler_server:
                 logger.info("Domain '%s' has no Cobbler server... aborting", 
domain.name)
                 return
-            for server in domain.cobbler_server.all():
-                cobbler_server = CobblerServer(server.fqdn, domain)
-                cobbler_server.sync_dhcp()
+            cobbler_server = domain.cobbler_server
+            cobbler_server_obj = CobblerServer(cobbler_server.fqdn, domain)
+            cobbler_server_obj.sync_dhcp()
         except Domain.DoesNotExist:
             logger.error("No Domain with id %s, aborting", self._domain_id)
         except Domain.MultipleObjectsReturned:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/machinetasks.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/machinetasks.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/machinetasks.py   
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/machinetasks.py   
2023-05-04 15:32:01.000000000 +0200
@@ -4,9 +4,10 @@
 
 from orthos2.data.models import Machine, NetworkInterface, ServerConfig
 from orthos2.taskmanager.models import Task
-from orthos2.utils.machinechecks import (get_installations, 
get_networkinterfaces,
-                                         get_status_ip, login_test,
-                                         nmap_check, ping_check_ipv4, 
ping_check_ipv6)
+from orthos2.utils.machinechecks import (get_installations,
+                                         get_networkinterfaces, get_status_ip,
+                                         login_test, nmap_check,
+                                         ping_check_ipv4, ping_check_ipv6)
 from orthos2.utils.misc import sync, wrap80
 from orthos2.utils.ssh import SSH
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/notifications.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/notifications.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/notifications.py  
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/notifications.py  
2023-05-04 15:32:01.000000000 +0200
@@ -1,12 +1,12 @@
 import logging
 
 from django.conf import settings
-from django.utils import timezone
 from django.contrib.auth.models import User
+from django.utils import timezone
 
-from orthos2.data.models import Machine, Domain, DomainAdmin
+from orthos2.data.models import Domain, DomainAdmin, Machine
 from orthos2.taskmanager.models import Task
-from orthos2.utils.misc import send_email, get_domain
+from orthos2.utils.misc import get_domain, send_email
 
 logger = logging.getLogger('tasks')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/sconsole.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/sconsole.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/sconsole.py       
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/sconsole.py       
2023-05-04 15:32:01.000000000 +0200
@@ -1,6 +1,6 @@
 import logging
 
-from orthos2.data.models import ServerConfig, Domain
+from orthos2.data.models import Domain, ServerConfig
 from orthos2.taskmanager.models import Task
 from orthos2.utils.ssh import SSH
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/setup.py 
new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/setup.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/taskmanager/tasks/setup.py  
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/taskmanager/tasks/setup.py  
2023-05-04 15:32:01.000000000 +0200
@@ -2,8 +2,8 @@
 
 from orthos2.data.models import Machine, ServerConfig
 from orthos2.taskmanager.models import Task
+from orthos2.utils.cobbler import CobblerException, CobblerServer
 from orthos2.utils.ssh import SSH
-from orthos2.utils.cobbler import CobblerServer, CobblerException
 
 logger = logging.getLogger('tasks')
 
@@ -26,27 +26,22 @@
         try:
             machine = Machine.objects.get(fqdn=self.fqdn)
             domain = machine.fqdn_domain
-            servers = domain.cobbler_server.all()
-            if not servers:
+            server = domain.cobbler_server
+            if not server:
                 logger.warning("No cobbler server available for '%s'", 
machine.fqdn_domain.name)
                 return
 
-            for server in servers:
-                try:
-                    logger.debug("trying %s for setup", server.fqdn)
-                    cobbler_server = CobblerServer(server.fqdn, domain)
-                    cobbler_server.setup(machine, self.choice)
-
-                except CobblerException as e:
-                    logger.warning("Setup of %s with %s failed on %s with %s", 
machine.fqdn,
-                                   self.choice, server.fqdn, e)
-                else:
-                    logger.debug("success")
-                    machine.reboot()
-                    break
+            try:
+                logger.debug("trying %s for setup", server.fqdn)
+                cobbler_server = CobblerServer(server.fqdn, domain)
+                cobbler_server.setup(machine, self.choice)
+
+            except CobblerException as e:
+                logger.warning("Setup of %s with %s failed on %s with %s", 
machine.fqdn,
+                               self.choice, server.fqdn, e)
             else:
-                logger.exception("Setup of %s with %s failed on all cobbler 
servers",
-                                 machine.fqdn, self.choice)
+                logger.debug("success")
+                machine.reboot()
 
         except SSH.Exception as exception:
             logger.exception(exception)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/urls.py 
new/orthos2-1.2.169+git.a693485/orthos2/urls.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/urls.py     2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/urls.py     2023-05-04 
15:32:01.000000000 +0200
@@ -15,8 +15,8 @@
         1. Import the include() function: from django.urls import url, include
         2. Add a URL to urlpatterns:  re_path(r'^blog/', include('blog.urls'))
 """
-from django.urls import include, re_path
 from django.contrib import admin
+from django.urls import include, re_path
 
 urlpatterns = [
     re_path(r'^', include('orthos2.frontend.urls', namespace='frontend')),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/utils/cobbler.py 
new/orthos2-1.2.169+git.a693485/orthos2/utils/cobbler.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/utils/cobbler.py    2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/utils/cobbler.py    2023-05-04 
15:32:01.000000000 +0200
@@ -3,9 +3,9 @@
 from django.template import Context, Template
 
 from orthos2.data.models import Machine, ServerConfig
-from orthos2.utils.ssh import SSH
 from orthos2.utils.misc import get_hostname, get_ipv4, get_ipv6
 from orthos2.utils.remotepowertype import RemotePowerType
+from orthos2.utils.ssh import SSH
 
 logger = logging.getLogger('utils')
 
@@ -172,9 +172,9 @@
         :returns: The corresponding cobbler server or None
         """
         domain = machine.fqdn_domain
-        server = domain.cobbler_server.all()
-        if server and server[0]:
-            return CobblerServer(server[0].fqdn, domain)
+        server = domain.cobbler_server
+        if server:
+            return CobblerServer(server.fqdn, domain)
         return None
 
     def connect(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/utils/hostnamefinder.py 
new/orthos2-1.2.169+git.a693485/orthos2/utils/hostnamefinder.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/utils/hostnamefinder.py     
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/utils/hostnamefinder.py     
2023-05-04 15:32:01.000000000 +0200
@@ -1,5 +1,5 @@
-import socket
 import logging
+import socket
 
 from django.conf import settings
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/utils/machinechecks.py 
new/orthos2-1.2.169+git.a693485/orthos2/utils/machinechecks.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/utils/machinechecks.py      
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/utils/machinechecks.py      
2023-05-04 15:32:01.000000000 +0200
@@ -4,10 +4,11 @@
 import threading
 from decimal import Decimal
 
-from orthos2.data.models import Architecture, Installation, Machine, 
NetworkInterface
+from orthos2.data.models import (Architecture, Installation, Machine,
+                                 NetworkInterface)
 from orthos2.utils.misc import execute, normalize_ascii
-from orthos2.utils.ssh import SSH
 from orthos2.utils.remote import ssh_execute
+from orthos2.utils.ssh import SSH
 
 ARPHRD_IEEE80211 = 801
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/utils/remotepowertype.py 
new/orthos2-1.2.169+git.a693485/orthos2/utils/remotepowertype.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/utils/remotepowertype.py    
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/utils/remotepowertype.py    
2023-05-04 15:32:01.000000000 +0200
@@ -1,4 +1,5 @@
 import logging
+
 from django.conf import settings
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/orthos2/utils/ssh.py 
new/orthos2-1.2.169+git.a693485/orthos2/utils/ssh.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/utils/ssh.py        2023-03-20 
17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/utils/ssh.py        2023-05-04 
15:32:01.000000000 +0200
@@ -1,8 +1,8 @@
 import logging
 import os
 import socket
-import paramiko
 
+import paramiko
 from django.conf import settings
 
 from orthos2.data.models import Machine, ServerConfig
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/utils/tests/test_cobbler.py 
new/orthos2-1.2.169+git.a693485/orthos2/utils/tests/test_cobbler.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/utils/tests/test_cobbler.py 
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/utils/tests/test_cobbler.py 
2023-05-04 15:32:01.000000000 +0200
@@ -1,8 +1,8 @@
 import logging
-import mock
-from mock import MagicMock, NonCallableMagicMock
 
+import mock
 from django.test import TestCase
+from mock import MagicMock, NonCallableMagicMock
 
 import orthos2.utils.cobbler as cobbler
 from orthos2.data.models import Architecture, Domain, Machine, MachineGroup
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/orthos2-1.2.154+git.40b86d2/orthos2/utils/tests/test_misc.py 
new/orthos2-1.2.169+git.a693485/orthos2/utils/tests/test_misc.py
--- old/orthos2-1.2.154+git.40b86d2/orthos2/utils/tests/test_misc.py    
2023-03-20 17:05:03.000000000 +0100
+++ new/orthos2-1.2.169+git.a693485/orthos2/utils/tests/test_misc.py    
2023-05-04 15:32:01.000000000 +0200
@@ -2,6 +2,7 @@
 
 import mock
 from django.test import TestCase
+
 from orthos2.utils.machinechecks import nmap_check, ping_check
 from orthos2.utils.misc import (execute, get_domain, get_hostname,
                                 has_valid_domain_ending, is_dns_resolvable,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/orthos2-1.2.154+git.40b86d2/setup.py 
new/orthos2-1.2.169+git.a693485/setup.py
--- old/orthos2-1.2.154+git.40b86d2/setup.py    2023-03-20 17:05:03.000000000 
+0100
+++ new/orthos2-1.2.169+git.a693485/setup.py    2023-05-04 15:32:01.000000000 
+0200
@@ -2,6 +2,7 @@
 
 import os
 from glob import glob
+
 from setuptools import find_packages, setup
 
 logpath = os.environ.get('LOG_PATH', "/var/log/orthos2")

++++++ orthos2.obsinfo ++++++
--- /var/tmp/diff_new_pack.btdVvT/_old  2023-05-04 17:10:48.196445313 +0200
+++ /var/tmp/diff_new_pack.btdVvT/_new  2023-05-04 17:10:48.208445384 +0200
@@ -1,5 +1,5 @@
 name: orthos2
-version: 1.2.154+git.40b86d2
-mtime: 1679328303
-commit: 40b86d2e9a98629b5745f842f2f43a80ba41947f
+version: 1.2.169+git.a693485
+mtime: 1683207121
+commit: a693485533889750f553759487e456d86799c6c2
 

Reply via email to