provider.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. """
  2. Provider implementation based on boto library for AWS-compatible clouds.
  3. """
  4. import os
  5. import boto
  6. from boto.ec2.regioninfo import RegionInfo
  7. try:
  8. # These are installed only for the case of a dev instance
  9. from httpretty import HTTPretty
  10. from moto.ec2 import mock_ec2
  11. from moto.s3 import mock_s3
  12. except ImportError:
  13. # TODO: Once library logging is configured, change this
  14. print("[aws provider] moto library not available!")
  15. from cloudbridge.cloud.base import BaseCloudProvider
  16. from cloudbridge.cloud.interfaces import TestMockHelperMixin
  17. from .services import AWSBlockStoreService
  18. from .services import AWSComputeService
  19. from .services import AWSNetworkService
  20. from .services import AWSObjectStoreService
  21. from .services import AWSSecurityService
  22. class AWSCloudProvider(BaseCloudProvider):
  23. PROVIDER_ID = 'aws'
  24. def __init__(self, config):
  25. super(AWSCloudProvider, self).__init__(config)
  26. self.cloud_type = 'aws'
  27. # Initialize cloud connection fields
  28. self.a_key = self._get_config_value(
  29. 'aws_access_key', os.environ.get('AWS_ACCESS_KEY', None))
  30. self.s_key = self._get_config_value(
  31. 'aws_secret_key', os.environ.get('AWS_SECRET_KEY', None))
  32. # EC2 connection fields
  33. self.ec2_is_secure = self._get_config_value('ec2_is_secure', True)
  34. self.region_name = self._get_config_value(
  35. 'ec2_region_name', 'us-east-1')
  36. self.region_endpoint = self._get_config_value(
  37. 'ec2_region_endpoint', 'ec2.us-east-1.amazonaws.com')
  38. self.ec2_port = self._get_config_value('ec2_port', None)
  39. self.ec2_conn_path = self._get_config_value('ec2_conn_path', '/')
  40. self.ec2_validate_certs = self._get_config_value(
  41. 'ec2_validate_certs', False)
  42. # S3 connection fields
  43. self.s3_is_secure = self._get_config_value('s3_is_secure', True)
  44. self.s3_host = self._get_config_value('s3_host', 's3.amazonaws.com')
  45. self.s3_port = self._get_config_value('s3_port', None)
  46. self.s3_conn_path = self._get_config_value('s3_conn_path', '/')
  47. self.s3_validate_certs = self._get_config_value(
  48. 's3_validate_certs', False)
  49. # service connections, lazily initialized
  50. self._ec2_conn = None
  51. self._vpc_conn = None
  52. self._s3_conn = None
  53. # Initialize provider services
  54. self._compute = AWSComputeService(self)
  55. self._network = AWSNetworkService(self)
  56. self._security = AWSSecurityService(self)
  57. self._block_store = AWSBlockStoreService(self)
  58. self._object_store = AWSObjectStoreService(self)
  59. @property
  60. def ec2_conn(self):
  61. if not self._ec2_conn:
  62. self._ec2_conn = self._connect_ec2()
  63. return self._ec2_conn
  64. @property
  65. def vpc_conn(self):
  66. if not self._vpc_conn:
  67. self._vpc_conn = self._connect_vpc()
  68. return self._vpc_conn
  69. @property
  70. def s3_conn(self):
  71. if not self._s3_conn:
  72. self._s3_conn = self._connect_s3()
  73. return self._s3_conn
  74. @property
  75. def compute(self):
  76. return self._compute
  77. @property
  78. def network(self):
  79. return self._network
  80. @property
  81. def security(self):
  82. return self._security
  83. @property
  84. def block_store(self):
  85. return self._block_store
  86. @property
  87. def object_store(self):
  88. return self._object_store
  89. def _connect_ec2(self):
  90. """
  91. Get a boto ec2 connection object.
  92. """
  93. r = RegionInfo(name=self.region_name, endpoint=self.region_endpoint)
  94. return self._conect_ec2_region(r)
  95. def _conect_ec2_region(self, region):
  96. ec2_conn = boto.connect_ec2(
  97. aws_access_key_id=self.a_key,
  98. aws_secret_access_key=self.s_key,
  99. # api_version is needed for availability
  100. # zone support for EC2
  101. api_version='2012-06-01' if self.cloud_type == 'aws' else None,
  102. is_secure=self.ec2_is_secure,
  103. region=region,
  104. port=self.ec2_port,
  105. path=self.ec2_conn_path,
  106. validate_certs=self.ec2_validate_certs,
  107. debug=2 if self.config.debug_mode else 0)
  108. return ec2_conn
  109. def _connect_vpc(self):
  110. """
  111. Get a boto VPC connection object.
  112. """
  113. r = RegionInfo(name=self.region_name, endpoint=self.region_endpoint)
  114. vpc_conn = boto.connect_vpc(
  115. aws_access_key_id=self.a_key,
  116. aws_secret_access_key=self.s_key,
  117. # api_version is needed for availability
  118. # zone support for EC2
  119. api_version='2012-06-01' if self.cloud_type == 'aws' else None,
  120. is_secure=self.ec2_is_secure,
  121. region=r,
  122. port=self.ec2_port,
  123. path=self.ec2_conn_path,
  124. validate_certs=self.ec2_validate_certs,
  125. debug=2 if self.config.debug_mode else 0)
  126. return vpc_conn
  127. def _connect_s3(self):
  128. """
  129. Get a boto S3 connection object.
  130. """
  131. s3_conn = boto.connect_s3(aws_access_key_id=self.a_key,
  132. aws_secret_access_key=self.s_key,
  133. is_secure=self.s3_is_secure,
  134. port=self.s3_port,
  135. host=self.s3_host,
  136. path=self.s3_conn_path,
  137. validate_certs=self.s3_validate_certs,
  138. debug=2 if self.config.debug_mode else 0)
  139. return s3_conn
  140. class MockAWSCloudProvider(AWSCloudProvider, TestMockHelperMixin):
  141. def __init__(self, config):
  142. super(MockAWSCloudProvider, self).__init__(config)
  143. def setUpMock(self):
  144. """
  145. Let Moto take over all socket communications
  146. """
  147. self.ec2mock = mock_ec2()
  148. self.ec2mock.start()
  149. self.s3mock = mock_s3()
  150. self.s3mock.start()
  151. HTTPretty.register_uri(
  152. method="GET",
  153. uri="https://cloudbridgelib.s3.amazonaws.com/aws_instance_data.json",
  154. body="""
  155. [
  156. {
  157. "family": "General Purpose",
  158. "enhanced_networking": false,
  159. "vCPU": 1,
  160. "generation": "previous",
  161. "ebs_iops": 0,
  162. "network_performance": "Low",
  163. "ebs_throughput": 0,
  164. "vpc": {
  165. "ips_per_eni": 4,
  166. "max_enis": 2
  167. },
  168. "arch": [
  169. "i386",
  170. "x86_64"
  171. ],
  172. "linux_virtualization_types": [],
  173. "ebs_optimized": false,
  174. "storage": {
  175. "ssd": false,
  176. "devices": 1,
  177. "size": 160
  178. },
  179. "max_bandwidth": 0,
  180. "instance_type": "t1.micro",
  181. "ECU": 1.0,
  182. "memory": 1.7
  183. }
  184. ]
  185. """
  186. )
  187. def tearDownMock(self):
  188. """
  189. Stop Moto intercepting all socket communications
  190. """
  191. self.s3mock.stop()
  192. self.ec2mock.stop()