services.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. """
  2. Services implemented by the AWS provider.
  3. """
  4. import string
  5. from boto.ec2.blockdevicemapping import BlockDeviceMapping
  6. from boto.ec2.blockdevicemapping import BlockDeviceType
  7. from boto.exception import EC2ResponseError
  8. import requests
  9. from cloudbridge.cloud.base.resources import BaseLaunchConfig
  10. from cloudbridge.cloud.base.resources import ClientPagedResultList
  11. from cloudbridge.cloud.base.resources import ServerPagedResultList
  12. from cloudbridge.cloud.base.services import BaseBlockStoreService
  13. from cloudbridge.cloud.base.services import BaseComputeService
  14. from cloudbridge.cloud.base.services import BaseImageService
  15. from cloudbridge.cloud.base.services import BaseInstanceService
  16. from cloudbridge.cloud.base.services import BaseInstanceTypesService
  17. from cloudbridge.cloud.base.services import BaseKeyPairService
  18. from cloudbridge.cloud.base.services import BaseNetworkService
  19. from cloudbridge.cloud.base.services import BaseObjectStoreService
  20. from cloudbridge.cloud.base.services import BaseRegionService
  21. from cloudbridge.cloud.base.services import BaseSecurityGroupService
  22. from cloudbridge.cloud.base.services import BaseSecurityService
  23. from cloudbridge.cloud.base.services import BaseSnapshotService
  24. from cloudbridge.cloud.base.services import BaseSubnetService
  25. from cloudbridge.cloud.base.services import BaseVolumeService
  26. from cloudbridge.cloud.interfaces.resources \
  27. import InvalidConfigurationException
  28. from cloudbridge.cloud.interfaces.resources import InstanceType
  29. from cloudbridge.cloud.interfaces.resources import KeyPair
  30. from cloudbridge.cloud.interfaces.resources import MachineImage
  31. # from cloudbridge.cloud.interfaces.resources import Network
  32. from cloudbridge.cloud.interfaces.resources import PlacementZone
  33. from cloudbridge.cloud.interfaces.resources import SecurityGroup
  34. from cloudbridge.cloud.interfaces.resources import Snapshot
  35. from cloudbridge.cloud.interfaces.resources import Volume
  36. from .resources import AWSBucket
  37. from .resources import AWSInstance
  38. from .resources import AWSInstanceType
  39. from .resources import AWSKeyPair
  40. from .resources import AWSMachineImage
  41. from .resources import AWSNetwork
  42. from .resources import AWSRegion
  43. from .resources import AWSSecurityGroup
  44. from .resources import AWSSnapshot
  45. from .resources import AWSSubnet
  46. from .resources import AWSVolume
  47. class AWSSecurityService(BaseSecurityService):
  48. def __init__(self, provider):
  49. super(AWSSecurityService, self).__init__(provider)
  50. # Initialize provider services
  51. self._key_pairs = AWSKeyPairService(provider)
  52. self._security_groups = AWSSecurityGroupService(provider)
  53. @property
  54. def key_pairs(self):
  55. """
  56. Provides access to key pairs for this provider.
  57. :rtype: ``object`` of :class:`.KeyPairService`
  58. :return: a KeyPairService object
  59. """
  60. return self._key_pairs
  61. @property
  62. def security_groups(self):
  63. """
  64. Provides access to security groups for this provider.
  65. :rtype: ``object`` of :class:`.SecurityGroupService`
  66. :return: a SecurityGroupService object
  67. """
  68. return self._security_groups
  69. class AWSKeyPairService(BaseKeyPairService):
  70. def __init__(self, provider):
  71. super(AWSKeyPairService, self).__init__(provider)
  72. def get(self, key_pair_id):
  73. """
  74. Returns a KeyPair given its ID.
  75. """
  76. try:
  77. kps = self.provider.ec2_conn.get_all_key_pairs(
  78. keynames=[key_pair_id])
  79. return AWSKeyPair(self.provider, kps[0])
  80. except EC2ResponseError:
  81. return None
  82. def list(self, limit=None, marker=None):
  83. """
  84. List all key pairs associated with this account.
  85. :rtype: ``list`` of :class:`.KeyPair`
  86. :return: list of KeyPair objects
  87. """
  88. key_pairs = [AWSKeyPair(self.provider, kp)
  89. for kp in self.provider.ec2_conn.get_all_key_pairs()]
  90. return ClientPagedResultList(self.provider, key_pairs,
  91. limit=limit, marker=marker)
  92. def find(self, name, limit=None, marker=None):
  93. """
  94. Searches for a key pair by a given list of attributes.
  95. """
  96. try:
  97. key_pairs = [
  98. AWSKeyPair(self.provider, kp) for kp in
  99. self.provider.ec2_conn.get_all_key_pairs(keynames=[name])]
  100. except EC2ResponseError:
  101. key_pairs = []
  102. return ClientPagedResultList(self.provider, key_pairs,
  103. limit=limit, marker=marker)
  104. def create(self, name):
  105. """
  106. Create a new key pair or raise an exception if one already exists.
  107. :type name: str
  108. :param name: The name of the key pair to be created.
  109. :rtype: ``object`` of :class:`.KeyPair`
  110. :return: A key pair instance or ``None`` if one was not be created.
  111. """
  112. kp = self.provider.ec2_conn.create_key_pair(name)
  113. if kp:
  114. return AWSKeyPair(self.provider, kp)
  115. return None
  116. class AWSSecurityGroupService(BaseSecurityGroupService):
  117. def __init__(self, provider):
  118. super(AWSSecurityGroupService, self).__init__(provider)
  119. def get(self, sg_id):
  120. """
  121. Returns a SecurityGroup given its id.
  122. """
  123. try:
  124. sgs = self.provider.ec2_conn.get_all_security_groups(
  125. group_ids=[sg_id])
  126. return AWSSecurityGroup(self.provider, sgs[0]) if sgs else None
  127. except EC2ResponseError:
  128. return None
  129. def list(self, limit=None, marker=None):
  130. """
  131. List all security groups associated with this account.
  132. :rtype: ``list`` of :class:`.SecurityGroup`
  133. :return: list of SecurityGroup objects
  134. """
  135. sgs = [AWSSecurityGroup(self.provider, sg)
  136. for sg in self.provider.ec2_conn.get_all_security_groups()]
  137. return ClientPagedResultList(self.provider, sgs,
  138. limit=limit, marker=marker)
  139. def create(self, name, description):
  140. """
  141. Create a new SecurityGroup.
  142. :type name: str
  143. :param name: The name of the new security group.
  144. :type description: str
  145. :param description: The description of the new security group.
  146. :rtype: ``object`` of :class:`.SecurityGroup`
  147. :return: A SecurityGroup instance or ``None`` if one was not created.
  148. """
  149. sg = self.provider.ec2_conn.create_security_group(name, description)
  150. if sg:
  151. return AWSSecurityGroup(self.provider, sg)
  152. return None
  153. def find(self, name, limit=None, marker=None):
  154. """
  155. Get all security groups associated with your account.
  156. """
  157. try:
  158. security_groups = self.provider.ec2_conn.get_all_security_groups(
  159. groupnames=[name])
  160. except EC2ResponseError:
  161. security_groups = []
  162. return [AWSSecurityGroup(self.provider, sg) for sg in security_groups]
  163. def delete(self, group_id):
  164. """
  165. Delete an existing SecurityGroup.
  166. :type group_id: str
  167. :param group_id: The security group ID to be deleted.
  168. :rtype: ``bool``
  169. :return: ``True`` if the security group does not exist, ``False``
  170. otherwise. Note that this implies that the group may not have
  171. been deleted by this method but instead has not existed in
  172. the first place.
  173. """
  174. try:
  175. for sg in self.provider.ec2_conn.get_all_security_groups(
  176. group_ids=[group_id]):
  177. try:
  178. sg.delete()
  179. except EC2ResponseError:
  180. return False
  181. except EC2ResponseError:
  182. pass
  183. return True
  184. class AWSBlockStoreService(BaseBlockStoreService):
  185. def __init__(self, provider):
  186. super(AWSBlockStoreService, self).__init__(provider)
  187. # Initialize provider services
  188. self._volume_svc = AWSVolumeService(self.provider)
  189. self._snapshot_svc = AWSSnapshotService(self.provider)
  190. @property
  191. def volumes(self):
  192. return self._volume_svc
  193. @property
  194. def snapshots(self):
  195. return self._snapshot_svc
  196. class AWSVolumeService(BaseVolumeService):
  197. def __init__(self, provider):
  198. super(AWSVolumeService, self).__init__(provider)
  199. def get(self, volume_id):
  200. """
  201. Returns a volume given its id.
  202. """
  203. vols = self.provider.ec2_conn.get_all_volumes(volume_ids=[volume_id])
  204. return AWSVolume(self.provider, vols[0]) if vols else None
  205. def find(self, name, limit=None, marker=None):
  206. """
  207. Searches for a volume by a given list of attributes.
  208. """
  209. filtr = {'tag:Name': name}
  210. aws_vols = self.provider.ec2_conn.get_all_volumes(filters=filtr)
  211. cb_vols = [AWSVolume(self.provider, vol) for vol in aws_vols]
  212. return ClientPagedResultList(self.provider, cb_vols,
  213. limit=limit, marker=marker)
  214. def list(self, limit=None, marker=None):
  215. """
  216. List all volumes.
  217. """
  218. aws_vols = self.provider.ec2_conn.get_all_volumes()
  219. cb_vols = [AWSVolume(self.provider, vol) for vol in aws_vols]
  220. return ClientPagedResultList(self.provider, cb_vols,
  221. limit=limit, marker=marker)
  222. def create(self, name, size, zone, snapshot=None, description=None):
  223. """
  224. Creates a new volume.
  225. """
  226. zone_id = zone.id if isinstance(zone, PlacementZone) else zone
  227. snapshot_id = snapshot.id if isinstance(
  228. snapshot, AWSSnapshot) and snapshot else snapshot
  229. ec2_vol = self.provider.ec2_conn.create_volume(
  230. size,
  231. zone_id,
  232. snapshot=snapshot_id)
  233. cb_vol = AWSVolume(self.provider, ec2_vol)
  234. cb_vol.name = name
  235. if description:
  236. cb_vol.description = description
  237. return cb_vol
  238. class AWSSnapshotService(BaseSnapshotService):
  239. def __init__(self, provider):
  240. super(AWSSnapshotService, self).__init__(provider)
  241. def get(self, snapshot_id):
  242. """
  243. Returns a snapshot given its id.
  244. """
  245. try:
  246. snaps = self.provider.ec2_conn.get_all_snapshots(
  247. snapshot_ids=[snapshot_id])
  248. except EC2ResponseError as ec2e:
  249. if ec2e.code == 'InvalidSnapshot.NotFound':
  250. return None
  251. raise ec2e
  252. return AWSSnapshot(self.provider, snaps[0]) if snaps else None
  253. def find(self, name, limit=None, marker=None):
  254. """
  255. Searches for a snapshot by a given list of attributes.
  256. """
  257. filtr = {'tag-value': name}
  258. snaps = [AWSSnapshot(self.provider, snap) for snap in
  259. self.provider.ec2_conn.get_all_snapshots(filters=filtr)]
  260. return ClientPagedResultList(self.provider, snaps,
  261. limit=limit, marker=marker)
  262. def list(self, limit=None, marker=None):
  263. """
  264. List all snapshots.
  265. """
  266. snaps = [AWSSnapshot(self.provider, snap)
  267. for snap in self.provider.ec2_conn.get_all_snapshots(
  268. owner='self')]
  269. return ClientPagedResultList(self.provider, snaps,
  270. limit=limit, marker=marker)
  271. def create(self, name, volume, description=None):
  272. """
  273. Creates a new snapshot of a given volume.
  274. """
  275. volume_id = volume.id if isinstance(volume, AWSVolume) else volume
  276. ec2_snap = self.provider.ec2_conn.create_snapshot(
  277. volume_id,
  278. description=description)
  279. cb_snap = AWSSnapshot(self.provider, ec2_snap)
  280. cb_snap.name = name
  281. if description:
  282. cb_snap.description = description
  283. return cb_snap
  284. class AWSObjectStoreService(BaseObjectStoreService):
  285. def __init__(self, provider):
  286. super(AWSObjectStoreService, self).__init__(provider)
  287. def get(self, bucket_id):
  288. """
  289. Returns a bucket given its ID. Returns ``None`` if the bucket
  290. does not exist.
  291. """
  292. bucket = self.provider.s3_conn.lookup(bucket_id)
  293. if bucket:
  294. return AWSBucket(self.provider, bucket)
  295. else:
  296. return None
  297. def find(self, name, limit=None, marker=None):
  298. """
  299. Searches for a bucket by a given list of attributes.
  300. """
  301. buckets = [AWSBucket(self.provider, bucket)
  302. for bucket in self.provider.s3_conn.get_all_buckets()
  303. if name in bucket.name]
  304. return ClientPagedResultList(self.provider, buckets,
  305. limit=limit, marker=marker)
  306. def list(self, limit=None, marker=None):
  307. """
  308. List all containers.
  309. """
  310. buckets = [AWSBucket(self.provider, bucket)
  311. for bucket in self.provider.s3_conn.get_all_buckets()]
  312. return ClientPagedResultList(self.provider, buckets,
  313. limit=limit, marker=marker)
  314. def create(self, name, location=None):
  315. """
  316. Create a new bucket.
  317. """
  318. bucket = self.provider.s3_conn.create_bucket(
  319. name,
  320. location=location if location else '')
  321. return AWSBucket(self.provider, bucket)
  322. class AWSImageService(BaseImageService):
  323. def __init__(self, provider):
  324. super(AWSImageService, self).__init__(provider)
  325. def get(self, image_id):
  326. """
  327. Returns an Image given its id
  328. """
  329. try:
  330. image = self.provider.ec2_conn.get_image(image_id)
  331. if image:
  332. return AWSMachineImage(self.provider, image)
  333. except EC2ResponseError:
  334. pass
  335. return None
  336. def find(self, name, limit=None, marker=None):
  337. """
  338. Searches for an image by a given list of attributes
  339. """
  340. filters = {'name': name}
  341. images = [AWSMachineImage(self.provider, image) for image in
  342. self.provider.ec2_conn.get_all_images(filters=filters)]
  343. return ClientPagedResultList(self.provider, images,
  344. limit=limit, marker=marker)
  345. def list(self, limit=None, marker=None):
  346. """
  347. List all images.
  348. """
  349. images = [AWSMachineImage(self.provider, image)
  350. for image in self.provider.ec2_conn.get_all_images()]
  351. return ClientPagedResultList(self.provider, images,
  352. limit=limit, marker=marker)
  353. class AWSComputeService(BaseComputeService):
  354. def __init__(self, provider):
  355. super(AWSComputeService, self).__init__(provider)
  356. self._instance_type_svc = AWSInstanceTypesService(self.provider)
  357. self._instance_svc = AWSInstanceService(self.provider)
  358. self._region_svc = AWSRegionService(self.provider)
  359. self._images_svc = AWSImageService(self.provider)
  360. @property
  361. def images(self):
  362. return self._images_svc
  363. @property
  364. def instance_types(self):
  365. return self._instance_type_svc
  366. @property
  367. def instances(self):
  368. return self._instance_svc
  369. @property
  370. def regions(self):
  371. return self._region_svc
  372. class AWSInstanceService(BaseInstanceService):
  373. def __init__(self, provider):
  374. super(AWSInstanceService, self).__init__(provider)
  375. def create(self, name, image, instance_type, zone=None,
  376. key_pair=None, security_groups=None, user_data=None,
  377. launch_config=None,
  378. **kwargs):
  379. """
  380. Creates a new virtual machine instance.
  381. """
  382. image_id = image.id if isinstance(image, MachineImage) else image
  383. instance_size = instance_type.id if \
  384. isinstance(instance_type, InstanceType) else instance_type
  385. zone_id = zone.id if isinstance(zone, PlacementZone) else zone
  386. key_pair_name = key_pair.name if isinstance(
  387. key_pair,
  388. KeyPair) else key_pair
  389. if security_groups:
  390. if isinstance(security_groups, list) and \
  391. isinstance(security_groups[0], SecurityGroup):
  392. security_groups_list = [sg.name for sg in security_groups]
  393. else:
  394. security_groups_list = security_groups
  395. else:
  396. security_groups_list = None
  397. if launch_config:
  398. bdm = self._process_block_device_mappings(launch_config, zone_id)
  399. net_id = self._get_net_id(launch_config)
  400. else:
  401. bdm = net_id = None
  402. reservation = self.provider.ec2_conn.run_instances(
  403. image_id=image_id, instance_type=instance_size,
  404. min_count=1, max_count=1, placement=zone_id,
  405. key_name=key_pair_name, security_groups=security_groups_list,
  406. user_data=user_data, block_device_map=bdm, subnet_id=net_id)
  407. if reservation:
  408. instance = AWSInstance(self.provider, reservation.instances[0])
  409. instance.name = name
  410. return instance
  411. def _process_block_device_mappings(self, launch_config, zone=None):
  412. """
  413. Processes block device mapping information
  414. and returns a Boto BlockDeviceMapping object. If new volumes
  415. are requested (source is None and destination is VOLUME), they will be
  416. created and the relevant volume ids included in the mapping.
  417. """
  418. bdm = BlockDeviceMapping()
  419. # Assign letters from f onwards
  420. # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/device_naming.html
  421. next_letter = iter(list(string.ascii_lowercase[6:]))
  422. # assign ephemeral devices from 0 onwards
  423. ephemeral_counter = 0
  424. for device in launch_config.block_devices:
  425. bd_type = BlockDeviceType()
  426. if device.is_volume:
  427. if device.is_root:
  428. bdm['/dev/sda1'] = bd_type
  429. else:
  430. bdm['sd' + next(next_letter)] = bd_type
  431. if isinstance(device.source, Snapshot):
  432. bd_type.snapshot_id = device.source.id
  433. elif isinstance(device.source, Volume):
  434. bd_type.volume_id = device.source.id
  435. elif isinstance(device.source, MachineImage):
  436. # Not supported
  437. pass
  438. else:
  439. # source is None, but destination is volume, therefore
  440. # create a blank volume. If the Zone is None, this
  441. # could fail since the volume and instance may be created
  442. # in two different zones.
  443. if not zone:
  444. raise InvalidConfigurationException(
  445. "A zone must be specified when launching with a"
  446. " new blank volume block device mapping.")
  447. new_vol = self.provider.block_store.volumes.create(
  448. '',
  449. device.size,
  450. zone)
  451. bd_type.volume_id = new_vol.id
  452. bd_type.delete_on_terminate = device.delete_on_terminate
  453. if device.size:
  454. bd_type.size = device.size
  455. else: # device is ephemeral
  456. bd_type.ephemeral_name = 'ephemeral%s' % ephemeral_counter
  457. return bdm
  458. def _get_net_id(self, launch_config):
  459. return (launch_config.network_interfaces[0]
  460. if len(launch_config.network_interfaces) > 0
  461. else None)
  462. def create_launch_config(self):
  463. return BaseLaunchConfig(self.provider)
  464. def get(self, instance_id):
  465. """
  466. Returns an instance given its id. Returns None
  467. if the object does not exist.
  468. """
  469. reservation = self.provider.ec2_conn.get_all_reservations(
  470. instance_ids=[instance_id])
  471. if reservation:
  472. return AWSInstance(self.provider, reservation[0].instances[0])
  473. else:
  474. return None
  475. def find(self, name, limit=None, marker=None):
  476. """
  477. Searches for an instance by a given list of attributes.
  478. :rtype: ``object`` of :class:`.Instance`
  479. :return: an Instance object
  480. """
  481. filtr = {'tag:Name': name}
  482. reservations = self.provider.ec2_conn.get_all_reservations(
  483. filters=filtr,
  484. max_results=limit,
  485. next_token=marker)
  486. instances = [AWSInstance(self.provider, inst)
  487. for res in reservations
  488. for inst in res.instances]
  489. return ServerPagedResultList(reservations.is_truncated,
  490. reservations.next_token,
  491. False, data=instances)
  492. def list(self, limit=None, marker=None):
  493. """
  494. List all instances.
  495. """
  496. reservations = self.provider.ec2_conn.get_all_reservations(
  497. max_results=limit,
  498. next_token=marker)
  499. instances = [AWSInstance(self.provider, inst)
  500. for res in reservations
  501. for inst in res.instances]
  502. return ServerPagedResultList(reservations.is_truncated,
  503. reservations.next_token,
  504. False, data=instances)
  505. AWS_INSTANCE_DATA_DEFAULT_URL = "https://cloudbridgelib.s3.amazonaws.com/" \
  506. "aws_instance_data.json"
  507. class AWSInstanceTypesService(BaseInstanceTypesService):
  508. def __init__(self, provider):
  509. super(AWSInstanceTypesService, self).__init__(provider)
  510. @property
  511. def instance_data(self):
  512. """
  513. TODO: Needs a caching function with timeout
  514. """
  515. r = requests.get(self.provider.config.get(
  516. "aws_instance_info_url", AWS_INSTANCE_DATA_DEFAULT_URL))
  517. return r.json()
  518. def list(self, limit=None, marker=None):
  519. inst_types = [AWSInstanceType(self.provider, inst_type)
  520. for inst_type in self.instance_data]
  521. return ClientPagedResultList(self.provider, inst_types,
  522. limit=limit, marker=marker)
  523. class AWSRegionService(BaseRegionService):
  524. def __init__(self, provider):
  525. super(AWSRegionService, self).__init__(provider)
  526. def get(self, region_id):
  527. region = self.provider.ec2_conn.get_all_regions(
  528. region_names=[region_id])
  529. if region:
  530. return AWSRegion(self.provider, region[0])
  531. else:
  532. return None
  533. def list(self, limit=None, marker=None):
  534. regions = [AWSRegion(self.provider, region)
  535. for region in self.provider.ec2_conn.get_all_regions()]
  536. return ClientPagedResultList(self.provider, regions,
  537. limit=limit, marker=marker)
  538. @property
  539. def current(self):
  540. return self.get(self._provider.region_name)
  541. class AWSNetworkService(BaseNetworkService):
  542. def __init__(self, provider):
  543. super(AWSNetworkService, self).__init__(provider)
  544. self._subnet_svc = AWSSubnetService(self.provider)
  545. def get(self, network_id):
  546. network = self.provider.vpc_conn.get_all_vpcs(vpc_ids=[network_id])
  547. if network:
  548. return AWSNetwork(self.provider, network[0])
  549. return None
  550. def list(self, limit=None, marker=None):
  551. networks = [AWSNetwork(self.provider, network)
  552. for network in self.provider.vpc_conn.get_all_vpcs()]
  553. return ClientPagedResultList(self.provider, networks,
  554. limit=limit, marker=marker)
  555. def create(self, name=None):
  556. # AWS requried CIDR block to be specified when creating a network
  557. # so set a default one and use the largest possible netmask.
  558. default_cidr = '10.0.0.0/16'
  559. network = self.provider.vpc_conn.create_vpc(cidr_block=default_cidr)
  560. cb_network = AWSNetwork(self.provider, network)
  561. if name:
  562. cb_network.name = name
  563. return cb_network
  564. @property
  565. def subnets(self):
  566. return self._subnet_svc
  567. class AWSSubnetService(BaseSubnetService):
  568. def __init__(self, provider):
  569. super(AWSSubnetService, self).__init__(provider)
  570. def get(self, subnet_id):
  571. subnets = self.provider.vpc_conn.get_all_subnets([subnet_id])
  572. if subnets:
  573. return AWSSubnet(self.provider, subnets[0])
  574. return None
  575. def list(self, network=None):
  576. fltr = None
  577. if network:
  578. network_id = (network.id if isinstance(network, AWSNetwork) else
  579. network)
  580. fltr = {'vpc-id': network_id}
  581. subnets = self.provider.vpc_conn.get_all_subnets(filters=fltr)
  582. return [AWSSubnet(self.provider, subnet) for subnet in subnets]
  583. def create(self, network, cidr_block, name=None):
  584. network_id = network.id if isinstance(network, AWSNetwork) else network
  585. subnet = self.provider.vpc_conn.create_subnet(network_id, cidr_block)
  586. cb_subnet = AWSSubnet(self.provider, subnet)
  587. if name:
  588. cb_subnet.name = name
  589. return cb_subnet
  590. def delete(self, subnet):
  591. subnet_id = subnet.id if isinstance(subnet, AWSSubnet) else subnet
  592. return self.provider.vpc_conn.delete_subnet(subnet_id=subnet_id)