Docs - Add Contributing Guide (#4543)

This commit is contained in:
Bert Blommers 2021-11-08 22:04:44 -01:00 committed by GitHub
parent 78709ce22c
commit f4c4b349c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
87 changed files with 2101 additions and 200 deletions

View File

@ -1,20 +1,20 @@
# Table of Contents
- [Contributing code](#contributing-code)
* [Running the tests locally](#running-the-tests-locally)
- [Development Guide](#development-guide)
* [TLDR](#tldr)
* [Linting](#linting)
* [General notes](#general-notes)
- [Missing features](#missing-features)
- [Missing services](#missing-services)
+ [Generating template code of services.](#generating-template-code-of-services)
+ [URL Indexing](#url-indexing)
- [Maintainers](#maintainers)
# Contributing code
Moto has a [Code of Conduct](https://github.com/spulec/moto/blob/master/CODE_OF_CONDUCT.md), you can expect to be treated with respect at all times when interacting with this project.
## Running the tests locally
# Development Guide
Please see our documentation for information on how to contribute:
https://docs.getmoto.org/en/latest/docs/contributing
## TLDR
Moto has a [Makefile](./Makefile) which has some helpful commands for getting set up.
You should be able to run `make init` to install the dependencies and then `make test` to run the tests.
@ -27,99 +27,6 @@ Ensure that the correct version of black is installed - `black==19.10b0`. (Diffe
Run `make lint` to verify whether your code confirms to the guidelines.
Use `make format` to automatically format your code, if it does not conform to `black`'s rules.
## General notes
Some tips that might help during development:
- A dedicated TaggingService exists in `moto.utilities`, to help with storing/retrieving tags for resources. Not all services use it yet, but contributors are encouraged to use the TaggingService for all new features.
- Our CI runs all tests twice - one normal run, and one run in ServerMode. In ServerMode, Moto is started as a stand-alone Flask server, and all tests are run against this Flask-instance.
To verify whether your tests pass in ServerMode, you can run the following commands:
```
pip install .[all,server]
moto_server
TEST_SERVER_MODE=true pytest -sv tests/test_service/..
```
- When writing tests, one test should only verify a single feature/method. I.e., one test for `create_resource()`, another for `update_resource()`, etc.
- When writing negative tests, try to use the following format:
```
with pytest.raises(botocore.exceptions.ClientError) as exc:
client.failing_call(..)
err = exc.value.response["Error"]
# These assertions use the 'sure' library, but any assertion style is accepted
err["Code"].should.equal(..)
err["Message"].should.equal(..)
```
This is the best way to ensure that exceptions are dealt with correctly by Moto.
- If a service is only partially implemented, a warning can be used to inform the user. For instance:
```
import warnings
warnings.warn("The Filters-parameter is not yet implemented for client.method()")
```
- To speed up our CI, the ServerMode tests for the `awslambda`, `batch`, `ec2` and `sqs` services will run in parallel.
This means the following:
- Make sure you use unique names for functions/queues/etc
- Calls to `describe_reservations()`/`list_queues()`/etc might return unexpected results
# Missing features
Moto is easier to contribute to than you probably think. There's [a list of which endpoints have been implemented](https://github.com/spulec/moto/blob/master/IMPLEMENTATION_COVERAGE.md) and we invite you to add new endpoints to existing services or to add new services.
How to teach Moto to support a new AWS endpoint:
* Search for an existing [issue](https://github.com/spulec/moto/issues) that matches what you want to achieve.
* If one doesn't already exist, create a new issue describing what's missing. This is where we'll all talk about the new addition and help you get it done.
* Create a [pull request](https://help.github.com/articles/using-pull-requests/) and mention the issue # in the PR description.
* Try to add a failing test case. For example, if you're trying to implement `boto3.client('acm').import_certificate()` you'll want to add a new method called `def test_import_certificate` to `tests/test_acm/test_acm.py`.
* Implementing the feature itself can be done by creating a method called `import_certificate` in `moto/acm/responses.py`. It's considered good practice to deal with input/output formatting and validation in `responses.py`, and create a method `import_certificate` in `moto/acm/models.py` that handles the actual import logic.
* If you can also implement the code that gets that test passing then great! If not, just ask the community for a hand and somebody will assist you.
# Missing services
Implementing a new service from scratch is more work, but still quite straightforward. All the code that intercepts network requests to `*.amazonaws.com` is already handled for you in `moto/core` - all that's necessary for new services to be recognized is to create a new decorator and determine which URLs should be intercepted.
See this PR for an example of what's involved in creating a new service: https://github.com/spulec/moto/pull/4076/files
Note the `urls.py` that redirects all incoming URL requests to a generic `dispatch` method, which in turn will call the appropriate method in `responses.py`.
If you want more control over incoming requests or their bodies, it is possible to redirect specific requests to a custom method. See this PR for an example: https://github.com/spulec/moto/pull/2957/files
### Generating template code of services.
By using `scripts/scaffold.py`, you can automatically generate template code of new services and new method of existing service. The script looks up API specification of given boto3 method and adds necessary codes including request parameters and response parameters. In some cases, it fails to generate codes.
Please try out by running `python scripts/scaffold.py`
```bash
$ python scripts/scaffold.py
Select service: codedeploy
==Current Implementation Status==
[ ] add_tags_to_on_premises_instances
...
[ ] create_deployment
...[
[ ] update_deployment_group
=================================
Select Operation: create_deployment
Initializing service codedeploy
creating moto/codedeploy
creating moto/codedeploy/models.py
creating moto/codedeploy/exceptions.py
creating moto/codedeploy/__init__.py
creating moto/codedeploy/responses.py
creating moto/codedeploy/urls.py
creating tests/test_codedeploy
creating tests/test_codedeploy/test_server.py
creating tests/test_codedeploy/test_codedeploy.py
inserting code moto/codedeploy/responses.py
inserting code moto/codedeploy/models.py
You will still need to add the mock into "__init__.py"
```
### URL Indexing
In order to speed up the performance of MotoServer, all AWS URL's that need intercepting are indexed.
When adding/replacing any URLs in `{service}/urls.py`, please run `python scripts/update_backend_index.py` to update this index.
# Maintainers

View File

@ -0,0 +1,75 @@
.. _contributing architecture:
=============================
Architecture
=============================
If you're interested in the inner workings of Moto, or are trying to hunt down some tricky bug, the below sections will help you learn more about how Moto works.
**************************
Decorator Architecture
**************************
When using decorators, Moto works by intercepting the HTTP request that is send out by boto3.
This has multiple benefits:
- boto3 keeps the responsibility of any initial parameter validation
- boto3 keeps the responsibility of any post-processing of the response
- Other SDK's can also be used against Moto, as all SDK's use the HTTP API to talk to AWS in the end.
Botocore utilizes an event-based architecture. Events such as `creating-client-class` and `before-send` are emitted for all boto3-requests.
When the decorator starts, Moto registers a hook into the `before-send`-event that allows us to intercept the HTTP-request that was about to be send.
For every intercepted request, Moto figures out which service/feature is called based on the HTTP request prepared by `boto3`, and calls our own stub instead.
***********************************************
Determining which service/feature is called
***********************************************
There are multiple ways for Moto to determine which request was called.
For each request we need to know two things:
#. Which service is this request for?
#. Which feature is called?
When using one ore more decorators, Moto will load all urls from `{service}/urls.py::url_bases`.
Incoming requests are matched against those to figure out which service the request has to go to.
After that, we try to find right feature by looking at:
#. The `Action`-parameter in the querystring or body, or
#. The `x-amz-target`-header, or
#. The full URI. Boto3 has a model for each service that maps the HTTP method and URI to a feature.
Note that this only works if the `Responses`-class has an attribute `SERVICE_NAME`, as Moto needs to know which boto3-client has this model.
When using Moto in ServerMode, all incoming requests will be made to `http://localhost`, or wherever the MotoServer is hosted, so we can no longer use the request URI to figure out which service to talk to.
In order to still know which service the request was intended for, Moto will check:
#. The authorization header first (`HTTP_AUTHORIZATION`)
#. The target header next (`HTTP_X_AMZ_TARGET`)
#. Or the path header (`PATH_INFO`)
#. If all else fails, we assume S3 as the default
Now that we have determined the service, we can rebuild the original host this request was send to.
With the combination of the restored host and path we can match against the `url_bases` and `url_paths` in `{service}/urls.py` to determine which Moto-method is responsible for handling the incoming request.
***********************************
File Architecture
***********************************
To keep a logical separation between services, each one is located into a separate folder.
Each service follows the same file structure.
The below table explains the purpose of each file:
+---------------+---------------------------------------------------------------------------------------------------------------+
| File | Responsibility |
+===============+===============================================================================================================+
| __init__.py | Initializes the decorator to be used by developers |
+---------------+---------------------------------------------------------------------------------------------------------------+
| urls.py | List of the URL's that should be intercepted |
+---------------+---------------------------------------------------------------------------------------------------------------+
| responses.py | Requests are redirected here first. Responsible for extracting parameters and determining the response format |
+---------------+---------------------------------------------------------------------------------------------------------------+
| models.py | Responsible for the data storage and logic required. |
+---------------+---------------------------------------------------------------------------------------------------------------+
| exceptions.py | Not required - this would contain any custom exceptions, if your code throws any |
+---------------+---------------------------------------------------------------------------------------------------------------+

View File

@ -0,0 +1,26 @@
.. _contributing checklist:
.. role:: raw-html(raw)
:format: html
================================
PR Checklist
================================
Ready to open a new PR? Great. Please have a quick look at this checklist to make sure that you're ready:
- [ ] Feature is added
- [ ] The linter is happy
- [ ] Tests are added
- [ ] All tests pass, existing and new
Can't quite get it working? :raw-html:`<br />`
Create the PR anyway! Seeing the code can help others figure out what's wrong.
Halfway through and too busy to finish? :raw-html:`<br />`
Create the PR anyway! Others can use your work and build on it to finish the feature.
.. note:: You can indicate a PR that's not quite ready with the `needs-help`-label.
Are you not sure on what you want to implement, or want some advice on how to approach things?
Feel free to open a new issue on Github: https://github.com/spulec/moto/issues

View File

@ -0,0 +1,118 @@
.. _contributing tips:
=============================
Development Tips
=============================
Below you can find some tips that might help during development.
****************************
Naming Conventions
****************************
Let's say you want to implement the `import_certificate` feature for the ACM service.
Implementing the feature itself can be done by creating a method called `import_certificate` in `moto/acm/responses.py`.
| It's considered good practice to deal with input/output formatting and validation in `responses.py`, and create a method `import_certificate` in `moto/acm/models.py` that handles the actual import logic.
When writing tests, you'll want to add a new method called `def test_import_certificate` to `tests/test_acm/test_acm.py`.
| Additional tests should also have names indicate of what's happening, i.e. `def test_import_certificate_fails_without_name`, `def test_import_existing_certificate`, etc.
****************************************
Determining which URLs to intercept
****************************************
In order for Moto to know which requests to intercept, Moto needs to know which URLs to intercept.
| But how do we know which URL's should be intercepted? There are a few ways of doing it:
- For an existing service, copy/paste the url-path for an existing feature and cross your fingers and toes
- Use the service model that is used by botocore: https://github.com/boto/botocore/tree/develop/botocore/data
Look for the `requestUri`-field in the `services.json` file.
- Make a call to AWS itself, and intercept the request using a proxy.
This gives you all information you could need, including the URL, parameters, request and response format.
******************************
Intercepting AWS requests
******************************
Download and install a proxy such `MITMProxy <https://mitmproxy.org/>`_.
With the proxy running, the easiest way of proxying requests to AWS is probably via the CLI.
.. sourcecode:: bash
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080
aws ses describe-rule-set --no-verify-ssl
.. sourcecode:: python
from botocore.config import Config
proxy_config = Config(proxies={'http': 'localhost:8080', 'https': 'localhost:8080'})
boto3.client("ses", config=proxy_config, use_ssl=False, verify=False)
******************************
Tagging Service
******************************
A dedicated TaggingService exists in `moto.utilities`, to help with storing/retrieving tags for resources.
Not all services use it yet, but contributors are encouraged to use the TaggingService for all new features.
***************************
CI
***************************
Our CI runs all tests twice - one normal run, and one run in ServerMode. In ServerMode, Moto is started as a stand-alone Flask server, and all tests are run against this Flask-instance.
To verify whether your tests pass in ServerMode, you can run the following commands:
.. sourcecode:: bash
moto_server
TEST_SERVER_MODE=true pytest -sv tests/test_service/..
*****************************
Partial Implementations
*****************************
If a service is only partially implemented, a warning can be used to inform the user:
.. sourcecode:: python
import warnings
warnings.warn("The Filters-parameter is not yet implemented for client.method()")
****************
Writing tests
****************
One test should only verify a single feature/method. I.e., one test for `create_resource()`, another for `update_resource()`, etc.
Negative tests
^^^^^^^^^^^^^^^^^
When writing negative tests, try to use the following format:
.. sourcecode:: python
with pytest.raises(botocore.exceptions.ClientError) as exc:
client.failing_call(..)
err = exc.value.response["Error"]
# These assertions use the 'sure' library, but any assertion style is accepted
err["Code"].should.equal(..)
err["Message"].should.equal(..)
This is the best way to ensure that exceptions are dealt with correctly by Moto.
Parallel tests
^^^^^^^^^^^^^^^^^^^^^
To speed up our CI, the ServerMode tests for the `awslambda`, `batch`, `ec2` and `sqs` services will run in parallel.
This means the following:
- Make sure you use unique names for functions/queues/etc
- Calls to `describe_reservations()`/`list_queues()`/etc might return resources from other tests

View File

@ -0,0 +1,103 @@
.. _contributing faq:
=============================
FAQ
=============================
When running the linter...
#############################
Why does black give different results?
****************************************
Different versions of black produce different results.
To ensure that our CI passes, please format the code using `black==19.10b0`.
When running a test...
#########################
Why does it take ages to run a single test?
**********************************************
There are a few reasons why this could happen.
If the test uses Docker, it could take a while to:
- Download the appropriate Docker image
- Run the image
- Wait for the logs to appear
Why am I getting Docker errors?
********************************
AWSLambda and Batch services use Docker to execute the code provided to the system, which means that Docker needs to be installed on your system in order for these tests to run.
Why are my tests failing in ServerMode?
******************************************
- Make sure that the correct url paths are present in `urls.py`
- Make sure that you've run `scripts/update_backend_index.py` afterwards, to let MotoServer know the urls have changed.
When using the scaffolding scripts..
#######################################
Why am I getting the error that my new module could not be found?
*******************************************************************
.. sourcecode:: bash
File "scripts/scaffold.py", line 499, in insert_codes
insert_code_to_class(responses_path, BaseResponse, func_in_responses)
File "scripts/scaffold.py", line 424, in insert_code_to_class
mod = importlib.import_module(mod_path)
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'moto.kafka'
This will happen if you've ran `pip install .` prior to running `scripts/scaffold.py`.
Instead, install Moto as an editable module instead:
.. sourcecode:: bash
pip uninstall moto
pip install -e .
What ...
#################
Does ServerMode refer to?
******************************
ServerMode refers to Moto running as a stand-alone server. This can be useful to:
- Test non-Python SDK's
- Have a semi-permanent, local AWS-like server running that multiple applications can talk to
Types of tests are there?
***********************************
There are three types of tests:
#. decorator tests
#. ServerMode tests
#. server tests (located in test_server.py)
The decorator tests refer to the normal unit tests that are run against an in-memory Moto instance.
The ServerMode tests refer to the same set of tests - but run against an external MotoServer instance.
When running tests in ServerMode, each boto3-client and boto3-resource are intercepted, and enriched with the `endpoint_url="http://localhost:5000"` argument. This allows us to run the same test twice, and verify that Moto behaves the same when using decorators, and in ServerMode.
The last 'server' tests are low-level tests that can be used to verify that Moto behaves exactly like the AWS HTTP API.
Each test will spin up the MotoServer in memory, and run HTTP requests directly against that server.
This allows the developer to test things like HTTP headers, the exact response/request format, etc.
Alternatives are there?
********************************
The best alternative would be `LocalStack <https://localstack.cloud//>`_.
LocalStack is Moto's bigger brother with more advanced features, such as EC2 VM's that you can SSH into and Dockerized RDS-installations that you can connect to.

View File

@ -0,0 +1,18 @@
.. _contributing main:
=============================
Contributing
=============================
Want to contribute to Moto? Yes please! The aim is to mock as many services and features as possible.
With AWS releasing new services almost daily, that is for sure a moving target! So any help is welcome.
Check our :ref:`contributing installation` guide on how to install Moto locally.
The :ref:`contributing architecture` page can be useful or interesting if you want to dive deeper in Moto's guts, but feel free to skip this page if you're not interested.
Want to add some new features, or improving the behaviour of existing ones? :ref:`contributing feature` is for you.
We also have a collection of :ref:`contributing tips` to give some guidance.
Finally, the :ref:`contributing faq` page may have some questions to your burning answers that popped up while reading this saga.

View File

@ -0,0 +1,44 @@
.. _contributing installation:
=============================
Installation
=============================
This is a guide how to install Moto for contributors.
The following software is assumed to be present:
- Python 3.x
- Docker
It is recommended to work from some kind of virtual environment, i.e. `virtualenv`, to prevent cross-contamination with other projects.
From within such a virtualenv, run the following command to install all required dependencies:
.. code-block:: bash
make init
With all dependencies installed, run the following command to run all the tests and verify your environment is ready:
.. code-block:: bash
make test
Note that this may take awhile - there are many services, and each service will have a boatload of tests.
To verify all tests pass for a specific service, for example for `s3`, run these commands manually:
.. code-block:: bash
flake8 moto/s3
black --check moto/s3 tests/test_s3
pylint tests/test_s3
pytest -sv tests/test_s3
If black fails, you can run the following command to automatically format the offending files:
.. code-block:: bash
make format
If any of these steps fail, please see our :ref:`contributing faq` or open an issue on Github.

View File

@ -0,0 +1,60 @@
.. _contributing feature:
=============================
New Features
=============================
Moto has a script that can automatically provide the scaffolding for a new service, and for adding new features to an existing service. This script does all the heavy lifting of generating template code, by looking up the API specification of a given `boto3` method and adding the necessary code to mock it.
Please try it out by running:
.. sourcecode:: bash
python scripts/scaffold.py
The script uses the `click`-module to assists with autocompletion.
- Use Tab to auto-complete the first suggest service, or
- Use the up and down-arrows on the keyboard to select something from the dropdown
- Press enter to continue
An example interaction:
.. sourcecode:: bash
$ python scripts/scaffold.py
Select service: codedeploy
==Current Implementation Status==
[ ] add_tags_to_on_premises_instances
...
[ ] create_deployment
...
[ ] update_deployment_group
=================================
Select Operation: create_deployment
Initializing service codedeploy
creating moto/codedeploy
creating moto/codedeploy/models.py
creating moto/codedeploy/exceptions.py
creating moto/codedeploy/__init__.py
creating moto/codedeploy/responses.py
creating moto/codedeploy/urls.py
creating tests/test_codedeploy
creating tests/test_codedeploy/test_server.py
creating tests/test_codedeploy/test_codedeploy.py
inserting code moto/codedeploy/responses.py
inserting code moto/codedeploy/models.py
Remaining steps after development is complete:
- Run scripts/implementation_coverage.py,
- Run scripts/update_backend_index.py.
.. note:: The implementation coverage script is used to automatically update the full list of supported services.
.. warning:: In order to speed up the performance of MotoServer, all AWS URL's that need intercepting are indexed.
When adding/replacing any URLs in `{service}/urls.py`, please run `python scripts/update_backend_index.py` to update this index.

View File

@ -1,11 +1,32 @@
.. _implementedservice_acm:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
acm
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_acm
def test_acm_behaviour:
boto3.client("acm")
...
|start-h3| Implemented features for this service |end-h3|
- [X] add_tags_to_certificate
- [X] delete_certificate
- [ ] describe_certificate

View File

@ -1,11 +1,32 @@
.. _implementedservice_apigateway:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==========
apigateway
==========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_apigateway
def test_apigateway_behaviour:
boto3.client("apigateway")
...
|start-h3| Implemented features for this service |end-h3|
- [X] create_api_key
- [X] create_authorizer
- [X] create_base_path_mapping

View File

@ -1,11 +1,32 @@
.. _implementedservice_application-autoscaling:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=======================
application-autoscaling
=======================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_applicationautoscaling
def test_application-autoscaling_behaviour:
boto3.client("application-autoscaling")
...
|start-h3| Implemented features for this service |end-h3|
- [X] delete_scaling_policy
- [ ] delete_scheduled_action
- [X] deregister_scalable_target

View File

@ -1,11 +1,32 @@
.. _implementedservice_athena:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
======
athena
======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_athena
def test_athena_behaviour:
boto3.client("athena")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] batch_get_named_query
- [ ] batch_get_query_execution
- [ ] create_data_catalog

View File

@ -1,11 +1,32 @@
.. _implementedservice_autoscaling:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===========
autoscaling
===========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_autoscaling
def test_autoscaling_behaviour:
boto3.client("autoscaling")
...
|start-h3| Implemented features for this service |end-h3|
- [X] attach_instances
- [X] attach_load_balancer_target_groups
- [X] attach_load_balancers

View File

@ -1,11 +1,32 @@
.. _implementedservice_batch:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=====
batch
=====
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_batch
def test_batch_behaviour:
boto3.client("batch")
...
|start-h3| Implemented features for this service |end-h3|
- [X] cancel_job
- [X] create_compute_environment
- [X] create_job_queue

View File

@ -1,11 +1,32 @@
.. _implementedservice_cloudformation:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==============
cloudformation
==============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_cloudformation
def test_cloudformation_behaviour:
boto3.client("cloudformation")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] activate_type
- [ ] batch_describe_type_configurations
- [ ] cancel_update_stack

View File

@ -1,11 +1,32 @@
.. _implementedservice_cloudtrail:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==========
cloudtrail
==========
Implementation of CloudTrail APIs.
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_cloudtrail
def test_cloudtrail_behaviour:
boto3.client("cloudtrail")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_tags
- [X] create_trail
- [X] delete_trail

View File

@ -1,11 +1,32 @@
.. _implementedservice_cloudwatch:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==========
cloudwatch
==========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_cloudwatch
def test_cloudwatch_behaviour:
boto3.client("cloudwatch")
...
|start-h3| Implemented features for this service |end-h3|
- [X] delete_alarms
- [ ] delete_anomaly_detector
- [X] delete_dashboards

View File

@ -1,11 +1,32 @@
.. _implementedservice_codecommit:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==========
codecommit
==========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_codecommit
def test_codecommit_behaviour:
boto3.client("codecommit")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] associate_approval_rule_template_with_repository
- [ ] batch_associate_approval_rule_template_with_repositories
- [ ] batch_describe_merge_conflicts

View File

@ -1,11 +1,32 @@
.. _implementedservice_codepipeline:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
============
codepipeline
============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_codepipeline
def test_codepipeline_behaviour:
boto3.client("codepipeline")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] acknowledge_job
- [ ] acknowledge_third_party_job
- [ ] create_custom_action_type

View File

@ -1,11 +1,32 @@
.. _implementedservice_cognito-identity:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
================
cognito-identity
================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_cognitoidentity
def test_cognito-identity_behaviour:
boto3.client("cognito-identity")
...
|start-h3| Implemented features for this service |end-h3|
- [X] create_identity_pool
- [ ] delete_identities
- [ ] delete_identity_pool

View File

@ -1,11 +1,32 @@
.. _implementedservice_cognito-idp:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===========
cognito-idp
===========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_cognitoidp
def test_cognito-idp_behaviour:
boto3.client("cognito-idp")
...
|start-h3| Implemented features for this service |end-h3|
- [X] add_custom_attributes
- [X] admin_add_user_to_group
- [X] admin_confirm_sign_up

View File

@ -1,11 +1,32 @@
.. _implementedservice_config:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
======
config
======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_config
def test_config_behaviour:
boto3.client("config")
...
|start-h3| Implemented features for this service |end-h3|
- [X] batch_get_aggregate_resource_config
Returns configuration of resource for current regional backend.

View File

@ -1,11 +1,32 @@
.. _implementedservice_datapipeline:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
============
datapipeline
============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_datapipeline
def test_datapipeline_behaviour:
boto3.client("datapipeline")
...
|start-h3| Implemented features for this service |end-h3|
- [X] activate_pipeline
- [ ] add_tags
- [X] create_pipeline

View File

@ -1,11 +1,32 @@
.. _implementedservice_datasync:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========
datasync
========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_datasync
def test_datasync_behaviour:
boto3.client("datasync")
...
|start-h3| Implemented features for this service |end-h3|
- [X] cancel_task_execution
- [ ] create_agent
- [ ] create_location_efs

View File

@ -1,11 +1,32 @@
.. _implementedservice_dms:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
dms
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_dms
def test_dms_behaviour:
boto3.client("dms")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_tags_to_resource
- [ ] apply_pending_maintenance_action
- [ ] cancel_replication_task_assessment_run

View File

@ -1,11 +1,32 @@
.. _implementedservice_ds:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==
ds
==
Implementation of DirectoryService APIs.
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ds
def test_ds_behaviour:
boto3.client("ds")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] accept_shared_directory
- [ ] add_ip_routes
- [ ] add_region

View File

@ -1,11 +1,32 @@
.. _implementedservice_dynamodb:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========
dynamodb
========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_dynamodb2
def test_dynamodb_behaviour:
boto3.client("dynamodb")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] batch_execute_statement
- [X] batch_get_item
- [X] batch_write_item

View File

@ -1,11 +1,32 @@
.. _implementedservice_dynamodbstreams:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===============
dynamodbstreams
===============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_dynamodbstreams
def test_dynamodbstreams_behaviour:
boto3.client("dynamodbstreams")
...
|start-h3| Implemented features for this service |end-h3|
- [X] describe_stream
- [X] get_records
- [X] get_shard_iterator

View File

@ -1,11 +1,32 @@
.. _implementedservice_ec2-instance-connect:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
====================
ec2-instance-connect
====================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ec2instanceconnect
def test_ec2-instance-connect_behaviour:
boto3.client("ec2-instance-connect")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] send_serial_console_ssh_public_key
- [X] send_ssh_public_key

View File

@ -1,11 +1,32 @@
.. _implementedservice_ec2:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
ec2
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ec2
def test_ec2_behaviour:
boto3.client("ec2")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] accept_reserved_instances_exchange_quote
- [ ] accept_transit_gateway_multicast_domain_associations
- [X] accept_transit_gateway_peering_attachment

View File

@ -1,11 +1,32 @@
.. _implementedservice_ecr:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
ecr
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ecr
def test_ecr_behaviour:
boto3.client("ecr")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] batch_check_layer_availability
- [X] batch_delete_image
- [X] batch_get_image

View File

@ -1,11 +1,32 @@
.. _implementedservice_ecs:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
ecs
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ecs
def test_ecs_behaviour:
boto3.client("ecs")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] create_capacity_provider
- [X] create_cluster
- [X] create_service

View File

@ -1,5 +1,13 @@
.. _implementedservice_efs:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
efs
===
@ -11,6 +19,19 @@ The backend manager of EFS resources.
such resources should always go through this class.
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_efs
def test_efs_behaviour:
boto3.client("efs")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] create_access_point
- [X] create_file_system
Create a new EFS File System Volume.

View File

@ -1,11 +1,32 @@
.. _implementedservice_eks:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
eks
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_eks
def test_eks_behaviour:
boto3.client("eks")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] associate_encryption_config
- [ ] associate_identity_provider_config
- [ ] create_addon

View File

@ -1,11 +1,32 @@
.. _implementedservice_elasticbeanstalk:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
================
elasticbeanstalk
================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_elasticbeanstalk
def test_elasticbeanstalk_behaviour:
boto3.client("elasticbeanstalk")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] abort_environment_update
- [ ] apply_environment_managed_action
- [ ] associate_environment_operations_role

View File

@ -1,11 +1,32 @@
.. _implementedservice_elastictranscoder:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=================
elastictranscoder
=================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_elastictranscoder
def test_elastictranscoder_behaviour:
boto3.client("elastictranscoder")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] cancel_job
- [ ] create_job
- [X] create_pipeline

View File

@ -1,11 +1,32 @@
.. _implementedservice_elb:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
elb
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_elb
def test_elb_behaviour:
boto3.client("elb")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_tags
- [X] apply_security_groups_to_load_balancer
- [ ] attach_load_balancer_to_subnets

View File

@ -1,11 +1,32 @@
.. _implementedservice_elbv2:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=====
elbv2
=====
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_elbv2
def test_elbv2_behaviour:
boto3.client("elbv2")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_listener_certificates
- [ ] add_tags
- [X] create_listener

View File

@ -1,11 +1,32 @@
.. _implementedservice_emr-containers:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==============
emr-containers
==============
Implementation of EMRContainers APIs.
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_emrcontainers
def test_emr-containers_behaviour:
boto3.client("emr-containers")
...
|start-h3| Implemented features for this service |end-h3|
- [X] cancel_job_run
- [ ] create_managed_endpoint
- [X] create_virtual_cluster

View File

@ -1,11 +1,32 @@
.. _implementedservice_emr:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
emr
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_emr
def test_emr_behaviour:
boto3.client("emr")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_instance_fleet
- [X] add_instance_groups
- [X] add_job_flow_steps

View File

@ -1,11 +1,32 @@
.. _implementedservice_events:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
======
events
======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_events
def test_events_behaviour:
boto3.client("events")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] activate_event_source
- [X] cancel_replay
- [X] create_api_destination

View File

@ -1,11 +1,32 @@
.. _implementedservice_firehose:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========
firehose
========
Implementation of Firehose APIs.
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_firehose
def test_firehose_behaviour:
boto3.client("firehose")
...
|start-h3| Implemented features for this service |end-h3|
- [X] create_delivery_stream
Create a Kinesis Data Firehose delivery stream.

View File

@ -1,11 +1,32 @@
.. _implementedservice_forecast:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========
forecast
========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_forecast
def test_forecast_behaviour:
boto3.client("forecast")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] create_dataset
- [X] create_dataset_group
- [ ] create_dataset_import_job

