services.py 25 KB

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