From cdcf81cffa68133aec0095aff1893bc5b6b46c93 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Mon, 4 Apr 2016 09:56:36 -0400 Subject: [PATCH 1/4] rbac active removal test cases fixes --- awx/main/tests/unit/api/test_serializers.py | 23 ++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/awx/main/tests/unit/api/test_serializers.py b/awx/main/tests/unit/api/test_serializers.py index 3cac6a34d8..50e6322d1d 100644 --- a/awx/main/tests/unit/api/test_serializers.py +++ b/awx/main/tests/unit/api/test_serializers.py @@ -76,14 +76,14 @@ class TestJobTemplateSerializerGetRelated(GetRelatedMixin): class TestJobTemplateSerializerGetSummaryFields(GetSummaryFieldsMixin): def test__recent_jobs(self, mocker, job_template, jobs): - job_template.jobs.filter = mocker.MagicMock(**{'order_by.return_value': jobs}) - job_template.jobs.filter.return_value = job_template.jobs.filter + job_template.jobs.all = mocker.MagicMock(**{'order_by.return_value': jobs}) + job_template.jobs.all.return_value = job_template.jobs.all serializer = JobTemplateSerializer() recent_jobs = serializer._recent_jobs(job_template) - job_template.jobs.filter.assert_called_with(active=True) - job_template.jobs.filter.order_by.assert_called_with('-created') + job_template.jobs.all.assert_called_once_with() + job_template.jobs.all.order_by.assert_called_once_with('-created') assert len(recent_jobs) == 10 for x in jobs[:10]: assert recent_jobs == [{'id': x.id, 'status': x.status, 'finished': x.finished} for x in jobs[:10]] @@ -126,18 +126,17 @@ class TestJobSerializerGetRelated(GetRelatedMixin): def test_get_related(self, mocker, job, related_resource_name): self._test_get_related(JobSerializer, job, 'jobs', related_resource_name) - def test_job_template_present(self, job): - job.job_template.active = True - serializer = JobSerializer() - related = serializer.get_related(job) - assert 'job_template' in related - - def test_job_template_absent(self, job): - job.job_template.active = False + def test_job_template_absent(self, mocker, job): + job.job_template = None serializer = JobSerializer() related = serializer.get_related(job) assert 'job_template' not in related + def test_job_template_present(self, job): + related = self._mock_and_run(JobSerializer, job) + assert 'job_template' in related + assert related['job_template'] == '/api/v1/%s/%d/' % ('job_templates', job.job_template.pk) + @mock.patch('awx.api.serializers.BaseSerializer.get_summary_fields', lambda x,y: {}) class TestJobOptionsSerializerGetSummaryFields(GetSummaryFieldsMixin): def test__summary_field_labels_10_max(self, mocker, job_template, labels): From b6706662a4d29b9ac6e7559c36f3cf2303fba044 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Mon, 4 Apr 2016 09:59:06 -0400 Subject: [PATCH 2/4] Disable database settings until after 3.0 --- awx/api/urls.py | 3 ++- awx/api/views.py | 3 ++- awx/main/tests/old/settings.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/awx/api/urls.py b/awx/api/urls.py index f3b24c147a..e1fa5165d1 100644 --- a/awx/api/urls.py +++ b/awx/api/urls.py @@ -285,7 +285,8 @@ v1_urls = patterns('awx.api.views', url(r'^me/$', 'user_me_list'), url(r'^dashboard/$', 'dashboard_view'), url(r'^dashboard/graphs/jobs/$','dashboard_jobs_graph_view'), - url(r'^settings/', include(settings_urls)), + # TODO: Uncomment aftger 3.0 when we bring database settings endpoints back + # url(r'^settings/', include(settings_urls)), url(r'^schedules/', include(schedule_urls)), url(r'^organizations/', include(organization_urls)), url(r'^users/', include(user_urls)), diff --git a/awx/api/views.py b/awx/api/views.py index 0c406dc610..5daf08ac5c 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -112,7 +112,8 @@ class ApiV1RootView(APIView): data['authtoken'] = reverse('api:auth_token_view') data['ping'] = reverse('api:api_v1_ping_view') data['config'] = reverse('api:api_v1_config_view') - data['settings'] = reverse('api:settings_list') + # TODO: Uncomment after 3.0 when we bring database settings endpoints back + # data['settings'] = reverse('api:settings_list') data['me'] = reverse('api:user_me_list') data['dashboard'] = reverse('api:dashboard_view') data['organizations'] = reverse('api:organization_list') diff --git a/awx/main/tests/old/settings.py b/awx/main/tests/old/settings.py index f0d7cf63ac..d2ab4440c5 100644 --- a/awx/main/tests/old/settings.py +++ b/awx/main/tests/old/settings.py @@ -46,7 +46,7 @@ TEST_TOWER_SETTINGS_MANIFEST = { } @override_settings(TOWER_SETTINGS_MANIFEST=TEST_TOWER_SETTINGS_MANIFEST) -class SettingsTest(BaseTest): +class SettingsPlaceholder(BaseTest): def setUp(self): super(SettingsTest, self).setUp() From b01fe663affb9023f4e27bdd8e147e6a8ed59c96 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Mon, 4 Apr 2016 11:57:22 -0400 Subject: [PATCH 3/4] Fix up tests for vacated settings --- awx/main/tests/old/settings.py | 1 + awx/main/tests/unit/api/test_views.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/awx/main/tests/old/settings.py b/awx/main/tests/old/settings.py index d2ab4440c5..93ce2963a1 100644 --- a/awx/main/tests/old/settings.py +++ b/awx/main/tests/old/settings.py @@ -46,6 +46,7 @@ TEST_TOWER_SETTINGS_MANIFEST = { } @override_settings(TOWER_SETTINGS_MANIFEST=TEST_TOWER_SETTINGS_MANIFEST) +@pytest.mark.skip(reason="Settings deferred to 3.1") class SettingsPlaceholder(BaseTest): def setUp(self): diff --git a/awx/main/tests/unit/api/test_views.py b/awx/main/tests/unit/api/test_views.py index 6a7668c472..a5d63906c5 100644 --- a/awx/main/tests/unit/api/test_views.py +++ b/awx/main/tests/unit/api/test_views.py @@ -16,7 +16,7 @@ class TestApiV1RootView: 'authtoken', 'ping', 'config', - 'settings', + #'settings', 'me', 'dashboard', 'organizations', From 469bff1d0beaef478a62a5ff3b49e75545603fb4 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Mon, 4 Apr 2016 12:04:31 -0400 Subject: [PATCH 4/4] Fix required fields in notifier serializer Handle the situation where the password field was left as-is when posting the existing encrypted field --- awx/api/serializers.py | 8 ++++++-- awx/main/models/notifications.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index b170199bdb..89fda89a55 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2139,6 +2139,10 @@ class NotifierSerializer(BaseSerializer): incorrect_type_fields = [] if 'notification_configuration' not in attrs: return attrs + if self.context['view'].kwargs: + object_actual = self.context['view'].get_object() + else: + object_actual = None for field in notification_class.init_parameters: if field not in attrs['notification_configuration']: missing_fields.append(field) @@ -2149,8 +2153,8 @@ class NotifierSerializer(BaseSerializer): if not type(field_val) in expected_types: incorrect_type_fields.append((field, field_type)) continue - if field_type == "password" and field_val.startswith('$encrypted$'): - missing_fields.append(field) + if field_type == "password" and field_val == "$encrypted$" and object_actual is not None: + attrs['notification_configuration'][field] = object_actual.notification_configuration[field] error_list = [] if missing_fields: error_list.append("Missing required fields for Notification Configuration: {}".format(missing_fields)) diff --git a/awx/main/models/notifications.py b/awx/main/models/notifications.py index 29a51cf9ac..40dcba67ac 100644 --- a/awx/main/models/notifications.py +++ b/awx/main/models/notifications.py @@ -68,6 +68,8 @@ class Notifier(CommonModel): update_fields = kwargs.get('update_fields', []) for field in filter(lambda x: self.notification_class.init_parameters[x]['type'] == "password", self.notification_class.init_parameters): + if self.notification_configuration[field].startswith("$encrypted$"): + continue if new_instance: value = self.notification_configuration[field] setattr(self, '_saved_{}_{}'.format("config", field), value) @@ -84,7 +86,6 @@ class Notifier(CommonModel): self.notification_class.init_parameters): saved_value = getattr(self, '_saved_{}_{}'.format("config", field), '') self.notification_configuration[field] = saved_value - #setattr(self.notification_configuration, field, saved_value) if 'notification_configuration' not in update_fields: update_fields.append('notification_configuration') self.save(update_fields=update_fields)