View File

@ -1,11 +1,32 @@
.. _implementedservice_glacier:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=======
glacier
=======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_glacier
def test_glacier_behaviour:
boto3.client("glacier")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] abort_multipart_upload
- [ ] abort_vault_lock
- [ ] add_tags_to_vault

View File

@ -1,11 +1,32 @@
.. _implementedservice_glue:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
====
glue
====
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_glue
def test_glue_behaviour:
boto3.client("glue")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] batch_create_partition
- [ ] batch_delete_connection
- [ ] batch_delete_partition

View File

@ -1,11 +1,32 @@
.. _implementedservice_iam:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
iam
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_iam
def test_iam_behaviour:
boto3.client("iam")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_client_id_to_open_id_connect_provider
- [X] add_role_to_instance_profile
- [X] add_user_to_group

View File

@ -5,85 +5,12 @@
Implemented Services
====================
Please see a list of all currently supported services. Each service will have a list of the endpoints that are implemented.
- :doc:`acm`
- :doc:`apigateway`
- :doc:`application-autoscaling`
- :doc:`athena`
- :doc:`autoscaling`
- :doc:`batch`
- :doc:`cloudformation`
- :doc:`cloudtrail`
- :doc:`cloudwatch`
- :doc:`codecommit`
- :doc:`codepipeline`
- :doc:`cognito-identity`
- :doc:`cognito-idp`
- :doc:`config`
- :doc:`datapipeline`
- :doc:`datasync`
- :doc:`dms`
- :doc:`ds`
- :doc:`dynamodb`
- :doc:`dynamodbstreams`
- :doc:`ec2`
- :doc:`ec2-instance-connect`
- :doc:`ecr`
- :doc:`ecs`
- :doc:`efs`
- :doc:`eks`
- :doc:`elasticbeanstalk`
- :doc:`elastictranscoder`
- :doc:`elb`
- :doc:`elbv2`
- :doc:`emr`
- :doc:`emr-containers`
- :doc:`events`
- :doc:`firehose`
- :doc:`forecast`
- :doc:`glacier`
- :doc:`glue`
- :doc:`iam`
- :doc:`iot`
- :doc:`iot-data`
- :doc:`kinesis`
- :doc:`kinesis-video-archived-media`
- :doc:`kinesisvideo`
- :doc:`kms`
- :doc:`lambda`
- :doc:`logs`
- :doc:`managedblockchain`
- :doc:`mediaconnect`
- :doc:`medialive`
- :doc:`mediapackage`
- :doc:`mediastore`
- :doc:`mediastore-data`
- :doc:`opsworks`
- :doc:`organizations`
- :doc:`polly`
- :doc:`ram`
- :doc:`rds`
- :doc:`redshift`
- :doc:`resource-groups`
- :doc:`resourcegroupstaggingapi`
- :doc:`route53`
- :doc:`s3`
- :doc:`sagemaker`
- :doc:`secretsmanager`
- :doc:`ses`
- :doc:`sns`
- :doc:`sqs`
- :doc:`ssm`
- :doc:`stepfunctions`
- :doc:`sts`
- :doc:`support`
- :doc:`swf`
- :doc:`timestream-write`
- :doc:`transcribe`
- :doc:`wafv2`
.. toctree::
:hidden:
:glob:
:titlesonly:
:maxdepth: 1
:glob:
*
*

