Skip to content

Commit

Permalink
Merge pull request #175 from bjester/instance-id-fields
Browse files Browse the repository at this point in the history
Rename instance json fields and add ID fields for convenient querying
  • Loading branch information
bjester authored Feb 2, 2023
2 parents cf77031 + a2bac64 commit fd882f6
Show file tree
Hide file tree
Showing 10 changed files with 113 additions and 16 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

List of the most important changes for each release.

## 0.6.16
- Added dedicated `client_instance_id` and `server_instance_id` fields to `SyncSession`
- Renamed `client_instance` and `server_instance` fields on `SyncSession` to `client_instance_json` and `server_instance_json` respectively

## 0.6.15
- Fixes issue casuing overflow error during lengthy syncs
- Fixes issue causing overflow error during lengthy syncs

## 0.6.14
- Fixes issue that caused discrepancies between the client's and server's sync state
Expand Down
2 changes: 1 addition & 1 deletion morango/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
from __future__ import unicode_literals

default_app_config = "morango.apps.MorangoConfig"
__version__ = "0.6.15"
__version__ = "0.6.16"
3 changes: 3 additions & 0 deletions morango/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ class Meta:


class SyncSessionSerializer(serializers.ModelSerializer):
client_instance = serializers.CharField(source='client_instance_json')
server_instance = serializers.CharField(source='server_instance_json')

class Meta:
model = SyncSession
fields = (
Expand Down
18 changes: 13 additions & 5 deletions morango/api/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ class SyncSessionViewSet(

def create(self, request):

instance_id, _ = InstanceIDModel.get_or_create_current_instance()
server_instance, _ = InstanceIDModel.get_or_create_current_instance()

# verify and save the certificate chain to our cert store
try:
Expand Down Expand Up @@ -287,6 +287,12 @@ def create(self, request):
"Nonce is not valid", status=status.HTTP_403_FORBIDDEN
)

client_instance_json = request.data.get("instance")
client_instance_id = None
if client_instance_json:
client_instance = json.loads(client_instance_json)
client_instance_id = client_instance.get("id")

# build the data to be used for creation the syncsession
data = {
"id": request.data.get("id"),
Expand All @@ -301,9 +307,11 @@ def create(self, request):
"connection_path": request.data.get("connection_path"),
"client_ip": get_ip(request) or "",
"server_ip": request.data.get("server_ip") or "",
"client_instance": request.data.get("instance"),
"server_instance": json.dumps(
serializers.InstanceIDSerializer(instance_id).data
"client_instance_id": client_instance_id,
"client_instance_json": client_instance_json,
"server_instance_id": server_instance.id,
"server_instance_json": json.dumps(
serializers.InstanceIDSerializer(server_instance).data
),
}

Expand All @@ -313,7 +321,7 @@ def create(self, request):

resp_data = {
"signature": server_cert.sign(message),
"server_instance": data["server_instance"],
"server_instance": data["server_instance_json"],
}

return response.Response(resp_data, status=status.HTTP_201_CREATED)
Expand Down
25 changes: 25 additions & 0 deletions morango/migrations/0022_rename_instance_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2023-01-31 18:53
from __future__ import unicode_literals

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('morango', '0021_store_partition_index_create'),
]

operations = [
migrations.RenameField(
model_name='syncsession',
old_name='client_instance',
new_name='client_instance_json',
),
migrations.RenameField(
model_name='syncsession',
old_name='server_instance',
new_name='server_instance_json',
),
]
26 changes: 26 additions & 0 deletions morango/migrations/0023_add_instance_id_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2023-01-31 19:03
from __future__ import unicode_literals

from django.db import migrations
from django.db import models


class Migration(migrations.Migration):

dependencies = [
('morango', '0022_rename_instance_fields'),
]

operations = [
migrations.AddField(
model_name='syncsession',
name='client_instance_id',
field=models.UUIDField(blank=True, null=True),
),
migrations.AddField(
model_name='syncsession',
name='server_instance_id',
field=models.UUIDField(blank=True, null=True),
),
]
13 changes: 8 additions & 5 deletions morango/models/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,9 +240,12 @@ class SyncSession(models.Model):
client_ip = models.CharField(max_length=100, blank=True)
server_ip = models.CharField(max_length=100, blank=True)

# serialized copies of the client and server instance model fields, for debugging/tracking purposes
client_instance = models.TextField(default="{}")
server_instance = models.TextField(default="{}")
# track the instance IDs for convenient querying, as well as serialized copies of
# the client and server instance model fields for debugging/tracking purposes
client_instance_id = models.UUIDField(null=True, blank=True)
client_instance_json = models.TextField(default="{}")
server_instance_id = models.UUIDField(null=True, blank=True)
server_instance_json = models.TextField(default="{}")

# used to store other data we may need to know about this sync session
extra_fields = models.TextField(default="{}")
Expand All @@ -252,11 +255,11 @@ class SyncSession(models.Model):

@cached_property
def client_instance_data(self):
return json.loads(self.client_instance)
return json.loads(self.client_instance_json)

@cached_property
def server_instance_data(self):
return json.loads(self.server_instance)
return json.loads(self.server_instance_json)


class TransferSession(models.Model):
Expand Down
16 changes: 13 additions & 3 deletions morango/sync/syncsession.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,14 @@ def create_sync_session(self, client_cert, server_cert, chunk_size=None):
if not server_cert.verify(message, session_resp.json().get("signature")):
raise CertificateSignatureInvalid()

client_instance = InstanceIDModel.get_or_create_current_instance()[0]

server_instance_json = session_resp.json().get("server_instance") or "{}"
server_instance_id = None
if server_instance_json:
server_instance = json.loads(server_instance_json)
server_instance_id = server_instance.get("id")

# build the data to be used for creating our own syncsession
data = {
"id": data["id"],
Expand All @@ -239,12 +247,14 @@ def create_sync_session(self, client_cert, server_cert, chunk_size=None):
"connection_path": self.base_url,
"client_ip": data["client_ip"],
"server_ip": data["server_ip"],
"client_instance": json.dumps(
"client_instance_id": client_instance.id,
"client_instance_json": json.dumps(
InstanceIDSerializer(
InstanceIDModel.get_or_create_current_instance()[0]
client_instance
).data
),
"server_instance": session_resp.json().get("server_instance") or "{}",
"server_instance_id": server_instance_id,
"server_instance_json": session_resp.json().get("server_instance") or "{}",
"process_id": os.getpid(),
}
sync_session = SyncSession.objects.create(**data)
Expand Down
18 changes: 18 additions & 0 deletions tests/testapp/tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from django.core.serializers.json import DjangoJSONEncoder
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
from django.db.migrations.recorder import MigrationRecorder
from django.test.testcases import LiveServerTestCase
from django.utils import timezone
from facility_profile.models import Facility
Expand Down Expand Up @@ -450,6 +451,14 @@ class TestMigrationsMixin(object):
migrate_to = None
app = None

@classmethod
def setUpClass(cls):
super(TestMigrationsMixin, cls).setUpClass()

# get the latest migration before starting
latest_migration = MigrationRecorder.Migration.objects.filter(app=cls.app).last()
cls.latest_migration = (cls.app, latest_migration.name)

def setUp(self):
assert (
self.migrate_from and self.migrate_to
Expand All @@ -476,3 +485,12 @@ def setUp(self):

def setUpBeforeMigration(self, apps):
pass

@classmethod
def tearDownClass(cls):
# revert migration back to latest migration
executor = MigrationExecutor(connection)
executor.loader.build_graph()
executor.migrate([cls.latest_migration])

super(TestMigrationsMixin, cls).tearDownClass()
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ envlist =

[testenv]

whitelist_externals=
allowlist_externals=
sh

setenv =
Expand Down

0 comments on commit fd882f6

Please sign in to comment.