getting_started.rst 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. Getting Started
  2. ===============
  3. This getting started guide will provide a quick tour of some CloudBridge
  4. features. For more details on individual features, see the
  5. `Using CloudBridge <topics/overview.html>`_ section or the
  6. `API reference <api_docs/ref.html>`_.
  7. Installation
  8. ------------
  9. CloudBridge is available on PyPI so to install the latest available version,
  10. run::
  11. pip install --upgrade cloudbridge
  12. For common issues during setup, check the following section:
  13. `Common Setup Issues <topics/troubleshooting.html>`
  14. Create a provider
  15. -----------------
  16. To start, you will need to create a reference to a provider object. The
  17. provider object identifies the cloud you want to work with and supplies your
  18. credentials. The following two code snippets setup a necessary provider object,
  19. for AWS and OpenStack. For the details on other providers, take a look at the
  20. `Setup page <topics/setup.html>`_. The remainder of the code is the same for
  21. either provider.
  22. AWS:
  23. .. code-block:: python
  24. from cloudbridge.cloud.factory import CloudProviderFactory, ProviderList
  25. config = {'aws_access_key': 'AKIAJW2XCYO4AF55XFEQ',
  26. 'aws_secret_key': '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'}
  27. provider = CloudProviderFactory().create_provider(ProviderList.AWS, config)
  28. image_id = 'ami-aa2ea6d0' # Ubuntu 16.04 (HVM)
  29. OpenStack (with Keystone authentication v2):
  30. .. code-block:: python
  31. from cloudbridge.cloud.factory import CloudProviderFactory, ProviderList
  32. config = {'os_username': 'username',
  33. 'os_password': 'password',
  34. 'os_auth_url': 'authentication URL',
  35. 'os_region_name': 'region name',
  36. 'os_project_name': 'project name'}
  37. provider = CloudProviderFactory().create_provider(ProviderList.OPENSTACK,
  38. config)
  39. image_id = 'c1f4b7bc-a563-4feb-b439-a2e071d861aa' # Ubuntu 14.04 @ NeCTAR
  40. OpenStack (with Keystone authentication v3):
  41. .. code-block:: python
  42. from cloudbridge.cloud.factory import CloudProviderFactory, ProviderList
  43. config = {'os_username': 'username',
  44. 'os_password': 'password',
  45. 'os_auth_url': 'authentication URL',
  46. 'os_project_name': 'project name',
  47. 'os_project_domain_name': 'project domain name',
  48. 'os_user_domain_name': 'domain name'}
  49. provider = CloudProviderFactory().create_provider(ProviderList.OPENSTACK,
  50. config)
  51. image_id = 'acb53109-941f-4593-9bf8-4a53cb9e0739' # Ubuntu 16.04 @ Jetstream
  52. Azure:
  53. .. code-block:: python
  54. from cloudbridge.cloud.factory import CloudProviderFactory, ProviderList
  55. config = {'azure_subscription_id': 'REPLACE WITH ACTUAL VALUE',
  56. 'azure_client_id': 'REPLACE WITH ACTUAL VALUE',
  57. 'azure_secret': 'REPLACE WITH ACTUAL VALUE',
  58. 'azure_tenant': ' REPLACE WITH ACTUAL VALUE'}
  59. provider = CloudProviderFactory().create_provider(ProviderList.AZURE, config)
  60. image_id = 'Canonical:UbuntuServer:16.04.0-LTS:latest' # Ubuntu 16.04
  61. List some resources
  62. -------------------
  63. Once you have a reference to a provider, explore the cloud platform:
  64. .. code-block:: python
  65. provider.security.firewalls.list()
  66. provider.compute.vm_types.list()
  67. provider.storage.snapshots.list()
  68. provider.storage.buckets.list()
  69. This will demonstrate the fact that the library was properly installed and your
  70. provider object is setup correctly but it is not very interesting. Therefore,
  71. let's create a new instance we can ssh into using a key pair.
  72. Create a key pair
  73. -----------------
  74. We'll create a new key pair and save the private portion of the key to a file
  75. on disk as a read-only file.
  76. .. code-block:: python
  77. import os
  78. kp = provider.security.key_pairs.create('cloudbridge-intro')
  79. with open('cloudbridge_intro.pem', 'w') as f:
  80. f.write(kp.material)
  81. os.chmod('cloudbridge_intro.pem', 0o400)
  82. Create a network
  83. ----------------
  84. A cloudbridge instance should be launched into a private subnet. We'll create
  85. a private network and subnet, and make sure it has internet connectivity, by
  86. attaching an internet gateway to the subnet via a router.
  87. .. code-block:: python
  88. net = provider.networking.networks.create(cidr_block='10.0.0.0/16',
  89. label='my-network')
  90. sn = net.create_subnet(cidr_block='10.0.0.0/28', label='my-subnet')
  91. router = provider.networking.routers.create(network=net, label='my-router')
  92. router.attach_subnet(sn)
  93. gateway = net.gateways.get_or_create_inet_gateway()
  94. router.attach_gateway(gateway)
  95. Create a VM firewall
  96. --------------------
  97. Next, we need to create a VM firewall (also commonly known as a security group)
  98. and add a rule to allow ssh access. A VM firewall needs to be associated with
  99. a private network.
  100. .. code-block:: python
  101. from cloudbridge.cloud.interfaces.resources import TrafficDirection
  102. fw = provider.security.vm_firewalls.create(
  103. label='cloudbridge-intro', description='A VM firewall used by
  104. CloudBridge', network_id=net.id)
  105. fw.rules.create(TrafficDirection.INBOUND, 'tcp', 22, 22, '0.0.0.0/0')
  106. Launch an instance
  107. ------------------
  108. We can now launch an instance using the created key pair and security group.
  109. We will launch an instance type that has at least 2 CPUs and 4GB RAM. We will
  110. also add the network interface as a launch argument.
  111. .. code-block:: python
  112. img = provider.compute.images.get(image_id)
  113. zone = provider.compute.regions.get(provider.region_name).zones[0]
  114. vm_type = sorted([t for t in provider.compute.vm_types
  115. if t.vcpus >= 2 and t.ram >= 4],
  116. key=lambda x: x.vcpus*x.ram)[0]
  117. inst = provider.compute.instances.create(
  118. image=img, vm_type=vm_type, label='cloudbridge-intro',
  119. subnet=sn, zone=zone, key_pair=kp, vm_firewalls=[fw])
  120. # Wait until ready
  121. inst.wait_till_ready() # This is a blocking call
  122. # Show instance state
  123. inst.state
  124. # 'running'
  125. .. note ::
  126. Note that we iterated through provider.compute.vm_types directly
  127. instead of calling provider.compute.vm_types.list(). This is
  128. because we need to iterate through all records in this case. The list()
  129. method may not always return all records, depending on the global limit
  130. for records, necessitating that additional records be paged in. See
  131. :doc:`topics/paging_and_iteration`.
  132. Assign a public IP address
  133. --------------------------
  134. To access the instance, let's assign a public IP address to the instance. For
  135. this step, we'll first need to allocate a floating IP address for our account
  136. and then associate it with the instance. Note that floating IPs are associated
  137. with an Internet Gateway so we allocate the IP under the gateway we dealt with
  138. earlier.
  139. .. code-block:: python
  140. fip = gateway.floating_ips.create()
  141. inst.add_floating_ip(fip)
  142. inst.refresh()
  143. inst.public_ips
  144. # [u'54.166.125.219']
  145. From the command prompt, you can now ssh into the instance
  146. ``ssh -i cloudbridge_intro.pem ubuntu@54.166.125.219``.
  147. Get a resource
  148. --------------
  149. When a resource already exists, a reference to it can be retrieved using either
  150. its ID, name, or label. It is important to note that while IDs and names are
  151. unique, multiple resources of the same type could use the same label, thus the
  152. `find` method always returns a list, while the `get` method returns a single
  153. object. While the methods are similar across resources, they are explicitly
  154. listed in order to help map each resource with the service that handles it.
  155. .. code-block:: python
  156. # Key Pair
  157. kp = provider.security.key_pairs.get('keypair ID')
  158. kp_list = provider.security.key_pairs.find(name='cloudbridge-intro')
  159. kp = kp_list[0]
  160. # Network
  161. net = provider.networking.networks.get('network ID')
  162. net_list = provider.networking.networks.find(name='my-network')
  163. net_list = provider.networking.networks.find(label='my-network')
  164. net = net_list[0]
  165. # Subnet
  166. sn = provider.networking.subnets.get('subnet ID')
  167. # Unknown network
  168. sn_list = provider.networking.subnets.find(name='my-subnet')
  169. sn_list = provider.networking.subnets.find(label='my-subnet')
  170. # Known network
  171. sn_list = provider.networking.subnets.find(network=net.id, name='my-subnet')
  172. sn_list = provider.networking.subnets.find(network=net.id,
  173. label='my-subnet')
  174. sn = sn_list(0)
  175. # Router
  176. router = provider.networking.routers.get('router ID')
  177. router_list = provider.networking.routers.find(name='my-router')
  178. router_list = provider.networking.routers.find(label='my-router')
  179. router = router_list[0]
  180. # Gateway
  181. gateway = net.gateways.get_or_create_inet_gateway()
  182. # Floating IPs
  183. fip = gateway.floating_ips.get('FloatingIP ID')
  184. # Find using public IP address
  185. fip_list = gateway.floating_ips.find(public_ip='IP address')
  186. # Find using name or tag
  187. fip_list = net.gateways.floating_ips.find(name='my-fip')
  188. fip_list = net.gateways.floating_ips.find(label='my-fip')
  189. fip = fip_list[0]
  190. # Firewall
  191. fw = provider.security.vm_firewalls.get('firewall ID')
  192. fw_list = provider.security.vm_firewalls.find(name='cloudbridge-intro')
  193. fw_list = provider.security.vm_firewalls.find(label='cloudbridge-intro')
  194. fw = fw_list[0]
  195. # Instance
  196. inst = provider.compute.instances.get('instance ID')
  197. inst_list = provider.compute.instances.list(name='cloudbridge-intro')
  198. inst_list = provider.compute.instances.list(label='cloudbridge-intro')
  199. inst = inst_list[0]
  200. Cleanup
  201. -------
  202. To wrap things up, let's clean up all the resources we have created
  203. .. code-block:: python
  204. from cloudbridge.cloud.interfaces import InstanceState
  205. inst.delete()
  206. inst.wait_for([InstanceState.DELETED, InstanceState.UNKNOWN],
  207. terminal_states=[InstanceState.ERROR]) # Blocking call
  208. fip.delete()
  209. fw.delete()
  210. kp.delete()
  211. os.remove('cloudbridge_intro.pem')
  212. router.detach_gateway(gateway)
  213. router.detach_subnet(sn)
  214. gateway.delete()
  215. router.delete()
  216. sn.delete()
  217. net.delete()
  218. And that's it - a full circle in a few lines of code. You can now try
  219. the same with a different provider. All you will need to change is the
  220. cloud-specific data, namely the provider setup and the image ID.