View File

@ -1,11 +1,32 @@
.. _implementedservice_iot-data:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========
iot-data
========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_iotdata
def test_iot-data_behaviour:
boto3.client("iot-data")
...
|start-h3| Implemented features for this service |end-h3|
- [X] delete_thing_shadow
after deleting, get_thing_shadow will raise ResourceNotFound.
But version of the shadow keep increasing...

View File

@ -1,11 +1,32 @@
.. _implementedservice_iot:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
iot
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_iot
def test_iot_behaviour:
boto3.client("iot")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] accept_certificate_transfer
- [ ] add_thing_to_billing_group
- [X] add_thing_to_thing_group

View File

@ -1,11 +1,32 @@
.. _implementedservice_kinesis-video-archived-media:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
============================
kinesis-video-archived-media
============================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_kinesisvideoarchivedmedia
def test_kinesis-video-archived-media_behaviour:
boto3.client("kinesis-video-archived-media")
...
|start-h3| Implemented features for this service |end-h3|
- [X] get_clip
- [X] get_dash_streaming_session_url
- [X] get_hls_streaming_session_url

View File

@ -1,11 +1,32 @@
.. _implementedservice_kinesis:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=======
kinesis
=======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_kinesis
def test_kinesis_behaviour:
boto3.client("kinesis")
...
|start-h3| Implemented features for this service |end-h3|
- [X] add_tags_to_stream
- [X] create_stream
- [X] decrease_stream_retention_period

