linode-api4 5.46.0__tar.gz → 5.47.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {linode_api4-5.46.0/linode_api4.egg-info → linode_api4-5.47.0}/PKG-INFO +1 -1
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/vpc.py +8 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/login_client.py +47 -2
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/linode.py +12 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/linode_interfaces.py +82 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/region.py +1 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/vpc.py +12 -1
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/version.py +1 -1
- {linode_api4-5.46.0 → linode_api4-5.47.0/linode_api4.egg-info}/PKG-INFO +1 -1
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4.egg-info/SOURCES.txt +1 -0
- linode_api4-5.47.0/test/fixtures/linode_instances_124_interfaces_999.json +27 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/vpcs.json +1 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/vpcs_123456.json +1 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/vpcs_123456_subnets.json +1 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/vpcs_123456_subnets_789.json +1 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/conftest.py +39 -2
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/account/test_account.py +7 -2
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/image/test_image.py +1 -3
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/linode/interfaces/test_interfaces.py +122 -1
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/linode/test_linode.py +82 -39
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/networking/test_networking.py +2 -2
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/sharegroups/test_sharegroups.py +5 -3
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/vpc/test_vpc.py +31 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/linode_test.py +35 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/login_client_test.py +18 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/linode_interface_test.py +86 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/linode_test.py +16 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/vpc_test.py +41 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/LICENSE +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/MANIFEST.in +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/README.rst +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/examples/install-on-linode/app.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/examples/install-on-linode/make_stackscript.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/common.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/errors.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/account.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/beta.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/database.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/domain.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/group.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/image.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/image_share_group.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/linode.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/lke.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/lke_tier.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/lock.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/longview.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/maintenance.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/monitor.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/monitor_api.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/networking.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/nodebalancer.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/object_storage.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/placement.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/polling.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/profile.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/region.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/support.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/tag.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/groups/volume.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/linode_client.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/account.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/base.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/beta.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/database.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/dbase.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/domain.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/filtering.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/image.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/image_share_group.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/lke.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/lock.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/longview.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/monitor.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/monitor_api.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/networking.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/nodebalancer.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/object_storage.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/placement.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/profile.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/serializable.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/support.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/tag.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/objects/volume.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/paginated_list.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/polling.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4/util.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4.egg-info/dependency_links.txt +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4.egg-info/requires.txt +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/linode_api4.egg-info/top_level.txt +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/pyproject.toml +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/setup.cfg +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/setup.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_availability.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_availability_us-east.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_betas.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_betas_cool.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_child-accounts.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_child-accounts_123456.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_child-accounts_123456_token.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_events_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_invoices.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_invoices_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_invoices_123456_items.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_logins.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_logins_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_maintenance.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_notifications.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_oauth-clients_2737bf16b39ab5d7b4a1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_payment-method_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_payment-methods.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_payments.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_promo-codes.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_service-transfers.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_service-transfers_12345.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_settings.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_transfer.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/account_users_test-user.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/betas.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/betas_active.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_engines.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_instances.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_config.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_instances.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_instances_123_credentials.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_instances_123_credentials_reset.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_instances_123_patch.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_instances_123_resume.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_instances_123_ssl.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_mysql_instances_123_suspend.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_config.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_instances.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_instances_123_credentials.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_instances_123_credentials_reset.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_instances_123_patch.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_instances_123_resume.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_instances_123_ssl.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_postgresql_instances_123_suspend.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/databases_types.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/domains.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/domains_12345_clone.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/domains_12345_records.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/domains_12345_zone-file.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/domains_import.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_private_1234_sharegroups.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_private_123_regions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_private_1337.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_1234.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_1234_images.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_1234_images_shared_1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_1234_members.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_1234_members_abc123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_tokens.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_tokens_abc123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_tokens_abc123_sharegroup.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_sharegroups_tokens_abc123_sharegroup_images.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/images_upload.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_backups.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_configs.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_configs_456789.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_configs_456789_interfaces.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_123_put.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_321.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_456.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_disks.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_disks_12345_clone.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_firewalls.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_ips.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_nodebalancers.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_transfer.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_transfer_2023_4.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_123_volumes.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124_interfaces.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124_interfaces_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124_interfaces_123_firewalls.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124_interfaces_456.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124_interfaces_789.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124_interfaces_settings.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_instances_124_upgrade-interfaces.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_stackscripts_10079.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_types.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/linode_types_g6-nanode-1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters_18881.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters_18881_control__plane__acl.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters_18881_dashboard.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters_18881_nodes_123456.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters_18881_pools_456.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters_18882.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_clusters_18882_pools_789.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_tiers_standard_versions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_types.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/lke_versions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/locks.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/locks_1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/longview_clients.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/longview_plan.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/longview_subscriptions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/maintenance_policies.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/mongodb.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_alert-channels.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_alert-definitions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_dashboards.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_dashboards_1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_alert-definitions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_alert-definitions_12345.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_alert-definitions_12345_clone.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_alert-definitions_12345_entities.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_dashboards.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_metric-definitions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_metrics.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_dbaas_token.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_services_linode_token.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_streams.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_streams_1_history.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_streams_2.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_streams_3.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_streams_destinations.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_streams_destinations_1_history.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/monitor_streams_destinations_2.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/network-transfer_prices.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_123_devices.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_123_devices_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_123_devices_456.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_123_history.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_123_history_rules_2.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_123_rules.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_settings.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_templates.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_templates_public.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_firewalls_templates_vpc.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_ips_127.0.0.1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_ipv6_pools.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_ipv6_ranges.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_ipv6_ranges_2600%3A3c01%3A%3A.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_reserved_ips.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_reserved_ips_types.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/networking_vlans.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers_123456.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers_123456_configs.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers_123456_configs_65432_nodes.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers_12345_configs_4567_rebuild.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers_12345_firewalls.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers_12345_stats.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/nodebalancers_types.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets_us-east-1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-acl.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-list.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-url.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_ssl.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_buckets_us-east_example-bucket_access.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_clusters.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_global-quotas.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_global-quotas_obj-access-keys-per-account.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_global-quotas_obj-access-keys-per-account_usage.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_keys.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_quotas.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_quotas_obj-objects-us-ord-1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_quotas_obj-objects-us-ord-1_usage.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_transfer.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/object-storage_types.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/placement_groups.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/placement_groups_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile_device_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile_devices.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile_logins.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile_logins_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile_preferences.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile_security-questions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/profile_sshkeys.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/regions.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/regions_availability.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/regions_us-east_availability.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/regions_us-east_vpc-availability.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/regions_vpc-availability.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/support_tickets_123.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/tags.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/tags_nothing.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/tags_something.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/testmappedobj1.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/volumes.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/volumes_types.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/vpcs_123456_ips.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/vpcs_default-ranges.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/fixtures/vpcs_ips.json +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/filters/fixtures.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/filters/model_filters_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/helpers.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/linode_client/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/linode_client/test_errors.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/linode_client/test_linode_client.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/linode_client/test_retry.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/login_client/test_login_client.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/database/helpers.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/database/test_database.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/database/test_database_engine_config.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/domain/test_domain.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/firewall/test_firewall.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/firewall/test_firewall_templates.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/lke/test_lke.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/lock/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/lock/test_lock.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/longview/test_longview.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/maintenance/test_maintenance.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/monitor/test_monitor.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/monitor/test_monitor_logs.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/monitor_api/test_monitor_api.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/nodebalancer/test_nodebalancer.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/object_storage/test_obj.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/object_storage/test_obj_quotas.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/placement/test_placement.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/profile/test_profile.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/region/test_region.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/tag/test_tag.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/volume/test_blockstorage.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/integration/models/volume/test_volume.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/base.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/errors_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/fixtures.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/__init__.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/database_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/image_share_group_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/image_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/lke_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/lke_tier_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/lock_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/monitor_api_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/networking_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/object_storage_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/placement_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/polling_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/region_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/groups/vpc_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/linode_client_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/account_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/base_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/beta_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/database_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/domain_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/firewall_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/image_share_group_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/image_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/lke_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/lock_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/longview_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/mapped_object_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/monitor_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/networking_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/nodebalancers_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/object_storage_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/placement_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/profile_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/property_alias_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/region_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/serializable_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/support_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/tag_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/objects/volume_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/paginated_list_test.py +0 -0
- {linode_api4-5.46.0 → linode_api4-5.47.0}/test/unit/util_test.py +0 -0
|
@@ -11,6 +11,7 @@ from linode_api4.objects import (
|
|
|
11
11
|
VPCIPv6RangeOptions,
|
|
12
12
|
)
|
|
13
13
|
from linode_api4.objects.base import _flatten_request_body_recursive
|
|
14
|
+
from linode_api4.objects.vpc import VPCType
|
|
14
15
|
from linode_api4.paginated_list import PaginatedList
|
|
15
16
|
from linode_api4.util import drop_null_keys
|
|
16
17
|
|
|
@@ -44,6 +45,7 @@ class VPCGroup(Group):
|
|
|
44
45
|
subnets: Optional[List[Dict[str, Any]]] = None,
|
|
45
46
|
ipv6: Optional[List[Union[VPCIPv6RangeOptions, Dict[str, Any]]]] = None,
|
|
46
47
|
ipv4: Optional[List[Union[VPCIPv4RangeOptions, Dict[str, Any]]]] = None,
|
|
48
|
+
vpc_type: Optional[Union[VPCType, str]] = None,
|
|
47
49
|
**kwargs,
|
|
48
50
|
) -> VPC:
|
|
49
51
|
"""
|
|
@@ -61,6 +63,11 @@ class VPCGroup(Group):
|
|
|
61
63
|
:type subnets: List[Dict[str, Any]]
|
|
62
64
|
:param ipv6: The IPv6 address ranges for this VPC.
|
|
63
65
|
:type ipv6: List[Union[VPCIPv6RangeOptions, Dict[str, Any]]]
|
|
66
|
+
:param vpc_type: The type of VPC to create. Defaults to ``regular`` on
|
|
67
|
+
the API side. Set to ``rdma`` to create a GPUDirect
|
|
68
|
+
RDMA VPC (requires the ``GPUDirect RDMA`` account
|
|
69
|
+
capability).
|
|
70
|
+
:type vpc_type: Optional[Union[VPCType, str]]
|
|
64
71
|
:param ipv4: The IPv4 address ranges for this VPC. Note that IPv4 VPCs may not currently be available to all users.
|
|
65
72
|
:type ipv4: List[Union[VPCIPv4RangeOptions, Dict[str, Any]]]
|
|
66
73
|
|
|
@@ -74,6 +81,7 @@ class VPCGroup(Group):
|
|
|
74
81
|
"ipv4": ipv4,
|
|
75
82
|
"ipv6": ipv6,
|
|
76
83
|
"subnets": subnets,
|
|
84
|
+
"vpc_type": vpc_type,
|
|
77
85
|
}
|
|
78
86
|
|
|
79
87
|
if subnets is not None and len(subnets) > 0:
|
|
@@ -30,10 +30,11 @@ class OAuthScopes:
|
|
|
30
30
|
Lists of OAuth Scopes are accepted when calling the :any:`generate_login_url`
|
|
31
31
|
method of the :any:`LinodeLoginClient`.
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Most contained enumerations of OAuth Scopes have two levels, "read_only" and
|
|
34
34
|
"read_write". "read_only" access grants you the ability to get resources and
|
|
35
35
|
of that type, but not to change, create, or delete them. "read_write" access
|
|
36
|
-
allows to full access to resources of the requested type.
|
|
36
|
+
allows to full access to resources of the requested type. :any:`OAuthScopes.VPC`
|
|
37
|
+
is the exception and exposes only "read_write" and "all". In the above
|
|
37
38
|
example, you are requesting access to view, modify, create, and delete
|
|
38
39
|
Linodes, and to view Domains.
|
|
39
40
|
"""
|
|
@@ -254,6 +255,47 @@ class OAuthScopes:
|
|
|
254
255
|
return "longview:*"
|
|
255
256
|
return "longview:{}".format(self.name)
|
|
256
257
|
|
|
258
|
+
class Images(Enum):
|
|
259
|
+
"""
|
|
260
|
+
Access to Images
|
|
261
|
+
"""
|
|
262
|
+
|
|
263
|
+
read_only = 0
|
|
264
|
+
read_write = 1
|
|
265
|
+
all = 2
|
|
266
|
+
|
|
267
|
+
def __repr__(self):
|
|
268
|
+
if self.name == "all":
|
|
269
|
+
return "images:*"
|
|
270
|
+
return "images:{}".format(self.name)
|
|
271
|
+
|
|
272
|
+
class Databases(Enum):
|
|
273
|
+
"""
|
|
274
|
+
Access to Managed Databases
|
|
275
|
+
"""
|
|
276
|
+
|
|
277
|
+
read_only = 0
|
|
278
|
+
read_write = 1
|
|
279
|
+
all = 2
|
|
280
|
+
|
|
281
|
+
def __repr__(self):
|
|
282
|
+
if self.name == "all":
|
|
283
|
+
return "databases:*"
|
|
284
|
+
return "databases:{}".format(self.name)
|
|
285
|
+
|
|
286
|
+
class VPC(Enum):
|
|
287
|
+
"""
|
|
288
|
+
Access to VPCs and subnets
|
|
289
|
+
"""
|
|
290
|
+
|
|
291
|
+
read_write = 1
|
|
292
|
+
all = 2
|
|
293
|
+
|
|
294
|
+
def __repr__(self):
|
|
295
|
+
if self.name == "all":
|
|
296
|
+
return "vpc:*"
|
|
297
|
+
return "vpc:{}".format(self.name)
|
|
298
|
+
|
|
257
299
|
_scope_families = {
|
|
258
300
|
"linodes": Linodes,
|
|
259
301
|
"domains": Domains,
|
|
@@ -271,6 +313,9 @@ class OAuthScopes:
|
|
|
271
313
|
"object_storage": ObjectStorage,
|
|
272
314
|
"nodebalancers": NodeBalancers,
|
|
273
315
|
"longview": Longview,
|
|
316
|
+
"images": Images,
|
|
317
|
+
"databases": Databases,
|
|
318
|
+
"vpc": VPC,
|
|
274
319
|
}
|
|
275
320
|
|
|
276
321
|
@staticmethod
|
|
@@ -2115,10 +2115,22 @@ class Instance(Base):
|
|
|
2115
2115
|
:param vpc: The VPC-specific configuration of the new interface.
|
|
2116
2116
|
If set, the new instance will be a VPC interface.
|
|
2117
2117
|
|
|
2118
|
+
.. note::
|
|
2119
|
+
RDMA VPC interfaces (``rdma_vpc``) cannot be added via this
|
|
2120
|
+
endpoint. They may only be specified at instance creation time via
|
|
2121
|
+
:func:`linode_api4.LinodeGroup.instance_create`.
|
|
2122
|
+
|
|
2118
2123
|
:returns: The newly created Linode Interface.
|
|
2119
2124
|
:rtype: LinodeInterface
|
|
2120
2125
|
"""
|
|
2121
2126
|
|
|
2127
|
+
if kwargs.get("rdma_vpc") is not None:
|
|
2128
|
+
raise ValueError(
|
|
2129
|
+
"RDMA VPC interfaces (rdma_vpc) cannot be added via "
|
|
2130
|
+
"interface_create(). They may only be specified at instance "
|
|
2131
|
+
"creation time via LinodeGroup.instance_create()."
|
|
2132
|
+
)
|
|
2133
|
+
|
|
2122
2134
|
params = {
|
|
2123
2135
|
"firewall_id": firewall,
|
|
2124
2136
|
"default_route": default_route,
|
|
@@ -187,6 +187,47 @@ class LinodeInterfaceVLANOptions(JSONObject):
|
|
|
187
187
|
ipam_address: Optional[str] = None
|
|
188
188
|
|
|
189
189
|
|
|
190
|
+
@dataclass
|
|
191
|
+
class LinodeInterfaceRDMAVPCIPv4AddressOptions(JSONObject):
|
|
192
|
+
"""
|
|
193
|
+
Options accepted for a single address when creating or updating the IPv4
|
|
194
|
+
configuration of an RDMA VPC Linode Interface.
|
|
195
|
+
|
|
196
|
+
Only one address is supported per RDMA VPC interface, and it must be
|
|
197
|
+
marked as primary.
|
|
198
|
+
"""
|
|
199
|
+
|
|
200
|
+
address: Optional[str] = None
|
|
201
|
+
primary: Optional[bool] = None
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@dataclass
|
|
205
|
+
class LinodeInterfaceRDMAVPCIPv4Options(JSONObject):
|
|
206
|
+
"""
|
|
207
|
+
Options accepted when creating or updating the IPv4 configuration of an
|
|
208
|
+
RDMA VPC Linode Interface.
|
|
209
|
+
|
|
210
|
+
The ``addresses`` list MUST contain exactly one element. If omitted, the
|
|
211
|
+
API defaults to a single primary ``auto`` address.
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
addresses: Optional[List[LinodeInterfaceRDMAVPCIPv4AddressOptions]] = None
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@dataclass
|
|
218
|
+
class LinodeInterfaceRDMAVPCOptions(JSONObject):
|
|
219
|
+
"""
|
|
220
|
+
RDMA-VPC-exclusive options accepted when creating or updating a Linode
|
|
221
|
+
Interface.
|
|
222
|
+
|
|
223
|
+
Used for GPUDirect RDMA interfaces. Default routes and NAT 1:1 addresses
|
|
224
|
+
are not supported on RDMA VPC interfaces.
|
|
225
|
+
"""
|
|
226
|
+
|
|
227
|
+
subnet_id: int = 0
|
|
228
|
+
ipv4: Optional[LinodeInterfaceRDMAVPCIPv4Options] = None
|
|
229
|
+
|
|
230
|
+
|
|
190
231
|
@dataclass
|
|
191
232
|
class LinodeInterfaceOptions(JSONObject):
|
|
192
233
|
"""
|
|
@@ -204,6 +245,7 @@ class LinodeInterfaceOptions(JSONObject):
|
|
|
204
245
|
vpc: Optional[LinodeInterfaceVPCOptions] = None
|
|
205
246
|
public: Optional[LinodeInterfacePublicOptions] = None
|
|
206
247
|
vlan: Optional[LinodeInterfaceVLANOptions] = None
|
|
248
|
+
rdma_vpc: Optional[LinodeInterfaceRDMAVPCOptions] = None
|
|
207
249
|
|
|
208
250
|
|
|
209
251
|
# Interface GET Response
|
|
@@ -409,6 +451,45 @@ class LinodeInterfaceVLAN(JSONObject):
|
|
|
409
451
|
ipam_address: Optional[str] = None
|
|
410
452
|
|
|
411
453
|
|
|
454
|
+
@dataclass
|
|
455
|
+
class LinodeInterfaceRDMAVPCIPv4Address(JSONObject):
|
|
456
|
+
"""
|
|
457
|
+
A single address under the IPv4 configuration of an RDMA VPC Linode Interface.
|
|
458
|
+
"""
|
|
459
|
+
|
|
460
|
+
put_class = LinodeInterfaceRDMAVPCIPv4AddressOptions
|
|
461
|
+
|
|
462
|
+
address: str = ""
|
|
463
|
+
primary: bool = False
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
@dataclass
|
|
467
|
+
class LinodeInterfaceRDMAVPCIPv4(JSONObject):
|
|
468
|
+
"""
|
|
469
|
+
The IPv4 configuration of an RDMA VPC Linode Interface.
|
|
470
|
+
"""
|
|
471
|
+
|
|
472
|
+
put_class = LinodeInterfaceRDMAVPCIPv4Options
|
|
473
|
+
|
|
474
|
+
addresses: List[LinodeInterfaceRDMAVPCIPv4Address] = field(
|
|
475
|
+
default_factory=list
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
@dataclass
|
|
480
|
+
class LinodeInterfaceRDMAVPC(JSONObject):
|
|
481
|
+
"""
|
|
482
|
+
RDMA VPC-specific configuration field for a Linode Interface.
|
|
483
|
+
"""
|
|
484
|
+
|
|
485
|
+
put_class = LinodeInterfaceRDMAVPCOptions
|
|
486
|
+
|
|
487
|
+
vpc_id: int = 0
|
|
488
|
+
subnet_id: int = 0
|
|
489
|
+
|
|
490
|
+
ipv4: Optional[LinodeInterfaceRDMAVPCIPv4] = None
|
|
491
|
+
|
|
492
|
+
|
|
412
493
|
class LinodeInterface(DerivedBase):
|
|
413
494
|
"""
|
|
414
495
|
A Linode's network interface.
|
|
@@ -449,6 +530,7 @@ class LinodeInterface(DerivedBase):
|
|
|
449
530
|
"public": Property(mutable=True, json_object=LinodeInterfacePublic),
|
|
450
531
|
"vlan": Property(mutable=True, json_object=LinodeInterfaceVLAN),
|
|
451
532
|
"vpc": Property(mutable=True, json_object=LinodeInterfaceVPC),
|
|
533
|
+
"rdma_vpc": Property(mutable=True, json_object=LinodeInterfaceRDMAVPC),
|
|
452
534
|
}
|
|
453
535
|
|
|
454
536
|
def firewalls(self, *filters) -> List[Firewall]:
|
|
@@ -5,11 +5,20 @@ from linode_api4.errors import UnexpectedResponseError
|
|
|
5
5
|
from linode_api4.objects import Base, DerivedBase, Property, Region
|
|
6
6
|
from linode_api4.objects.base import _flatten_request_body_recursive
|
|
7
7
|
from linode_api4.objects.networking import VPCIPAddress
|
|
8
|
-
from linode_api4.objects.serializable import JSONObject
|
|
8
|
+
from linode_api4.objects.serializable import JSONObject, StrEnum
|
|
9
9
|
from linode_api4.paginated_list import PaginatedList
|
|
10
10
|
from linode_api4.util import drop_null_keys
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
class VPCType(StrEnum):
|
|
14
|
+
"""
|
|
15
|
+
VPCType represents the supported VPC types.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
regular = "regular"
|
|
19
|
+
rdma = "rdma"
|
|
20
|
+
|
|
21
|
+
|
|
13
22
|
@dataclass
|
|
14
23
|
class VPCIPv4DefaultRange(JSONObject):
|
|
15
24
|
"""
|
|
@@ -119,6 +128,7 @@ class VPCSubnet(DerivedBase):
|
|
|
119
128
|
"ipv6": Property(json_object=VPCSubnetIPv6Range, unordered=True),
|
|
120
129
|
"linodes": Property(json_object=VPCSubnetLinode, unordered=True),
|
|
121
130
|
"databases": Property(json_object=VPCSubnetDatabase, unordered=True),
|
|
131
|
+
"vpc_type": Property(),
|
|
122
132
|
"created": Property(is_datetime=True),
|
|
123
133
|
"updated": Property(is_datetime=True),
|
|
124
134
|
}
|
|
@@ -144,6 +154,7 @@ class VPC(Base):
|
|
|
144
154
|
),
|
|
145
155
|
"ipv6": Property(json_object=VPCIPv6Range, unordered=True),
|
|
146
156
|
"subnets": Property(derived_class=VPCSubnet),
|
|
157
|
+
"vpc_type": Property(),
|
|
147
158
|
"created": Property(is_datetime=True),
|
|
148
159
|
"updated": Property(is_datetime=True),
|
|
149
160
|
}
|
|
@@ -165,6 +165,7 @@ test/fixtures/linode_instances_124_interfaces_123.json
|
|
|
165
165
|
test/fixtures/linode_instances_124_interfaces_123_firewalls.json
|
|
166
166
|
test/fixtures/linode_instances_124_interfaces_456.json
|
|
167
167
|
test/fixtures/linode_instances_124_interfaces_789.json
|
|
168
|
+
test/fixtures/linode_instances_124_interfaces_999.json
|
|
168
169
|
test/fixtures/linode_instances_124_interfaces_settings.json
|
|
169
170
|
test/fixtures/linode_instances_124_upgrade-interfaces.json
|
|
170
171
|
test/fixtures/linode_stackscripts_10079.json
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": 999,
|
|
3
|
+
"mac_address": "22:00:f2:9e:d3:48",
|
|
4
|
+
"created": "2026-03-12T09:54:34",
|
|
5
|
+
"updated": "2026-03-12T09:54:35",
|
|
6
|
+
"default_route": {
|
|
7
|
+
"ipv4": false,
|
|
8
|
+
"ipv6": false
|
|
9
|
+
},
|
|
10
|
+
"version": 1,
|
|
11
|
+
"public": null,
|
|
12
|
+
"vpc": null,
|
|
13
|
+
"vlan": null,
|
|
14
|
+
"rdma_vpc": {
|
|
15
|
+
"vpc_id": 7,
|
|
16
|
+
"subnet_id": 8,
|
|
17
|
+
"ipv4": {
|
|
18
|
+
"addresses": [
|
|
19
|
+
{
|
|
20
|
+
"address": "10.0.0.2",
|
|
21
|
+
"primary": true
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
@@ -286,6 +286,7 @@ def test_linode_client():
|
|
|
286
286
|
token,
|
|
287
287
|
base_url=api_url,
|
|
288
288
|
ca_path=api_ca_file,
|
|
289
|
+
retry_statuses=[504],
|
|
289
290
|
)
|
|
290
291
|
return client
|
|
291
292
|
|
|
@@ -316,7 +317,7 @@ def test_domain(test_linode_client):
|
|
|
316
317
|
domain.invalidate()
|
|
317
318
|
return domain.status == "active"
|
|
318
319
|
|
|
319
|
-
wait_for_condition(3,
|
|
320
|
+
wait_for_condition(3, 45, get_domain_status)
|
|
320
321
|
|
|
321
322
|
# Create a SRV record
|
|
322
323
|
domain.record_create(
|
|
@@ -467,7 +468,6 @@ def test_oauth_client(test_linode_client):
|
|
|
467
468
|
@pytest.fixture(scope="session")
|
|
468
469
|
def create_vpc(test_linode_client):
|
|
469
470
|
client = test_linode_client
|
|
470
|
-
|
|
471
471
|
label = get_test_label(length=10)
|
|
472
472
|
|
|
473
473
|
vpc = client.vpcs.create(
|
|
@@ -479,6 +479,7 @@ def create_vpc(test_linode_client):
|
|
|
479
479
|
"VPC IPv6 Stack",
|
|
480
480
|
"Linode Interfaces",
|
|
481
481
|
"Custom VPC IPv4 Ranges",
|
|
482
|
+
"Linodes",
|
|
482
483
|
},
|
|
483
484
|
),
|
|
484
485
|
description="test description",
|
|
@@ -489,6 +490,27 @@ def create_vpc(test_linode_client):
|
|
|
489
490
|
vpc.delete()
|
|
490
491
|
|
|
491
492
|
|
|
493
|
+
@pytest.fixture
|
|
494
|
+
def create_vpc_with_rdma_type(test_linode_client):
|
|
495
|
+
client = test_linode_client
|
|
496
|
+
label = get_test_label(length=10)
|
|
497
|
+
|
|
498
|
+
# GPUDirect RDMA capability not available for now
|
|
499
|
+
region = get_region(
|
|
500
|
+
test_linode_client, {"VPCs", "VPC IPv6 Stack", "Linode Interfaces"}
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
vpc = client.vpcs.create(
|
|
504
|
+
label=label,
|
|
505
|
+
region=region,
|
|
506
|
+
description="test description",
|
|
507
|
+
vpc_type="rdma",
|
|
508
|
+
)
|
|
509
|
+
yield vpc
|
|
510
|
+
|
|
511
|
+
vpc.delete()
|
|
512
|
+
|
|
513
|
+
|
|
492
514
|
@pytest.fixture(scope="session")
|
|
493
515
|
def create_vpc_with_subnet(test_linode_client, create_vpc):
|
|
494
516
|
subnet = create_vpc.subnet_create(
|
|
@@ -524,6 +546,21 @@ def create_vpc_with_subnet_and_linode(
|
|
|
524
546
|
instance.delete()
|
|
525
547
|
|
|
526
548
|
|
|
549
|
+
@pytest.fixture
|
|
550
|
+
def create_vpc_with_subnet_and_rdma_type(create_vpc_with_rdma_type):
|
|
551
|
+
vpc_rdma = create_vpc_with_rdma_type
|
|
552
|
+
label = get_test_label(length=10)
|
|
553
|
+
|
|
554
|
+
subnet_rdma = vpc_rdma.subnet_create(
|
|
555
|
+
label=label,
|
|
556
|
+
ipv4="10.0.0.0/24",
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
yield vpc_rdma, subnet_rdma
|
|
560
|
+
|
|
561
|
+
subnet_rdma.delete()
|
|
562
|
+
|
|
563
|
+
|
|
527
564
|
@pytest.fixture
|
|
528
565
|
def create_vpc_with_ipv4(test_linode_client):
|
|
529
566
|
client = test_linode_client
|
|
@@ -39,6 +39,9 @@ def test_get_account(test_linode_client):
|
|
|
39
39
|
assert account_get.tax_id == account.tax_id
|
|
40
40
|
|
|
41
41
|
|
|
42
|
+
@pytest.mark.skip(
|
|
43
|
+
reason="Test fails for E2E test user with [504] Server Timeout due to enormous amount of logins. More details: ARB-7420"
|
|
44
|
+
)
|
|
42
45
|
def test_get_login(test_linode_client):
|
|
43
46
|
client = test_linode_client
|
|
44
47
|
login = retry_sending_request(3, client.load, Login(client, "", {}), "")
|
|
@@ -91,6 +94,8 @@ def test_update_maintenance_policy(test_linode_client):
|
|
|
91
94
|
assert updated.maintenance_policy == original_policy
|
|
92
95
|
|
|
93
96
|
|
|
97
|
+
# May fail due to multiple events occurring on the test user in the same time
|
|
98
|
+
@pytest.mark.flaky(reruns=2, reruns_delay=5)
|
|
94
99
|
@pytest.mark.smoke
|
|
95
100
|
def test_latest_get_event(test_linode_client, e2e_test_firewall):
|
|
96
101
|
client = test_linode_client
|
|
@@ -115,7 +120,7 @@ def test_latest_get_event(test_linode_client, e2e_test_firewall):
|
|
|
115
120
|
wait_for_condition(5, 150, get_linode_status)
|
|
116
121
|
|
|
117
122
|
events = client.load(Event, "")
|
|
118
|
-
latest_events = events._raw_json.get("data")[:
|
|
123
|
+
latest_events = events._raw_json.get("data")[:50]
|
|
119
124
|
|
|
120
125
|
linode.delete()
|
|
121
126
|
|
|
@@ -123,7 +128,7 @@ def test_latest_get_event(test_linode_client, e2e_test_firewall):
|
|
|
123
128
|
if label == event["entity"]["label"]:
|
|
124
129
|
break
|
|
125
130
|
else:
|
|
126
|
-
assert False, f"Linode '{label}' not found in the last
|
|
131
|
+
assert False, f"Linode '{label}' not found in the last 50 events"
|
|
127
132
|
|
|
128
133
|
|
|
129
134
|
def test_get_user(test_linode_client):
|
|
@@ -43,12 +43,10 @@ def image_upload_url(test_linode_client):
|
|
|
43
43
|
|
|
44
44
|
region = get_image_upload_regions(test_linode_client)[0]
|
|
45
45
|
|
|
46
|
-
test_linode_client.image_create_upload(
|
|
46
|
+
image, _ = test_linode_client.image_create_upload(
|
|
47
47
|
label, region.id, "integration test image upload"
|
|
48
48
|
)
|
|
49
49
|
|
|
50
|
-
image = test_linode_client.images()[0]
|
|
51
|
-
|
|
52
50
|
yield image
|
|
53
51
|
|
|
54
52
|
image.delete()
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import ipaddress
|
|
3
|
-
|
|
3
|
+
import os
|
|
4
|
+
from test.integration.helpers import get_test_label, wait_for_condition
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
6
7
|
|
|
@@ -16,6 +17,9 @@ from linode_api4 import (
|
|
|
16
17
|
LinodeInterfacePublicIPv6Options,
|
|
17
18
|
LinodeInterfacePublicIPv6RangeOptions,
|
|
18
19
|
LinodeInterfacePublicOptions,
|
|
20
|
+
LinodeInterfaceRDMAVPCIPv4AddressOptions,
|
|
21
|
+
LinodeInterfaceRDMAVPCIPv4Options,
|
|
22
|
+
LinodeInterfaceRDMAVPCOptions,
|
|
19
23
|
LinodeInterfaceVLANOptions,
|
|
20
24
|
LinodeInterfaceVPCIPv4AddressOptions,
|
|
21
25
|
LinodeInterfaceVPCIPv4Options,
|
|
@@ -43,6 +47,22 @@ def build_interface_public_ipv4(firewall, ip_address):
|
|
|
43
47
|
)
|
|
44
48
|
|
|
45
49
|
|
|
50
|
+
def build_interface_rdma_vpc_ipv4(subnet_id: int):
|
|
51
|
+
return LinodeInterfaceOptions(
|
|
52
|
+
firewall_id=-1,
|
|
53
|
+
rdma_vpc=LinodeInterfaceRDMAVPCOptions(
|
|
54
|
+
subnet_id=subnet_id,
|
|
55
|
+
ipv4=LinodeInterfaceRDMAVPCIPv4Options(
|
|
56
|
+
addresses=[
|
|
57
|
+
LinodeInterfaceRDMAVPCIPv4AddressOptions(
|
|
58
|
+
address="auto", primary=True
|
|
59
|
+
)
|
|
60
|
+
]
|
|
61
|
+
),
|
|
62
|
+
),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
46
66
|
def create_linode_with_legacy_config(
|
|
47
67
|
client, ip_address, label, firewall, authorized_key
|
|
48
68
|
):
|
|
@@ -75,6 +95,22 @@ def create_linode_with_standard_interfaces(
|
|
|
75
95
|
return linode
|
|
76
96
|
|
|
77
97
|
|
|
98
|
+
def create_multiple_rdma_interfaces(amount: int, subnet_id: int):
|
|
99
|
+
"""
|
|
100
|
+
Creates multiple VPC RDMA interfaces that may be needed for RDMA Linode instance
|
|
101
|
+
|
|
102
|
+
Note:
|
|
103
|
+
At least 8 separate VPC RDMA interfaces need to be created for a single RDMA linode instance
|
|
104
|
+
"""
|
|
105
|
+
interfaces = list()
|
|
106
|
+
|
|
107
|
+
for _ in range(amount):
|
|
108
|
+
rdma_iface = build_interface_rdma_vpc_ipv4(subnet_id)
|
|
109
|
+
interfaces.append(rdma_iface)
|
|
110
|
+
|
|
111
|
+
return interfaces
|
|
112
|
+
|
|
113
|
+
|
|
78
114
|
def test_linode_create_with_linode_interfaces(
|
|
79
115
|
create_vpc_with_subnet,
|
|
80
116
|
linode_with_linode_interfaces,
|
|
@@ -458,3 +494,88 @@ def test_linode_interfaces_with_reserved_ips(
|
|
|
458
494
|
assert reserved_ips_list[0].reserved == True
|
|
459
495
|
assert reserved_ips_list[0].linode_id is None
|
|
460
496
|
assert reserved_ips_list[0].assigned_entity is None
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
@pytest.mark.skipif(
|
|
500
|
+
os.getenv("RUN_RDMA_TESTS", "").strip().lower() not in {"yes", "true"},
|
|
501
|
+
reason="Linode with RDMA interfaces requires manual infra changes; set RUN_RDMA_TESTS=yes to enable",
|
|
502
|
+
)
|
|
503
|
+
def test_linode_interfaces_with_rdma_vpc_type(
|
|
504
|
+
request,
|
|
505
|
+
test_linode_client,
|
|
506
|
+
):
|
|
507
|
+
client = test_linode_client
|
|
508
|
+
region = "us-rno-1"
|
|
509
|
+
|
|
510
|
+
# Create a regular VPC with a subnet in us-rno-1
|
|
511
|
+
vpc = client.vpcs.create(
|
|
512
|
+
label=get_test_label(length=10),
|
|
513
|
+
region=region,
|
|
514
|
+
description="test description",
|
|
515
|
+
ipv6=[{"range": "auto"}],
|
|
516
|
+
)
|
|
517
|
+
request.addfinalizer(vpc.delete)
|
|
518
|
+
subnet = vpc.subnet_create(
|
|
519
|
+
label="test-subnet",
|
|
520
|
+
ipv4="10.0.0.0/24",
|
|
521
|
+
ipv6=[{"range": "auto"}],
|
|
522
|
+
)
|
|
523
|
+
request.addfinalizer(subnet.delete)
|
|
524
|
+
|
|
525
|
+
# Create an RDMA VPC with a subnet in us-rno-1
|
|
526
|
+
vpc_rdma = client.vpcs.create(
|
|
527
|
+
label=get_test_label(length=10),
|
|
528
|
+
region=region,
|
|
529
|
+
description="test description",
|
|
530
|
+
vpc_type="rdma",
|
|
531
|
+
)
|
|
532
|
+
request.addfinalizer(vpc_rdma.delete)
|
|
533
|
+
subnet_rdma = vpc_rdma.subnet_create(
|
|
534
|
+
label=get_test_label(length=10),
|
|
535
|
+
ipv4="10.0.0.0/24",
|
|
536
|
+
)
|
|
537
|
+
request.addfinalizer(subnet_rdma.delete)
|
|
538
|
+
|
|
539
|
+
# Include RDMA VPC interfaces
|
|
540
|
+
multi_ifaces = create_multiple_rdma_interfaces(8, subnet_rdma.id)
|
|
541
|
+
|
|
542
|
+
# Include (at least one) regular interface
|
|
543
|
+
multi_ifaces.append(
|
|
544
|
+
LinodeInterfaceOptions(
|
|
545
|
+
firewall_id=-1,
|
|
546
|
+
default_route=LinodeInterfaceDefaultRouteOptions(
|
|
547
|
+
ipv4=True,
|
|
548
|
+
),
|
|
549
|
+
vpc=LinodeInterfaceVPCOptions(
|
|
550
|
+
subnet_id=subnet.id,
|
|
551
|
+
ipv4=LinodeInterfaceVPCIPv4Options(
|
|
552
|
+
addresses=[
|
|
553
|
+
LinodeInterfaceVPCIPv4AddressOptions(
|
|
554
|
+
address="auto",
|
|
555
|
+
primary=True,
|
|
556
|
+
)
|
|
557
|
+
],
|
|
558
|
+
),
|
|
559
|
+
),
|
|
560
|
+
),
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
instance = client.linode.instance_create(
|
|
564
|
+
label="python-test-rdma-" + get_test_label(),
|
|
565
|
+
root_pass="aComplex@Password123",
|
|
566
|
+
image="linode/ubuntu24.04",
|
|
567
|
+
region=vpc.region,
|
|
568
|
+
ltype="g3-gpu-rtxpro6000-blackwell-rdma-8",
|
|
569
|
+
interface_generation=InterfaceGeneration.LINODE,
|
|
570
|
+
interfaces=multi_ifaces,
|
|
571
|
+
booted=False,
|
|
572
|
+
)
|
|
573
|
+
request.addfinalizer(instance.delete)
|
|
574
|
+
|
|
575
|
+
def get_linode_status():
|
|
576
|
+
instance.invalidate()
|
|
577
|
+
return instance.status == "offline"
|
|
578
|
+
|
|
579
|
+
wait_for_condition(5, 180, get_linode_status)
|
|
580
|
+
|
|
581
|
+
assert len(instance.linode_interfaces) == len(multi_ifaces)
|