4.1.0 - June 15, 2026 (sha 4d7999ac8785bececaa62964d25f4f552df7c3a0)
---------------------------------------------------------------------

## Release highlights
This minor release adds Azure DNS support and modernizes the release pipeline. The public CloudBridge
API is backward compatible with 4.0 — no code changes are required.

## What's new
* **Azure DNS support.** The Azure provider can now manage DNS zones and records, bringing it in line
  with the DNS service already offered by the other providers. This adds ``azure-mgmt-dns`` to the
  Azure dependency set.

## Fixes and maintenance
* Azure disks now use the region name (not the zone name) when resolving their location.
* Test reliability: retry default-subnet creation, and allow storage-account creation enough time to
  resolve DNS.

## Build and CI
* PyPI releases now use a trusted publisher (PyPI OIDC) from GitHub Actions instead of a stored API
  token. The deploy workflow is split into separate build and publish jobs, and integration runs are
  skipped on docs-only changes.

## Pull Requests
* Use a trusted publisher when publishing to PyPI by @ksuderman in https://github.com/CloudVE/cloudbridge/pull/330
* Add Azure DNS support by @nuwang in https://github.com/CloudVE/cloudbridge/pull/331
* CI hygiene: split deploy job + dedicated env, skip CI on docs-only changes by @nuwang in https://github.com/CloudVE/cloudbridge/pull/332

**Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v4.0.0...v4.1.0


4.0.0 - May 15, 2026 (sha 4963adc3f5f10cd885640138062800d7cd20e93a)
---------------------------------------------------------------------

## Release highlights
This is a major release that brings the dependency stack up to date. The public CloudBridge API is unchanged —
most users will not need any code changes. The version bump reflects the breadth of the underlying modernization
rather than interface breakage.

## What users should know
Python 3.13 or higher is now required. Support for older Python versions, including 2.7 compatibility
shims (``six``), has been removed. Earlier Python versions are no longer tested; the default test environment
is Python 3.13.

Azure public IPs now use the Standard SKU. Basic-SKU public IPs are being retired by Azure. Public IPs created
by CloudBridge are now Standard SKU. Within a single virtual network, public IPs of different SKUs cannot be
mixed (Azure restriction). If you have a network that already contains Basic-SKU IPs created by CloudBridge 3.x,
plan to standardize on one SKU before letting 4.0 add new IPs to that network.

Mock provider now requires moto >= 5.0. If you use MockAWSCloudProvider in your own test suite alongside direct
moto usage, your test harness must be on moto 5. In moto 5, the per-service decorators (mock_ec2, mock_s3, …) were
unified into a single mock_aws.

If you pin cloud SDKs alongside CloudBridge, you may need to relax upper bounds. The biggest jumps:
azure-mgmt-compute (up to <39), azure-mgmt-network (<31), openstacksdk (<5).

### Under the hood (no action required)
CloudBridge migrated off several abandoned Azure libraries (msrestazure, azure-cosmosdb-table, pysftp) and onto their
maintained successors. The migration is transparent at the API level. Existing Azure resources created by
3.x — including key pairs stored in Azure Table Storage — are read by 4.0 without migration.

## Pull Requests
* Update codecov badge by @nuwang in https://github.com/CloudVE/cloudbridge/pull/319
* pull_request to pull_request_target for tests by @almahmoud in https://github.com/CloudVE/cloudbridge/pull/322
* Azure - add AZURE_NETWORK_RESOURCE_GROUP to pick vnet from another ResourceGroup by @patchkez in https://github.com/CloudVE/cloudbridge/pull/321
* Run in pull_request mode with approval by @nuwang in https://github.com/CloudVE/cloudbridge/pull/327
* Upgrade azure, openstack sdks and moto to latest by @nuwang in https://github.com/CloudVE/cloudbridge/pull/323
* Modernize project setup by @nuwang in https://github.com/CloudVE/cloudbridge/pull/328

## New Contributors
* @patchkez made their first contribution in https://github.com/CloudVE/cloudbridge/pull/321

**Full Changelog**: https://github.com/CloudVE/cloudbridge/compare/v3.2.0...v4.0.0


3.2.0 - September 06, 2023 (sha dd7ccbba9457232880da755ca66f8ae9d2e7dce4)
---------------------------------------------------------------------

* Use external non-shared network for gateway by @almahmoud in https://github.com/CloudVE/cloudbridge/pull/307
* Install cloudbridge full in examples by @nuwang in https://github.com/CloudVE/cloudbridge/pull/310
* Add new `ec2_retries_value` config for  `AWSCloudProvider` by @MosheFriedland in https://github.com/CloudVE/cloudbridge/pull/313
* Add packaging action by @nuwang in https://github.com/CloudVE/cloudbridge/pull/314
* Fix linting error in resource comparison by @nuwang in https://github.com/CloudVE/cloudbridge/pull/315
* Fix tox syntax and branch references by @nuwang in https://github.com/CloudVE/cloudbridge/pull/316
* Switch to pytest by @nuwang in https://github.com/CloudVE/cloudbridge/pull/317
* Update tox syntax and pin min tox version by @nuwang in https://github.com/CloudVE/cloudbridge/pull/318

