From d0cde0218c812136f2f18fa0474bd87826e41ec8 Mon Sep 17 00:00:00 2001 From: Steve Pulec Date: Tue, 14 Mar 2017 23:20:17 -0400 Subject: [PATCH] Rearrange docs. --- README.md | 1 + docs/_build/doctrees/docs/ec2_tut.doctree | Bin 0 -> 8287 bytes .../doctrees/docs/getting_started.doctree | Bin 0 -> 12246 bytes docs/_build/doctrees/docs/moto_apis.doctree | Bin 0 -> 4727 bytes docs/_build/doctrees/docs/other_langs.doctree | Bin 0 -> 5297 bytes docs/_build/doctrees/docs/server_mode.doctree | Bin 0 -> 10556 bytes docs/_build/doctrees/environment.pickle | Bin 10880 -> 11476 bytes docs/_build/doctrees/index.doctree | Bin 30998 -> 30440 bytes docs/_build/doctrees/other_langs.doctree | Bin 5298 -> 5292 bytes .../html/_sources/docs/ec2_tut.rst.txt} | 0 .../_sources/docs/getting_started.rst.txt | 114 ++++++ .../html/_sources/docs/moto_apis.rst.txt} | 0 .../html/_sources/docs/other_langs.rst.txt} | 2 +- .../html/_sources/docs/server_mode.rst.txt | 67 ++++ docs/_build/html/_sources/index.rst.txt | 21 +- docs/_build/html/_sources/other_langs.rst.txt | 2 +- docs/_build/html/docs/ec2_tut.html | 306 ++++++++++++++++ docs/_build/html/docs/getting_started.html | 343 ++++++++++++++++++ docs/_build/html/docs/moto_apis.html | 256 +++++++++++++ docs/_build/html/docs/other_langs.html | 243 +++++++++++++ docs/_build/html/docs/server_mode.html | 283 +++++++++++++++ docs/_build/html/genindex.html | 8 +- docs/_build/html/index.html | 36 +- docs/_build/html/objects.inv | Bin 372 -> 398 bytes docs/_build/html/other_langs.html | 12 +- docs/_build/html/search.html | 8 +- docs/_build/html/searchindex.js | 2 +- docs/docs/ec2_tut.rst | 74 ++++ docs/{ => docs}/getting_started.rst | 2 + docs/docs/moto_apis.rst | 21 ++ docs/docs/server_mode.rst | 67 ++++ docs/index.rst | 21 +- 32 files changed, 1827 insertions(+), 62 deletions(-) create mode 100644 docs/_build/doctrees/docs/ec2_tut.doctree create mode 100644 docs/_build/doctrees/docs/getting_started.doctree create mode 100644 docs/_build/doctrees/docs/moto_apis.doctree create mode 100644 docs/_build/doctrees/docs/other_langs.doctree create mode 100644 docs/_build/doctrees/docs/server_mode.doctree rename docs/{ec2_tut.rst => _build/html/_sources/docs/ec2_tut.rst.txt} (100%) create mode 100644 docs/_build/html/_sources/docs/getting_started.rst.txt rename docs/{moto_apis.rst => _build/html/_sources/docs/moto_apis.rst.txt} (100%) rename docs/{other_langs.rst => _build/html/_sources/docs/other_langs.rst.txt} (78%) create mode 100644 docs/_build/html/_sources/docs/server_mode.rst.txt create mode 100644 docs/_build/html/docs/ec2_tut.html create mode 100644 docs/_build/html/docs/getting_started.html create mode 100644 docs/_build/html/docs/moto_apis.html create mode 100644 docs/_build/html/docs/other_langs.html create mode 100644 docs/_build/html/docs/server_mode.html create mode 100644 docs/docs/ec2_tut.rst rename docs/{ => docs}/getting_started.rst (99%) create mode 100644 docs/docs/moto_apis.rst create mode 100644 docs/docs/server_mode.rst diff --git a/README.md b/README.md index 5485c63cd..2b4daeda6 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Build Status](https://travis-ci.org/spulec/moto.png?branch=master)](https://travis-ci.org/spulec/moto) [![Coverage Status](https://coveralls.io/repos/spulec/moto/badge.png?branch=master)](https://coveralls.io/r/spulec/moto) +[![Docs](https://readthedocs.org/projects/pip/badge/?version=stable)](http://docs.getmoto.org) # In a nutshell diff --git a/docs/_build/doctrees/docs/ec2_tut.doctree b/docs/_build/doctrees/docs/ec2_tut.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d9f63cfa2c607446b0504c6f849a7a9fc00f1a2c GIT binary patch literal 8287 zcmZo*N>0g7E-lH-Db~x&Pf0E20&#Ow^Gdi188sUVnQ9A}H9|S_5_3~aDhpDJ3t4Il zSv4ZW85kH!i&GVH^Gos-5{ng5lZ_OT5|gu2^HK`g{33)I7#MOAOY@R5GV{_EGV_W{ z67!N%iwoKPBG?%i7*dms;!8?P3OPDTLj{XVlZs0+OG-;J^Yh|UQqzhHIcp2KLiq|3 zi;7d@b5o0p6Vp?R3%O$pc|!S;ON)w9^Gf22^Gl18Qww?hLb*~>lkH#ONv z7v_AS4E9iAxZ`yZju+102xSMU1UX%#G?XJbBQqzZC^fH8G`3Jo13er|5{uGPOSlTf zH5&^hY6~SbLOF{P%b^aJir`^jV9?W3h=+!SRVZ6QBFJln(iu#lY*1w~5ylJ*4EmwP zsYS*5#U-g_sroLdWvMy&1)vzx2RUCqB|o_sLO_kuD=IE2lnrGsNlXWMx==2Z4dRwU z`B1LJl9Hm#q|%bq;zEVmLPd>GW>BCg#fEZ#{9gnLe&yIuj+D{@klx}#mDo`BW-w)l#+D|b2TO5k zGAORN3biyF3$<$tbu==hLK!loGng`DGGs#~Q!5HmlS|@@Qqxk4QuC5iQ{s~<<3Y9- z>ed$OWpHFj6lchVvO|q2)Xz|;Ei}-`P>Ib@jm=Pw%}|OhG}Oot$`DD-P>U@z(#T-T z;7Bda(C}u>(9B>86~}6RW=f%PZJ|kq2*`BN*g{jx*vu@+N#!au(`+m>uPwCD$dCf( zfzaYq1z%_$aCJuH0m}^O3~i8yGUP&8OF()Htw1idMsaC|S}fdU8KSX;Ht2yBl3G#1 zRcMRXD!bOkLi^f62aOD=43M?vrAdjH!CsJ9l$c(WSdhV0=&0FP=u}(i4D!Pz1_p+Z zjLc$%lG2j=qRhk`h180IoW#t$VugeRQ1a4CO*TqMP%lnI~dI}&DxZoxv78jT1rWPxdWF(d-ROXi|WF(fQDkSC=jG%l zrlh8TO#)}HoSf7Yg(Pq==B0qk6g@7d)U^B}khUC!QO%K)(#z2o44Y23XV-`nNU~2GkY?!g7&!X;LC6e?aXj3@S~^u#H&9z`!uH;;=Bd zwXraywlEYFMnli}kOYv5GY!Ni<>V)4a}|bZHWr507Dj-4*}%ZSU}tBikeOSMUsM9l z51`zq1I`d!Aer3!bPbg>k#Y_%GzmeRS{MmRm{A&`oE5n_R>cL0$*G0Wp&SK8sl};9 zWvPWR8A{;d7g7#G$~A6Swu;TLjTj8RD~xMxER3%$On~K!JY^zyai#NOw-5!)eh;kg&CmO1T}$turz@(Go&*TAvHq= zxJt-EF&|nbz)j80um!iKuo;!p+E|!dTbKtb`9a2}Lwo}&-}7q=3qY=LWME)$Oe;w( zQUIkDP$>yc8>uNe3MCn-3Q4IMiDjAjMIZ?fzc?{B6;y8LDHIf?mSyIb7Uxu2Srrx{ zxfxuF7GZODN{$S2e=Fhe>c9}-5Od{CEa*D6!j z(l8~(D9zXiDGb4RsZt{&Is;p_5ru_gRfcT@og7zK-P%}KQ(IUI%L3()Z~~>Jy4u2e zP&ipIFff4II>o6a3dJRfC7Ha zOw=zw4=M=Fe4zeINvgV)0$c_Z>>z=H)V!3;ymSo%O^_*xxtZ~h)=zw9UP@|(x|Kqy zx`8@aswg=lvm`Yc)OG_4S6GUOJLx$vK&zu2xBY zc50rwm4Z504=7teTJY*t3a-vZ&iQ$H5WZDvvXLIVD$z^KO{~h#ODr$eOU};)xg;g8 z7~GBry8_gWGBwdNGBnXMG&a?N7I0v}Vs$Hp=va_jGAavFi^?*K^NYZ)sYuNO+mi`0yi^^L zXCb1wiRr2FP&sJ!2N?p(@bLvj`DvLsplE?v2bTi%nZZ`%8tN72Cg$WoOw21uElNvF zP6fNjFSVpRzbM-iCTNwKm#LeYVrH6VVQv6+Ze~GzVoFL;YB5NCsX9u)K@2QO%>`Q% zlcxX$VDaqKqP)}`unfp)P%%h<3RM)Ed`dENLH;OJH!?6Z)ip5JH8Kw|FtswZv@$i1 z0&9n+XK*}(6qSM#EL04Vd`i_3j!;lQ){~i+4o}gg>Zy5&Nja%0UF! zh=ga3f}F&XwEQBF&p@sRg?T|yW?5oMYCK9}$}G?|G|)3NHq$e-FxNA*FaR~1^fE!= znU@F&ahN`|kVMr6aY|8sN@;RQJgCzF3T{Y(DJV_K$xKGImb5fnl$e{6S)7fOP>WI% zi}MjV3(^`>w^9fKH_JTp((p8VF34}lc zy`kJCMTvREplUs}sIb>Blovi&4<3B(t1avgeoKB{ap8>E!kM7TB9sR< zrvM(rp5+%R1a~1~_F;Bx;T-hA+2YFLlGI$78m_{*nvI3?Y76H>{H{=2xB%3}31!Uz zjo5oLLIy}+L;D%Bpz&(8SjgD9H)ALZs45I)@$_@^FI-p(8tYq>0qT7%t}R>wH*qP* zM36@CKsR`-KssX{Nb#}^+X!6-1_lpM%Qh!7FIxdJ=C7axYNnKwmMDSx_<8vy3W$+) zy~5?KjfE>}3s*uckj_{P9zD!(0aKxTs6H%QRhpCtiW|`IRBBP-YQIp9%oI?IuBfDN zjW=T`FLHzw7p{#hTo=j<3voy+tgkKH5Gs(Fmy%fo9)tqVkrWqhj4j+0%2AwJQj(dM zUR<~tY4|;@C_k?xH7|uLEHS4vwV11LOMcBxggMvoDl2HLs+ovT%PWZ%$%fdMT(U0cu$m9tdSh%_}?@%9)Z_ zl3HAnm|IYI2;{_6P~gUclT6`ZZ>CV5_>|P*lFU4CbE)u%Uno~bVonKE!BKD4P+q7b zpmQ|G{4%WkLS<5mit>x%Q}dGZLEXf72sa}!FC{0nsPK5G0LWLxIf=y?MXBH(XyJ)a z)|Aww()7ZUexU-Xxk;&@h^@>?EzU?yEh#+J87iA!T2fG2g3HX)p==zDs0$o)Dla#_sp@OLunI)i4jIIag|&WUzS-6>W&v)^$QhE&dE>Aj!(@^%*=uHuTqN(uXTjVmK0^? z!iyV3tj9yfJ+F6$GN7(E`5kUMOp6Nt&)j;r&o9 zsCH0-e&83%mzjqgMTHMTIl(G*i!;*;ABFPAr(_m`I$iP5aCz((%9)uGUjUlQt0;UD z$`C4>oRL_Rm<;M)jbA8Fac*K!Nqk{xK4`x3ZD%MCC^5jZ@Vih2SQaiXFV`!mEXl~v183os)H3~o z)PiFD!uO!sBd;W}B0eKCJtHSGJ)@-XLnup5eqMUv$50v607J_spEAyb@`1{+pH7s?9__IOZgE-w5Y8!853 zfjU~LMWB{?JhV$(_@g6~yC|_7&i@H2T*1KuFCu^Wl_rIXqStib!QH~&-V7N^wS|8) zGDI@8GlVk|GlVj)+bKe;INanxMh`|KQ36JdBTCOO=Ll!V25sA_hhV phS(xTMh1pZHc-k*DK27SWMHT*VrFDu$PkGwVgb<-iN&Q!dI0~0D9Qi; literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/docs/getting_started.doctree b/docs/_build/doctrees/docs/getting_started.doctree new file mode 100644 index 0000000000000000000000000000000000000000..96db7c269c1fc6bbb195a3a10ea47c869849d3f4 GIT binary patch literal 12246 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 literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/docs/moto_apis.doctree b/docs/_build/doctrees/docs/moto_apis.doctree new file mode 100644 index 0000000000000000000000000000000000000000..32d9752f64311f0df85931dae3e5895005a69890 GIT binary patch literal 4727 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 literal 10880 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 ai&BfcK&FD0a29!kbaKYSL)!-u+Ij%0V|jl7 diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree index a1f0257782ea08c8a83c4ecdcb5083e25bcc024a..318fbf7351e845e231f11d5e2ff70fbb2b28801d 100644 GIT binary patch literal 30440 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 wgw^k*p`5S^rno2ybAX+K0xHL%*0Jxp1)Bpeg literal 30998 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 U=GB1A(~d2w1<~?}#idDl00|k;VgLXD diff --git a/docs/_build/doctrees/other_langs.doctree b/docs/_build/doctrees/other_langs.doctree index 7070542cb3c7599e4ecafe69d6ef8c90f307c965..eb8fa04730391ca1ebedd044f845d2a5e9bab295 100644 GIT binary patch delta 48 qcmdm_xkhsX3k&0l$*e5(%z6qQle<_n7_BC6X0b;X+q{rfkRJe5NewLk delta 54 tcmZ3Zxk+;a3k&1w$sbti*%T7Kx3g$4>P_CjVvj|5^K4c@egOQJ5pn` guide to get familiar +:doc:`Getting Started with Moto ` guide to get familiar with ``moto`` and its usage. Currently implemented Services: +------------------------------- +-----------------------+---------------------+-----------------------------------+ | Service Name | Decorator | Development Status | @@ -79,11 +78,6 @@ Currently implemented Services: +-----------------------+---------------------+-----------------------------------+ -Moto APIs ---------- -some stuff - - Additional Resources -------------------- @@ -91,6 +85,7 @@ Additional Resources * `Moto Source Repository`_ * `Moto Issue Tracker`_ +.. _AWS infrastructure: http://aws.amazon.com/ .. _Moto Issue Tracker: https://github.com/spulec/moto/issues .. _Moto Source Repository: https://github.com/spulec/moto @@ -99,7 +94,7 @@ Additional Resources :hidden: :glob: - index - getting_started - other_langs - moto_apis + docs/getting_started + docs/server_mode + docs/moto_apis + docs/ec2_tut diff --git a/docs/_build/html/_sources/other_langs.rst.txt b/docs/_build/html/_sources/other_langs.rst.txt index 6fb617c39..664ce50b1 100644 --- a/docs/_build/html/_sources/other_langs.rst.txt +++ b/docs/_build/html/_sources/other_langs.rst.txt @@ -4,7 +4,7 @@ Other languages =============== -You don't need to use Python to use Moto; it can be used with any language. To use it with another language, run moto_server and here are some examples in other languages. +You don't need to use Python to use Moto; it can be used with any language. To use it with another language, run moto_server. Here are some examples in other languages: * `Java`_ * `Ruby`_ diff --git a/docs/_build/html/docs/ec2_tut.html b/docs/_build/html/docs/ec2_tut.html new file mode 100644 index 000000000..63b3adc24 --- /dev/null +++ b/docs/_build/html/docs/ec2_tut.html @@ -0,0 +1,306 @@ + + + + + + + + + + + Use Moto as EC2 backend — Moto 0.4.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Use Moto as EC2 backend

+

This tutorial explains moto.ec2‘s features and how to use it. This +tutorial assumes that you have already downloaded and installed boto and moto. +Before all code examples the following snippet is launched:

+
>>> import boto.ec2, moto
+>>> mock_ec2 = moto.mock_ec2()
+>>> mock_ec2.start()
+>>> conn = boto.ec2.connect_to_region("eu-west-1")
+
+
+
+

Launching instances

+

After mock is started, the behavior is the same than previously:

+
>>> reservation = conn.run_instances('ami-f00ba4')
+>>> reservation.instances[0]
+Instance:i-91dd2f32
+
+
+

Moto set static or generate random object’s attributes:

+
>>> vars(reservation.instances[0])
+{'_in_monitoring_element': False,
+ '_placement': None,
+ '_previous_state': None,
+ '_state': pending(0),
+ 'ami_launch_index': u'0',
+ 'architecture': u'x86_64',
+ 'block_device_mapping': None,
+ 'client_token': '',
+ 'connection': EC2Connection:ec2.eu-west-1.amazonaws.com,
+ 'dns_name': u'ec2-54.214.135.84.compute-1.amazonaws.com',
+ 'ebs_optimized': False,
+ 'eventsSet': None,
+ 'group_name': None,
+ 'groups': [],
+ 'hypervisor': u'xen',
+ 'id': u'i-91dd2f32',
+ 'image_id': u'f00ba4',
+ 'instance_profile': None,
+ 'instance_type': u'm1.small',
+ 'interfaces': [NetworkInterface:eni-ed65f870],
+ 'ip_address': u'54.214.135.84',
+ 'item': u'\n        ',
+ 'kernel': u'None',
+ 'key_name': u'None',
+ 'launch_time': u'2015-07-27T05:59:57Z',
+ 'monitored': True,
+ 'monitoring': u'\n          ',
+ 'monitoring_state': u'enabled',
+ 'persistent': False,
+ 'platform': None,
+ 'private_dns_name': u'ip-10.136.187.180.ec2.internal',
+ 'private_ip_address': u'10.136.187.180',
+ 'product_codes': [],
+ 'public_dns_name': u'ec2-54.214.135.84.compute-1.amazonaws.com',
+ 'ramdisk': None,
+ 'reason': '',
+ 'region': RegionInfo:eu-west-1,
+ 'requester_id': None,
+ 'root_device_name': None,
+ 'root_device_type': None,
+ 'sourceDestCheck': u'true',
+ 'spot_instance_request_id': None,
+ 'state_reason': None,
+ 'subnet_id': None,
+ 'tags': {},
+ 'virtualization_type': u'paravirtual',
+ 'vpc_id': None}
+
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/docs/getting_started.html b/docs/_build/html/docs/getting_started.html new file mode 100644 index 000000000..5ab53fe72 --- /dev/null +++ b/docs/_build/html/docs/getting_started.html @@ -0,0 +1,343 @@ + + + + + + + + + + + Getting Started with Moto — Moto 0.4.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Getting Started with Moto

+
+

Installing Moto

+

You can use pip to install the latest released version of moto:

+
pip install moto
+
+
+

If you want to install moto from source:

+
git clone git://github.com/spulec/moto.git
+cd moto
+python setup.py install
+
+
+
+
+

Moto usage

+

For example we have the following code we want to test:

+
import boto
+from boto.s3.key import Key
+
+class MyModel(object):
+    def __init__(self, name, value):
+        self.name = name
+        self.value = value
+
+    def save(self):
+        conn = boto.connect_s3()
+        bucket = conn.get_bucket('mybucket')
+        k = Key(bucket)
+        k.key = self.name
+        k.set_contents_from_string(self.value)
+
+
+

There are several method to do this, just keep in mind Moto creates a full blank environment.

+
+

Decorator

+

With a decorator wrapping all the calls to S3 are automatically mocked out.

+
import boto
+from moto import mock_s3
+from mymodule import MyModel
+
+@mock_s3
+def test_my_model_save():
+    conn = boto.connect_s3()
+    # We need to create the bucket since this is all in Moto's 'virtual' AWS account
+    conn.create_bucket('mybucket')
+
+    model_instance = MyModel('steve', 'is awesome')
+    model_instance.save()
+
+    assert conn.get_bucket('mybucket').get_key('steve').get_contents_as_string() == 'is awesome'
+
+
+
+
+

Context manager

+

Same as decorator, every call inside with statement are mocked out.

+
def test_my_model_save():
+    with mock_s3():
+        conn = boto.connect_s3()
+        conn.create_bucket('mybucket')
+
+        model_instance = MyModel('steve', 'is awesome')
+        model_instance.save()
+
+        assert conn.get_bucket('mybucket').get_key('steve').get_contents_as_string() == 'is awesome'
+
+
+
+
+

Raw

+

You can also start and stop manually the mocking.

+
def test_my_model_save():
+    mock = mock_s3()
+    mock.start()
+
+    conn = boto.connect_s3()
+    conn.create_bucket('mybucket')
+
+    model_instance = MyModel('steve', 'is awesome')
+    model_instance.save()
+
+    assert conn.get_bucket('mybucket').get_key('steve').get_contents_as_string() == 'is awesome'
+
+    mock.stop()
+
+
+
+
+

Stand-alone server mode

+

Moto comes with a stand-alone server allowing you to mock out an AWS HTTP endpoint. It is very useful to test even if you don’t use Python.

+
$ moto_server ec2 -p3000
+ * Running on http://127.0.0.1:3000/
+
+
+

This method isn’t encouraged if you’re using boto, best is to use decorator method.

+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/docs/moto_apis.html b/docs/_build/html/docs/moto_apis.html new file mode 100644 index 000000000..690a8069e --- /dev/null +++ b/docs/_build/html/docs/moto_apis.html @@ -0,0 +1,256 @@ + + + + + + + + + + + Moto APIs — Moto 0.4.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Moto APIs

+

Moto provides some internal APIs to view and change the state of the backends.

+
+

Reset API

+

This API resets the state of all of the backends. Send an HTTP POST to reset:

+
requests.post("http://motoapi.amazonaws.com/moto-api/reset")
+
+
+
+
+

Dashboard

+

Moto comes with a dashboard to view the current state of the system:

+
http://localhost:5000/moto-api/
+
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/docs/other_langs.html b/docs/_build/html/docs/other_langs.html new file mode 100644 index 000000000..3b5a91b53 --- /dev/null +++ b/docs/_build/html/docs/other_langs.html @@ -0,0 +1,243 @@ + + + + + + + + + + + Other languages — Moto 0.4.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Other languages

+

You don’t need to use Python to use Moto; it can be used with any language. To use it with another language, run moto_server. Here are some examples in other languages:

+ +
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/docs/server_mode.html b/docs/_build/html/docs/server_mode.html new file mode 100644 index 000000000..c226df021 --- /dev/null +++ b/docs/_build/html/docs/server_mode.html @@ -0,0 +1,283 @@ + + + + + + + + + + + Server mode — Moto 0.4.10 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Server mode

+

Moto has a stand-alone server mode. This allows you to utilize +the backend structure of Moto even if you don’t use Python.

+

It uses flask, which isn’t a default dependency. You can install the +server ‘extra’ package with:

+
pip install moto[server]
+
+
+

You can then start it running a service:

+
$ moto_server ec2
+
+
+

You can also pass the port:

+
$ moto_server ec2 -p3000
+ * Running on http://127.0.0.1:3000/
+
+
+

If you want to be able to use the server externally you can pass an IP +address to bind to as a hostname or allow any of your external +interfaces with 0.0.0.0:

+
$ moto_server ec2 -H 0.0.0.0
+ * Running on http://0.0.0.0:5000/
+
+
+

Please be aware this might allow other network users to access your +server.

+

Then go to localhost to see a list of running instances (it will be empty since you haven’t added any yet).

+

If you want to use boto3 with this, you can pass an endpoint_url to the resource

+
boto3.resource(
+    service_name='s3',
+    region_name='us-west-1',
+    endpoint_url='http://localhost:5000',
+)
+
+
+
+

Other languages

+

You don’t need to use Python to use Moto; it can be used with any language. Here are some examples to run it with other languages:

+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 1a7b34098..d0445ccd1 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -90,10 +90,10 @@ diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index cab7668b9..9b6474caf 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -36,7 +36,7 @@ href="genindex.html"/> - + @@ -89,21 +89,11 @@ -
    -
  • Moto: Mock AWS Services -
  • -
  • Getting Started with Moto
  • -
  • Other languages
  • -
  • Moto APIs
  • + @@ -170,13 +160,15 @@

    Moto: Mock AWS Services

    A library that allows you to easily mock out tests based on -AWS infrastructure.

    +AWS infrastructure.

    Getting Started

    If you’ve never used moto before, you should read the -Getting Started with Moto guide to get familiar +Getting Started with Moto guide to get familiar with moto and its usage.

    -

    Currently implemented Services:

    +
    +
    +

    Currently implemented Services:

    @@ -321,10 +313,6 @@ all endpoints done
    -
    -

    Moto APIs

    -

    some stuff

    -

    Additional Resources

      @@ -346,7 +334,7 @@ all endpoints done diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 157697e1afd26af9b70476a677479fd9a0902829..9d86687f9f2ad7b680f6b17a3f9d25a5f6533ab2 100644 GIT binary patch delta 286 zcmeyu)WC=;w}6<( z3D$#~?{BW$7UHyj!HucU(j26BPWNJ{W|e$+e(TGqAD1}hpVD|Bb?<&z!LvtAdsXx{ zJ0;KBr?vHAv*XU7s3UtHwX-jr;n9EW%DR^8Z;nNuT;ChF@~``zzWUd%3aqluU$(eY zs9~*Ic(f;JUbF>+jzf}kRNXPNY!+GhGs|)%gA(t55vmWG+wg0Xd$p?N^-G5=@4sN# z=sP%lm(#-0wnLpUsHYSo$PD%3!JcVvlZJCGUe#-#@?YnLn)`yEw$IcJuTW!YYK#wLRgZ2ybB)BUC`KCsBxzwku$#XROk SV$rKD>??~uvR_PmlL!FFxq3PP diff --git a/docs/_build/html/other_langs.html b/docs/_build/html/other_langs.html index 8ec0b7210..c329485c5 100644 --- a/docs/_build/html/other_langs.html +++ b/docs/_build/html/other_langs.html @@ -91,6 +91,16 @@
        +
      • Moto: Mock AWS Services +
      • Getting Started with Moto
      • Other languages
      • Moto APIs
      • @@ -159,7 +169,7 @@

        Other languages

        -

        You don’t need to use Python to use Moto; it can be used with any language. To use it with another language, run moto_server and here are some examples in other languages.

        +

        You don’t need to use Python to use Moto; it can be used with any language. To use it with another language, run moto_server. Here are some examples in other languages:

        • Java
        • Ruby
        • diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index 311903b7e..f78097c23 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -89,10 +89,10 @@ diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index f66b2d15b..73a7045f9 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["ec2_tut","getting_started","index","moto_apis","other_langs"],envversion:50,filenames:["ec2_tut.rst","getting_started.rst","index.rst","moto_apis.rst","other_langs.rst"],objects:{},objnames:{},objtypes:{},terms:{"27t05":0,"57z":0,"91dd2f32":0,"class":1,"import":[0,1],"static":0,"true":0,"var":0,AWS:1,EBS:2,ECS:2,For:1,KMS:2,RDS:2,SES:2,SNS:2,SQS:2,STS:2,There:1,With:1,__init__:1,_in_monitoring_el:0,_placement:0,_previous_st:0,_state:0,access:[],account:1,administr:[],after:0,all:[0,1,2,3],allow:[1,2],alreadi:0,also:1,amazonaw:[0,3],ami:[0,2],ami_launch_index:0,analyt:[],ani:4,anoth:4,api:[],applic:[],architectur:0,assert:1,assum:0,attribut:0,auto:[],automat:1,autosc:2,awesom:1,backend:3,base:2,basic:2,befor:[0,2],behavior:0,best:1,blank:1,block:[],block_device_map:0,bodi:[],boto:[0,1],bucket:1,call:1,can:[1,4],cell:[],chang:3,client_token:0,clone:1,cloud:[],cloudform:2,cloudwatch:2,code:[0,1],column:[],com:[0,1,3],come:[1,3],comput:0,conn:[0,1],connect:0,connect_s3:1,connect_to_region:0,contain:[],content:[],core:2,creat:1,create_bucket:1,current:[2,3],data:2,databas:[],decor:2,def:1,deliveri:[],deploy:[],develop:2,dns_name:0,don:[1,4],done:2,download:0,dynamodb2:2,dynamodb:2,easili:2,ebs_optim:0,ec2:[1,2],ec2connect:0,ed65f870:0,elast:[],elb:2,emr:2,enabl:0,encourag:1,endpoint:[1,2],eni:0,environ:1,even:1,eventsset:0,everi:1,exampl:[0,1,4],explain:0,f00ba4:0,fals:0,familiar:2,featur:0,follow:[0,1],from:1,full:1,gatewai:2,gener:0,get_bucket:1,get_contents_as_str:1,get_kei:1,git:1,github:1,glacier:2,grid:[],group:[0,2],group_nam:0,guid:2,have:[0,1],header:[],here:4,how:0,http:[1,3],hypervisor:0,iam:2,ident:[],image_id:0,implement:2,index:2,infrastructur:2,insid:1,instal:0,instanc:2,instance_profil:0,instance_typ:0,interfac:0,intern:[0,3],ip_address:0,isn:1,issu:2,item:0,its:2,java:4,javascript:4,just:1,keep:1,kei:1,kernel:0,key_nam:0,kinesi:2,lambda:2,languag:[],latest:1,launch_tim:0,librari:2,localhost:3,mai:[],manag:[],manual:1,method:1,mind:1,mobil:[],mock:[0,1],mock_apigatewai:2,mock_autosc:2,mock_cloudform:2,mock_cloudwatch:2,mock_datapipelin:2,mock_dynamodb2:2,mock_dynamodb:2,mock_ec2:[0,2],mock_ec:2,mock_elb:2,mock_emr:2,mock_glaci:2,mock_iam:2,mock_kinesi:2,mock_km:2,mock_lambda:2,mock_rd:2,mock_rds2:2,mock_redshift:2,mock_route53:2,mock_s3:[1,2],mock_s:2,mock_sfw:2,mock_sn:2,mock_sq:2,mock_st:2,model_inst:1,modul:[],monitor:0,monitoring_st:0,moto:4,moto_serv:[1,4],motoapi:3,mybucket:1,mymodel:1,mymodul:1,name:[1,2],need:[1,4],network:[],networkinterfac:0,never:2,none:0,object:[0,1],other:[],out:[1,2],p3000:1,page:[],paravirtu:0,partial:2,pend:0,persist:0,pip:1,pipelin:2,platform:0,post:3,previous:0,private_dns_nam:0,private_ip_address:0,product_cod:0,provid:3,public_dns_nam:0,python:[1,4],ramdisk:0,random:0,rds2:2,read:2,reason:0,redshift:2,region:0,regioninfo:0,releas:1,repositori:2,request:3,requester_id:0,reserv:0,root_device_nam:0,root_device_typ:0,route53:2,row:[],rubi:4,run:[1,4],run_inst:0,same:[0,1],save:1,scale:[],search:[],secur:2,self:1,send:3,set:0,set_contents_from_str:1,setup:1,sever:1,should:2,sinc:1,small:0,snippet:0,some:[2,3,4],sourc:[1,2],sourcedestcheck:0,span:[],spot_instance_request_id:0,spulec:1,start:0,state:3,state_reason:0,statement:1,statu:2,steve:1,stop:1,storag:[],stuff:2,subnet_id:0,swf:2,system:3,tabl:[],tag:[0,2],test:[1,2],test_my_model_sav:1,than:0,thi:[0,1,3],tracker:2,tutori:0,usag:2,use:[0,1,4],used:[2,4],useful:1,using:1,valu:1,veri:1,version:1,view:3,virtual:1,virtualization_typ:0,vpc_id:0,want:1,west:0,wrap:1,x86_64:0,xen:0,you:[0,1,2,4]},titles:["Use Moto as EC2 backend","Getting Started with Moto","Moto: Mock AWS Services","Moto APIs","Other languages"],titleterms:{AWS:2,Use:0,addit:2,alon:1,ani:[],anoth:[],api:[2,3],backend:0,boto:[],can:[],context:1,current:[],dashboard:3,decor:1,don:[],ec2:0,exampl:[],get:[1,2],here:[],implement:[],indic:[],instal:1,instanc:0,languag:4,launch:0,librari:[],manag:1,mock:2,mode:1,moto:[0,1,2,3],moto_serv:[],need:[],other:4,python:[],raw:1,reset:3,resourc:2,run:[],server:1,servic:2,some:[],stand:1,start:[1,2],tabl:[],usag:1,use:[],used:[],you:[]}}) \ No newline at end of file +Search.setIndex({docnames:["docs/ec2_tut","docs/getting_started","docs/moto_apis","docs/server_mode","index"],envversion:50,filenames:["docs/ec2_tut.rst","docs/getting_started.rst","docs/moto_apis.rst","docs/server_mode.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"27t05":0,"57z":0,"91dd2f32":0,"class":1,"default":3,"import":[0,1],"static":0,"true":0,"var":0,AWS:1,EBS:4,ECS:4,For:1,KMS:4,RDS:4,SES:4,SNS:4,SQS:4,STS:4,Then:3,There:1,With:1,__init__:1,_in_monitoring_el:0,_placement:0,_previous_st:0,_state:0,abl:3,abov:[],access:3,account:1,action:[],added:3,address:3,administr:[],after:0,all:[0,1,2,4],allow:[1,3,4],alon:3,alreadi:0,also:[1,3],amazonaw:[0,2],ami:[0,4],ami_launch_index:0,analyt:[],ani:3,anoth:[],api:4,applic:[],architectur:0,assert:1,assum:0,attribut:0,auto:[],automat:1,autosc:4,awar:3,awesom:1,backend:[2,3],base:4,basic:4,befor:[0,4],behavior:0,best:1,bind:3,blank:1,block:[],block_device_map:0,bodi:[],boto3:3,boto:[0,1],bucket:1,call:1,can:[1,3],cell:[],chang:2,client_token:0,clone:1,cloud:[],cloudform:4,cloudwatch:4,code:[0,1],column:[],com:[0,1,2],come:[1,2],comput:0,config:[],conn:[0,1],connect:0,connect_s3:1,connect_to_region:0,contain:[],content:[],core:4,creat:1,create_bucket:1,current:2,data:4,databas:[],decor:4,def:1,deliveri:[],depend:3,deploy:[],describeinst:[],develop:4,dns_name:0,don:[1,3],done:4,download:0,dynamodb2:4,dynamodb:4,easiest:[],easili:4,ebs_optim:0,ec2:[1,3,4],ec2connect:0,ed65f870:0,elast:[],elb:4,empti:3,emr:4,enabl:0,encourag:1,endpoint:[1,4],endpoint_url:3,eni:0,environ:1,even:[1,3],eventsset:0,everi:1,exampl:[0,1,3],explain:0,extern:3,extra:3,f00ba4:0,fals:0,familiar:4,featur:0,file:[],flask:3,follow:[0,1],from:1,full:1,gatewai:4,gener:0,get_bucket:1,get_contents_as_str:1,get_kei:1,git:1,github:1,glacier:4,grid:[],group:[0,4],group_nam:0,guid:4,has:3,have:[0,1],haven:3,header:[],here:3,hostnam:3,how:0,http:[1,2,3],https_validate_certif:[],hypervisor:0,iam:4,ident:[],image_id:0,implement:[],index:4,infrastructur:4,insid:1,instal:[0,3],instanc:[3,4],instance_profil:0,instance_typ:0,instead:[],interfac:[0,3],intern:[0,2],ip_address:0,is_secur:[],isn:[1,3],issu:4,item:0,its:4,java:3,javascript:3,just:1,keep:1,kei:1,kernel:0,key_nam:0,kinesi:4,lambda:4,languag:[],latest:1,launch_tim:0,librari:4,list:3,localhost:[2,3],mai:[],manag:[],manual:1,method:1,might:3,mind:1,mobil:[],mock:[0,1],mock_apigatewai:4,mock_autosc:4,mock_cloudform:4,mock_cloudwatch:4,mock_datapipelin:4,mock_dynamodb2:4,mock_dynamodb:4,mock_ec2:[0,4],mock_ec:4,mock_elb:4,mock_emr:4,mock_glaci:4,mock_iam:4,mock_kinesi:4,mock_km:4,mock_lambda:4,mock_rd:4,mock_rds2:4,mock_redshift:4,mock_route53:4,mock_s3:[1,4],mock_s:4,mock_sfw:4,mock_sn:4,mock_sq:4,mock_st:4,model_inst:1,modul:[],monitor:0,monitoring_st:0,moto:3,moto_serv:[1,3],motoapi:2,mybucket:1,mymodel:1,mymodul:1,name:[1,4],need:[1,3],network:3,networkinterfac:0,never:4,none:0,object:[0,1],other:[],out:[1,4],p3000:[1,3],packag:3,page:[],paravirtu:0,partial:4,pass:3,pend:0,persist:0,pip:[1,3],pipelin:4,platform:0,pleas:3,port:3,post:2,previous:0,private_dns_nam:0,private_ip_address:0,product_cod:0,provid:2,proxi:[],proxy_port:[],public_dns_nam:0,python:[1,3],ramdisk:0,random:0,rds2:4,read:4,reason:0,redshift:4,region:0,region_nam:3,regioninfo:0,releas:1,repositori:4,request:2,requester_id:0,reserv:0,resourc:3,root_device_nam:0,root_device_typ:0,route53:4,row:[],rubi:3,run:[1,3],run_inst:0,same:[0,1],save:1,scale:[],search:[],secur:4,see:3,self:1,send:2,servic:3,service_nam:3,set:0,set_contents_from_str:1,setup:1,sever:1,should:4,simpler:[],sinc:[1,3],small:0,snippet:0,some:[2,3],sourc:[1,4],sourcedestcheck:0,span:[],spot_instance_request_id:0,spulec:1,stand:3,start:[0,3],state:2,state_reason:0,statement:1,statu:4,steve:1,stop:1,storag:[],strongli:[],structur:3,stuff:[],subnet_id:0,swf:4,system:2,tabl:[],tag:[0,4],test:[1,4],test_my_model_sav:1,than:0,thi:[0,1,2,3],tracker:4,tutori:0,usag:4,use:[0,1,3],used:[3,4],useful:1,user:3,uses:3,using:1,util:3,valu:1,veri:1,version:1,view:2,virtual:1,virtualization_typ:0,vpc_id:0,wai:[],want:[1,3],west:[0,3],which:3,wrap:1,x86_64:0,xen:0,yet:3,you:[0,1,3,4],your:3},titles:["Use Moto as EC2 backend","Getting Started with Moto","Moto APIs","Server mode","Moto: Mock AWS Services"],titleterms:{AWS:4,Use:0,addit:4,alon:1,ani:[],anoth:[],api:2,backend:0,boto:[],can:[],context:1,current:4,dashboard:2,decor:1,don:[],ec2:0,exampl:[],get:[1,4],here:[],implement:4,indic:[],instal:1,instanc:0,languag:3,launch:0,librari:[],manag:1,mock:4,mode:[1,3],moto:[0,1,2,4],moto_serv:[],need:[],other:3,python:[],raw:1,reset:2,resourc:4,run:[],server:[1,3],servic:4,some:[],stand:1,start:[1,4],tabl:[],usag:1,use:[],used:[],you:[]}}) \ No newline at end of file diff --git a/docs/docs/ec2_tut.rst b/docs/docs/ec2_tut.rst new file mode 100644 index 000000000..86d6ae313 --- /dev/null +++ b/docs/docs/ec2_tut.rst @@ -0,0 +1,74 @@ +.. _ec2_tut: + +======================= +Use Moto as EC2 backend +======================= + +This tutorial explains ``moto.ec2``'s features and how to use it. This +tutorial assumes that you have already downloaded and installed boto and moto. +Before all code examples the following snippet is launched:: + + >>> import boto.ec2, moto + >>> mock_ec2 = moto.mock_ec2() + >>> mock_ec2.start() + >>> conn = boto.ec2.connect_to_region("eu-west-1") + +Launching instances +------------------- + +After mock is started, the behavior is the same than previously:: + + >>> reservation = conn.run_instances('ami-f00ba4') + >>> reservation.instances[0] + Instance:i-91dd2f32 + +Moto set static or generate random object's attributes:: + + >>> vars(reservation.instances[0]) + {'_in_monitoring_element': False, + '_placement': None, + '_previous_state': None, + '_state': pending(0), + 'ami_launch_index': u'0', + 'architecture': u'x86_64', + 'block_device_mapping': None, + 'client_token': '', + 'connection': EC2Connection:ec2.eu-west-1.amazonaws.com, + 'dns_name': u'ec2-54.214.135.84.compute-1.amazonaws.com', + 'ebs_optimized': False, + 'eventsSet': None, + 'group_name': None, + 'groups': [], + 'hypervisor': u'xen', + 'id': u'i-91dd2f32', + 'image_id': u'f00ba4', + 'instance_profile': None, + 'instance_type': u'm1.small', + 'interfaces': [NetworkInterface:eni-ed65f870], + 'ip_address': u'54.214.135.84', + 'item': u'\n ', + 'kernel': u'None', + 'key_name': u'None', + 'launch_time': u'2015-07-27T05:59:57Z', + 'monitored': True, + 'monitoring': u'\n ', + 'monitoring_state': u'enabled', + 'persistent': False, + 'platform': None, + 'private_dns_name': u'ip-10.136.187.180.ec2.internal', + 'private_ip_address': u'10.136.187.180', + 'product_codes': [], + 'public_dns_name': u'ec2-54.214.135.84.compute-1.amazonaws.com', + 'ramdisk': None, + 'reason': '', + 'region': RegionInfo:eu-west-1, + 'requester_id': None, + 'root_device_name': None, + 'root_device_type': None, + 'sourceDestCheck': u'true', + 'spot_instance_request_id': None, + 'state_reason': None, + 'subnet_id': None, + 'tags': {}, + 'virtualization_type': u'paravirtual', + 'vpc_id': None} diff --git a/docs/getting_started.rst b/docs/docs/getting_started.rst similarity index 99% rename from docs/getting_started.rst rename to docs/docs/getting_started.rst index e0a4fb10e..97f667d26 100644 --- a/docs/getting_started.rst +++ b/docs/docs/getting_started.rst @@ -1,3 +1,5 @@ +.. _getting_started: + ========================= Getting Started with Moto ========================= diff --git a/docs/docs/moto_apis.rst b/docs/docs/moto_apis.rst new file mode 100644 index 000000000..3414cba1a --- /dev/null +++ b/docs/docs/moto_apis.rst @@ -0,0 +1,21 @@ +.. _moto_apis: + +========= +Moto APIs +========= + +Moto provides some internal APIs to view and change the state of the backends. + +Reset API +--------- + +This API resets the state of all of the backends. Send an HTTP POST to reset:: + + requests.post("http://motoapi.amazonaws.com/moto-api/reset") + +Dashboard +--------- + +Moto comes with a dashboard to view the current state of the system:: + + http://localhost:5000/moto-api/ diff --git a/docs/docs/server_mode.rst b/docs/docs/server_mode.rst new file mode 100644 index 000000000..e8139e04d --- /dev/null +++ b/docs/docs/server_mode.rst @@ -0,0 +1,67 @@ +.. _server_mode: + +=========== +Server mode +=========== + +Moto has a stand-alone server mode. This allows you to utilize +the backend structure of Moto even if you don't use Python. + +It uses flask, which isn't a default dependency. You can install the +server 'extra' package with: + +.. code:: bash + + pip install moto[server] + + +You can then start it running a service: + +.. code:: bash + + $ moto_server ec2 + +You can also pass the port: + +.. code-block:: bash + + $ moto_server ec2 -p3000 + * Running on http://127.0.0.1:3000/ + +If you want to be able to use the server externally you can pass an IP +address to bind to as a hostname or allow any of your external +interfaces with 0.0.0.0: + +.. code-block:: bash + + $ moto_server ec2 -H 0.0.0.0 + * Running on http://0.0.0.0:5000/ + +Please be aware this might allow other network users to access your +server. + +Then go to localhost_ to see a list of running instances (it will be empty since you haven't added any yet). + +If you want to use boto3 with this, you can pass an `endpoint_url` to the resource + +.. code-block:: python + + boto3.resource( + service_name='s3', + region_name='us-west-1', + endpoint_url='http://localhost:5000', + ) + +Other languages +--------------- + +You don't need to use Python to use Moto; it can be used with any language. Here are some examples to run it with other languages: + +* `Java`_ +* `Ruby`_ +* `Javascript`_ + +.. _Java: https://github.com/spulec/moto/blob/master/other_langs/sqsSample.java +.. _Ruby: https://github.com/spulec/moto/blob/master/other_langs/test.rb +.. _Javascript: https://github.com/spulec/moto/blob/master/other_langs/test.js +.. _localhost: http://localhost:5000/?Action=DescribeInstances diff --git a/docs/index.rst b/docs/index.rst index 560ebc661..2ce31febd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,18 +5,17 @@ Moto: Mock AWS Services ============================= A library that allows you to easily mock out tests based on -_`AWS infrastructure`. - -.. _AWS infrastructure: http://aws.amazon.com/ +`AWS infrastructure`_. Getting Started --------------- If you've never used ``moto`` before, you should read the -:doc:`Getting Started with Moto ` guide to get familiar +:doc:`Getting Started with Moto ` guide to get familiar with ``moto`` and its usage. Currently implemented Services: +------------------------------- +-----------------------+---------------------+-----------------------------------+ | Service Name | Decorator | Development Status | @@ -79,11 +78,6 @@ Currently implemented Services: +-----------------------+---------------------+-----------------------------------+ -Moto APIs ---------- -some stuff - - Additional Resources -------------------- @@ -91,6 +85,7 @@ Additional Resources * `Moto Source Repository`_ * `Moto Issue Tracker`_ +.. _AWS infrastructure: http://aws.amazon.com/ .. _Moto Issue Tracker: https://github.com/spulec/moto/issues .. _Moto Source Repository: https://github.com/spulec/moto @@ -99,7 +94,7 @@ Additional Resources :hidden: :glob: - index - getting_started - other_langs - moto_apis + docs/getting_started + docs/server_mode + docs/moto_apis + docs/ec2_tut