Mimic is an API-compatible mock service for Openstack Compute and Rackspace's implementation of Identity and Cloud Load balancers. It is backed by in-memory data structure rather than a potentially expensive database.
Mimic helps with:
- fast set-up
- instant response
- cost efficient
- enables offline developmenet
- enables ability to test unusual behaviors/errors of an api
- acts as a central repository for mocked responses from services
https://github.com/rackerlabs/mimic/blob/master/mimic/rest/nova_api.py
- LIST servers - Lists servers on the tenant, in mimic
- POST server - Creates a server in mimic (look at the 'Errors or unusual behaviors supported for compute' below)
- GET server - Returns the server, if it exists in mimic else returns a 404
- DELETE server - Deletes the server, if it exists in mimcic else returns 404
- LIST addresses - Lists the private and public Ips for the given server. 404 if not found.
- GET image - If the image ID is anything but what is listed in the mimic presets,
invalid_image_ref
returns 200. Else returns a 400. - GET flavor - If the flavor ID is anything but what is listed in the mimic presets,
invalid_flavor_ref
returns 200. Else returns a 400. - GET limits - Returns only the absolute limits for compute
Based on the metadata (mimic_presets) provided when a server is being created, a server can be made to behave as follows:
- Fail with the given response message and response code
- Go into an error state on creation
- Remain in building state for the specified amount of time
- Fails to delete the server, with the specified response code for the number of times specified
- Returns 'image not found' or 'flavor not found' responses for specified IDs
Eg: Request for create server that remains in building for 120 seconds:
{ "server" : { "name" : "api-test-server-1", "imageRef" : "3afe97b2-26dc-49c5-a2cc-a2fc8d80c001", "flavorRef" : "2", "metadata": {"server_building": 120} } }
https://github.com/rackerlabs/mimic/blob/master/mimic/rest/auth_api.py
- Authenticate - Given a tenant id, username and password, returns the service catalog with links to compute and load balancer links within mimic, and a test token.
- Impersonate user (Admin call) - Given a token created by mimic in the header, returns a test token for the username.
- GET endpoints - Given token created by mimic, returns the service catalog for that user.
https://github.com/rackerlabs/mimic/blob/master/mimic/rest/loadbalancer_api.py
- LIST load balancers - Lists the load balancers created in mimic
- POST load balancer - Creates a load balancer (look at the 'Errors or unusual behaviors supported for cloud load balancers' below)
- GET load balancer - Returns the load balancer if it exists, else 404
- DELETE load balancer - Deletes the load balancer if it exists, else returns 404
- LIST nodes - Lists the nodes on the load balancer
- POST node - Creates a node on the load balancer
- GET node - Returns the node if it exists, else returns 404
- DELETE node - Deletes the node if it exists, else returns 404
Based on key and value of the metadata (mimic_presets) provided when a load balancer is being created, a load balancer can be made to behave as follows:
- Remain in 'BUILD' state for the specified amount of time
- Load balancer goes into 'PENDING-UPDATE' state on every add/delete node for the specified amout of time
- Load balancer goes into 'PENDING-DELETE' state on delete load balancer for the specified amout of time
- Load balancer goes into an error state on creation
Eg: Request for create load balancer that is expected to go into 'PENDING-UPDATE' state on every add/delete node, for 20 seconds:
{"loadBalancer": {"name": "a-new-loadbalancer2", "protocol": "HTTP", "virtualIps": [{"type": "PUBLIC"}], "metadata": [{"key": "lb_pending_update", "value": 20}], "nodes": []}}
- support XML
- validate the auth token
- create a cloud server with an image that by default comes with python 2.7 (eg: ubuntu 12.04) and ssh into it
git clone https://github.com/rackerlabs/mimic.git
pip install -r requirements.txt
from within the mimic folder (if there is a gcc error,apt-get install python-dev
)- cd into mimic or add the mimic to the PYTHONPATH and run
twistd -n mimic