3.1.0 - August 19, 2022 (sha 28067e22377a60423e7fcf4f995ce224307b8b09)
---------------------------------------------------------------------

* Added app credentials support to openstack.
* Added VM instance create time property to all providers (thanks to @rodrigonull)
* Added Azure stop VM instance method (thanks to @rodrigonull)
* Cloud provider sdks updated to latest versions
* Other misc fixes.

3.0.0 - December 3, 2021 (sha 327e330bed78b8b70c9ff9d256513d71bc27545f)
---------------------------------------------------------------------

* This is a major release due to packaging changes, although there are no backward incompatible interface changes.
* The cloudbridge package no longer installs any providers by default, and you must use `pip install cloudbridge[full]`
  instead of `pip install cloudbridge` to obtain previous behaviour. This is to allow greater control over what
  providers are installed. To install only specific providers, use `pip install cloudbridge[aws,gcp]` etc. #292
  (thanks to @RyanSiu1995)
* Allow users to create signed urls with write permissions #294 (thanks to @FabioRosado)

2.2.0 - November 5, 2021 (sha f3fb8e18781cd3ede4509ef75a69e7c2a420a167)
---------------------------------------------------------------------

* This is a maintenance release with no backward incompatible changes.
* Azure dependencies updated to latest version and associated fixes #274, #277, #278, #279, #281, #282
  (thanks to @FabioRosado)
* AWS, GCP and OpenStack dependencies updated to latest versions and associated fixes.
* AWS resources use TagSpecification support, removing extra requests for initial tagging.
* Fixed wrong logging object in cloud provider #272 (thanks to @MosheFriedland)
* Switched to github actions from travis
* Patch discovery.build calls in GCP provider to use google's improved httplib2 #263 (thanks to @selshowk)
* Added feature to start and stop aws instance #271 (thanks to @abhi005)
* Miscellaneous doc and maintenance fixes.

2.1.0 - December 1, 2020 (sha a5c3af8ebc5be3ed44db34ebba097848f17305fb)
---------------------------------------------------------------------

* This release introduces the DNS service, which is a top level service for managing DNS zones and records.
* Support for using the newly added AWS instance type offerings API. This removes the dependency on a static machine
  type list, and returns up-to-date information on instance type availability.
* The default package no longer bundles Azure, as the Azure python libraries are very large and affects docker
  container size when using cloudbridge. To install with Azure, use `pip install cloudbridge[full]` or
  `pip install cloudbridge[azure]`.
* A convenience method for cloning providers in different zones has been added, which helps with multi-zone operations.
* Support for specifying s3 signature version for the AWS provider.
* Miscellaneous bug fixes and error handling improvements.
* Support for python<3 dropped.
* No major backward incompatible changes (apart from Azure not being bundled by default)


2.0.0 - March 13, 2019 (sha 10e28a0d07251af4a424fcbf11435fa4d52e5277)
---------------------------------------------------------------------

* This is a major release which contains many improvements and some breaking
  changes to the interface, but the changes are fairly straightforward.
* Support for Google Cloud (thanks to @mbookman, @chiniforooshan, @baizhang)
* Support for middleware, event listening and interception, allowing
  CloudBridge to be extended without needing to modify library code (This is
  also potentially useful for handling corner cases for specific clouds).
* The mock provider is now available by default as a standard cloud provider,
  which is useful for testing applications that use CloudBridge.
* Providers now operate in a single zone, and therefore, all methods that
  previously required the zone as a parameter no longer do. Specifically,
  ``instance.create()``, ``volume.create()``, ``subnet.create``,
  ``subnet.get_or_create_default()`` are affected in services,
  and ``snap.create_volume`` is affected in resources. The provider's default
  zone must now be specified through the provider config.
* All exceptions that are generated by CloudBridge will now extend from
  ``CloudBridgeBaseException``
* The cloud package is deprecated and everything under it has been moved
  one level up. For example, instead of
  ``from cloudbridge.cloud.factory import CloudProviderFactory`` use
  ``from cloudbridge.factory import CloudProviderFactory``.
* Services are much more uniform now, and sub-services have been introduced
  for greater uniformity. For example, ``net.create_subnet()`` is now
  ``net.subnets.create()``
* ``gateways.get_or_create_inet_gateway()`` is now simply
  ``gateways.get_or_create()``
* AWS instance types are now served through Amazon CloudFront for better
  performance.
* Miscellaneous bug fixes and improvements.

1.0.2 - September 25, 2018 (sha 621aeed1a8d7c5ad270649f8ee960e9682e57dae)
-------------------------------------------------------------------------
* Added AWS instance types caching for better performance
* Added ``router.subnets`` property
* Ensure the default network for CloudBridge on AWS has subnets

