CHANGELOG.rst 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. 4.4.2 - September 18, 2026 (sha bd6fac9aeaac5c3cb6005d0be77319e9b0cf7fb8)
  2. -------------------------------------------------------------------------
  3. ## Fixes
  4. * **GCP common-metadata writes now survive concurrent writers.** Labels for
  5. networks, routers, firewalls and key pairs live in the project-wide common
  6. instance metadata, which every write re-uploads under an optimistic
  7. fingerprint. Two things went wrong under parallel use. The retry for a
  8. stale fingerprint only recognised the conflict as an HTTP error, but a
  9. concurrent writer produces it differently: the upload is accepted and the
  10. resulting *operation* completes with ``CONDITION_NOT_MET``, which
  11. ``wait_for_operation`` raised as a plain ``Exception`` the retry ignored.
  12. And - measured in the live suite - GCP accepts several writes against the
  13. same fingerprint while an earlier one is still pending, and a later one can
  14. complete as ``DONE`` with its change absent from the document: 11 of 56
  15. writes in one run. ``wait_for_operation`` now raises ``GCPOperationError``
  16. (a ``ProviderInternalException`` carrying the operation's error payload and
  17. ``codes``); a metadata write is only finished once its change reads back,
  18. and is redone on fresh metadata otherwise (``MetadataWriteNotApplied`` once
  19. the retries are exhausted); a write that changes nothing is not sent at
  20. all; ``add_metadata_item`` checks for an existing key itself and raises
  21. ``DuplicateResourceException``, so a retry never appends a second copy;
  22. and ``remove_metadata_item`` returns ``False`` when there was nothing to
  23. remove, as its callers always assumed.
  24. * **A config value of ``False`` or ``0`` is now honored instead of being
  25. replaced by the default.** ``_get_config_value`` treated every falsy value
  26. as "not configured", so ``s3_validate_certs: False`` (and
  27. ``ec2_validate_certs``) silently left certificate verification switched on,
  28. and a ``0`` for any numeric option was quietly swapped for its default.
  29. Only ``None`` and the empty string now count as unset - what an absent
  30. value looks like coming from YAML, a blank environment variable or a blank
  31. ini option. A value that was previously ignored for being falsy now takes
  32. effect; a misconfigured ``0`` (say for ``multipart_max_concurrency``)
  33. therefore errors where it used to be masked.
  34. * **Explicitly configured OpenStack credentials take precedence over the
  35. ``OS_*`` environment.** The provider filled in every credential field from
  36. the environment whenever the config did not name it, and Keystone password
  37. authentication was preferred when both a password and an application
  38. credential were present. So a provider configured with only an application
  39. credential, running in a process that carried ``OS_USERNAME`` and
  40. ``OS_PASSWORD``, authenticated as that ambient identity rather than the
  41. credential it was given. The two credential sets are now resolved
  42. separately: the environment only completes the set the config names (a
  43. configured ``os_username`` with the password in ``OS_PASSWORD`` still
  44. works), and is consulted for both only when neither is configured.
  45. ## Build and CI
  46. * **``CB_TEST_TRACE`` trace files are now printed even when the suite
  47. fails.** They were emitted by a command placed after pytest in tox's
  48. ``commands``, and tox stops at the first failing command - so the trace
  49. was lost for exactly the runs worth reading. It now runs from
  50. ``commands_post``.
  51. ## Pull Requests
  52. * Retry GCP metadata writes on an operation-level fingerprint conflict by @nuwang in https://github.com/CloudVE/cloudbridge/pull/349
  53. * Honor falsy config values, and configured OpenStack credentials over the environment by @nuwang in https://github.com/CloudVE/cloudbridge/pull/348
  54. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.4.1...v4.4.2
  55. 4.4.1 - August 21, 2026 (sha 093ef669598d9f324be28d400a851396739cf1d8)
  56. ----------------------------------------------------------------------
  57. ## Fixes
  58. * **``cryptography`` is now declared as a dependency.**
  59. ``cloudbridge.base.helpers`` imports it at module scope, and almost
  60. everything imports that module, so it was required for the library to
  61. import at all - but it appeared nowhere in ``pyproject.toml``. A plain
  62. ``pip install cloudbridge`` therefore produced an installation that raised
  63. ``ModuleNotFoundError: No module named 'cryptography'`` on
  64. ``import cloudbridge.base.resources``, as did ``cloudbridge[aws]``, since
  65. boto3 does not depend on it either. Installations that worked did so
  66. because something else in the environment happened to provide it. This
  67. affected 4.4.0 and earlier; the import has been there since 2019.
  68. ## Build and CI
  69. * **A new ``Bare install imports`` job builds the wheel, installs it with no
  70. extras, and imports the modules a user reaches for first.** Every test
  71. environment installs the ``[dev]`` extra, which pulls in the provider SDKs
  72. and their transitive dependencies, so the suite passed against a package
  73. whose declared dependencies were incomplete. The job runs from outside the
  74. repository, so the source tree cannot satisfy the import in place of the
  75. installed wheel.
  76. ## Pull Requests
  77. * Declare cryptography as a dependency, and guard bare installs by @nuwang in https://github.com/CloudVE/cloudbridge/pull/347
  78. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.4.0...v4.4.1
  79. 4.4.0 - August 21, 2026 (sha 55d925d56eaad247b960ad00e636253637192549)
  80. ----------------------------------------------------------------------
  81. ## Release highlights
  82. ``BucketObject.iter_content`` becomes a real chunked stream on every provider:
  83. it takes a ``chunk_size``, yields chunks sized by that rather than by the
  84. content, and no longer materialises a whole object in memory anywhere.
  85. Separately, two pathological patterns in AWS listing are removed - an image
  86. search that scanned the region's entire public catalogue, and a paginated
  87. call that used the caller's result limit as its transport page size.
  88. ## Enhancements
  89. * **``iter_content`` and ``save_content`` accept a ``chunk_size``.** It
  90. defaults to 1 MiB and is settable globally through the ``iter_chunk_size``
  91. provider config value or the ``CB_ITER_CHUNK_SIZE`` environment variable,
  92. alongside the existing ``CB_MULTIPART_*`` knobs. Previously the read size
  93. was hardcoded and inconsistent - 4 KiB on AWS, 64 KiB on OpenStack Swift,
  94. the service's own chunking on Azure - and callers had no way to change it.
  95. The AWS value dated from the 2017 boto2-to-boto3 migration, where a
  96. ``BucketObjIterator`` shim replaced boto2's ``Key`` (which read in 8 KiB
  97. ``BufferSize`` chunks); it was never a tuning decision. Reading an HTTP body
  98. at 1 MiB measures ~12x cheaper per byte than at 4 KiB, and the curve is flat
  99. from 1 MiB up, so larger defaults would only cost memory. Note that
  100. ``save_content`` was never affected: it copied via ``shutil.copyfileobj``,
  101. which reads in 64 KiB blocks regardless.
  102. * **New ``aws_page_size`` configuration value.** How many records to request
  103. from AWS per call while satisfying a list method, defaulting to 500. It is
  104. a transport setting, distinct from ``default_result_limit``, which bounds
  105. how many results the caller receives; the two used to be the same number.
  106. It is clamped to what the service permits for the call in hand, so a value
  107. outside those bounds is adjusted rather than rejected. AWS-specific
  108. because it only means anything where the provider walks pages itself:
  109. GCP, Azure and OpenStack each return a single page plus a continuation
  110. token and let the caller drive.
  111. ## Fixes
  112. * **The default network is created with the configured default CIDR.**
  113. ``BaseNetworkService.get_or_create_default`` passed a hardcoded
  114. ``10.0.0.0/16`` instead of ``BaseNetwork.CB_DEFAULT_IPV4RANGE``, so setting
  115. ``CB_DEFAULT_IPV4RANGE`` was silently ignored on Azure and OpenStack, which
  116. inherit the base implementation. AWS and GCP override it and were already
  117. correct.
  118. * **Azure no longer splits object content on newlines.** ``iter_content``
  119. returned an ``io.RawIOBase`` wrapper, and iterating a raw stream calls
  120. ``readline()`` - so chunks broke at ``b"\n"`` at whatever sizes the content
  121. happened to dictate, and a blob with no newline in it was buffered whole
  122. however large it was. It now yields ``chunk_size`` chunks read over a single
  123. connection.
  124. * **GCP no longer loads the entire object into memory.** ``iter_content``
  125. returned ``io.BytesIO`` wrapped around a full ``get_media().execute()``, so
  126. streaming a large object cost its full size in RAM (and, being a
  127. ``BytesIO``, also iterated by line). Content is now fetched as successive
  128. ranged reads of ``chunk_size`` bytes, keeping memory flat at one chunk.
  129. ``download_to_file`` remains the faster path for downloading to disk, as it
  130. fetches ranges in parallel.
  131. * **``save_content`` no longer requires ``iter_content`` to return a
  132. file-like object.** It copied with ``shutil.copyfileobj``, which needs a
  133. ``.read()`` that the interface never promised - only ``Iterable[bytes]``. It
  134. now writes the iterated chunks directly, so a provider returning a plain
  135. generator works.
  136. * **``AWSImageService.find`` no longer scans every public image to run its
  137. tag search.** ``find(label=...)`` issues two ``describe_images`` calls, one
  138. filtered on ``name`` and one on ``tag:Name``, and neither was scoped by
  139. ``Owners``. The ``tag:Name`` half can only ever match images in the calling
  140. account - AMI tags are not visible across accounts, so an image owned by
  141. anyone else cannot satisfy the filter however it is tagged - so omitting
  142. ``Owners`` never widened what it could find. It only made EC2 evaluate the
  143. filter against the whole regional catalogue: measured in ap-southeast-1,
  144. 10.0s unscoped against 0.1s scoped, for identical single-image results.
  145. The ``name`` half is unchanged and still searches public images, which is
  146. what most callers want; an explicit ``owners`` argument still overrides
  147. both.
  148. * **Paginated AWS calls no longer use the caller's result limit as the
  149. transport page size.** ``BotoEC2Service._get_paginated_results`` set
  150. ``PaginationConfig={'MaxItems': limit, 'PageSize': limit}``, conflating how
  151. many results the caller wants with how many the service returns per
  152. request. Against a scan that matches sparsely that walks the collection in
  153. tiny increments: the same filtered ``describe_images`` took 977.6s at a
  154. page size of 5 and 10.0s at 1000, for one result either way. ``MaxItems``
  155. still bounds what the caller receives; ``PageSize`` is now a full page,
  156. clamped to whatever bounds the service model declares for the operation
  157. (``DescribeRouteTables`` permits 100 where most permit more, several require
  158. at least 5, and falling outside them is a hard ``InvalidParameterValue``).
  159. Since ``DEFAULT_RESULT_LIMIT`` is 50, every paginated AWS call was affected,
  160. not just filtered searches.
  161. ## Backward compatibility
  162. ``chunk_size`` is optional everywhere, so existing calls keep working. The
  163. AWS return value still exposes ``read``/``close`` as before. The Azure and GCP
  164. return values are now plain generators: code that called ``.read()`` on them
  165. must iterate instead, or use ``save_content``/``download_to_file``.
  166. ## Pull Requests
  167. * Make iter_content a chunked stream with a configurable chunk size by @nuwang in https://github.com/CloudVE/cloudbridge/pull/343
  168. * Create the default network with the configured default CIDR by @nuwang in https://github.com/CloudVE/cloudbridge/pull/344
  169. * Instrument the cloud suites to find where the AWS time goes by @nuwang in https://github.com/CloudVE/cloudbridge/pull/345
  170. * Fix the two effects behind the AWS suite's runtime: unscoped tag search and transport page size by @nuwang in https://github.com/CloudVE/cloudbridge/pull/346
  171. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.3.1...v4.4.0
  172. 4.3.1 - August 2, 2026 (sha 8fabc1e2d3916e2c100bdb18075f2caa3bd38b38)
  173. ---------------------------------------------------------------------
  174. ## Release highlights
  175. This point release makes downloads safe when the destination path is written
  176. concurrently, and removes two pathological API-call patterns in the AWS
  177. provider that dominated integration test runtimes - listing VM types and
  178. waiting on Route53 record changes. Fully backward compatible with 4.3.0 - no
  179. code changes are required.
  180. ## Fixes
  181. * **AWS VM type listings no longer refetch the whole catalogue for every
  182. page.** EC2 offers no server-side paging for instance types, so
  183. ``AWSVMTypeService.list`` materialises the full catalogue and pages it
  184. client-side. It previously refetched that catalogue on every call - one
  185. ``DescribeInstanceTypeOfferings`` walk plus a ``DescribeInstanceTypes`` call
  186. per 100 types, about 14 API calls - which made walking the pages of a full
  187. listing quadratic in API calls. Walking all 1343 types offered in
  188. ``us-east-1a`` at a result limit of 5 cost roughly 4300 API calls; it now
  189. costs 14. The catalogue is memoised per availability zone for the lifetime
  190. of the provider.
  191. * **AWS DNS record changes no longer wait a full 30 seconds each.** Creating
  192. or deleting a record blocks until Route53 reports the change INSYNC, using
  193. boto3's ``resource_record_sets_changed`` waiter. That waiter polls every 30
  194. seconds by default, so a change that propagated in a few seconds still cost
  195. a full 30. Measured against Route53, INSYNC was reached inside the first
  196. poll interval every time, making the granularity the entire cost. The
  197. waiter now polls every 5 seconds while keeping the same ~30 minute ceiling.
  198. * **Downloads no longer assemble the object at the destination path.**
  199. ``BucketObject.download_to_file`` builds the file out of the way and moves it
  200. into place once complete, so the destination only ever holds a whole object.
  201. Previously the generic ranged driver (used by GCP and OpenStack Swift)
  202. created the destination up front and reopened it for every range, so anything
  203. that replaced that path mid-transfer - notably a second download of the same
  204. object to the same path, as a download cache does - could truncate the
  205. in-progress file or make the next range fail with ``FileNotFoundError``. A
  206. failed transfer no longer deletes an existing file at the destination either,
  207. and the Azure downloader (which wrote in place) gains the same guarantee.
  208. Ranges are now also written through a single file handle rather than
  209. reopening the path per range.
  210. ## Build and CI
  211. * The AWS cloud integration job now requests a 3 hour OIDC session instead of
  212. relying on the 1 hour default. The credentials are exported to tox as static
  213. environment variables and cannot be refreshed mid-run, so a suite that ran
  214. past the hour failed its remaining tests with ``RequestExpired`` - and,
  215. because cleanup handlers need working credentials too, leaked the instances
  216. and images those tests had created. Requires the IAM role's
  217. ``MaxSessionDuration`` to permit the longer session.
  218. ## Pull Requests
  219. * Never assemble a download at its destination path by @nuwang in https://github.com/CloudVE/cloudbridge/pull/341
  220. * Cut AWS integration suite runtime and stop credentials expiring mid-run by @nuwang in https://github.com/CloudVE/cloudbridge/pull/342
  221. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.3.0...v4.3.1
  222. 4.3.0 - July 11, 2026 (sha 863d0c8297e74e62a72b98643952f9a923807b7b)
  223. --------------------------------------------------------------------
  224. ## Release highlights
  225. This release adds cross-provider ranged, parallel downloads, completing the
  226. transfer story started with 4.2.0's multipart uploads. Fully backward
  227. compatible — no code changes are required.
  228. ## What's new
  229. * **Cross-provider ranged, parallel downloads.** The new
  230. ``BucketObject.download_to_file`` fetches objects larger than the configured
  231. threshold as ranged reads of ``part_size`` bytes, up to ``max_concurrency``
  232. parts in parallel, so large downloads are no longer bound to a single
  233. connection (and the whole object is never held in memory). AWS delegates to
  234. boto3's TransferManager and Azure to azure-storage-blob's concurrent
  235. downloader; GCP and OpenStack Swift use CloudBridge's generic driver, which
  236. fetches ranges in parallel via cloned providers. A new
  237. ``BucketObjectService.download_range`` primitive is also available directly
  238. for partial reads. The per-call ``TransferConfig`` knobs (threshold, part
  239. size, concurrency) now tune transfers in both directions — pass a different
  240. instance per call to tune uploads and downloads differently.
  241. ## Pull Requests
  242. * Add cross-provider ranged, parallel downloads by @nuwang in https://github.com/CloudVE/cloudbridge/pull/340
  243. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.2.1...v4.3.0
  244. 4.2.1 - July 10, 2026 (sha f06765d1100ec461908396475a4510460843a65c)
  245. --------------------------------------------------------------------
  246. ## Release highlights
  247. This point release lowers the supported Python floor to 3.10 and adds
  248. response-header overrides to signed object URLs. Fully backward compatible
  249. with 4.2.0 — no code changes are required.
  250. ## What's new
  251. * **Supported Python floor lowered to 3.10.** ``requires-python`` was ``>=3.13``
  252. since the PEP 621 packaging migration, but nothing in the codebase or its
  253. dependencies needs more than 3.10. CloudBridge now installs on Python
  254. 3.10–3.13, and CI runs the mock-provider suite on both the lowest and highest
  255. supported versions. ``mypy`` type-checks against 3.10 so newer-stdlib usage
  256. is caught at lint time.
  257. * **Response-header overrides on signed URLs.** ``BucketObject.generate_url`` now
  258. accepts optional ``content_disposition`` and ``content_type`` parameters that ask
  259. the backing store to serve the object with those response headers on GET. Honored
  260. fully by AWS, Azure and GCP; OpenStack Swift honors the filename portion of the
  261. disposition via its tempurl ``filename`` parameter (the content type cannot be
  262. overridden). Both are ignored for writable URLs.
  263. ## Pull Requests
  264. * Lower supported Python floor to 3.10 by @nuwang in https://github.com/CloudVE/cloudbridge/pull/338
  265. * Add response-header overrides to BucketObject.generate_url by @nuwang in https://github.com/CloudVE/cloudbridge/pull/339
  266. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.2.0...v4.2.1
  267. 4.2.0 - July 9, 2026 (sha 60dbe305f0af46a7ce3eadd093756d31b8131b2e)
  268. -------------------------------------------------------------------
  269. ## Release highlights
  270. This release makes CloudBridge's entire public API strongly typed (shipped with a
  271. PEP 561 ``py.typed`` marker), adds cross-provider multipart upload for large objects,
  272. and removes the long-deprecated ``deprecation`` dependency along with the deprecated
  273. APIs it supported.
  274. ## What's new
  275. * **Comprehensive type hints.** The whole public interface is now annotated and ships a
  276. PEP 561 ``py.typed`` marker, so downstream users get a fully-typed API even though the
  277. underlying cloud SDKs are untyped. A ``mypy`` check runs in CI — the interface and base
  278. layers under a strict bar, and the SDK-wrapping providers under a pragmatic tier.
  279. * **Cross-provider multipart upload.** Large object uploads now use multipart transfer
  280. with per-call ``TransferConfig`` knobs (threshold, part size, concurrency), with parts
  281. uploaded in parallel via cloned providers.
  282. ## Breaking changes
  283. * Removed the ``deprecation`` dependency and the long-expired deprecated APIs it
  284. supported (both marked ``removed_in=2.0``):
  285. * the ``network_id=`` keyword alias on ``security.vm_firewalls.create`` — use
  286. ``network=`` instead;
  287. * the ``AZURE_VM_DEFAULT_USER_NAME`` environment/config variable — use
  288. ``AZURE_VM_DEFAULT_USERNAME`` instead.
  289. ## Fixes and maintenance
  290. * Typing surfaced and fixed several latent provider issues: Azure ``Volume.source`` now
  291. resolves to a ``Snapshot`` object, the Azure multi-firewall merge on launch passes the
  292. required network, and Azure ``parse_url`` reports a meaningful parameter on error.
  293. * GCP volume attach/detach now waits for the operation to complete, and the attachments
  294. check was corrected.
  295. * Reconciled numerous cross-provider return-type and behaviour inconsistencies to match
  296. the interface — e.g. ``start``/``stop``/``delete`` return ``None`` consistently,
  297. firewall-rule ``direction`` returns the ``TrafficDirection`` enum, and fatal missing-id
  298. paths raise ``ProviderInternalException`` instead of returning ``None``.
  299. ## Build and CI
  300. * Added a ``mypy`` tox environment (``tox -e mypy``) and a CI step; the ``lint``
  301. environment now also enforces import order via ``flake8-import-order``.
  302. ## Pull Requests
  303. * Add cross-provider multipart upload support by @nuwang in https://github.com/CloudVE/cloudbridge/pull/333
  304. * Wait for GCP volume attach/detach operations; fix attachments check by @nuwang in https://github.com/CloudVE/cloudbridge/pull/334
  305. * Add comprehensive typing to cloudbridge + mypy tox check by @nuwang in https://github.com/CloudVE/cloudbridge/pull/335
  306. * Remove the deprecation dependency and long-expired deprecated APIs by @nuwang in https://github.com/CloudVE/cloudbridge/pull/336
  307. * Fix latent provider bugs surfaced during the typing work by @nuwang in https://github.com/CloudVE/cloudbridge/pull/337
  308. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.1.0...v4.2.0
  309. 4.1.0 - June 15, 2026 (sha 4d7999ac8785bececaa62964d25f4f552df7c3a0)
  310. ---------------------------------------------------------------------
  311. ## Release highlights
  312. This minor release adds Azure DNS support and modernizes the release pipeline. The public CloudBridge
  313. API is backward compatible with 4.0 — no code changes are required.
  314. ## What's new
  315. * **Azure DNS support.** The Azure provider can now manage DNS zones and records, bringing it in line
  316. with the DNS service already offered by the other providers. This adds ``azure-mgmt-dns`` to the
  317. Azure dependency set.
  318. ## Fixes and maintenance
  319. * Azure disks now use the region name (not the zone name) when resolving their location.
  320. * Test reliability: retry default-subnet creation, and allow storage-account creation enough time to
  321. resolve DNS.
  322. ## Build and CI
  323. * PyPI releases now use a trusted publisher (PyPI OIDC) from GitHub Actions instead of a stored API
  324. token. The deploy workflow is split into separate build and publish jobs, and integration runs are
  325. skipped on docs-only changes.
  326. ## Pull Requests
  327. * Use a trusted publisher when publishing to PyPI by @ksuderman in https://github.com/CloudVE/cloudbridge/pull/330
  328. * Add Azure DNS support by @nuwang in https://github.com/CloudVE/cloudbridge/pull/331
  329. * CI hygiene: split deploy job + dedicated env, skip CI on docs-only changes by @nuwang in https://github.com/CloudVE/cloudbridge/pull/332
  330. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.0.0...v4.1.0
  331. 4.0.0 - May 15, 2026 (sha 4963adc3f5f10cd885640138062800d7cd20e93a)
  332. ---------------------------------------------------------------------
  333. ## Release highlights
  334. This is a major release that brings the dependency stack up to date. The public CloudBridge API is unchanged —
  335. most users will not need any code changes. The version bump reflects the breadth of the underlying modernization
  336. rather than interface breakage.
  337. ## What users should know
  338. Python 3.13 or higher is now required. Support for older Python versions, including 2.7 compatibility
  339. shims (``six``), has been removed. Earlier Python versions are no longer tested; the default test environment
  340. is Python 3.13.
  341. Azure public IPs now use the Standard SKU. Basic-SKU public IPs are being retired by Azure. Public IPs created
  342. by CloudBridge are now Standard SKU. Within a single virtual network, public IPs of different SKUs cannot be
  343. mixed (Azure restriction). If you have a network that already contains Basic-SKU IPs created by CloudBridge 3.x,
  344. plan to standardize on one SKU before letting 4.0 add new IPs to that network.
  345. Mock provider now requires moto >= 5.0. If you use MockAWSCloudProvider in your own test suite alongside direct
  346. moto usage, your test harness must be on moto 5. In moto 5, the per-service decorators (mock_ec2, mock_s3, …) were
  347. unified into a single mock_aws.
  348. If you pin cloud SDKs alongside CloudBridge, you may need to relax upper bounds. The biggest jumps:
  349. azure-mgmt-compute (up to <39), azure-mgmt-network (<31), openstacksdk (<5).
  350. ### Under the hood (no action required)
  351. CloudBridge migrated off several abandoned Azure libraries (msrestazure, azure-cosmosdb-table, pysftp) and onto their
  352. maintained successors. The migration is transparent at the API level. Existing Azure resources created by
  353. 3.x — including key pairs stored in Azure Table Storage — are read by 4.0 without migration.
  354. ## Pull Requests
  355. * Update codecov badge by @nuwang in https://github.com/CloudVE/cloudbridge/pull/319
  356. * pull_request to pull_request_target for tests by @almahmoud in https://github.com/CloudVE/cloudbridge/pull/322
  357. * Azure - add AZURE_NETWORK_RESOURCE_GROUP to pick vnet from another ResourceGroup by @patchkez in https://github.com/CloudVE/cloudbridge/pull/321
  358. * Run in pull_request mode with approval by @nuwang in https://github.com/CloudVE/cloudbridge/pull/327
  359. * Upgrade azure, openstack sdks and moto to latest by @nuwang in https://github.com/CloudVE/cloudbridge/pull/323
  360. * Modernize project setup by @nuwang in https://github.com/CloudVE/cloudbridge/pull/328
  361. ## New Contributors
  362. * @patchkez made their first contribution in https://github.com/CloudVE/cloudbridge/pull/321
  363. **Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v3.2.0...v4.0.0
  364. 3.2.0 - September 06, 2023 (sha dd7ccbba9457232880da755ca66f8ae9d2e7dce4)
  365. ---------------------------------------------------------------------
  366. * Use external non-shared network for gateway by @almahmoud in https://github.com/CloudVE/cloudbridge/pull/307
  367. * Install cloudbridge full in examples by @nuwang in https://github.com/CloudVE/cloudbridge/pull/310
  368. * Add new `ec2_retries_value` config for `AWSCloudProvider` by @MosheFriedland in https://github.com/CloudVE/cloudbridge/pull/313
  369. * Add packaging action by @nuwang in https://github.com/CloudVE/cloudbridge/pull/314
  370. * Fix linting error in resource comparison by @nuwang in https://github.com/CloudVE/cloudbridge/pull/315
  371. * Fix tox syntax and branch references by @nuwang in https://github.com/CloudVE/cloudbridge/pull/316
  372. * Switch to pytest by @nuwang in https://github.com/CloudVE/cloudbridge/pull/317
  373. * Update tox syntax and pin min tox version by @nuwang in https://github.com/CloudVE/cloudbridge/pull/318
  374. 3.1.0 - August 19, 2022 (sha 28067e22377a60423e7fcf4f995ce224307b8b09)
  375. ---------------------------------------------------------------------
  376. * Added app credentials support to openstack.
  377. * Added VM instance create time property to all providers (thanks to @rodrigonull)
  378. * Added Azure stop VM instance method (thanks to @rodrigonull)
  379. * Cloud provider sdks updated to latest versions
  380. * Other misc fixes.
  381. 3.0.0 - December 3, 2021 (sha 327e330bed78b8b70c9ff9d256513d71bc27545f)
  382. ---------------------------------------------------------------------
  383. * This is a major release due to packaging changes, although there are no backward incompatible interface changes.
  384. * The cloudbridge package no longer installs any providers by default, and you must use `pip install cloudbridge[full]`
  385. instead of `pip install cloudbridge` to obtain previous behaviour. This is to allow greater control over what
  386. providers are installed. To install only specific providers, use `pip install cloudbridge[aws,gcp]` etc. #292
  387. (thanks to @RyanSiu1995)
  388. * Allow users to create signed urls with write permissions #294 (thanks to @FabioRosado)
  389. 2.2.0 - November 5, 2021 (sha f3fb8e18781cd3ede4509ef75a69e7c2a420a167)
  390. ---------------------------------------------------------------------
  391. * This is a maintenance release with no backward incompatible changes.
  392. * Azure dependencies updated to latest version and associated fixes #274, #277, #278, #279, #281, #282
  393. (thanks to @FabioRosado)
  394. * AWS, GCP and OpenStack dependencies updated to latest versions and associated fixes.
  395. * AWS resources use TagSpecification support, removing extra requests for initial tagging.
  396. * Fixed wrong logging object in cloud provider #272 (thanks to @MosheFriedland)
  397. * Switched to github actions from travis
  398. * Patch discovery.build calls in GCP provider to use google's improved httplib2 #263 (thanks to @selshowk)
  399. * Added feature to start and stop aws instance #271 (thanks to @abhi005)
  400. * Miscellaneous doc and maintenance fixes.
  401. 2.1.0 - December 1, 2020 (sha a5c3af8ebc5be3ed44db34ebba097848f17305fb)
  402. ---------------------------------------------------------------------
  403. * This release introduces the DNS service, which is a top level service for managing DNS zones and records.
  404. * Support for using the newly added AWS instance type offerings API. This removes the dependency on a static machine
  405. type list, and returns up-to-date information on instance type availability.
  406. * The default package no longer bundles Azure, as the Azure python libraries are very large and affects docker
  407. container size when using cloudbridge. To install with Azure, use `pip install cloudbridge[full]` or
  408. `pip install cloudbridge[azure]`.
  409. * A convenience method for cloning providers in different zones has been added, which helps with multi-zone operations.
  410. * Support for specifying s3 signature version for the AWS provider.
  411. * Miscellaneous bug fixes and error handling improvements.
  412. * Support for python<3 dropped.
  413. * No major backward incompatible changes (apart from Azure not being bundled by default)
  414. 2.0.0 - March 13, 2019 (sha 10e28a0d07251af4a424fcbf11435fa4d52e5277)
  415. ---------------------------------------------------------------------
  416. * This is a major release which contains many improvements and some breaking
  417. changes to the interface, but the changes are fairly straightforward.
  418. * Support for Google Cloud (thanks to @mbookman, @chiniforooshan, @baizhang)
  419. * Support for middleware, event listening and interception, allowing
  420. CloudBridge to be extended without needing to modify library code (This is
  421. also potentially useful for handling corner cases for specific clouds).
  422. * The mock provider is now available by default as a standard cloud provider,
  423. which is useful for testing applications that use CloudBridge.
  424. * Providers now operate in a single zone, and therefore, all methods that
  425. previously required the zone as a parameter no longer do. Specifically,
  426. ``instance.create()``, ``volume.create()``, ``subnet.create``,
  427. ``subnet.get_or_create_default()`` are affected in services,
  428. and ``snap.create_volume`` is affected in resources. The provider's default
  429. zone must now be specified through the provider config.
  430. * All exceptions that are generated by CloudBridge will now extend from
  431. ``CloudBridgeBaseException``
  432. * The cloud package is deprecated and everything under it has been moved
  433. one level up. For example, instead of
  434. ``from cloudbridge.cloud.factory import CloudProviderFactory`` use
  435. ``from cloudbridge.factory import CloudProviderFactory``.
  436. * Services are much more uniform now, and sub-services have been introduced
  437. for greater uniformity. For example, ``net.create_subnet()`` is now
  438. ``net.subnets.create()``
  439. * ``gateways.get_or_create_inet_gateway()`` is now simply
  440. ``gateways.get_or_create()``
  441. * AWS instance types are now served through Amazon CloudFront for better
  442. performance.
  443. * Miscellaneous bug fixes and improvements.
  444. 1.0.2 - September 25, 2018 (sha 621aeed1a8d7c5ad270649f8ee960e9682e57dae)
  445. -------------------------------------------------------------------------
  446. * Added AWS instance types caching for better performance
  447. * Added ``router.subnets`` property
  448. * Ensure the default network for CloudBridge on AWS has subnets
  449. 1.0.1 - September 7, 2018. (sha 3130492008c5e0e115b8dfec880d32a4ac90b761)
  450. -------------------------------------------------------------------------
  451. * Fixed minor bug when retrieving buckets with only limited access.
  452. * Relaxed some library version dependencies (e.g. six).
  453. 1.0.0 - September 6, 2018. (sha 11bccd822f21a598fc753995440cf1a409984889)
  454. -------------------------------------------------------------------------
  455. * Added Microsoft Azure as a provider.
  456. * Restructured the interface to make it more comprehensible and uniform across
  457. all supported providers. See `issue #69 <https://github.com/CloudVE/cloudbridge/issues/69>`_
  458. for more details as well as the library layout image for an easy visual
  459. reference: https://github.com/CloudVE/cloudbridge#quick-reference.
  460. * Migrated AWS implementation to use the boto3 library (thanks @01000101)
  461. * Cleaned up use of ``name`` property for resources. Resources now have ``id``,
  462. ``name``, and ``label`` properties to represent respectively: a unique
  463. identifier supplied by the provider; a descriptive, unchangeable name; and a
  464. user-supplied label that can be modified during the existence of a resource.
  465. * Added enforcement of name and label value: names must be at least 3 characters
  466. in length at minimum, and 64 characters at maximum, consisting of only lower
  467. case letters and dashes. Should not start or end with a dash.
  468. * Refactored tests and extracted standard interface tests where all resources
  469. are being tested using the same code structure. Also, tests will run only
  470. for providers that implement a given service.
  471. * Moved the repository from github.com/gvlproject to github.com/cloudve org.
  472. * When deleting an OpenStack network, clear any ports.
  473. * Added support for launching OpenStack instances into a specific subnet
  474. * Update image list interface to allow filtering by owner.
  475. * When listing images on AWS, filter only the ones by current account owner.
  476. * Retrieve AWS instance types from a public service to include latest values.
  477. * Instance state uses ``DELETED`` state instead of ``TERMINATED``.
  478. * Return VM type RAM in GB.
  479. * Add implementation for ``generate_url`` on OpenStack.
  480. * General documentation updates.
  481. 0.3.3 - August 7, 2017. (sha 348e1e88935f61f53a83ed8d6a0e012a46621e25)
  482. ----------------------------------------------------------------------
  483. * Remove explicit versioning of requests and Babel.
  484. 0.3.2 - June 10, 2017. (sha f07f3cbd758a0872b847b5537d9073c90f87c24d)
  485. ---------------------------------------------------------------------
  486. * Patch release to support files>5GB with OpenStack (thanks @MartinPaulo).
  487. * Misc bug fixes.
  488. 0.3.1 - April 18, 2017. (sha f36a462e886d8444cb2818f6573677ecf0565315)
  489. ----------------------------------------------------------------------
  490. * Patch for binary file handling in OpenStack.
  491. 0.3.0 - April 11, 2017. (sha 13539ccda9e4809082796574d18b1b9bb3f2c624)
  492. ----------------------------------------------------------------------
  493. * Reworked test framework to rely on tox's test generation features. This
  494. allows for individual test cases to be run on a per provider basis.
  495. * Added more OpenStack swift config options (OS_AUTH_TOKEN and OS_STORAGE_URL)
  496. * Added supports for accessing EC2 containers with restricted permissions.
  497. * Removed exists() method from object store interface. Use get()==None check
  498. instead.
  499. * New method (img.min_disk) for getting size of machine image.
  500. * Test improvements (flake8 during build, more tests).
  501. * Misc bug fixes and improvements.
  502. * Changed library to beta state
  503. * General documentation updates (testing, release process)
  504. 0.2.0 - March 23, 2017. (sha a442d96b829ea2c721728520b01981fa61774625)
  505. ----------------------------------------------------------------------
  506. * Reworked the instance launch method to require subnet vs. network. This
  507. removed the option of adding network interface to a launch config object.
  508. * Added object store methods: upload from file path, list objects with a
  509. prefix, check if an object exists, (AWS only) get an accessible URL for an
  510. object (thanks @VJalili).
  511. * Modified `get_ec2_credentials()` method to `get_or_create_ec2_credentials()`
  512. * Added an option to read provider config values from a file
  513. (`~/.cloudbridge` or `/etc/cloudbridge`).
  514. * Replaced py35 with py36 for running tests.
  515. * Added logging configuration for the library.
  516. * General documentation updates.
  517. 0.1.1 - Aug 10, 2016. (sha 0122fb1173c88ae64e40140ffd35ff3797e9e4ad)
  518. --------------------------------------------------------------------
  519. * For AWS, always launch instances into private networking (i.e., VPC).
  520. * Support for using OpenStack Keystone v3.
  521. * Add functionality to manipulate routers and routes.
  522. * Add FloatingIP resource type and integrate with Network service.
  523. * Numerous documentation updates.
  524. * For an OpenStack provider, add method to get the ec2 credentials for a user.
  525. 0.1.0 - Jan 30, 2016.
  526. ---------------------
  527. * Initial release of CloudBridge.
  528. * Support for Bucket, Instance, Instance type, Key pair, Machine image.
  529. Region, Security group, Snapshot, Volume, Network and Subnet services.
  530. * Support for paging results, block device mapping and launching into VPCs.
  531. * Support for AWS and OpenStack clouds.
  532. * Basic usage docs and complete API docs.
  533. * 95% test coverage.
  534. * Support for AWS mock test provider (via
  535. `moto <https://github.com/spulec/moto>`_).