assemblyline-core 4.6.1.dev214__tar.gz → 4.6.1.dev215__tar.gz

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

Potentially problematic release.


This version of assemblyline-core might be problematic. Click here for more details.

Files changed (91) hide show
  1. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/PKG-INFO +1 -1
  2. assemblyline_core-4.6.1.dev215/assemblyline_core/VERSION +1 -0
  3. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/tasking_client.py +2 -25
  4. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/updater/helper.py +8 -7
  5. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/updater/run_updater.py +9 -27
  6. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core.egg-info/PKG-INFO +1 -1
  7. assemblyline_core-4.6.1.dev215/test/test_tasking_client.py +37 -0
  8. assemblyline_core-4.6.1.dev214/assemblyline_core/VERSION +0 -1
  9. assemblyline_core-4.6.1.dev214/test/test_tasking_client.py +0 -89
  10. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/LICENCE.md +0 -0
  11. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/README.md +0 -0
  12. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/__init__.py +0 -0
  13. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/alerter/__init__.py +0 -0
  14. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/alerter/processing.py +0 -0
  15. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/alerter/run_alerter.py +0 -0
  16. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/archiver/__init__.py +0 -0
  17. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/archiver/run_archiver.py +0 -0
  18. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/badlist_client.py +0 -0
  19. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/dispatching/__init__.py +0 -0
  20. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/dispatching/__main__.py +0 -0
  21. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/dispatching/client.py +0 -0
  22. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/dispatching/dispatcher.py +0 -0
  23. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/dispatching/schedules.py +0 -0
  24. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/dispatching/timeout.py +0 -0
  25. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/expiry/__init__.py +0 -0
  26. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/expiry/run_expiry.py +0 -0
  27. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/ingester/__init__.py +0 -0
  28. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/ingester/__main__.py +0 -0
  29. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/ingester/constants.py +0 -0
  30. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/ingester/ingester.py +0 -0
  31. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/__init__.py +0 -0
  32. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/es_metrics.py +0 -0
  33. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  34. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/helper.py +0 -0
  35. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/metrics_server.py +0 -0
  36. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  37. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  38. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  39. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/plumber/__init__.py +0 -0
  40. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/plumber/run_plumber.py +0 -0
  41. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/__init__.py +0 -0
  42. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/client.py +0 -0
  43. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/creator/__init__.py +0 -0
  44. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/creator/run.py +0 -0
  45. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/creator/run_worker.py +0 -0
  46. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/loader/__init__.py +0 -0
  47. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/loader/run.py +0 -0
  48. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/loader/run_worker.py +0 -0
  49. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/replay/replay.py +0 -0
  50. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/safelist_client.py +0 -0
  51. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/__init__.py +0 -0
  52. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/collection.py +0 -0
  53. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  54. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
  55. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/controllers/interface.py +0 -0
  56. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
  57. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/run_scaler.py +0 -0
  58. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/scaler/scaler_server.py +0 -0
  59. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/server_base.py +0 -0
  60. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/signature_client.py +0 -0
  61. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/submission_client.py +0 -0
  62. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/updater/__init__.py +0 -0
  63. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/vacuum/__init__.py +0 -0
  64. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/vacuum/crawler.py +0 -0
  65. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/vacuum/department_map.py +0 -0
  66. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/vacuum/safelist.py +0 -0
  67. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/vacuum/stream_map.py +0 -0
  68. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/vacuum/worker.py +0 -0
  69. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/workflow/__init__.py +0 -0
  70. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core/workflow/run_workflow.py +0 -0
  71. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core.egg-info/SOURCES.txt +0 -0
  72. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  73. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core.egg-info/requires.txt +0 -0
  74. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/assemblyline_core.egg-info/top_level.txt +0 -0
  75. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/setup.cfg +0 -0
  76. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/setup.py +0 -0
  77. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_alerter.py +0 -0
  78. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_badlist_client.py +0 -0
  79. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_dispatcher.py +0 -0
  80. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_expiry.py +0 -0
  81. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_plumber.py +0 -0
  82. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_replay.py +0 -0
  83. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_safelist_client.py +0 -0
  84. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_scaler.py +0 -0
  85. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_scheduler.py +0 -0
  86. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_signature_client.py +0 -0
  87. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_simulation.py +0 -0
  88. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_vacuum.py +0 -0
  89. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_worker_ingest.py +0 -0
  90. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_worker_submit.py +0 -0
  91. {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev215}/test/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.6.1.dev214
3
+ Version: 4.6.1.dev215
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1 @@
1
+ 4.6.1.dev215
@@ -3,6 +3,7 @@ import time
3
3
  from typing import Any, Dict, Optional
4
4
 
5
5
  import elasticapm
6
+
6
7
  from assemblyline.common import forge
7
8
  from assemblyline.common.constants import SERVICE_STATE_HASH, ServiceStatus
8
9
  from assemblyline.common.dict_utils import flatten, unflatten
@@ -21,7 +22,6 @@ from assemblyline.odm.models.service import Service
21
22
  from assemblyline.odm.models.tagging import Tagging
22
23
  from assemblyline.remote.datatypes.events import EventSender, EventWatcher
23
24
  from assemblyline.remote.datatypes.hash import ExpiringHash
24
-
25
25
  from assemblyline_core.dispatching.client import DispatchClient
26
26
 
27
27
 
@@ -161,32 +161,9 @@ class TaskingClient:
161
161
  self.datastore.service_delta.save(service.name, {'version': service.version})
162
162
  self.datastore.service_delta.commit()
163
163
  self.log.info(f"{log_prefix}{service.name} version ({service.version}) registered")
164
- else:
165
- # Check for any updates to the service that should be applied to the service delta
166
- service_delta = flatten(self.datastore.service_delta.get(service.name, as_obj=False))
167
- if service_delta.get('version') is not None and service_delta['version'] != service.version:
168
- # Update the service delta based on changes in the new service version
169
- old_service = flatten(self.datastore.service.get(f'{service.name}_{service_delta["version"]}',
170
- as_obj=False))
171
- new_service = flatten(service.as_primitives())
172
-
173
- # Check for cases elements from internal lists have been removed
174
- for key, id_field in self.datastore.service_list_keys.items():
175
- if key in service_delta:
176
- # Check to see what was removed from the list in the previous version
177
- old_ids = set(item[id_field] for item in old_service.get(key, []))
178
- new_ids = set(item[id_field] for item in service_delta[key])
179
- removed_ids = old_ids - new_ids
180
-
181
- # Add any new items to the delta so it can be included in the merged service configuration
182
- added_ids = set(item[id_field] for item in new_service[key]) - removed_ids
183
- if added_ids:
184
- service_delta[key].extend([{id_field: added_id} for added_id in added_ids])
185
-
186
- self.datastore.service_delta.save(service.name, unflatten(service_delta))
187
164
 
188
165
  new_heuristics = []
189
-
166
+
190
167
  plan = self.datastore.heuristic.get_bulk_plan()
191
168
  for index, heuristic in enumerate(heuristics):
192
169
  heuristic_id = f'#{index}' # Set heuristic id to it's position in the list for logging purposes
@@ -1,22 +1,23 @@
1
1
  import os
2
+ import requests
2
3
  import re
3
4
  import socket
4
5
  import string
5
6
  import time
7
+
8
+ from assemblyline.common.version import FRAMEWORK_VERSION, SYSTEM_VERSION
9
+ from assemblyline.odm.models.config import Config as SystemConfig, ServiceRegistry
10
+ from assemblyline.odm.models.service import Service as ServiceConfig, DockerConfig
11
+
6
12
  from base64 import b64encode
7
13
  from collections import defaultdict
8
14
  from logging import Logger
9
15
  from typing import Dict, List
16
+ from packaging.version import parse, Version
10
17
  from urllib.parse import urlencode
11
18
 
12
- import requests
13
- from assemblyline.common.version import FRAMEWORK_VERSION, SYSTEM_VERSION
14
- from assemblyline.odm.models.config import Config as SystemConfig
15
- from assemblyline.odm.models.config import ServiceRegistry
16
- from assemblyline.odm.models.service import DockerConfig
17
- from assemblyline.odm.models.service import Service as ServiceConfig
18
19
  from azure.identity import DefaultAzureCredential
19
- from packaging.version import Version, parse
20
+
20
21
 
21
22
  DEFAULT_DOCKER_REGISTRY = "hub.docker.com"
22
23
 
@@ -11,12 +11,6 @@ from concurrent.futures import ThreadPoolExecutor
11
11
  from typing import Any, List, Optional
12
12
 
13
13
  import docker
14
- from assemblyline.common import isotime
15
- from assemblyline.odm.messages.changes import Operation, ServiceChange
16
- from assemblyline.odm.models.config import Mount, Selector
17
- from assemblyline.odm.models.service import DockerConfig, Service
18
- from assemblyline.remote.datatypes.events import EventSender, EventWatcher
19
- from assemblyline.remote.datatypes.hash import Hash
20
14
  from kubernetes import client, config
21
15
  from kubernetes.client import (
22
16
  V1Capabilities,
@@ -40,6 +34,12 @@ from kubernetes.client import (
40
34
  )
41
35
  from kubernetes.client.rest import ApiException
42
36
 
37
+ from assemblyline.common import isotime
38
+ from assemblyline.odm.messages.changes import Operation, ServiceChange
39
+ from assemblyline.odm.models.config import Mount, Selector
40
+ from assemblyline.odm.models.service import DockerConfig, Service
41
+ from assemblyline.remote.datatypes.events import EventSender, EventWatcher
42
+ from assemblyline.remote.datatypes.hash import Hash
43
43
  from assemblyline_core.scaler.controllers.kubernetes_ctl import (
44
44
  PRIVILEGED_SERVICE_ACCOUNT_NAME,
45
45
  create_docker_auth_config,
@@ -692,32 +692,14 @@ class ServiceUpdater(ThreadedCoreBase):
692
692
  service_name, latest_tag = service_key.split("_")
693
693
 
694
694
  if self.datastore.service.get_if_exists(service_key):
695
- service_image = self.datastore.service.get(service_key, as_obj=False)['docker_config']['image'].rsplit(':', 1)[0].split('/', 1)[1]
696
-
697
- service_delta = self.datastore.service_delta.get(service_name, as_obj=False)
698
- # Update the service version in the delta
699
- service_delta['version'] = latest_tag
700
-
701
- # If the container images related to the service have been changed, update the version
702
- if service_delta.get('docker_config', {}).get('image'):
703
- image_path, _ = service_delta['docker_config']['image'].rsplit(':', 1)
704
- service_delta['docker_config']['image'] = f"{image_path}:{latest_tag}"
705
-
706
- if service_delta.get('dependencies', {}).items():
707
- for _, dep_data in service_delta['dependencies'].items():
708
- if dep_data.get('image'):
709
- dep_image_path, _ = dep_data['image'].rsplit(':', 1)
710
- if service_image in dep_image_path:
711
- # Only update dependencies that share the same image as the main service
712
- dep_data['image'] = f"{dep_image_path}:{latest_tag}"
695
+ operations = [(self.datastore.service_delta.UPDATE_SET, 'version', latest_tag)]
713
696
 
714
697
  # Check if a service waas previously disabled and re-enable it
715
698
  if service_name in self.incompatible_services:
716
699
  self.incompatible_services.remove(service_name)
717
- service_delta['enabled'] = True
718
-
700
+ operations.append((self.datastore.service_delta.UPDATE_SET, 'enabled', True))
719
701
 
720
- if self.datastore.service_delta.save(service_name, service_delta):
702
+ if self.datastore.service_delta.update(service_name, operations):
721
703
  # Update completed, cleanup
722
704
  self.service_events.send(service_name, {
723
705
  'operation': Operation.Modified,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.6.1.dev214
3
+ Version: 4.6.1.dev215
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1,37 @@
1
+ from assemblyline_core.tasking_client import TaskingClient
2
+
3
+ from assemblyline.odm.models.service import Service
4
+ from assemblyline.odm.models.heuristic import Heuristic
5
+ from assemblyline.odm.models.result import Result, Section, Heuristic as SectionHeuristic
6
+
7
+ from assemblyline.odm.randomizer import random_minimal_obj
8
+
9
+ def test_register_service(datastore_connection):
10
+ client = TaskingClient(datastore_connection, register_only=True)
11
+
12
+ # Test service registration
13
+ service = random_minimal_obj(Service).as_primitives()
14
+ heuristics = [random_minimal_obj(Heuristic).as_primitives() for _ in range(2)]
15
+ service['heuristics'] = heuristics
16
+ assert client.register_service(service)
17
+ assert all([datastore_connection.heuristic.exists(h['heur_id']) for h in heuristics])
18
+
19
+ # Test registration with heuristics that were removed but still have related results
20
+ heuristic = heuristics.pop(0)
21
+ result = random_minimal_obj(Result)
22
+ section = random_minimal_obj(Section)
23
+ section.heuristic = SectionHeuristic(heuristic)
24
+ result.result.sections = [section]
25
+ datastore_connection.result.save('test_result', result)
26
+ datastore_connection.result.commit()
27
+
28
+ # Heuristics that were removed should still reside in the system if there are still associated data to it
29
+ service['heuristics'] = heuristics
30
+ assert client.register_service(service)
31
+ assert datastore_connection.heuristic.exists(heuristic['heur_id'])
32
+
33
+ # Test registration with removed heuristics that have no related results
34
+ datastore_connection.result.delete('test_result')
35
+ datastore_connection.result.commit()
36
+ assert client.register_service(service)
37
+ assert not datastore_connection.heuristic.exists(heuristic['heur_id'])
@@ -1 +0,0 @@
1
- 4.6.1.dev214
@@ -1,89 +0,0 @@
1
- from assemblyline.odm.models.heuristic import Heuristic
2
- from assemblyline.odm.models.result import Heuristic as SectionHeuristic
3
- from assemblyline.odm.models.result import Result, Section
4
- from assemblyline.odm.models.service import Service
5
- from assemblyline.odm.randomizer import random_minimal_obj, random_model_obj
6
- from assemblyline_core.tasking_client import TaskingClient
7
-
8
-
9
- def test_register_service(datastore_connection):
10
- client = TaskingClient(datastore_connection, register_only=True)
11
-
12
- # Test service registration
13
- service = random_model_obj(Service).as_primitives()
14
- heuristics = [random_minimal_obj(Heuristic).as_primitives() for _ in range(2)]
15
- service['heuristics'] = heuristics
16
- assert client.register_service(service)
17
- assert all([datastore_connection.heuristic.exists(h['heur_id']) for h in heuristics])
18
-
19
- # Test registration with heuristics that were removed but still have related results
20
- heuristic = heuristics.pop(0)
21
- result = random_minimal_obj(Result)
22
- section = random_minimal_obj(Section)
23
- section.heuristic = SectionHeuristic(heuristic)
24
- result.result.sections = [section]
25
- datastore_connection.result.save('test_result', result)
26
- datastore_connection.result.commit()
27
-
28
- # Heuristics that were removed should still reside in the system if there are still associated data to it
29
- service['heuristics'] = heuristics
30
- assert client.register_service(service)
31
- assert datastore_connection.heuristic.exists(heuristic['heur_id'])
32
-
33
- # Test registration with removed heuristics that have no related results
34
- datastore_connection.result.delete('test_result')
35
- datastore_connection.result.commit()
36
- assert client.register_service(service)
37
- assert not datastore_connection.heuristic.exists(heuristic['heur_id'])
38
-
39
- # Test registration with new and removed sources, submission parameters and configurations
40
- datastore_connection.service_delta.save(service['name'], {
41
- "version": service['version'],
42
- # Let's imagine a user added a new configuration parameter between updates
43
- "config": {"user_config": "user_value"},
44
- "submission_params": [
45
- {
46
- # Let's imagine a user added a new submission parameter between updates
47
- "name": "user_param",
48
- "type": "str",
49
- "default": "user_value",
50
- "value": "user_value",
51
- }
52
- ],
53
- "update_config": {
54
- # Let's imagine a user removed a sources between updates
55
- "sources": service['update_config']['sources'][1:],
56
- }
57
- })
58
-
59
- # Now let's update the service with a new version that has some changes
60
- service['config']['new_config'] = 'new_value'
61
- service['submission_params'].append({
62
- "name": "new_param",
63
- "type": "str",
64
- "default": "new_value",
65
- "value": "new_value",
66
- })
67
- service['update_config']['sources'].append({"name": "new_source", "uri": "http://new_source"})
68
- service['version'] = "new_version"
69
- assert client.register_service(service)
70
-
71
- datastore_connection.service_delta.update(service['name'],
72
- [(datastore_connection.service_delta.UPDATE_SET, 'version', service['version'])])
73
-
74
- merged_service = datastore_connection.get_service_with_delta(service['name'], as_obj=False)
75
- # Update sources that have been removed should stay removed
76
- sources = [s['name'] for s in merged_service['update_config']['sources']]
77
- assert service['update_config']['sources'][0]['name'] not in sources
78
-
79
- # Update sources that are new should be added
80
- assert 'new_source' in sources
81
-
82
- # Submission parameters that are new should be added and old user parameters should stay
83
- submission_param_names = [p['name'] for p in merged_service['submission_params']]
84
- assert 'new_param' in submission_param_names
85
- assert 'user_param' in submission_param_names
86
-
87
- # Configurations that are new should be added and old user configurations should stay
88
- assert merged_service['config']['new_config'] == 'new_value'
89
- assert merged_service['config']['user_config'] == 'user_value'