diff --git a/Makefile b/Makefile index 2e679e6..f175ec6 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,11 @@ test: ENABLE_LDAP=0 ENABLE_LDAP_SECONDARY=0 $(manage) test -v2 --settings=config.settings.test +.PHONY: test-keepdb +test-keepdb: + ENABLE_LDAP=0 ENABLE_LDAP_SECONDARY=0 $(manage) test -v2 --settings=config.settings.test --keepdb + + .PHONY: isort isort: isort --force-sort-within-sections --profile=black . diff --git a/usersec/forms.py b/usersec/forms.py index f6af847..005ff2b 100644 --- a/usersec/forms.py +++ b/usersec/forms.py @@ -16,9 +16,9 @@ HpcUserCreateRequest, ) -DEFAULT_USER_RESOURCES = {"tier1": "1", "tier2": "0"} -DEFAULT_GROUP_RESOURCES = {"tier1": "1", "tier2": "0"} -DEFAULT_PROJECT_RESOURCES = {"tier1": "1", "tier2": "0"} +DEFAULT_USER_RESOURCES = {"tier1": 1, "tier2_mirrored": 0, "tier2_unmirrored": 0} +DEFAULT_GROUP_RESOURCES = {"tier1": 1, "tier2_mirrored": 0, "tier2_unmirrored": 0} +DEFAULT_PROJECT_RESOURCES = {"tier1": 1, "tier2_mirrored": 0, "tier2_unmirrored": 0} class HpcGroupCreateRequestForm(forms.ModelForm): @@ -111,16 +111,29 @@ def __init__(self, *args, user, group, **kwargs): self.fields["tier1"].initial = group.resources_requested["tier1"] self.fields["tier1"].widget.attrs["class"] = "form-control mergeToJson" - self.fields["tier2"] = forms.IntegerField( + self.fields["tier2_unmirrored"] = forms.IntegerField( required=True, help_text=( "Amount of storage on the slower ('tier 2') storage that is meant for long-term storage. " - "Alternatively, you can use your group storage at Charite or MDC." + "This storage is not mirrored and should be used for data that can be reconstructed from " + "other sources. Alternatively, you can use your group storage at Charite or MDC." ), - label="Long-Term Storage [TB]", + label="Long-Term Storage Unmirrored [TB]", ) - self.fields["tier2"].initial = group.resources_requested["tier2"] - self.fields["tier2"].widget.attrs["class"] = "form-control mergeToJson" + self.fields["tier2_unmirrored"].initial = group.resources_requested["tier2_unmirrored"] + self.fields["tier2_unmirrored"].widget.attrs["class"] = "form-control mergeToJson" + + self.fields["tier2_mirrored"] = forms.IntegerField( + required=True, + help_text=( + "Amount of storage on the slower ('tier 2') storage that is meant for long-term storage. " + "This storage is mirrored and should be used for data that cannot be reconstructed from " + "other sources. Alternatively, you can use your group storage at Charite or MDC." + ), + label="Long-Term Storage Mirrored [TB]", + ) + self.fields["tier2_mirrored"].initial = group.resources_requested["tier2_mirrored"] + self.fields["tier2_mirrored"].widget.attrs["class"] = "form-control mergeToJson" else: self.fields["delegate"].widget = forms.HiddenInput() @@ -294,16 +307,29 @@ def __init__(self, *args, user=None, group=None, **kwargs): self.fields["tier1"].initial = DEFAULT_PROJECT_RESOURCES["tier1"] self.fields["tier1"].widget.attrs["class"] = "form-control mergeToJson" - self.fields["tier2"] = forms.IntegerField( + self.fields["tier2_unmirrored"] = forms.IntegerField( + required=True, + help_text=( + "Amount of storage on the slower ('tier 2') storage that is meant for long-term storage. " + "This storage is not mirrored and should be used for data that can be reconstructed from " + "other sources. Alternatively, you can use your group storage at Charite or MDC." + ), + label="Long-Term Storage Unmirrored [TB]", + ) + self.fields["tier2_unmirrored"].initial = DEFAULT_PROJECT_RESOURCES["tier2_unmirrored"] + self.fields["tier2_unmirrored"].widget.attrs["class"] = "form-control mergeToJson" + + self.fields["tier2_mirrored"] = forms.IntegerField( required=True, help_text=( "Amount of storage on the slower ('tier 2') storage that is meant for long-term storage. " - "Alternatively, you can use your group storage at Charite or MDC." + "This storage is mirrored and should be used for data that cannot be reconstructed from " + "other sources. Alternatively, you can use your group storage at Charite or MDC." ), - label="Long-Term Storage [TB]", + label="Long-Term Storage Mirrored [TB]", ) - self.fields["tier2"].initial = DEFAULT_PROJECT_RESOURCES["tier2"] - self.fields["tier2"].widget.attrs["class"] = "form-control mergeToJson" + self.fields["tier2_mirrored"].initial = DEFAULT_PROJECT_RESOURCES["tier2_mirrored"] + self.fields["tier2_mirrored"].widget.attrs["class"] = "form-control mergeToJson" else: self.fields["delegate"].widget = forms.HiddenInput() @@ -397,16 +423,29 @@ def __init__(self, *args, user=None, project=None, **kwargs): self.fields["tier1"].initial = DEFAULT_PROJECT_RESOURCES["tier1"] self.fields["tier1"].widget.attrs["class"] = "form-control mergeToJson" - self.fields["tier2"] = forms.IntegerField( + self.fields["tier2_unmirrored"] = forms.IntegerField( + required=True, + help_text=( + "Amount of storage on the slower ('tier 2') storage that is meant for long-term storage. " + "This storage is not mirrored and should be used for data that can be reconstructed from " + "other sources. Alternatively, you can use your group storage at Charite or MDC." + ), + label="Long-Term Storage Unmirrored [TB]", + ) + self.fields["tier2_unmirrored"].initial = DEFAULT_PROJECT_RESOURCES["tier2_unmirrored"] + self.fields["tier2_unmirrored"].widget.attrs["class"] = "form-control mergeToJson" + + self.fields["tier2_mirrored"] = forms.IntegerField( required=True, help_text=( "Amount of storage on the slower ('tier 2') storage that is meant for long-term storage. " - "Alternatively, you can use your group storage at Charite or MDC." + "This storage is mirrored and should be used for data that cannot be reconstructed from " + "other sources. Alternatively, you can use your group storage at Charite or MDC." ), - label="Long-Term Storage [TB]", + label="Long-Term Storage Mirrored [TB]", ) - self.fields["tier2"].initial = DEFAULT_PROJECT_RESOURCES["tier2"] - self.fields["tier2"].widget.attrs["class"] = "form-control mergeToJson" + self.fields["tier2_mirrored"].initial = DEFAULT_PROJECT_RESOURCES["tier2_mirrored"] + self.fields["tier2_mirrored"].widget.attrs["class"] = "form-control mergeToJson" else: self.fields["delegate"].widget = forms.HiddenInput() diff --git a/usersec/tests/factories.py b/usersec/tests/factories.py index 59d4749..ebe0468 100644 --- a/usersec/tests/factories.py +++ b/usersec/tests/factories.py @@ -45,7 +45,8 @@ def hpc_obj_to_dict(obj): HPCGROUPCREATEREQUEST_FORM_DATA_VALID = { "resources_requested": json.dumps({"resource": 100}), "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "description": "some group description", "expiration": "2022-01-01", "comment": "nothing", @@ -56,7 +57,8 @@ def hpc_obj_to_dict(obj): HPCGROUPCHANGEREQUEST_FORM_DATA_VALID = { "resources_requested": json.dumps({"resource": 111}), "tier1": 111, - "tier2": 222, + "tier2_mirrored": 222, + "tier2_unmirrored": 333, "description": "updated group description", "expiration": "2023-01-01", "comment": "nothing", @@ -67,7 +69,8 @@ def hpc_obj_to_dict(obj): HPCUSERCREATEREQUEST_FORM_DATA_VALID = { "resources_requested": json.dumps({"resource": 100}), "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "email": "user@" + settings.INSTITUTE_EMAIL_DOMAINS.split(",")[0], "expiration": "2022-01-01", "comment": "nothing", @@ -85,7 +88,8 @@ def hpc_obj_to_dict(obj): HPCPROJECTCREATEREQUEST_FORM_DATA_VALID = { "resources_requested": json.dumps({"resource": 100}), "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "description": "some project description", "name": "some-project", "expiration": "2022-01-01", @@ -98,7 +102,8 @@ def hpc_obj_to_dict(obj): HPCPROJECTCHANGEREQUEST_FORM_DATA_VALID = { "resources_requested": json.dumps({"resource": 111}), "tier1": 111, - "tier2": 222, + "tier2_mirrored": 222, + "tier2_unmirrored": 333, "description": "updated project description", "expiration": "2022-01-01", "comment": "nothing", @@ -150,8 +155,8 @@ class Meta: owner = None # HpcUser delegate = None # HpcUser - resources_requested = {"tier1": 1, "tier2": 0} - resources_used = {"tier1": 0.5, "tier2": 0} + resources_requested = {"tier1": 1, "tier2_mirrored": 0, "tier2_unmirrored": 0} + resources_used = {"tier1": 0.5, "tier2_mirrored": 0, "tier2_unmirrored": 0} description = "this is a group" creator = None # User gid = 2000 diff --git a/usersec/tests/snapshots/snap_test_serializers.py b/usersec/tests/snapshots/snap_test_serializers.py index d3f7921..d13f59c 100644 --- a/usersec/tests/snapshots/snap_test_serializers.py +++ b/usersec/tests/snapshots/snap_test_serializers.py @@ -16,8 +16,8 @@ "gid": 2000, "name": "hpc-group0", "owner": None, - "resources_requested": {"tier1": 1, "tier2": 0}, - "resources_used": {"tier1": 0.5, "tier2": 0}, + "resources_requested": {"tier1": 1, "tier2_mirrored": 0, "tier2_unmirrored": 0}, + "resources_used": {"tier1": 0.5, "tier2_mirrored": 0, "tier2_unmirrored": 0}, "status": "INITIAL", "uuid": "uuid_placeholder", } diff --git a/usersec/tests/test_forms.py b/usersec/tests/test_forms.py index cde920f..ffd419f 100644 --- a/usersec/tests/test_forms.py +++ b/usersec/tests/test_forms.py @@ -91,7 +91,12 @@ def test_form_initials(self): form.fields["tier1"].initial, self.hpc_group.resources_requested.get("tier1") ) self.assertEqual( - form.fields["tier2"].initial, self.hpc_group.resources_requested.get("tier2") + form.fields["tier2_mirrored"].initial, + self.hpc_group.resources_requested.get("tier2_mirrored"), + ) + self.assertEqual( + form.fields["tier2_unmirrored"].initial, + self.hpc_group.resources_requested.get("tier2_unmirrored"), ) def test_form_valid(self): diff --git a/usersec/tests/test_serializers.py b/usersec/tests/test_serializers.py index d67a0f0..678172e 100644 --- a/usersec/tests/test_serializers.py +++ b/usersec/tests/test_serializers.py @@ -12,7 +12,6 @@ class ResetSequenceMixin: - def setUp(self): super().setUp() HpcUserFactory.reset_sequence() diff --git a/usersec/tests/test_views.py b/usersec/tests/test_views.py index 0f4197e..3d66d63 100644 --- a/usersec/tests/test_views.py +++ b/usersec/tests/test_views.py @@ -267,7 +267,8 @@ def test_post(self): "resources_requested": '{"updated": 400}', "description": "description changed", "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "expiration": "2050-01-01", } @@ -312,7 +313,8 @@ def test_post_fail(self): "resources_requested": "", "description": "description changed", "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "expiration": "2050-01-01", } @@ -544,7 +546,8 @@ def test_post(self): "resources_requested": '{"updated": 400}', "description": "description changed", "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "expiration": "2050-01-01", } @@ -589,7 +592,8 @@ def test_post_fail(self): "resources_requested": "", "description": "description changed", "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "expiration": "2050-01-01", } @@ -928,7 +932,8 @@ def test_post(self): "comment": "I made a comment!", "resources_requested": '{"updated": 400}', "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "email": "other@" + settings.INSTITUTE_EMAIL_DOMAINS.split(",")[0], "expiration": "2050-01-01", } @@ -973,7 +978,8 @@ def test_post_fail(self): "comment": "I made a comment!", "resources_requested": "", "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "email": "other@" + settings.INSTITUTE_EMAIL_DOMAINS.split(",")[0], "expiration": "2050-01-01", } @@ -1588,7 +1594,8 @@ def test_post(self): "comment": "I made a comment!", "resources_requested": '{"updated": 400}', "tier1": 100, - "tier2": 200, + "tier2_mirrored": 200, + "tier2_unmirrored": 300, "expiration": self.obj.expiration, "name": self.obj.name, "description": self.obj.description, @@ -1950,7 +1957,8 @@ def test_post(self): "comment": "I made a comment!", "resources_requested": '{"updated": 444}', "tier1": 111, - "tier2": 222, + "tier2_mirrored": 222, + "tier2_unmirrored": 333, "expiration": self.obj.expiration, "description": self.obj.description, "members": [m.id for m in self.obj.members.all()],