View File

@ -1,11 +1,32 @@
.. _implementedservice_kinesisvideo:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
============
kinesisvideo
============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_kinesisvideo
def test_kinesisvideo_behaviour:
boto3.client("kinesisvideo")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] create_signaling_channel
- [X] create_stream
- [ ] delete_signaling_channel

View File

@ -1,11 +1,32 @@
.. _implementedservice_kms:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
kms
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_kms
def test_kms_behaviour:
boto3.client("kms")
...
|start-h3| Implemented features for this service |end-h3|
- [X] cancel_key_deletion
- [ ] connect_custom_key_store
- [ ] create_alias

View File

@ -1,11 +1,32 @@
.. _implementedservice_lambda:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
======
lambda
======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_lambda
def test_lambda_behaviour:
boto3.client("lambda")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_layer_version_permission
- [X] add_permission
- [ ] create_alias

View File

@ -1,11 +1,32 @@
.. _implementedservice_logs:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
====
logs
====
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_logs
def test_logs_behaviour:
boto3.client("logs")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] associate_kms_key
- [ ] cancel_export_task
- [ ] create_export_task

View File

@ -1,11 +1,32 @@
.. _implementedservice_managedblockchain:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=================
managedblockchain
=================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_managedblockchain
def test_managedblockchain_behaviour:
boto3.client("managedblockchain")
...
|start-h3| Implemented features for this service |end-h3|
- [X] create_member
- [X] create_network
- [X] create_node

View File

@ -1,11 +1,32 @@
.. _implementedservice_mediaconnect:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
============
mediaconnect
============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_mediaconnect
def test_mediaconnect_behaviour:
boto3.client("mediaconnect")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_flow_media_streams
- [X] add_flow_outputs
- [ ] add_flow_sources

View File

@ -1,11 +1,32 @@
.. _implementedservice_medialive:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=========
medialive
=========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_medialive
def test_medialive_behaviour:
boto3.client("medialive")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] accept_input_device_transfer
- [ ] batch_delete
- [ ] batch_start

View File

@ -1,11 +1,32 @@
.. _implementedservice_mediapackage:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
============
mediapackage
============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_mediapackage
def test_mediapackage_behaviour:
boto3.client("mediapackage")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] configure_logs
- [X] create_channel
- [ ] create_harvest_job

View File

@ -1,11 +1,32 @@
.. _implementedservice_mediastore-data:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===============
mediastore-data
===============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_mediastoredata
def test_mediastore-data_behaviour:
boto3.client("mediastore-data")
...
|start-h3| Implemented features for this service |end-h3|
- [X] delete_object
- [ ] describe_object
- [X] get_object

View File

@ -1,11 +1,32 @@
.. _implementedservice_mediastore:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==========
mediastore
==========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_mediastore
def test_mediastore_behaviour:
boto3.client("mediastore")
...
|start-h3| Implemented features for this service |end-h3|
- [X] create_container
- [X] delete_container
- [ ] delete_container_policy