1.0.1 - September 7, 2018. (sha 3130492008c5e0e115b8dfec880d32a4ac90b761)
-------------------------------------------------------------------------
* Fixed minor bug when retrieving buckets with only limited access.
* Relaxed some library version dependencies (e.g. six).

1.0.0 - September 6, 2018. (sha 11bccd822f21a598fc753995440cf1a409984889)
-------------------------------------------------------------------------

* Added Microsoft Azure as a provider.
* Restructured the interface to make it more comprehensible and uniform across
  all supported providers. See `issue #69 <https://github.com/CloudVE/cloudbridge/issues/69>`_
  for more details as well as the library layout image for an easy visual
  reference: https://github.com/CloudVE/cloudbridge#quick-reference.
* Migrated AWS implementation to use the boto3 library (thanks @01000101)
* Cleaned up use of ``name`` property for resources. Resources now have ``id``,
  ``name``, and ``label`` properties to represent respectively: a unique
  identifier supplied by the provider; a descriptive, unchangeable name; and a
  user-supplied label that can be modified during the existence of a resource.
* Added enforcement of name and label value: names must be at least 3 characters
  in length at minimum, and 64 characters at maximum, consisting of only lower
  case letters and dashes. Should not start or end with a dash.
* Refactored tests and extracted standard interface tests where all resources
  are being tested using the same code structure. Also, tests will run only
  for providers that implement a given service.
* Moved the repository from github.com/gvlproject to github.com/cloudve org.
* When deleting an OpenStack network, clear any ports.
* Added support for launching OpenStack instances into a specific subnet
* Update image list interface to allow filtering by owner.
* When listing images on AWS, filter only the ones by current account owner.
* Retrieve AWS instance types from a public service to include latest values.
* Instance state uses ``DELETED`` state instead of ``TERMINATED``.
* Return VM type RAM in GB.
* Add implementation for ``generate_url`` on OpenStack.
* General documentation updates.

0.3.3 - August 7, 2017. (sha 348e1e88935f61f53a83ed8d6a0e012a46621e25)
----------------------------------------------------------------------

* Remove explicit versioning of requests and Babel.

0.3.2 - June 10, 2017. (sha f07f3cbd758a0872b847b5537d9073c90f87c24d)
---------------------------------------------------------------------

* Patch release to support files>5GB with OpenStack (thanks @MartinPaulo).
* Misc bug fixes.

0.3.1 - April 18, 2017. (sha f36a462e886d8444cb2818f6573677ecf0565315)
----------------------------------------------------------------------

* Patch for binary file handling in OpenStack.

0.3.0 - April 11, 2017. (sha 13539ccda9e4809082796574d18b1b9bb3f2c624)
----------------------------------------------------------------------

* Reworked test framework to rely on tox's test generation features. This
  allows for individual test cases to be run on a per provider basis.
* Added more OpenStack swift config options (OS_AUTH_TOKEN and OS_STORAGE_URL)
* Added supports for accessing EC2 containers with restricted permissions.
* Removed exists() method from object store interface. Use get()==None check
  instead.
* New method (img.min_disk) for getting size of machine image.
* Test improvements (flake8 during build, more tests).
* Misc bug fixes and improvements.
* Changed library to beta state
* General documentation updates (testing, release process)

0.2.0 - March 23, 2017. (sha a442d96b829ea2c721728520b01981fa61774625)
----------------------------------------------------------------------

* Reworked the instance launch method to require subnet vs. network. This
  removed the option of adding network interface to a launch config object.
* Added object store methods: upload from file path, list objects with a
  prefix, check if an object exists, (AWS only) get an accessible URL for an
  object (thanks @VJalili).
* Modified `get_ec2_credentials()` method to `get_or_create_ec2_credentials()`
* Added an option to read provider config values from a file
  (`~/.cloudbridge` or `/etc/cloudbridge`).
* Replaced py35 with py36 for running tests.
* Added logging configuration for the library.
* General documentation updates.


0.1.1 - Aug 10, 2016. (sha 0122fb1173c88ae64e40140ffd35ff3797e9e4ad)
--------------------------------------------------------------------

* For AWS, always launch instances into private networking (i.e., VPC).
* Support for using OpenStack Keystone v3.
* Add functionality to manipulate routers and routes.
* Add FloatingIP resource type and integrate with Network service.
* Numerous documentation updates.
* For an OpenStack provider, add method to get the ec2 credentials for a user.


0.1.0 - Jan 30, 2016.
---------------------

* Initial release of CloudBridge.
* Support for Bucket, Instance, Instance type, Key pair, Machine image.
  Region, Security group, Snapshot, Volume, Network and Subnet services.
* Support for paging results, block device mapping and launching into VPCs.
* Support for AWS and OpenStack clouds.
* Basic usage docs and complete API docs.
* 95% test coverage.
* Support for AWS mock test provider (via
  `moto <https://github.com/spulec/moto>`_).
