From 2a7ba3effff178aa351b5bf1cc282a946f8aa5b2 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Wed, 29 Jul 2026 15:35:20 -0400 Subject: [PATCH 01/11] CMR-11368: Databine, initial test --- metadata-db-app/project.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/metadata-db-app/project.clj b/metadata-db-app/project.clj index 06c3d81c86..dceaabfae5 100644 --- a/metadata-db-app/project.clj +++ b/metadata-db-app/project.clj @@ -1,3 +1,4 @@ + (defproject nasa-cmr/cmr-metadata-db-app "0.1.0-SNAPSHOT" :description "The metadata db is a micro-service that provides support for persisting metadata concepts." From e32f0f7bc7f06e11157d0795ac942a0faaedcbfa Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Fri, 31 Jul 2026 10:12:00 -0400 Subject: [PATCH 02/11] CMR-11368: Getting a lot of random fails with this test --- .../int_test/acl_search_test.clj | 193 +++++++++--------- 1 file changed, 97 insertions(+), 96 deletions(-) diff --git a/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj b/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj index f3c4072fbf..5f2b853103 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj +++ b/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj @@ -305,63 +305,64 @@ (deftest acl-search-permitted-group-test (declare group-permissions acls query-map) - (let [token (e/login (u/conn-context) "user1") - acl1 (u/ingest-acl token (assoc (u/system-acl "SYSTEM_AUDIT_REPORT") - :group_permissions - [{:user_type "guest" :permissions ["read"]}])) - acl2 (u/ingest-acl token (assoc (u/system-acl "METRIC_DATA_POINT_SAMPLE") - :group_permissions - [{:user_type "registered" :permissions ["read"]}])) - ;; SYSTEM GROUP ACL is already created in the fixture loading, so need to update, not create. - _acl3-id (e/grant (u/conn-context) - [{:group_id "AG12345-PROV" :permissions ["create" "read"]} - {:user_type "guest" :permissions ["read"]}] - :system_identity - {:target "GROUP"}) - acl3 (first (e/get-system-group-acls (u/conn-context))) - - acl4 (u/ingest-acl token (assoc (u/provider-acl "AUDIT_REPORT") - :group_permissions - [{:user_type "guest" :permissions ["read"]}])) - acl5 (u/ingest-acl token (assoc (u/provider-acl "OPTION_DEFINITION") - :group_permissions - [{:user_type "registered" :permissions ["create"]}])) - acl6 (u/ingest-acl token (assoc (u/provider-acl "OPTION_ASSIGNMENT") - :group_permissions - [{:group_id "AG12345-PROV" :permissions ["delete"]}])) - - acl7 (u/ingest-acl token (u/catalog-item-acl "All Collections")) - acl8 (u/ingest-acl token (assoc (u/catalog-item-acl "All Granules") - :group_permissions - [{:user_type "registered" :permissions ["read" "order"]} - {:group_id "AG10000-PROV" :permissions ["create"]}])) - provider-group-acls (e/get-provider-group-acls (u/conn-context)) - - guest-acls [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl1 acl3 acl4 acl7] - registered-acls [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl2 acl5 acl8] - AG12345-acls [acl3 acl6] - AG10000-acls [acl8] - read-acls (into [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl1 acl2 acl3 acl4 acl8] provider-group-acls) - create-acls (into [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl3 acl5 acl7 acl8] provider-group-acls) - all-acls-no-admin [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl1 acl2 acl3 acl4 acl5 acl6 acl7 acl8]] - - (testing "Search ACLs by permitted group" - (are [permitted-groups acls] - (let [response (ac/search-for-acls (u/conn-context) - {:permitted-group permitted-groups} - {:token token})] - (= (u/acls->search-response (count acls) acls) - (dissoc response :took))) - - ["guest"] guest-acls - ["registered"] registered-acls - ["AG12345-PROV"] AG12345-acls - ["AG10000-PROV"] AG10000-acls - ;; permitted-group search is case insensitive by default - ["REGISTERED" "AG10000-PROV"] registered-acls - ["GUEST" "AG10000-PROV"] (concat guest-acls AG10000-acls) - ["AG12345-PROV" "AG10000-PROV"] (concat AG12345-acls AG10000-acls) - ["guest" "registered" "AG12345-PROV" "AG10000-PROV"] all-acls-no-admin)) + (u/without-publishing-messages + (let [token (e/login (u/conn-context) "user1") + acl1 (u/ingest-acl token (assoc (u/system-acl "SYSTEM_AUDIT_REPORT") + :group_permissions + [{:user_type "guest" :permissions ["read"]}])) + acl2 (u/ingest-acl token (assoc (u/system-acl "METRIC_DATA_POINT_SAMPLE") + :group_permissions + [{:user_type "registered" :permissions ["read"]}])) + ;; SYSTEM GROUP ACL is already created in the fixture loading, so need to update, not create. + _acl3-id (e/grant (u/conn-context) + [{:group_id "AG12345-PROV" :permissions ["create" "read"]} + {:user_type "guest" :permissions ["read"]}] + :system_identity + {:target "GROUP"}) + acl3 (first (e/get-system-group-acls (u/conn-context))) + + acl4 (u/ingest-acl token (assoc (u/provider-acl "AUDIT_REPORT") + :group_permissions + [{:user_type "guest" :permissions ["read"]}])) + acl5 (u/ingest-acl token (assoc (u/provider-acl "OPTION_DEFINITION") + :group_permissions + [{:user_type "registered" :permissions ["create"]}])) + acl6 (u/ingest-acl token (assoc (u/provider-acl "OPTION_ASSIGNMENT") + :group_permissions + [{:group_id "AG12345-PROV" :permissions ["delete"]}])) + + acl7 (u/ingest-acl token (u/catalog-item-acl "All Collections")) + acl8 (u/ingest-acl token (assoc (u/catalog-item-acl "All Granules") + :group_permissions + [{:user_type "registered" :permissions ["read" "order"]} + {:group_id "AG10000-PROV" :permissions ["create"]}])) + provider-group-acls (e/get-provider-group-acls (u/conn-context)) + + guest-acls [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl1 acl3 acl4 acl7] + registered-acls [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl2 acl5 acl8] + AG12345-acls [acl3 acl6] + AG10000-acls [acl8] + read-acls (into [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl1 acl2 acl3 acl4 acl8] provider-group-acls) + create-acls (into [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl3 acl5 acl7 acl8] provider-group-acls) + all-acls-no-admin [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl1 acl2 acl3 acl4 acl5 acl6 acl7 acl8]] + + (testing "Search ACLs by permitted group" + (are [permitted-groups acls] + (let [response (ac/search-for-acls (u/conn-context) + {:permitted-group permitted-groups} + {:token token})] + (= (u/acls->search-response (count acls) acls) + (dissoc response :took))) + + ["guest"] guest-acls + ["registered"] registered-acls + ["AG12345-PROV"] AG12345-acls + ["AG10000-PROV"] AG10000-acls + ;; permitted-group search is case insensitive by default + ["REGISTERED" "AG10000-PROV"] registered-acls + ["GUEST" "AG10000-PROV"] (concat guest-acls AG10000-acls) + ["AG12345-PROV" "AG10000-PROV"] (concat AG12345-acls AG10000-acls) + ["guest" "registered" "AG12345-PROV" "AG10000-PROV"] all-acls-no-admin)) (testing "Search ACLs by permitted group with options" (are [permitted-groups options acls] @@ -371,52 +372,52 @@ (= (u/acls->search-response (count acls) acls) (dissoc response :took))) - ["GUEST"] {"options[permitted_group][ignore_case]" true} guest-acls - ["GUEST"] {"options[permitted_group][ignore_case]" false} [])) + ["GUEST"] {"options[permitted_group][ignore_case]" true} guest-acls + ["GUEST"] {"options[permitted_group][ignore_case]" false} [])) (testing "Search ACLs by group permission" (are3 [group-permissions acls] - (let [query-map (generate-query-map-for-group-permissions group-permissions) - response (ac/search-for-acls (u/conn-context) query-map {:token token})] - (is (= (u/acls->search-response (count acls) acls) - (dissoc response :took)))) - ;; CMR-3154 acceptance criterium 1 - "Guests create" - ["guest" "create"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl7] + (let [query-map (generate-query-map-for-group-permissions group-permissions) + response (ac/search-for-acls (u/conn-context) query-map {:token token})] + (is (= (u/acls->search-response (count acls) acls) + (dissoc response :took)))) + ;; CMR-3154 acceptance criterium 1 + "Guests create" + ["guest" "create"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl7] - "Guest read" - ["guest" "read"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl1 acl3 acl4] + "Guest read" + ["guest" "read"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl1 acl3 acl4] - "Registered read" - ["registered" "read"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl2 acl8] + "Registered read" + ["registered" "read"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl2 acl8] - "Group create" - ["AG10000-PROV" "create"] [acl8] + "Group create" + ["AG10000-PROV" "create"] [acl8] - "Registered order" - ["registered" "order"] [acl8] + "Registered order" + ["registered" "order"] [acl8] - "Group create" - ["AG12345-PROV" "create"] [acl3] + "Group create" + ["AG12345-PROV" "create"] [acl3] - "Another group create" - ["AG10000-PROV" "create"] AG10000-acls + "Another group create" + ["AG10000-PROV" "create"] AG10000-acls - "Group read" - ["AG12345-PROV" "read"] [acl3] + "Group read" + ["AG12345-PROV" "read"] [acl3] - "Group delete" - ["AG12345-PROV" "delete"] [acl6] + "Group delete" + ["AG12345-PROV" "delete"] [acl6] - "Case-insensitive group create" - ["AG10000-PROV" "CREATE"] AG10000-acls + "Case-insensitive group create" + ["AG10000-PROV" "CREATE"] AG10000-acls - ;; CMR-3154 acceptance criterium 2 - "Registered read or registered create" - ["registered" "read" "registered" "create"] registered-acls + ;; CMR-3154 acceptance criterium 2 + "Registered read or registered create" + ["registered" "read" "registered" "create"] registered-acls - "Registered read or group AG12345-PROV delete" - ["registered" "read" "AG12345-PROV" "delete"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl2 acl6 acl8])) + "Registered read or group AG12345-PROV delete" + ["registered" "read" "AG12345-PROV" "delete"] [fixtures/*fixture-provider-acl* fixtures/*fixture-system-acl* acl2 acl6 acl8])) ;; CMR-3154 acceptance criterium 3 (testing "Search ACLs by group permission just group or permission" @@ -432,14 +433,14 @@ "Just user type" {:permitted-group "guest"} guest-acls - "Just group" - {:permitted-group "AG10000-PROV"} AG10000-acls + "Just group" + {:permitted-group "AG10000-PROV"} AG10000-acls - "Just read permission" - {:permission "read"} read-acls + "Just read permission" + {:permission "read"} read-acls - "Just create permission" - {:permission "create"} create-acls)) + "Just create permission" + {:permission "create"} create-acls)) ;; CMR-3154 acceptance criterium 4 (testing "Search ACLS by group permission with non integer index is an error" @@ -465,7 +466,7 @@ (is (= {:status 400 :body {:errors ["Sub-parameter permission of parameter group_permissions has invalid values [foo]. Only 'read', 'update', 'create', 'delete', or 'order' may be specified."]} :content-type :json} - (ac/search-for-acls (u/conn-context) query {:token token :raw? true}))))))) + (ac/search-for-acls (u/conn-context) query {:token token :raw? true})))))))) (deftest acl-search-by-identity-type-test (declare identity-types expected-acls) From e2b990664243778bd2b491397aeb276220647d23 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Mon, 3 Aug 2026 14:43:42 -0400 Subject: [PATCH 03/11] CMR-11368: Getting a lot of random fails with this test - try to manage write status better --- .../int_test/enable_disable_test.clj | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj index d1e1ab72c0..2e4df24a91 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj +++ b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj @@ -101,25 +101,34 @@ ;; test delete (is (= 200 (:status (u/delete-group token concept_id))))) - ;; disable writes for access control service + ;; disable writes for access control service and give threads time to catch up (u/disable-access-control-writes post-options) + (Thread/sleep 5000) (testing "save, update, and delete group fails after disable" - (let [group3 (u/make-group {:name "group3" :members ["user1" "user2" "user3"]}) - {:keys [status]} (u/create-group token group3 {:allow-failure? true})] - ;; check save response - (is (= 503 status)) - ;; test update - (is (= 503 (:status (u/update-group token concept-id2 {:name "Updated3" :description "Updated3"})))) - ;; test delete - (is (= 503 (:status (u/delete-group token concept-id2 {:allow-failure? true})))))) + (try + (let [group3 (u/make-group {:name "group3" :members ["user1" "user2" "user3"]}) + {:keys [status]} (u/create-group token group3 {:allow-failure? true})] + ;; check save response + (is (= 503 status)) + ;; test update + (is (= 503 (:status (u/update-group token concept-id2 {:name "Updated3" :description "Updated3"})))) + ;; test delete + (is (= 503 (:status (u/delete-group token concept-id2 {:allow-failure? true}))))) + (finally + ;; Allways re-eneable writes for access control service, even if there was an exception + (u/enable-access-control-writes post-options) + (Thread/sleep 5000)))) ;; re-eneable writes for access control service (u/enable-access-control-writes post-options) + (Thread/sleep 5000) (testing "save, update, and delete group succeeds after re-enable" - (let [group3 (u/make-group {:name "group4" :members ["user1" "user5"]}) + (let [group3 (u/make-group {:name "group4" :members ["user1" "user5"]}) {:keys [status]} (u/create-group token group3)] + (u/enable-access-control-writes post-options) + (Thread/sleep 5000) ;; check save response (is (= 200 status)) ;; test update From 376d377cdf21d5e6a8de772516c3d87057acef40 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Tue, 4 Aug 2026 13:45:48 -0400 Subject: [PATCH 04/11] CMR-11368: applying same fix to another test --- .../int_test/enable_disable_test.clj | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj index 2e4df24a91..a0f1ca95b7 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj +++ b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj @@ -63,18 +63,21 @@ ;; disable writes for access control service (u/disable-access-control-writes post-options) + (Thread/sleep 5000) (testing "save, update, and delete acl fails after disable" - (let [resp (ac/create-acl (u/conn-context) system-acl {:raw? true :token token})] - ;; check save response - (is (= 503 (:status resp))) - ;; test update - (is (= 503 (:status (ac/update-acl (u/conn-context) concept-id2 provider-acl {:token token :raw? true})))) - ;; test delete - (is (= 503 (:status (ac/delete-acl (u/conn-context) concept-id2 {:token token :raw? true})))))) - - ;; re-enable writes for access control service - (u/enable-access-control-writes post-options) + (try + (let [resp (ac/create-acl (u/conn-context) system-acl {:raw? true :token token})] + ;; check save response + (is (= 503 (:status resp))) + ;; test update + (is (= 503 (:status (ac/update-acl (u/conn-context) concept-id2 provider-acl {:token token :raw? true})))) + ;; test delete + (is (= 503 (:status (ac/delete-acl (u/conn-context) concept-id2 {:token token :raw? true}))))) + (finally + ;; always re-enable writes for access control service + (u/enable-access-control-writes post-options) + (Thread/sleep 5000)))) (testing "save, upate, and delete acl works after re-enable" (let [resp (ac/create-acl (u/conn-context) system-acl {:raw? true :token token})] @@ -120,15 +123,9 @@ (u/enable-access-control-writes post-options) (Thread/sleep 5000)))) - ;; re-eneable writes for access control service - (u/enable-access-control-writes post-options) - (Thread/sleep 5000) - (testing "save, update, and delete group succeeds after re-enable" (let [group3 (u/make-group {:name "group4" :members ["user1" "user5"]}) {:keys [status]} (u/create-group token group3)] - (u/enable-access-control-writes post-options) - (Thread/sleep 5000) ;; check save response (is (= 200 status)) ;; test update From 68f25f475de3b4a0ccd17e56a97fba96586e3df0 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Wed, 5 Aug 2026 07:10:42 -0400 Subject: [PATCH 05/11] CMR-11368: another test found to be setting read/write, also making tests as serial --- .../int_test/enable_disable_test.clj | 4 +- .../admin/admin_permissions_test.clj | 102 ++++++++++-------- 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj index a0f1ca95b7..eb0fb203db 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj +++ b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj @@ -45,7 +45,7 @@ (e/login (u/conn-context) username)) -(deftest enable-disable-re-enable-write-acl +(deftest ^:serial enable-disable-re-enable-write-acl (let [token (get-token "admin") first-resp (ac/create-acl (u/conn-context) system-acl {:raw? true :token token}) concept-id (get-in first-resp [:body :concept_id]) @@ -88,7 +88,7 @@ ;; test delete (is (= 200 (:status (ac/delete-acl (u/conn-context) concept-id2 {:token token :raw? true})))))))) -(deftest enable-disable-re-enable-write-group +(deftest ^:serial enable-disable-re-enable-write-group (let [token (get-token "admin") group (u/make-group) {:keys [status concept_id]} (u/create-group token group) diff --git a/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj b/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj index 0cfab3c366..553fb9fad2 100644 --- a/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj +++ b/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj @@ -41,7 +41,7 @@ (is (some #{status} [200 201 204 401])) (not= status 401)))) -(deftest ingest-management-permission-test +(deftest ^:serial ingest-management-permission-test (let [admin-read-update-group-concept-id (e/get-or-create-group (s/context) "admin-read-update-group") admin-read-group-concept-id (e/get-or-create-group (s/context) "admin-read-group") admin-update-group-concept-id (e/get-or-create-group (s/context) "admin-update-group") @@ -78,69 +78,77 @@ ;; Grant provider admin permission, but not system permission (e/grant-group-provider-admin (s/context) prov-admin-group-concept-id "PROV1" :read :update) - (testing "Admin permissions test" - (are3 [url methods] - (check-all-permissions url methods) + (try + (testing "Admin permissions test" + (are3 [url methods] + (check-all-permissions url methods) - "search-clear-cache" - (url/search-clear-cache-url) :post + "search-clear-cache" + (url/search-clear-cache-url) :post - "search-reset" - (url/search-reset-url) :post + "search-reset" + (url/search-reset-url) :post - "indexer-clear-cache" - (url/indexer-clear-cache-url) :post + "indexer-clear-cache" + (url/indexer-clear-cache-url) :post - "indexer-reset" - (url/indexer-reset-url) :post + "indexer-reset" + (url/indexer-reset-url) :post - "enable-ingest-writes" - (url/enable-ingest-writes-url) :post + "enable-ingest-writes" + (url/enable-ingest-writes-url) :post - "disable-ingest-write" - (url/disable-ingest-writes-url) :post + "disable-ingest-write" + (url/disable-ingest-writes-url) :post - "enable-search-writes" - (url/enable-search-writes-url) :post + "enable-search-writes" + (url/enable-search-writes-url) :post - "disable-search-writes" - (url/disable-search-writes-url) :post + "disable-search-writes" + (url/disable-search-writes-url) :post - "enable-access-control-writes" - (url/enable-access-control-writes-url) :post + "enable-access-control-writes" + (url/enable-access-control-writes-url) :post - "disable-access-control-writes" - (url/disable-access-control-writes-url) :post + "disable-access-control-writes" + (url/disable-access-control-writes-url) :post - "mdb-reset" - (url/mdb-reset-url) :post + "mdb-reset" + (url/mdb-reset-url) :post - "index-set-reset" - (url/index-set-reset-url) :post + "index-set-reset" + (url/index-set-reset-url) :post - "reindex-collection-permitted-groups" - (url/reindex-collection-permitted-groups-url) :post + "reindex-collection-permitted-groups" + (url/reindex-collection-permitted-groups-url) :post - "reindex-all-collections" - (url/reindex-all-collections-url) :post + "reindex-all-collections" + (url/reindex-all-collections-url) :post - "cleanup-expired-collections" - (url/cleanup-expired-collections-url) :post + "cleanup-expired-collections" + (url/cleanup-expired-collections-url) :post - "cleanup-granule-bulk-update-tasks" - (url/cleanup-granule-bulk-update-task-url) :post + "cleanup-granule-bulk-update-tasks" + (url/cleanup-granule-bulk-update-task-url) :post - "access-control-reindex-acls" - (url/access-control-reindex-acls-url) :post + "access-control-reindex-acls" + (url/access-control-reindex-acls-url) :post - "enable-email-subscription-processing" - (url/enable-email-subscription-processing) :post + "enable-email-subscription-processing" + (url/enable-email-subscription-processing) :post - "disable-email-subscription-processing" - (url/disable-email-subscription-processing) :post)) + "disable-email-subscription-processing" + (url/disable-email-subscription-processing) :post)) - (testing "Admin permissions test with body" - (check-all-permissions (url/email-subscription-processing) - :post - {} - {:revision-date-range "2000-01-01T10:00:00Z,2010-03-10T12:00:00Z"})))) + (testing "Admin permissions test with body" + (check-all-permissions (url/email-subscription-processing) + :post + {} + {:revision-date-range "2000-01-01T10:00:00Z,2010-03-10T12:00:00Z"})) + (finally + ;; Always guarantee writes are re-enabled after this test suite! + (has-action-permission? (url/enable-ingest-writes-url) :post admin-read-update-token) + (has-action-permission? (url/enable-search-writes-url) :post admin-read-update-token) + (has-action-permission? (url/enable-access-control-writes-url) :post admin-read-update-token) + ;; Give the caches time to clear + (Thread/sleep 5000))))) From 0e67a6fdac3da98e0eb4b4ad86442d92f8644321 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Wed, 5 Aug 2026 15:44:20 -0400 Subject: [PATCH 06/11] CMR-11368: another test found to be setting read/write, also making tests as serial --- .../test/cmr/system_int_test/admin/admin_permissions_test.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj b/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj index 553fb9fad2..48c43d9a1f 100644 --- a/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj +++ b/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj @@ -150,5 +150,6 @@ (has-action-permission? (url/enable-ingest-writes-url) :post admin-read-update-token) (has-action-permission? (url/enable-search-writes-url) :post admin-read-update-token) (has-action-permission? (url/enable-access-control-writes-url) :post admin-read-update-token) + (has-action-permission? (url/enable-email-subscription-processing) :post admin-read-update-token) ;; Give the caches time to clear (Thread/sleep 5000))))) From f980438e9dcea7ae1ef100df4a24a4aefe3439e2 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Thu, 6 Aug 2026 06:44:00 -0400 Subject: [PATCH 07/11] CMR-11368: this will fix the map cast issue --- .../cmr/access_control/services/acl_search_service.clj | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/access-control-app/src/cmr/access_control/services/acl_search_service.clj b/access-control-app/src/cmr/access_control/services/acl_search_service.clj index c90f0a68e3..f690debeb1 100644 --- a/access-control-app/src/cmr/access_control/services/acl_search_service.clj +++ b/access-control-app/src/cmr/access_control/services/acl_search_service.clj @@ -105,9 +105,12 @@ which corresponds to acls that grant read permission to guests for order permission (to anyone)." [_context params] - (concat (group-permission-parameter-index-validation params) - (group-permission-parameter-subfield-validation params) - (group-permission-permission-validation params))) + (let [gp (:group-permission params)] + (if (and (some? gp) (not (map? gp))) + ["Parameter group_permission must be a map with integer indices as keys."] + (concat (group-permission-parameter-index-validation params) + (group-permission-parameter-subfield-validation params) + (group-permission-permission-validation params))))) (def acl-identity-type->search-value "Maps identity type query parameter values to the actual values used in the index." From 7ee66b2e65001035755922e59f4aca7d3cfd457a Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Wed, 12 Aug 2026 16:57:46 -0400 Subject: [PATCH 08/11] CMR-11368: adding more sync and tweeking time to lower chance of hitting the other testing threads --- .../int_test/acl_search_test.clj | 28 +++++++++---------- .../int_test/enable_disable_test.clj | 6 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj b/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj index 5f2b853103..26d534feb3 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj +++ b/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj @@ -20,7 +20,7 @@ (fixtures/grant-all-acl-fixture)) (use-fixtures :once (fixtures/int-test-fixtures)) -(deftest invalid-search-test +(deftest ^:serial invalid-search-test (testing "Accept header" (testing "Other than JSON is rejected" (is (= {:status 400 @@ -65,7 +65,7 @@ (group-permission->flat-query index {:permitted-group group :permission permission})) (partition 2 group-permissions)))) -(deftest acl-search-order-test +(deftest ^:serial acl-search-order-test ;; Conforms to requirements set out in CMR-3590, alphabetical order regardless of case (let [token (e/login (u/conn-context) "user1") acl1 (u/ingest-acl token {:group_permissions [{:user_type "registered" :permissions ["read"]}] @@ -91,7 +91,7 @@ "System - GROUP"] (map :name (:items (ac/search-for-acls (merge {:token token} (u/conn-context)) {}))))))) -(deftest acl-search-permission-test +(deftest ^:serial acl-search-permission-test (let [_token (e/login (u/conn-context) "user1") admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1 (u/ingest-group admin-token @@ -170,7 +170,7 @@ (is (= (u/acls->search-response 1 [acl7]) (dissoc response :took))))))) -(deftest acl-search-test +(deftest ^:serial acl-search-test (let [admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1 (u/ingest-group admin-token {:name "group1"} @@ -277,7 +277,7 @@ {:page_size 3 :page_num 2} {:token admin-token}) :took)))))) -(deftest acl-search-by-any-id-test +(deftest ^:serial acl-search-by-any-id-test (let [token (e/login (u/conn-context) "user1") acl1 (u/ingest-acl token (u/catalog-item-acl "All Collections")) acl2 (u/ingest-acl token (u/catalog-item-acl "All Granules")) @@ -303,7 +303,7 @@ (:concept-id acl2) "acl3-legacy-guid"]}))) -(deftest acl-search-permitted-group-test +(deftest ^:serial acl-search-permitted-group-test (declare group-permissions acls query-map) (u/without-publishing-messages (let [token (e/login (u/conn-context) "user1") @@ -468,7 +468,7 @@ :content-type :json} (ac/search-for-acls (u/conn-context) query {:token token :raw? true})))))))) -(deftest acl-search-by-identity-type-test +(deftest ^:serial acl-search-by-identity-type-test (declare identity-types expected-acls) (let [admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1 (u/ingest-group admin-token @@ -517,7 +517,7 @@ "Identity type searches are always case-insensitive" ["PrOvIdEr"] (concat [fixtures/*fixture-provider-acl*] provider-group-acls))))) -(deftest acl-search-by-target-test +(deftest ^:serial acl-search-by-target-test (declare target) (let [token (e/login (u/conn-context) "user1") single-instance-acl (u/ingest-acl token @@ -541,7 +541,7 @@ "Provider target, case insensitive" ["catalog_item_acl"] [fixtures/*fixture-provider-acl*]))) -(deftest acl-search-by-permitted-user-test +(deftest ^:serial acl-search-by-permitted-user-test (declare user users) (let [admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1 (u/ingest-group admin-token {:name "group1"} ["user1"]) @@ -605,7 +605,7 @@ "User names are case-insensitive" ["USER1"] [fixtures/*fixture-system-acl* fixtures/*fixture-provider-acl* acl-registered-1 acl-registered-2 acl-group1 acl-group2])))) -(deftest acl-search-provider-test +(deftest ^:serial acl-search-provider-test (declare options provider-ids) (let [admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1 (u/ingest-group admin-token {:name "group1"} ["user1"]) @@ -687,7 +687,7 @@ "Multiple providers with empty results using ignore_case=false option" ["prov1"] {"options[provider][ignore_case]" false} [])))) -(deftest acl-search-multiple-criteria +(deftest ^:serial acl-search-multiple-criteria (let [admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1 (u/ingest-group admin-token {:name "group1"} ["user1"]) group2 (u/ingest-group admin-token {:name "group2"} ["user2"]) @@ -755,7 +755,7 @@ :permitted-user "user2"} [acl3 fixtures/*fixture-provider-acl* acl5 acl7])))) -(deftest acl-search-with-legacy-group-guid-test +(deftest ^:serial acl-search-with-legacy-group-guid-test (let [admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1-legacy-guid "group1-legacy-guid" group1 (u/ingest-group admin-token @@ -816,7 +816,7 @@ (is (= (u/acls->search-response (count expected-acls) expected-acls {:include-full-acl true}) (dissoc response :took))))))) -(deftest acl-reindexing-test +(deftest ^:serial acl-reindexing-test (u/without-publishing-messages (let [token (e/login (u/conn-context) "user1") acl1 (u/ingest-acl token (assoc (u/system-acl "METRIC_DATA_POINT_SAMPLE") @@ -862,7 +862,7 @@ (count expected-acls-after-reindexing) expected-acls-after-reindexing))) (set (:items actual-response)))))))) -(deftest acl-search-by-target-group-id-test +(deftest ^:serial acl-search-by-target-group-id-test (let [admin-token (e/login (u/conn-context) "admin" ["AG1200000000-CMR"]) group1 (u/ingest-group admin-token {:name "group1"} diff --git a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj index eb0fb203db..eaec739192 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj +++ b/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj @@ -63,7 +63,7 @@ ;; disable writes for access control service (u/disable-access-control-writes post-options) - (Thread/sleep 5000) + (Thread/sleep 1000) (testing "save, update, and delete acl fails after disable" (try @@ -77,7 +77,7 @@ (finally ;; always re-enable writes for access control service (u/enable-access-control-writes post-options) - (Thread/sleep 5000)))) + (Thread/sleep 1000)))) (testing "save, upate, and delete acl works after re-enable" (let [resp (ac/create-acl (u/conn-context) system-acl {:raw? true :token token})] @@ -121,7 +121,7 @@ (finally ;; Allways re-eneable writes for access control service, even if there was an exception (u/enable-access-control-writes post-options) - (Thread/sleep 5000)))) + (Thread/sleep 1000)))) (testing "save, update, and delete group succeeds after re-enable" (let [group3 (u/make-group {:name "group4" :members ["user1" "user5"]}) From 384b32ed22e7244aa48b41997a6df064cb2d5a30 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Thu, 27 Aug 2026 10:33:30 -0400 Subject: [PATCH 09/11] CMR-11368 - moved two test files to system-int-test --- .../access_control}/acl_search_test.clj | 4 +- .../access_control}/enable_disable_test.clj | 12 +- .../access_control/fixtures.clj | 192 ++++++++++++++++++ 3 files changed, 200 insertions(+), 8 deletions(-) rename {access-control-app/int-test/cmr/access_control/int_test => system-int-test/test/cmr/system_int_test/access_control}/acl_search_test.clj (99%) rename {access-control-app/int-test/cmr/access_control/int_test => system-int-test/test/cmr/system_int_test/access_control}/enable_disable_test.clj (96%) create mode 100644 system-int-test/test/cmr/system_int_test/access_control/fixtures.clj diff --git a/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj b/system-int-test/test/cmr/system_int_test/access_control/acl_search_test.clj similarity index 99% rename from access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj rename to system-int-test/test/cmr/system_int_test/access_control/acl_search_test.clj index 26d534feb3..594dedd527 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/acl_search_test.clj +++ b/system-int-test/test/cmr/system_int_test/access_control/acl_search_test.clj @@ -1,9 +1,9 @@ -(ns cmr.access-control.int-test.acl-search-test +(ns cmr.system-int-test.access-control.acl-search-test (:require [clj-http.client :as client] [clojure.string :as string] [clojure.test :refer [are deftest is testing use-fixtures]] - [cmr.access-control.int-test.fixtures :as fixtures] + [cmr.system-int-test.access-control.fixtures :as fixtures] [cmr.access-control.test.util :as u] [cmr.common-app.api.routes :as routes] [cmr.common.util :as util :refer [are3]] diff --git a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj b/system-int-test/test/cmr/system_int_test/access_control/enable_disable_test.clj similarity index 96% rename from access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj rename to system-int-test/test/cmr/system_int_test/access_control/enable_disable_test.clj index eaec739192..dbee205c20 100644 --- a/access-control-app/int-test/cmr/access_control/int_test/enable_disable_test.clj +++ b/system-int-test/test/cmr/system_int_test/access_control/enable_disable_test.clj @@ -1,8 +1,8 @@ -(ns cmr.access-control.int-test.enable-disable-test +(ns cmr.system-int-test.access-control.enable-disable-test "CMR Access Control Enable/Disable endpoint test" (:require [clojure.test :refer[deftest is testing use-fixtures]] - [cmr.access-control.int-test.fixtures :as fixtures] + [cmr.system-int-test.access-control.fixtures :as fixtures] [cmr.access-control.test.util :as u] [cmr.mock-echo.client.echo-util :as e] [cmr.transmit.access-control :as ac] @@ -63,7 +63,7 @@ ;; disable writes for access control service (u/disable-access-control-writes post-options) - (Thread/sleep 1000) + (Thread/sleep 500) (testing "save, update, and delete acl fails after disable" (try @@ -77,7 +77,7 @@ (finally ;; always re-enable writes for access control service (u/enable-access-control-writes post-options) - (Thread/sleep 1000)))) + (Thread/sleep 500)))) (testing "save, upate, and delete acl works after re-enable" (let [resp (ac/create-acl (u/conn-context) system-acl {:raw? true :token token})] @@ -106,7 +106,7 @@ ;; disable writes for access control service and give threads time to catch up (u/disable-access-control-writes post-options) - (Thread/sleep 5000) + (Thread/sleep 500) (testing "save, update, and delete group fails after disable" (try @@ -121,7 +121,7 @@ (finally ;; Allways re-eneable writes for access control service, even if there was an exception (u/enable-access-control-writes post-options) - (Thread/sleep 1000)))) + (Thread/sleep 500)))) (testing "save, update, and delete group succeeds after re-enable" (let [group3 (u/make-group {:name "group4" :members ["user1" "user5"]}) diff --git a/system-int-test/test/cmr/system_int_test/access_control/fixtures.clj b/system-int-test/test/cmr/system_int_test/access_control/fixtures.clj new file mode 100644 index 0000000000..e4cb4bfd98 --- /dev/null +++ b/system-int-test/test/cmr/system_int_test/access_control/fixtures.clj @@ -0,0 +1,192 @@ +(ns cmr.system-int-test.access-control.fixtures + (:require + [clojure.test :as ct] + [cmr.access-control.config :as access-control-config] + [cmr.access-control.system :as system] + [cmr.access-control.test.provider-util :as prov-util] + [cmr.access-control.test.util :as test-util :refer [conn-context]] + [cmr.common-app.test.client-util :as common-client-test-util] + [cmr.common.jobs :as jobs] + [cmr.elastic-utils.test-util :as elastic-test-util] + [cmr.message-queue.config :as q-conf] + [cmr.message-queue.queue.memory-queue :as mem-queue] + [cmr.message-queue.queue.sqs :as sqs] + [cmr.message-queue.test.queue-broker-side-api :as qb-side-api] + [cmr.message-queue.test.queue-broker-wrapper :as queue-broker-wrapper] + [cmr.metadata-db.config :as mdb-config] + [cmr.metadata-db.data.memory-db :as memory] + [cmr.metadata-db.system :as mdb-system] + [cmr.mock-echo.client.echo-util :as e] + [cmr.mock-echo.client.mock-echo-client :as mock-echo-client] + [cmr.mock-echo.client.mock-urs-client :as mock-urs-client] + [cmr.mock-echo.system :as mock-echo-system] + [cmr.transmit.access-control :as ac] + [cmr.transmit.config :as config] + [cmr.transmit.metadata-db2 :as mdb])) + +(defn queue-config + "Create the message queue configuration needed by access-control." + [] + (q-conf/merge-configs (mdb-config/queue-config) + (access-control-config/queue-config))) + +(defn get-broker-backend + "Create the appropriate broker backend. If an SQS endpoint is defined, + an SQS broker will be used." + [] + (let [aws? (= "aws" (q-conf/queue-type)) + cfg (queue-config)] + (if aws? + (sqs/create-queue-broker cfg) + (mem-queue/create-memory-queue-broker cfg)))) + +(defn create-broker + "Create the testing broker, wrapping the appropriate backend." + [] + (queue-broker-wrapper/create-queue-broker-wrapper + (get-broker-backend))) + +(defn create-mdb-system + "Creates an in memory version of metadata db." + ([] + (create-mdb-system false)) + ([use-external-db] + (let [mdb-sys (mdb-system/create-system)] + (merge mdb-sys + {:scheduler (jobs/create-non-running-scheduler)} + (when-not use-external-db + {:db (memory/create-db)}))))) + +(defn int-test-fixtures + "Returns test fixtures for starting the access control application and its external dependencies. + The test fixtures only start up applications and side APIs if it detects the applications are not + already running on the ports requested. This allows the tests to be run in different scenarios + and still work. The applications may already be running in dev-system or through user.clj If they + are running these fixtures won't do anything. If it isn't running these fixtures will start up the + applications and the test will work." + [] + (let [queue-broker (create-broker)] + (ct/join-fixtures + [elastic-test-util/run-elastic-fixture + (common-client-test-util/run-app-fixture + conn-context + :access-control + (assoc (system/create-system) :queue-broker queue-broker) + system/start + system/stop) + + ;; Create a side API that will allow waiting for the queue broker terminal states to be achieved. + (common-client-test-util/side-api-fixture + (fn [_] + (qb-side-api/build-routes queue-broker)) + nil) + + (common-client-test-util/run-app-fixture + conn-context + :echo-rest + (mock-echo-system/create-system) + mock-echo-system/start + mock-echo-system/stop) + + (common-client-test-util/run-app-fixture + conn-context + :metadata-db + (assoc (create-mdb-system) :queue-broker queue-broker) + mdb-system/start + mdb-system/stop)]))) + +(defn reset-fixture + "Test fixture that resets the application before each test and creates providers and users listed. + provider-map should be a map of provider guids to provider ids. usernames should be a list of usernames + that exist in URS. The password for each username will be username + \"pass\"." + ([] + (reset-fixture nil)) + ([provider-map] + (reset-fixture provider-map nil)) + ([provider-map usernames] + (fn [f] + (mock-echo-client/reset (conn-context)) + (mdb/reset (conn-context)) + (ac/reset (conn-context) {:bootstrap-data? true}) + (e/grant-system-group-permissions-to-admin-group (conn-context) :create :read) + (doseq [[_provider-guid provider-id] provider-map] + (mdb/create-provider (assoc (conn-context) :token (config/echo-system-token)) + (prov-util/minimum-provider->metadata {:provider-id provider-id})) + ;; Create provider in mock echo with the guid set to the ID to make things easier to sync up + (e/create-providers (conn-context) {provider-id provider-id}) + ;; Give full permission to the mock admin user to modify groups for the provider + (e/grant-provider-group-permissions-to-admin-group + (conn-context) provider-id :create :read)) + + (when (seq usernames) + (mock-urs-client/create-users (conn-context) (for [username usernames] + {:username username + :password (str username "pass")}))) + ;; Resetting adds bootstrap minimal data to access control. Wait until it's indexed. + (test-util/wait-until-indexed) + (f)))) + +(defn grant-all-group-fixture + "Returns a test fixture function which grants all users the ability to create and modify groups + for given provider guids." + [provider-guids] + (fn [f] + (e/grant-system-group-permissions-to-all (conn-context)) + (doseq [provider-guid provider-guids] + (e/grant-provider-group-permissions-to-all (conn-context) provider-guid)) + (f))) + +(defn grant-admin-group-fixture + "Returns a test fixture function which grants all users the ability to create and modify groups + for given provider guids." + [provider-guids] + (fn [f] + (e/grant-system-group-permissions-to-admin-group (conn-context)) + (doseq [provider-guid provider-guids] + (e/grant-provider-group-permissions-to-admin-group (conn-context) provider-guid)) + (f))) + +;;These two vars will be rebinded dynamically when the fixtures are setup for each test and +;;are used to represent the ACLs inside of the tests + +(def ^:dynamic *fixture-provider-acl*) + +(def ^:dynamic *fixture-system-acl*) + +(defn grant-provider-acl-permissions-to-all + "Creates provider acls granting create on group-id or user-type" + [] + (let [acl {:group_permissions [{:user_type "registered" + :permissions ["read" "update" "create" "delete"]} + {:user_type "guest" + :permissions ["read" "update" "create" "delete"]}] + :provider_identity {:provider_id "PROV1" + :target "CATALOG_ITEM_ACL"}} + {:keys [concept_id revision_id]} (ac/create-acl (merge {:token config/mock-echo-system-token} + (conn-context)) + acl)] + (assoc acl :concept-id concept_id :revision-id revision_id))) + +(defn grant-any-acl-system-acl-to-all + "Creates system acl targeting ANY_ACL that grants create, read, update, and delete to all" + [] + (let [acl {:group_permissions [{:user_type "registered" + :permissions ["read" "update" "create" "delete"]} + {:user_type "guest" + :permissions ["read" "update" "create" "delete"]}] + :system_identity {:target "ANY_ACL"}} + {:keys [concept_id revision_id]} (ac/create-acl + (merge {:token config/mock-echo-system-token} + (conn-context)) + acl)] + (assoc acl :concept-id concept_id :revision-id revision_id))) + +(defn grant-all-acl-fixture + "Returns a test fixture function which grants guest ability to create, read, update, and delete any ACL." + [] + (fn [f] + (let [system-acl (grant-any-acl-system-acl-to-all) + provider-acl (grant-provider-acl-permissions-to-all)] + (binding [*fixture-system-acl* system-acl + *fixture-provider-acl* provider-acl] + (f))))) From cfed69f72e0ec32c3ad98412e4490816766868ce Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Tue, 1 Sep 2026 10:08:35 -0400 Subject: [PATCH 10/11] CMR-11368 - clean up from self review --- .../test/cmr/system_int_test/admin/admin_permissions_test.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj b/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj index 48c43d9a1f..1fe70143fe 100644 --- a/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj +++ b/system-int-test/test/cmr/system_int_test/admin/admin_permissions_test.clj @@ -151,5 +151,5 @@ (has-action-permission? (url/enable-search-writes-url) :post admin-read-update-token) (has-action-permission? (url/enable-access-control-writes-url) :post admin-read-update-token) (has-action-permission? (url/enable-email-subscription-processing) :post admin-read-update-token) - ;; Give the caches time to clear - (Thread/sleep 5000))))) + ;; Give the servers time set + (Thread/sleep 500))))) From 211e67fa8d900cb714ca04de812ffa00f1f6c384 Mon Sep 17 00:00:00 2001 From: Thomas Cherry Date: Thu, 3 Sep 2026 13:59:04 -0400 Subject: [PATCH 11/11] CMR-11368: removing change as another change fixed it --- .../cmr/access_control/services/acl_search_service.clj | 9 +++------ metadata-db-app/project.clj | 1 - 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/access-control-app/src/cmr/access_control/services/acl_search_service.clj b/access-control-app/src/cmr/access_control/services/acl_search_service.clj index f690debeb1..c90f0a68e3 100644 --- a/access-control-app/src/cmr/access_control/services/acl_search_service.clj +++ b/access-control-app/src/cmr/access_control/services/acl_search_service.clj @@ -105,12 +105,9 @@ which corresponds to acls that grant read permission to guests for order permission (to anyone)." [_context params] - (let [gp (:group-permission params)] - (if (and (some? gp) (not (map? gp))) - ["Parameter group_permission must be a map with integer indices as keys."] - (concat (group-permission-parameter-index-validation params) - (group-permission-parameter-subfield-validation params) - (group-permission-permission-validation params))))) + (concat (group-permission-parameter-index-validation params) + (group-permission-parameter-subfield-validation params) + (group-permission-permission-validation params))) (def acl-identity-type->search-value "Maps identity type query parameter values to the actual values used in the index." diff --git a/metadata-db-app/project.clj b/metadata-db-app/project.clj index dceaabfae5..06c3d81c86 100644 --- a/metadata-db-app/project.clj +++ b/metadata-db-app/project.clj @@ -1,4 +1,3 @@ - (defproject nasa-cmr/cmr-metadata-db-app "0.1.0-SNAPSHOT" :description "The metadata db is a micro-service that provides support for persisting metadata concepts."