View File

@ -1,11 +1,32 @@
.. _implementedservice_opsworks:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========
opsworks
========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_opsworks
def test_opsworks_behaviour:
boto3.client("opsworks")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] assign_instance
- [ ] assign_volume
- [ ] associate_elastic_ip

View File

@ -1,11 +1,32 @@
.. _implementedservice_organizations:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=============
organizations
=============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_organizations
def test_organizations_behaviour:
boto3.client("organizations")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] accept_handshake
- [X] attach_policy
- [ ] cancel_handshake

View File

@ -1,11 +1,32 @@
.. _implementedservice_polly:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=====
polly
=====
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_polly
def test_polly_behaviour:
boto3.client("polly")
...
|start-h3| Implemented features for this service |end-h3|
- [X] delete_lexicon
- [X] describe_voices
- [X] get_lexicon

View File

@ -1,11 +1,32 @@
.. _implementedservice_ram:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
ram
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ram
def test_ram_behaviour:
boto3.client("ram")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] accept_resource_share_invitation
- [ ] associate_resource_share
- [ ] associate_resource_share_permission

View File

@ -1,11 +1,32 @@
.. _implementedservice_rds:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
rds
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_rds2
def test_rds_behaviour:
boto3.client("rds")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_role_to_db_cluster
- [ ] add_role_to_db_instance
- [ ] add_source_identifier_to_subscription

