diff --git a/karbor_dashboard/api/karbor.py b/karbor_dashboard/api/karbor.py index 5a399e8..5f2423c 100644 --- a/karbor_dashboard/api/karbor.py +++ b/karbor_dashboard/api/karbor.py @@ -206,11 +206,12 @@ def scheduled_operation_get(request, scheduled_operation_id): def restore_create(request, provider_id, checkpoint_id, - restore_target, parameters): + restore_target, parameters, restore_auth): return karborclient(request).restores.create(provider_id, checkpoint_id, restore_target, - parameters) + parameters, + restore_auth) def restore_delete(request, restore_id): diff --git a/karbor_dashboard/checkpoints/forms.py b/karbor_dashboard/checkpoints/forms.py index 31617a6..c98fd66 100644 --- a/karbor_dashboard/checkpoints/forms.py +++ b/karbor_dashboard/checkpoints/forms.py @@ -14,6 +14,7 @@ from django import forms from django.utils.translation import ugettext_lazy as _ +from django.views.decorators.debug import sensitive_variables # noqa from horizon import exceptions from horizon import forms as horizon_forms @@ -31,6 +32,11 @@ class RestoreCheckpointForm(horizon_forms.SelfHandlingForm): widget=forms.HiddenInput(), required=False) restore_target = forms.CharField(label=_("Restore Target")) + restore_target_username = forms.CharField( + label=_("Restore Target Username")) + restore_target_password = forms.CharField( + label=_("Restore Target Password"), + widget=forms.PasswordInput()) provider = forms.CharField( widget=forms.HiddenInput(attrs={"class": "provider"})) parameters = forms.CharField( @@ -45,15 +51,23 @@ class RestoreCheckpointForm(horizon_forms.SelfHandlingForm): provider = karborclient.provider_get(request, provider_id) self.fields['provider'].initial = json.dumps(provider._info) + @sensitive_variables('restore_target_password') def handle(self, request, data): try: + data_parameters = json.loads(data["parameters"]) + restore_auth = { + "type": "password", + "username": data["restore_target_username"], + "password": data["restore_target_password"], + } new_restore = karborclient.restore_create( request, provider_id=data["provider_id"], checkpoint_id=data["checkpoint_id"], restore_target=data["restore_target"], - parameters=json.loads(data["parameters"])) - messages.success(request, _("Checkpoint restore initiated.")) + parameters=data_parameters, + restore_auth=restore_auth) + messages.success(request, _("Checkpoint restore initiated")) return new_restore except Exception: exceptions.handle(request, _('Unable to restore checkpoint.')) diff --git a/karbor_dashboard/test/api_tests/api_tests.py b/karbor_dashboard/test/api_tests/api_tests.py index 59ae4f1..5b8da22 100644 --- a/karbor_dashboard/test/api_tests/api_tests.py +++ b/karbor_dashboard/test/api_tests/api_tests.py @@ -325,17 +325,21 @@ class karborApiTests(test.APITestCase): restore = self.restores.first() karborclient = self.stub_karborclient() karborclient.restores = self.mox.CreateMockAnything() - karborclient.restores.create(restore["provider_id"], - restore["checkpoint_id"], - restore["restore_target"], - restore["parameters"]).AndReturn(restore) + karborclient.restores.create( + restore["provider_id"], + restore["checkpoint_id"], + restore["restore_target"], + restore["parameters"], + restore["restore_auth"] + ).AndReturn(restore) self.mox.ReplayAll() ret_val = karbor.restore_create(self.request, restore["provider_id"], restore["checkpoint_id"], restore["restore_target"], - restore["parameters"]) + restore["parameters"], + restore["restore_auth"]) self.assertEqual(restore["id"], ret_val["id"]) def test_restore_delete(self): @@ -438,7 +442,8 @@ class karborApiTests(test.APITestCase): limit=page_size + 1, sort_key=None, sort_dir=None, - sort=None).AndReturn(restore_list[:page_size + 1]) + sort=None + ).AndReturn(restore_list[:page_size + 1]) self.mox.ReplayAll() ret_val, has_more_data, has_prev_data = karbor.restore_list_paged( self.request, paginate=True) diff --git a/karbor_dashboard/test/test_data.py b/karbor_dashboard/test/test_data.py index a73c06f..7c985fa 100644 --- a/karbor_dashboard/test/test_data.py +++ b/karbor_dashboard/test/test_data.py @@ -126,7 +126,9 @@ def data(TEST): "provider_id": "fake_provider_id", "checkpoint_id": "fake_checkpoint_id", "restore_target": "192.168.0.1:8080/v2.0", - "parameters": {"username": "admin"}, + "parameters": {}, + "restore_auth": {"type": "password", "username": "admin", + "password": "test"}, "status": "IN PROGRESS" } resource_dict_2 = { @@ -135,7 +137,9 @@ def data(TEST): "provider_id": "fake_provider_id2", "checkpoint_id": "fake_checkpoint_id2", "restore_target": "192.168.0.1:8080/v2.0", - "parameters": {"username": "admin"}, + "parameters": {}, + "restore_auth": {"type": "password", "username": "admin", + "password": "test"}, "status": "IN PROGRESS" } resource_dict_3 = { @@ -144,7 +148,9 @@ def data(TEST): "provider_id": "fake_provider_id3", "checkpoint_id": "fake_checkpoint_id3", "restore_target": "192.168.0.1:8080/v2.0", - "parameters": {"username": "admin"}, + "parameters": {}, + "restore_auth": {"type": "password", "username": "admin", + "password": "test"}, "status": "IN PROGRESS" } resource_dict_4 = { @@ -153,7 +159,9 @@ def data(TEST): "provider_id": "fake_provider_id4", "checkpoint_id": "fake_checkpoint_id4", "restore_target": "192.168.0.1:8080/v2.0", - "parameters": {"username": "admin"}, + "parameters": {}, + "restore_auth": {"type": "password", "username": "admin", + "password": "test"}, "status": "IN PROGRESS" }