Skip to content

Commit

Permalink
Better MDM target artifact updates & DDM retries
Browse files Browse the repository at this point in the history
Add retry count in ServerToken for DDM. This should remediate the
network issues on some downloads.

Update all target artifacts in one SQL query. Emit change events for the
target artifacts.
  • Loading branch information
np5 committed Feb 9, 2025
1 parent 3e63141 commit 249fd4a
Show file tree
Hide file tree
Showing 19 changed files with 799 additions and 180 deletions.
343 changes: 306 additions & 37 deletions tests/mdm/test_artifacts.py

Large diffs are not rendered by default.

16 changes: 10 additions & 6 deletions tests/mdm/test_declarations_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,23 @@ def test_get_artifact_version_server_token_reinstall_major(self):
target,
{"reinstall_on_os_update": str(Artifact.ReinstallOnOSUpdate.MAJOR),
"reinstall_interval": 0},
{"pk": av_pk}
{"pk": av_pk},
0
)
self.assertEqual(server_token, f"{av_pk}.ov-15")

def test_get_artifact_version_server_token_reinstall_minor(self):
def test_get_artifact_version_server_token_reinstall_minor_one_retry_count(self):
target = Mock()
target.comparable_os_version = (15, 2, 1)
av_pk = str(uuid.uuid4())
server_token = get_artifact_version_server_token(
target,
{"reinstall_on_os_update": str(Artifact.ReinstallOnOSUpdate.MINOR),
"reinstall_interval": 0},
{"pk": av_pk}
{"pk": av_pk},
1
)
self.assertEqual(server_token, f"{av_pk}.ov-15.2")
self.assertEqual(server_token, f"{av_pk}.ov-15.2.rc-1")

def test_get_artifact_version_server_token_reinstall_patch(self):
target = Mock()
Expand All @@ -57,7 +59,8 @@ def test_get_artifact_version_server_token_reinstall_patch(self):
target,
{"reinstall_on_os_update": str(Artifact.ReinstallOnOSUpdate.PATCH),
"reinstall_interval": 0},
{"pk": av_pk}
{"pk": av_pk},
0
)
self.assertEqual(server_token, f"{av_pk}.ov-15.2.1")

Expand All @@ -73,6 +76,7 @@ def test_get_artifact_version_server_token_reinstall_interval(self, patched_date
target,
{"reinstall_on_os_update": str(Artifact.ReinstallOnOSUpdate.NO),
"reinstall_interval": 3600 * 24 * 90},
{"pk": av_pk}
{"pk": av_pk},
0
)
self.assertEqual(server_token, f"{av_pk}.ri-1")
34 changes: 33 additions & 1 deletion tests/mdm/test_mdm_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
Channel, DEPEnrollmentSession, DeviceCommand, EnrolledDevice,
OTAEnrollmentSession, Platform,
RealmGroupTagMapping,
Profile, UserEnrollmentSession, ReEnrollmentSession)
Profile, UserEnrollmentSession, ReEnrollmentSession,
TargetArtifact)
from .utils import (force_artifact, force_blueprint_artifact,
force_dep_enrollment_session,
force_enrolled_user,
Expand Down Expand Up @@ -649,6 +650,37 @@ def test_declarative_management_legacy_profile_declaration_device(self, post_eve
self.assertEqual(t_session, session)
self.assertIsNone(t_user)

def test_declarative_management_legacy_profile_declaration_device_retry(self, post_event):
session, udid, serial_number = force_dep_enrollment_session(self.mbu, authenticated=True, completed=True)
profile = self._force_blueprint_profile(session)
artifact_version = profile.artifact_version
artifact = artifact_version.artifact
payload = {
"UDID": udid,
"MessageType": "DeclarativeManagement",
"Data": json.dumps({"un": 2}),
"Endpoint": f"declaration/configuration/zentral.legacy-profile.{artifact.pk}"
}
target = Target(session.enrolled_device)
target.update_target_artifact(artifact_version, TargetArtifact.Status.FAILED) # force retry
response = self._put(reverse("mdm_public:checkin"), payload, session)
self.assertEqual(response.status_code, 200)
declaration = json.loads(response.content)
url = declaration["Payload"].pop("ProfileURL")
self.assertEqual(
declaration,
{'Identifier': f'zentral.legacy-profile.{artifact.pk}',
'Payload': {},
'ServerToken': f"{artifact_version.pk}.rc-1", # first retry
'Type': 'com.apple.configuration.legacy'}
)
token = url.removeprefix("https://zentral/public/mdm/profiles/")
token = token.removesuffix("/")
t_profile, t_session, t_user = load_legacy_profile_token(token)
self.assertEqual(t_profile, profile)
self.assertEqual(t_session, session)
self.assertIsNone(t_user)

def test_declarative_management_legacy_profile_declaration_user(self, post_event):
session, udid, serial_number = force_dep_enrollment_session(self.mbu, authenticated=True, completed=True)
enrolled_user = force_enrolled_user(session.enrolled_device)
Expand Down
Loading

0 comments on commit 249fd4a

Please sign in to comment.