View File

@ -1,11 +1,32 @@
.. _implementedservice_redshift:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========
redshift
========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_redshift
def test_redshift_behaviour:
boto3.client("redshift")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] accept_reserved_node_exchange
- [ ] add_partner
- [ ] associate_data_share_consumer

View File

@ -1,11 +1,32 @@
.. _implementedservice_resource-groups:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===============
resource-groups
===============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_resourcegroups
def test_resource-groups_behaviour:
boto3.client("resource-groups")
...
|start-h3| Implemented features for this service |end-h3|
- [X] create_group
- [X] delete_group
- [X] get_group

View File

@ -1,11 +1,32 @@
.. _implementedservice_resourcegroupstaggingapi:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
========================
resourcegroupstaggingapi
========================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_resourcegroupstaggingapi
def test_resourcegroupstaggingapi_behaviour:
boto3.client("resourcegroupstaggingapi")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] describe_report_creation
- [ ] get_compliance_summary
- [X] get_resources

View File

@ -1,11 +1,32 @@
.. _implementedservice_route53:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=======
route53
=======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_route53
def test_route53_behaviour:
boto3.client("route53")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] activate_key_signing_key
- [ ] associate_vpc_with_hosted_zone
- [X] change_resource_record_sets

View File

@ -1,11 +1,32 @@
.. _implementedservice_s3:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==
s3
==
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_s3
def test_s3_behaviour:
boto3.client("s3")
...
|start-h3| Implemented features for this service |end-h3|
- [X] abort_multipart_upload
- [X] complete_multipart_upload
- [X] copy_object

View File

@ -1,11 +1,32 @@
.. _implementedservice_sagemaker:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=========
sagemaker
=========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_sagemaker
def test_sagemaker_behaviour:
boto3.client("sagemaker")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_association
- [ ] add_tags
- [X] associate_trial_component

View File

@ -1,11 +1,32 @@
.. _implementedservice_secretsmanager:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==============
secretsmanager
==============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_secretsmanager
def test_secretsmanager_behaviour:
boto3.client("secretsmanager")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] cancel_rotate_secret
- [X] create_secret
- [ ] delete_resource_policy

View File

@ -1,11 +1,32 @@
.. _implementedservice_ses:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
ses
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ses
def test_ses_behaviour:
boto3.client("ses")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] clone_receipt_rule_set
- [X] create_configuration_set
- [X] create_configuration_set_event_destination

View File

@ -1,11 +1,32 @@
.. _implementedservice_sns:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
sns
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_sns
def test_sns_behaviour:
boto3.client("sns")
...
|start-h3| Implemented features for this service |end-h3|
- [X] add_permission
- [ ] check_if_phone_number_is_opted_out
- [ ] confirm_subscription

View File

@ -1,11 +1,32 @@
.. _implementedservice_sqs:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
sqs
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_sqs
def test_sqs_behaviour:
boto3.client("sqs")
...
|start-h3| Implemented features for this service |end-h3|
- [X] add_permission
- [X] change_message_visibility
- [ ] change_message_visibility_batch

View File

@ -1,11 +1,32 @@
.. _implementedservice_ssm:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
ssm
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_ssm
def test_ssm_behaviour:
boto3.client("ssm")
...
|start-h3| Implemented features for this service |end-h3|
- [X] add_tags_to_resource
- [ ] associate_ops_item_related_item
- [ ] cancel_command

View File

@ -1,11 +1,32 @@
.. _implementedservice_stepfunctions:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=============
stepfunctions
=============
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_stepfunctions
def test_stepfunctions_behaviour:
boto3.client("stepfunctions")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] create_activity
- [X] create_state_machine
- [ ] delete_activity

View File

@ -1,11 +1,32 @@
.. _implementedservice_sts:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
sts
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_sts
def test_sts_behaviour:
boto3.client("sts")
...
|start-h3| Implemented features for this service |end-h3|
- [X] assume_role
- [X] assume_role_with_saml
- [X] assume_role_with_web_identity

View File

@ -1,11 +1,32 @@
.. _implementedservice_support:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=======
support
=======
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_support
def test_support_behaviour:
boto3.client("support")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] add_attachments_to_set
- [ ] add_communication_to_case
- [X] create_case

View File

@ -1,11 +1,32 @@
.. _implementedservice_swf:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
===
swf
===
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_swf
def test_swf_behaviour:
boto3.client("swf")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] count_closed_workflow_executions
- [ ] count_open_workflow_executions
- [X] count_pending_activity_tasks

View File

@ -1,11 +1,32 @@
.. _implementedservice_timestream-write:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
================
timestream-write
================
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_timestreamwrite
def test_timestream-write_behaviour:
boto3.client("timestream-write")
...
|start-h3| Implemented features for this service |end-h3|
- [X] create_database
- [X] create_table
- [X] delete_database

View File

@ -1,11 +1,32 @@
.. _implementedservice_transcribe:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
==========
transcribe
==========
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_transcribe
def test_transcribe_behaviour:
boto3.client("transcribe")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] create_call_analytics_category
- [ ] create_language_model
- [X] create_medical_vocabulary

View File

@ -1,5 +1,13 @@
.. _implementedservice_wafv2:
.. |start-h3| raw:: html
<h3>
.. |end-h3| raw:: html
</h3>
=====
wafv2
=====
@ -8,6 +16,19 @@ wafv2
https://docs.aws.amazon.com/waf/latest/APIReference/API_Operations_AWS_WAFV2.html
|start-h3| Example usage |end-h3|
.. sourcecode:: python
@mock_wafv2
def test_wafv2_behaviour:
boto3.client("wafv2")
...
|start-h3| Implemented features for this service |end-h3|
- [ ] associate_web_acl
- [ ] check_capacity
- [ ] create_ip_set

View File

@ -28,11 +28,31 @@ Additional Resources
.. toctree::
:maxdepth: 2
:hidden:
:glob:
:caption: Getting Started
docs/getting_started
docs/server_mode
docs/boto
docs/iam
docs/aws_config
docs/services/index
.. toctree::
:maxdepth: 1
:hidden:
:caption: Implemented Services
docs/services/index
.. toctree::
:maxdepth: 1
:hidden:
:glob:
:caption: Contributing to Moto
docs/contributing/index
docs/contributing/installation
docs/contributing/architecture
docs/contributing/new_feature
docs/contributing/development_tips
docs/contributing/checklist
docs/contributing/faq

View File

@ -19,24 +19,26 @@ def get_moto_implementation(service_name):
if service_name in alternative_service_names
else service_name
)
mock = None
mock_name = None
if hasattr(moto, "mock_{}".format(alt_service_name)):
mock = getattr(moto, "mock_{}".format(alt_service_name))
mock_name = "mock_{}".format(alt_service_name)
mock = getattr(moto, mock_name)
elif hasattr(moto, "mock_{}".format(service_name)):
mock = getattr(moto, "mock_{}".format(service_name))
else:
mock = None
mock_name = "mock_{}".format(service_name)
mock = getattr(moto, mock_name)
if mock is None:
return None
return None, None
backends = list(mock().backends.values())
if backends:
return backends[0]
return backends[0], mock_name
def calculate_extended_implementation_coverage():
service_names = Session().get_available_services()
coverage = {}
for service_name in service_names:
moto_client = get_moto_implementation(service_name)
moto_client, mock_name = get_moto_implementation(service_name)
real_client = boto3.client(service_name, region_name="us-east-1")
implemented = dict()
not_implemented = []
@ -52,6 +54,7 @@ def calculate_extended_implementation_coverage():
coverage[service_name] = {
"docs": moto_client.__doc__,
"name": mock_name,
"implemented": implemented,
"not_implemented": not_implemented,
}
@ -62,7 +65,7 @@ def calculate_implementation_coverage():
service_names = Session().get_available_services()
coverage = {}
for service_name in service_names:
moto_client = get_moto_implementation(service_name)
moto_client, _ = get_moto_implementation(service_name)
real_client = boto3.client(service_name, region_name="us-east-1")
implemented = []
not_implemented = []
@ -184,6 +187,14 @@ def write_implementation_coverage_to_docs(coverage):
file.write(f".. _implementedservice_{shorthand}:\n")
file.write("\n")
file.write(".. |start-h3| raw:: html\n\n")
file.write(" <h3>")
file.write("\n\n")
file.write(".. |end-h3| raw:: html\n\n")
file.write(" </h3>")
file.write("\n\n")
title = f"{service_name}"
file.write("=" * len(title) + "\n")
file.write(title + "\n")
@ -193,6 +204,19 @@ def write_implementation_coverage_to_docs(coverage):
file.write(coverage[service_name].get("docs") or "")
file.write("\n\n")
file.write("|start-h3| Example usage |end-h3|\n\n")
file.write(f""".. sourcecode:: python
@{coverage[service_name]['name']}
def test_{service_name}_behaviour:
boto3.client("{service_name}")
...
""")
file.write("\n\n")
file.write("|start-h3| Implemented features for this service |end-h3|\n\n")
for op in operations:
if op in implemented:
file.write("- [X] {}\n".format(op))
@ -203,6 +227,7 @@ def write_implementation_coverage_to_docs(coverage):
file.write("- [ ] {}\n".format(op))
file.write("\n")
with open(implementation_coverage_file, "w+") as file:
file.write(".. _implemented_services:\n")
file.write("\n")
@ -212,20 +237,16 @@ def write_implementation_coverage_to_docs(coverage):
file.write("Implemented Services\n")
file.write("====================\n")
file.write("\n")
file.write("Please see a list of all currently supported services. Each service will have a list of the endpoints that are implemented.\n")
file.write("\n")
for service_name in sorted(coverage):
implemented = coverage.get(service_name)["implemented"]
if len(implemented) == 0:
continue
file.write(f" - :doc:`{service_name }`\n")
file.write("\n")
file.write(".. toctree::\n")
file.write(" :hidden:\n")
file.write(" :glob:\n")
file.write(" :titlesonly:\n")
file.write(" :maxdepth: 1\n")
file.write(" :glob:\n")
file.write("\n")
file.write(" *\n")
file.write(" *\n")
if __name__ == "__main__":

View File

@ -518,6 +518,13 @@ def insert_codes(service, operation, api_protocol):
@click.command()
def main():
click.echo("This script uses the click-module.\n")
click.echo(" - Start typing the name of the service you want to extend\n"
" - Use Tab to auto-complete the first suggest service\n"
" - Use the up and down-arrows on the keyboard to select something from the dropdown\n"
" - Press enter to continue\n")
"""Create basic files needed for the user's choice of service and op."""
service, operation = select_service_and_operation()
@ -535,9 +542,9 @@ def main():
)
click.echo(
"Remaining setup:\n"
'- Add the mock into "docs/index.rst",\n'
'- Add the mock into "IMPLEMENTATION_COVERAGE.md",\n'
"\n"
"Remaining steps after development is complete:\n"
'- Run scripts/implementation_coverage.py,\n'
"- Run scripts/update_backend_index.py."
)