Skip to content

feat: Support for passing certificate path in httpx calls#409

Merged
sl-at-ibm merged 4 commits into
mainfrom
feat-verify-certs
Jun 15, 2026
Merged

feat: Support for passing certificate path in httpx calls#409
sl-at-ibm merged 4 commits into
mainfrom
feat-verify-certs

Conversation

@erichare

@erichare erichare commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Supersedes #404 — rebased onto the latest main and recreated from a branch in datastax/astrapy (previously opened from my fork).

This pull request adds support for specifying a custom CA certificate path for SSL verification when connecting to the API. This is useful for environments with custom certificate requirements, such as PrivateLink setups. The change propagates the new ca_cert_path option throughout the codebase, ensures it is properly inherited and handled in configuration objects, and adds unit tests to verify correct behavior.

New SSL certificate configuration support:

  • Added ca_cert_path option to APIOptions and FullAPIOptions, including initialization, representation, inheritance, and default value handling. [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
  • Updated APICommander to accept and use a custom SSL context based on ca_cert_path, ensuring the correct SSL context is used for both sync and async clients, and that it is preserved during object copying. [1] [2]

Propagation of CA certificate option in API commander creation:

  • Passed ca_cert_path from APIOptions to all relevant APICommander instantiations in astrapy/admin/admin.py, astrapy/data/collection.py, astrapy/data/database.py, and astrapy/data/table.py. [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]

Testing enhancements:

  • Added unit tests for APICommander to verify correct SSL context creation and inheritance with ca_cert_path, including preservation during copying.
  • Added unit tests for APIOptions to verify correct inheritance and override behavior of ca_cert_path.

erichare added 4 commits June 15, 2026 11:45
- assert the async client shares the same custom SSL context as the sync client
- add an explicit-None override case (resets to the certifi default)
- correct a misleading comment (omitted/UNSET field vs explicit None)
- add a CHANGES entry for the new ca_cert_path option

@sl-at-ibm sl-at-ibm left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.
In the interest of time, I took the liberty of rebasing to latest main and applying small changes (consistent ordering within APIOptions, CHANGES rephrasing).

@sl-at-ibm sl-at-ibm force-pushed the feat-verify-certs branch from cf65025 to 756391b Compare June 15, 2026 09:56
@github-actions

Copy link
Copy Markdown

Coverage report

for commit: 88f809b93b1160a9c7d498c255103fab57d081c0.
download detailed report here.

                                                File   Stmts   Miss      Cover     Delta
----------------------------------------------------------------------------------------
                                     astrapy/repl.py      77     77      0.00%     0.00%
                              astrapy/admin/admin.py     763    361     52.69%     0.00%
                               astrapy/utils/meta.py      38     15     60.53%     0.00%
                                 astrapy/__init__.py      26     10     61.54%     0.00%
                                  astrapy/results.py      50     16     68.00%     0.00%
              astrapy/exceptions/table_exceptions.py      27      8     70.37%     0.00%
         astrapy/exceptions/collection_exceptions.py      40     11     72.50%     0.00%
                  astrapy/data_types/data_api_set.py      90     23     74.44%     0.00%
                         astrapy/exceptions/utils.py      53     11     79.25%     0.00%
                  astrapy/data/cursors/pagination.py      21      4     80.95%     0.00%
                           astrapy/authentication.py     138     24     82.61%     0.00%
          astrapy/data/info/collection_descriptor.py     197     33     83.25%     0.00%
                        astrapy/utils/user_agents.py      18      3     83.33%     0.00%
                                   astrapy/client.py      68     11     83.82%     0.00%
               astrapy/data_types/data_api_vector.py      44      7     84.09%     0.00%
                      astrapy/data/info/reranking.py     122     18     85.25%     0.00%
                            astrapy/utils/parsing.py       7      1     85.71%     0.00%
                  astrapy/data_types/data_api_map.py      59      8     86.44%     0.00%
 astrapy/data/info/table_descriptor/table_listing.py      49      6     87.76%     0.00%
                            astrapy/data/database.py     657     75     88.58%     0.00%
 astrapy/data/info/table_descriptor/table_indexes.py     230     26     88.70%     0.00%
            astrapy/data_types/data_api_timestamp.py      98     11     88.78%     0.00%
                      astrapy/data/info/vectorize.py     131     14     89.31%     0.00%
                  astrapy/data/info/database_info.py     104     11     89.42%     0.00%
    astrapy/settings/definitions/definitions_data.py      38      4     89.47%     0.00%
  astrapy/data/info/table_descriptor/type_listing.py      39      4     89.74%     0.00%
             astrapy/data_types/data_api_dict_udt.py      10      1     90.00%     0.00%
                              astrapy/utils/unset.py      10      1     90.00%     0.00%
astrapy/data/info/table_descriptor/table_altering.py     114     11     90.35%     0.00%
             astrapy/data_types/data_api_duration.py      55      5     90.91%     0.00%
                               astrapy/data/table.py     738     65     91.19%     0.00%
                          astrapy/admin/endpoints.py      36      3     91.67%     0.00%
 astrapy/data/info/table_descriptor/table_columns.py     204     17     91.67%     0.00%
 astrapy/data/info/table_descriptor/type_altering.py      85      7     91.76%     0.00%
                 astrapy/utils/duration_std_utils.py      92      7     92.39%     0.00%
         astrapy/exceptions/devops_api_exceptions.py      79      6     92.41%     0.00%
                          astrapy/data/collection.py     752     57     92.42%     0.00%
                astrapy/data/cursors/query_engine.py     214     16     92.52%     0.00%
         astrapy/event_observers/context_managers.py      27      2     92.59%     0.00%
                 astrapy/data_types/data_api_time.py      98      7     92.86%     0.00%
                 astrapy/data_types/data_api_date.py      89      6     93.26%     0.00%
 astrapy/data/info/table_descriptor/type_creation.py      32      2     93.75%     0.00%
             astrapy/exceptions/error_descriptors.py      53      3     94.34%     0.00%
   astrapy/settings/definitions/definitions_types.py      19      1     94.74%     0.00%
         astrapy/data/utils/collection_converters.py      80      4     95.00%     0.00%
              astrapy/data/utils/table_converters.py     411     20     95.13%     0.00%
                 astrapy/data/cursors/find_cursor.py     631     30     95.25%     0.00%
astrapy/data/info/table_descriptor/table_creation.py      49      2     95.92%     0.00%
                astrapy/event_observers/observers.py      30      1     96.67%     0.00%
                      astrapy/data/cursors/cursor.py      92      3     96.74%     0.00%
                 astrapy/data/cursors/farr_cursor.py     350     11     96.86%     0.00%
                           astrapy/utils/str_enum.py      32      1     96.88%     0.00%
                   astrapy/utils/duration_c_utils.py      66      2     96.97%     0.00%
                         astrapy/utils/date_utils.py      80      2     97.50%     0.00%
   astrapy/settings/definitions/definitions_admin.py      41      1     97.56%     0.00%
           astrapy/exceptions/data_api_exceptions.py      84      1     98.81%     0.00%
           astrapy/data/utils/distinct_extractors.py     104      1     99.04%     0.00%
                           astrapy/admin/__init__.py       3      0    100.00%     0.00%
                              astrapy/api_options.py       3      0    100.00%     0.00%
                               astrapy/collection.py       2      0    100.00%     0.00%
                                astrapy/constants.py       5      0    100.00%     0.00%
                                  astrapy/cursors.py       7      0    100.00%     0.00%
                            astrapy/data/__init__.py       0      0    100.00%     0.00%
                    astrapy/data/cursors/__init__.py       1      0    100.00%     0.00%
             astrapy/data/cursors/reranked_result.py       8      0    100.00%     0.00%
                      astrapy/data/utils/__init__.py       0      0    100.00%     0.00%
      astrapy/data/utils/extended_json_converters.py      28      0    100.00%     0.00%
                   astrapy/data/utils/table_types.py      36      0    100.00%     0.00%
               astrapy/data/utils/vector_coercion.py      13      0    100.00%     0.00%
                      astrapy/data_types/__init__.py      10      0    100.00%     0.00%
                                 astrapy/database.py       2      0    100.00%     0.00%
                 astrapy/event_observers/__init__.py       5      0    100.00%     0.00%
                   astrapy/event_observers/events.py      50      0    100.00%     0.00%
                                      astrapy/ids.py       5      0    100.00%     0.00%
                                     astrapy/info.py      15      0    100.00%     0.00%
                        astrapy/settings/__init__.py       0      0    100.00%     0.00%
                        astrapy/settings/defaults.py      44      0    100.00%     0.00%
            astrapy/settings/definitions/__init__.py       0      0    100.00%     0.00%
                  astrapy/settings/error_messages.py       2      0    100.00%     0.00%
                                    astrapy/table.py       2      0    100.00%     0.00%
                           astrapy/utils/__init__.py       0      0    100.00%     0.00%
                     astrapy/utils/document_paths.py      46      0    100.00%     0.00%
                     astrapy/utils/python_version.py       5      0    100.00%     0.00%
                      astrapy/utils/request_tools.py      32      0    100.00%     0.00%
                        astrapy/utils/api_options.py     206     20     90.29%     0.14%
                      astrapy/utils/api_commander.py     248     22     91.13%     0.15%
                      astrapy/exceptions/__init__.py     108     18     83.33%     0.93%
----------------------------------------------------------------------------------------
                                              totals    8827   1148     86.99%     0.02%

@sl-at-ibm sl-at-ibm merged commit 2a6fbb4 into main Jun 15, 2026
46 of 61 checks passed
@sl-at-ibm sl-at-ibm deleted the feat-verify-certs branch June 15, 2026 13:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants