linode-api4 5.26.0__tar.gz → 5.28.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.
Files changed (274) hide show
  1. {linode_api4-5.26.0/linode_api4.egg-info → linode_api4-5.28.0}/PKG-INFO +7 -7
  2. {linode_api4-5.26.0 → linode_api4-5.28.0}/README.rst +5 -5
  3. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/account.py +6 -6
  4. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/database.py +125 -9
  5. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/lke.py +12 -3
  6. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/networking.py +27 -0
  7. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/object_storage.py +40 -0
  8. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/database.py +26 -4
  9. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/linode.py +18 -1
  10. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/lke.py +33 -11
  11. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/networking.py +14 -0
  12. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/object_storage.py +52 -8
  13. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/version.py +1 -1
  14. {linode_api4-5.26.0 → linode_api4-5.28.0/linode_api4.egg-info}/PKG-INFO +7 -7
  15. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4.egg-info/SOURCES.txt +9 -1
  16. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_types.json +32 -1
  17. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_clusters.json +2 -1
  18. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_clusters_18881.json +2 -1
  19. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_buckets_us-east-1.json +3 -1
  20. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket.json +3 -1
  21. linode_api4-5.28.0/test/fixtures/object-storage_buckets_us-east_example-bucket_access.json +6 -0
  22. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/conftest.py +20 -1
  23. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/linode_client/test_linode_client.py +3 -3
  24. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/account/test_account.py +1 -1
  25. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/database/test_database.py +119 -243
  26. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/firewall/test_firewall.py +1 -1
  27. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/image/test_image.py +2 -2
  28. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/linode/test_linode.py +49 -8
  29. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/lke/test_lke.py +72 -2
  30. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/networking/test_networking.py +61 -2
  31. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/nodebalancer/test_nodebalancer.py +1 -1
  32. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/object_storage/test_obj.py +68 -7
  33. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/volume/test_volume.py +1 -1
  34. linode_api4-5.28.0/test/unit/groups/database_test.py +192 -0
  35. linode_api4-5.28.0/test/unit/groups/image_test.py +37 -0
  36. linode_api4-5.28.0/test/unit/groups/linode_test.py +118 -0
  37. linode_api4-5.28.0/test/unit/groups/lke_test.py +43 -0
  38. linode_api4-5.28.0/test/unit/groups/placement_test.py +68 -0
  39. {linode_api4-5.26.0/test/unit/objects → linode_api4-5.28.0/test/unit/groups}/region_test.py +0 -36
  40. linode_api4-5.28.0/test/unit/groups/vpc_test.py +107 -0
  41. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/database_test.py +17 -6
  42. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/image_test.py +2 -32
  43. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/linode_test.py +16 -111
  44. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/lke_test.py +73 -30
  45. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/networking_test.py +26 -1
  46. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/object_storage_test.py +27 -0
  47. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/placement_test.py +0 -42
  48. linode_api4-5.28.0/test/unit/objects/region_test.py +44 -0
  49. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/vpc_test.py +1 -50
  50. {linode_api4-5.26.0 → linode_api4-5.28.0}/LICENSE +0 -0
  51. {linode_api4-5.26.0 → linode_api4-5.28.0}/MANIFEST.in +0 -0
  52. {linode_api4-5.26.0 → linode_api4-5.28.0}/examples/install-on-linode/app.py +0 -0
  53. {linode_api4-5.26.0 → linode_api4-5.28.0}/examples/install-on-linode/make_stackscript.py +0 -0
  54. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/__init__.py +0 -0
  55. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/common.py +0 -0
  56. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/errors.py +0 -0
  57. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/__init__.py +0 -0
  58. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/beta.py +0 -0
  59. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/domain.py +0 -0
  60. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/group.py +0 -0
  61. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/image.py +0 -0
  62. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/linode.py +0 -0
  63. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/longview.py +0 -0
  64. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/nodebalancer.py +0 -0
  65. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/placement.py +0 -0
  66. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/polling.py +0 -0
  67. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/profile.py +0 -0
  68. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/region.py +0 -0
  69. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/support.py +0 -0
  70. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/tag.py +0 -0
  71. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/volume.py +0 -0
  72. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/groups/vpc.py +0 -0
  73. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/linode_client.py +0 -0
  74. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/login_client.py +0 -0
  75. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/__init__.py +0 -0
  76. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/account.py +0 -0
  77. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/base.py +0 -0
  78. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/beta.py +0 -0
  79. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/dbase.py +0 -0
  80. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/domain.py +0 -0
  81. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/filtering.py +0 -0
  82. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/image.py +0 -0
  83. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/longview.py +0 -0
  84. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/nodebalancer.py +0 -0
  85. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/placement.py +0 -0
  86. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/profile.py +0 -0
  87. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/region.py +0 -0
  88. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/serializable.py +0 -0
  89. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/support.py +0 -0
  90. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/tag.py +0 -0
  91. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/volume.py +0 -0
  92. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/objects/vpc.py +0 -0
  93. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/paginated_list.py +0 -0
  94. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/polling.py +0 -0
  95. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4/util.py +0 -0
  96. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4.egg-info/dependency_links.txt +0 -0
  97. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4.egg-info/requires.txt +0 -0
  98. {linode_api4-5.26.0 → linode_api4-5.28.0}/linode_api4.egg-info/top_level.txt +0 -0
  99. {linode_api4-5.26.0 → linode_api4-5.28.0}/pyproject.toml +0 -0
  100. {linode_api4-5.26.0 → linode_api4-5.28.0}/setup.cfg +0 -0
  101. {linode_api4-5.26.0 → linode_api4-5.28.0}/setup.py +0 -0
  102. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/__init__.py +0 -0
  103. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account.json +0 -0
  104. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_availability.json +0 -0
  105. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_availability_us-east.json +0 -0
  106. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_betas.json +0 -0
  107. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_betas_cool.json +0 -0
  108. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_child-accounts.json +0 -0
  109. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_child-accounts_123456.json +0 -0
  110. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_child-accounts_123456_token.json +0 -0
  111. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_events_123.json +0 -0
  112. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_invoices.json +0 -0
  113. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_invoices_123.json +0 -0
  114. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_invoices_123456_items.json +0 -0
  115. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_logins.json +0 -0
  116. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_logins_123.json +0 -0
  117. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_maintenance.json +0 -0
  118. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_notifications.json +0 -0
  119. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_oauth-clients_2737bf16b39ab5d7b4a1.json +0 -0
  120. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_payment-method_123.json +0 -0
  121. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_payment-methods.json +0 -0
  122. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_payments.json +0 -0
  123. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_promo-codes.json +0 -0
  124. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_service-transfers.json +0 -0
  125. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_service-transfers_12345.json +0 -0
  126. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_settings.json +0 -0
  127. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_transfer.json +0 -0
  128. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/account_users_test-user.json +0 -0
  129. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/betas.json +0 -0
  130. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/betas_active.json +0 -0
  131. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_engines.json +0 -0
  132. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_instances.json +0 -0
  133. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_mysql_instances.json +0 -0
  134. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_mysql_instances_123_backups.json +0 -0
  135. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_mysql_instances_123_backups_456_restore.json +0 -0
  136. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_mysql_instances_123_credentials.json +0 -0
  137. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_mysql_instances_123_credentials_reset.json +0 -0
  138. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_mysql_instances_123_patch.json +0 -0
  139. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_mysql_instances_123_ssl.json +0 -0
  140. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_postgresql_instances.json +0 -0
  141. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_postgresql_instances_123_backups.json +0 -0
  142. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_postgresql_instances_123_backups_456_restore.json +0 -0
  143. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_postgresql_instances_123_credentials.json +0 -0
  144. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_postgresql_instances_123_credentials_reset.json +0 -0
  145. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_postgresql_instances_123_patch.json +0 -0
  146. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_postgresql_instances_123_ssl.json +0 -0
  147. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/databases_types.json +0 -0
  148. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/domains.json +0 -0
  149. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/domains_12345_clone.json +0 -0
  150. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/domains_12345_records.json +0 -0
  151. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/domains_12345_zone-file.json +0 -0
  152. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/domains_import.json +0 -0
  153. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/images.json +0 -0
  154. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/images_private_123_regions.json +0 -0
  155. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/images_private_1337.json +0 -0
  156. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/images_upload.json +0 -0
  157. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances.json +0 -0
  158. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_backups.json +0 -0
  159. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_configs.json +0 -0
  160. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_configs_456789.json +0 -0
  161. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_configs_456789_interfaces.json +0 -0
  162. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_123.json +0 -0
  163. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_123_put.json +0 -0
  164. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_321.json +0 -0
  165. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_456.json +0 -0
  166. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_disks.json +0 -0
  167. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_disks_12345_clone.json +0 -0
  168. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_firewalls.json +0 -0
  169. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_ips.json +0 -0
  170. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_nodebalancers.json +0 -0
  171. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_transfer.json +0 -0
  172. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_transfer_2023_4.json +0 -0
  173. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_instances_123_volumes.json +0 -0
  174. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_stackscripts_10079.json +0 -0
  175. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/linode_types_g6-nanode-1.json +0 -0
  176. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_clusters_18881_control__plane__acl.json +0 -0
  177. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_clusters_18881_dashboard.json +0 -0
  178. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_clusters_18881_nodes_123456.json +0 -0
  179. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_clusters_18881_pools_456.json +0 -0
  180. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_types.json +0 -0
  181. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/lke_versions.json +0 -0
  182. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/longview_clients.json +0 -0
  183. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/longview_plan.json +0 -0
  184. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/longview_subscriptions.json +0 -0
  185. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/mongodb.json +0 -0
  186. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/network-transfer_prices.json +0 -0
  187. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_firewalls.json +0 -0
  188. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_firewalls_123.json +0 -0
  189. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_firewalls_123_devices.json +0 -0
  190. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_firewalls_123_devices_123.json +0 -0
  191. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_firewalls_123_rules.json +0 -0
  192. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_ips_127.0.0.1.json +0 -0
  193. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_ipv6_pools.json +0 -0
  194. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_ipv6_ranges.json +0 -0
  195. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_ipv6_ranges_2600%3A3c01%3A%3A.json +0 -0
  196. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/networking_vlans.json +0 -0
  197. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers.json +0 -0
  198. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers_123456.json +0 -0
  199. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers_123456_configs.json +0 -0
  200. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers_123456_configs_65432_nodes.json +0 -0
  201. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers_12345_configs_4567_rebuild.json +0 -0
  202. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers_12345_firewalls.json +0 -0
  203. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers_12345_stats.json +0 -0
  204. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/nodebalancers_types.json +0 -0
  205. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_buckets.json +0 -0
  206. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-acl.json +0 -0
  207. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-list.json +0 -0
  208. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-url.json +0 -0
  209. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_ssl.json +0 -0
  210. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_clusters.json +0 -0
  211. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_keys.json +0 -0
  212. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/object-storage_transfer.json +0 -0
  213. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/placement_groups.json +0 -0
  214. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/placement_groups_123.json +0 -0
  215. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile.json +0 -0
  216. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile_device_123.json +0 -0
  217. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile_devices.json +0 -0
  218. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile_logins.json +0 -0
  219. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile_logins_123.json +0 -0
  220. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile_preferences.json +0 -0
  221. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile_security-questions.json +0 -0
  222. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/profile_sshkeys.json +0 -0
  223. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/regions.json +0 -0
  224. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/regions_availability.json +0 -0
  225. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/regions_us-east_availability.json +0 -0
  226. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/support_tickets_123.json +0 -0
  227. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/tags.json +0 -0
  228. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/tags_nothing.json +0 -0
  229. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/tags_something.json +0 -0
  230. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/testmappedobj1.json +0 -0
  231. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/volumes.json +0 -0
  232. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/volumes_types.json +0 -0
  233. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/vpcs.json +0 -0
  234. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/vpcs_123456.json +0 -0
  235. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/vpcs_123456_ips.json +0 -0
  236. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/vpcs_123456_subnets.json +0 -0
  237. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/vpcs_123456_subnets_789.json +0 -0
  238. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/fixtures/vpcs_ips.json +0 -0
  239. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/__init__.py +0 -0
  240. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/helpers.py +0 -0
  241. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/linode_client/__init__.py +0 -0
  242. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/linode_client/test_errors.py +0 -0
  243. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/linode_client/test_retry.py +0 -0
  244. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/login_client/test_login_client.py +0 -0
  245. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/__init__.py +0 -0
  246. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/domain/test_domain.py +0 -0
  247. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/longview/test_longview.py +0 -0
  248. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/placement/test_placement.py +0 -0
  249. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/profile/test_profile.py +0 -0
  250. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/tag/test_tag.py +0 -0
  251. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/integration/models/vpc/test_vpc.py +0 -0
  252. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/__init__.py +0 -0
  253. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/base.py +0 -0
  254. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/errors_test.py +0 -0
  255. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/fixtures.py +0 -0
  256. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/groups/__init__.py +0 -0
  257. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/groups/object_storage_test.py +0 -0
  258. {linode_api4-5.26.0/test/unit/objects → linode_api4-5.28.0/test/unit/groups}/polling_test.py +0 -0
  259. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/linode_client_test.py +0 -0
  260. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/login_client_test.py +0 -0
  261. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/account_test.py +0 -0
  262. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/beta_test.py +0 -0
  263. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/domain_test.py +0 -0
  264. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/firewall_test.py +0 -0
  265. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/longview_test.py +0 -0
  266. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/mapped_object_test.py +0 -0
  267. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/nodebalancers_test.py +0 -0
  268. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/profile_test.py +0 -0
  269. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/serializable_test.py +0 -0
  270. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/support_test.py +0 -0
  271. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/tag_test.py +0 -0
  272. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/objects/volume_test.py +0 -0
  273. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/paginated_list_test.py +0 -0
  274. {linode_api4-5.26.0 → linode_api4-5.28.0}/test/unit/util_test.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: linode_api4
3
- Version: 5.26.0
3
+ Version: 5.28.0
4
4
  Summary: The official Python SDK for Linode API v4
5
5
  Author-email: Linode <devs@linode.com>
6
6
  License: BSD-3-Clause
@@ -198,16 +198,16 @@ Running the tests
198
198
  ^^^^^^^^^^^^^^^^^
199
199
  Run the tests locally using the make command. Run the entire test suite using command below::
200
200
 
201
- make testint
201
+ make test-int
202
202
 
203
203
  To run a specific package/suite, use the environment variable `TEST_SUITE` using directory names in `integration/...` folder ::
204
204
 
205
- make TEST_SUITE="account" testint // Runs tests in `integration/models/account` directory
206
- make TEST_SUITE="linode_client" testint // Runs tests in `integration/linode_client` directory
205
+ make TEST_SUITE="account" test-int // Runs tests in `integration/models/account` directory
206
+ make TEST_SUITE="linode_client" test-int // Runs tests in `integration/linode_client` directory
207
207
 
208
- Lastly to run a specific test case use environment variable `TEST_CASE` with `testint` command::
208
+ Lastly to run a specific test case use environment variable `TEST_CASE` with `test-int` command::
209
209
 
210
- make TEST_CASE=test_get_domain_record testint
210
+ make TEST_CASE=test_get_domain_record test-int
211
211
 
212
212
  Documentation
213
213
  -------------
@@ -148,16 +148,16 @@ Running the tests
148
148
  ^^^^^^^^^^^^^^^^^
149
149
  Run the tests locally using the make command. Run the entire test suite using command below::
150
150
 
151
- make testint
151
+ make test-int
152
152
 
153
153
  To run a specific package/suite, use the environment variable `TEST_SUITE` using directory names in `integration/...` folder ::
154
154
 
155
- make TEST_SUITE="account" testint // Runs tests in `integration/models/account` directory
156
- make TEST_SUITE="linode_client" testint // Runs tests in `integration/linode_client` directory
155
+ make TEST_SUITE="account" test-int // Runs tests in `integration/models/account` directory
156
+ make TEST_SUITE="linode_client" test-int // Runs tests in `integration/linode_client` directory
157
157
 
158
- Lastly to run a specific test case use environment variable `TEST_CASE` with `testint` command::
158
+ Lastly to run a specific test case use environment variable `TEST_CASE` with `test-int` command::
159
159
 
160
- make TEST_CASE=test_get_domain_record testint
160
+ make TEST_CASE=test_get_domain_record test-int
161
161
 
162
162
  Documentation
163
163
  -------------
@@ -101,7 +101,7 @@ class AccountGroup(Group):
101
101
  s = AccountSettings(self.client, result["managed"], result)
102
102
  return s
103
103
 
104
- def invoices(self):
104
+ def invoices(self, *filters):
105
105
  """
106
106
  Returns Invoices issued to this account.
107
107
 
@@ -112,9 +112,9 @@ class AccountGroup(Group):
112
112
  :returns: Invoices issued to this account.
113
113
  :rtype: PaginatedList of Invoice
114
114
  """
115
- return self.client._get_and_filter(Invoice)
115
+ return self.client._get_and_filter(Invoice, *filters)
116
116
 
117
- def payments(self):
117
+ def payments(self, *filters):
118
118
  """
119
119
  Returns a list of Payments made on this account.
120
120
 
@@ -123,7 +123,7 @@ class AccountGroup(Group):
123
123
  :returns: A list of payments made on this account.
124
124
  :rtype: PaginatedList of Payment
125
125
  """
126
- return self.client._get_and_filter(Payment)
126
+ return self.client._get_and_filter(Payment, *filters)
127
127
 
128
128
  def oauth_clients(self, *filters):
129
129
  """
@@ -337,7 +337,7 @@ class AccountGroup(Group):
337
337
  json=resp,
338
338
  )
339
339
 
340
- def service_transfers(self):
340
+ def service_transfers(self, *filters):
341
341
  """
342
342
  Returns a collection of all created and accepted Service Transfers for this account, regardless of the user that created or accepted the transfer.
343
343
 
@@ -347,7 +347,7 @@ class AccountGroup(Group):
347
347
  :rtype: PaginatedList of ServiceTransfer
348
348
  """
349
349
 
350
- return self.client._get_and_filter(ServiceTransfer)
350
+ return self.client._get_and_filter(ServiceTransfer, *filters)
351
351
 
352
352
  def service_transfer_create(self, entities):
353
353
  """
@@ -1,13 +1,14 @@
1
1
  from linode_api4.errors import UnexpectedResponseError
2
2
  from linode_api4.groups import Group
3
3
  from linode_api4.objects import (
4
- Base,
5
4
  Database,
6
5
  DatabaseEngine,
7
6
  DatabaseType,
8
7
  MySQLDatabase,
9
8
  PostgreSQLDatabase,
9
+ drop_null_keys,
10
10
  )
11
+ from linode_api4.objects.base import _flatten_request_body_recursive
11
12
 
12
13
 
13
14
  class DatabaseGroup(Group):
@@ -126,13 +127,71 @@ class DatabaseGroup(Group):
126
127
 
127
128
  params = {
128
129
  "label": label,
129
- "region": region.id if issubclass(type(region), Base) else region,
130
- "engine": engine.id if issubclass(type(engine), Base) else engine,
131
- "type": ltype.id if issubclass(type(ltype), Base) else ltype,
130
+ "region": region,
131
+ "engine": engine,
132
+ "type": ltype,
132
133
  }
133
134
  params.update(kwargs)
134
135
 
135
- result = self.client.post("/databases/mysql/instances", data=params)
136
+ result = self.client.post(
137
+ "/databases/mysql/instances",
138
+ data=_flatten_request_body_recursive(drop_null_keys(params)),
139
+ )
140
+
141
+ if "id" not in result:
142
+ raise UnexpectedResponseError(
143
+ "Unexpected response when creating MySQL Database", json=result
144
+ )
145
+
146
+ d = MySQLDatabase(self.client, result["id"], result)
147
+ return d
148
+
149
+ def mysql_fork(self, source, restore_time, **kwargs):
150
+ """
151
+ Forks an :any:`MySQLDatabase` on this account with
152
+ the given restore_time. label, region, engine, and ltype are optional.
153
+ For example::
154
+
155
+ client = LinodeClient(TOKEN)
156
+
157
+ db_to_fork = client.database.mysql_instances()[0]
158
+
159
+ new_fork = client.database.mysql_fork(
160
+ db_to_fork.id,
161
+ db_to_fork.updated,
162
+ label="new-fresh-label"
163
+ )
164
+
165
+ API Documentation: https://techdocs.akamai.com/linode-api/reference/post-databases-mysql-instances
166
+
167
+ :param source: The id of the source database
168
+ :type source: int
169
+ :param restore_time: The timestamp for the fork
170
+ :type restore_time: datetime
171
+ :param label: The name for this cluster
172
+ :type label: str
173
+ :param region: The region to deploy this cluster in
174
+ :type region: str | Region
175
+ :param engine: The engine to deploy this cluster with
176
+ :type engine: str | Engine
177
+ :param ltype: The Linode Type to use for this cluster
178
+ :type ltype: str | Type
179
+ """
180
+
181
+ params = {
182
+ "fork": {
183
+ "source": source,
184
+ "restore_time": restore_time.strftime("%Y-%m-%dT%H:%M:%S"),
185
+ }
186
+ }
187
+ if "ltype" in kwargs:
188
+ params["type"] = kwargs["ltype"]
189
+ params.update(kwargs)
190
+
191
+ result = self.client.post(
192
+ "/databases/mysql/instances",
193
+ data=_flatten_request_body_recursive(drop_null_keys(params)),
194
+ )
136
195
 
137
196
  if "id" not in result:
138
197
  raise UnexpectedResponseError(
@@ -191,14 +250,71 @@ class DatabaseGroup(Group):
191
250
 
192
251
  params = {
193
252
  "label": label,
194
- "region": region.id if issubclass(type(region), Base) else region,
195
- "engine": engine.id if issubclass(type(engine), Base) else engine,
196
- "type": ltype.id if issubclass(type(ltype), Base) else ltype,
253
+ "region": region,
254
+ "engine": engine,
255
+ "type": ltype,
256
+ }
257
+ params.update(kwargs)
258
+
259
+ result = self.client.post(
260
+ "/databases/postgresql/instances",
261
+ data=_flatten_request_body_recursive(drop_null_keys(params)),
262
+ )
263
+
264
+ if "id" not in result:
265
+ raise UnexpectedResponseError(
266
+ "Unexpected response when creating PostgreSQL Database",
267
+ json=result,
268
+ )
269
+
270
+ d = PostgreSQLDatabase(self.client, result["id"], result)
271
+ return d
272
+
273
+ def postgresql_fork(self, source, restore_time, **kwargs):
274
+ """
275
+ Forks an :any:`PostgreSQLDatabase` on this account with
276
+ the given restore_time. label, region, engine, and ltype are optional.
277
+ For example::
278
+
279
+ client = LinodeClient(TOKEN)
280
+
281
+ db_to_fork = client.database.postgresql_instances()[0]
282
+
283
+ new_fork = client.database.postgresql_fork(
284
+ db_to_fork.id,
285
+ db_to_fork.updated,
286
+ label="new-fresh-label"
287
+ )
288
+
289
+ API Documentation: https://techdocs.akamai.com/linode-api/reference/post-databases-postgresql-instances
290
+
291
+ :param source: The id of the source database
292
+ :type source: int
293
+ :param restore_time: The timestamp for the fork
294
+ :type restore_time: datetime
295
+ :param label: The name for this cluster
296
+ :type label: str
297
+ :param region: The region to deploy this cluster in
298
+ :type region: str | Region
299
+ :param engine: The engine to deploy this cluster with
300
+ :type engine: str | Engine
301
+ :param ltype: The Linode Type to use for this cluster
302
+ :type ltype: str | Type
303
+ """
304
+
305
+ params = {
306
+ "fork": {
307
+ "source": source,
308
+ "restore_time": restore_time.strftime("%Y-%m-%dT%H:%M:%S"),
309
+ }
197
310
  }
311
+ if "ltype" in kwargs:
312
+ params["type"] = kwargs["ltype"]
198
313
  params.update(kwargs)
199
314
 
200
315
  result = self.client.post(
201
- "/databases/postgresql/instances", data=params
316
+ "/databases/postgresql/instances",
317
+ data=_flatten_request_body_recursive(drop_null_keys(params)),
202
318
  )
203
319
 
204
320
  if "id" not in result:
@@ -66,6 +66,7 @@ class LKEGroup(Group):
66
66
  control_plane: Union[
67
67
  LKEClusterControlPlaneOptions, Dict[str, Any]
68
68
  ] = None,
69
+ apl_enabled: bool = False,
69
70
  **kwargs,
70
71
  ):
71
72
  """
@@ -100,8 +101,12 @@ class LKEGroup(Group):
100
101
  formatted dicts.
101
102
  :param kube_version: The version of Kubernetes to use
102
103
  :type kube_version: KubeVersion or str
103
- :param control_plane: Dict[str, Any] or LKEClusterControlPlaneRequest
104
- :type control_plane: The control plane configuration of this LKE cluster.
104
+ :param control_plane: The control plane configuration of this LKE cluster.
105
+ :type control_plane: Dict[str, Any] or LKEClusterControlPlaneRequest
106
+ :param apl_enabled: Whether this cluster should use APL.
107
+ NOTE: This endpoint is in beta and may only
108
+ function if base_url is set to `https://api.linode.com/v4beta`.
109
+ :type apl_enabled: bool
105
110
  :param kwargs: Any other arguments to pass along to the API. See the API
106
111
  docs for possible values.
107
112
 
@@ -120,9 +125,13 @@ class LKEGroup(Group):
120
125
  }
121
126
  params.update(kwargs)
122
127
 
128
+ # Prevent errors for users without access to APL
129
+ if apl_enabled:
130
+ params["apl_enabled"] = apl_enabled
131
+
123
132
  result = self.client.post(
124
133
  "/lke/clusters",
125
- data=_flatten_request_body_recursive(drop_null_keys(params)),
134
+ data=drop_null_keys(_flatten_request_body_recursive(params)),
126
135
  )
127
136
 
128
137
  if "id" not in result:
@@ -367,3 +367,30 @@ class NetworkingGroup(Group):
367
367
  return self.client._get_and_filter(
368
368
  NetworkTransferPrice, *filters, endpoint="/network-transfer/prices"
369
369
  )
370
+
371
+ def delete_vlan(self, vlan, region):
372
+ """
373
+ This operation deletes a VLAN.
374
+ You can't delete a VLAN if it's still attached to a Linode.
375
+
376
+ API Documentation: https://techdocs.akamai.com/linode-api/reference/delete-vlan
377
+
378
+ :param vlan: The label of the VLAN to be deleted.
379
+ :type vlan: str or VLAN
380
+ :param region: The VLAN's region.
381
+ :type region: str or Region
382
+ """
383
+ if isinstance(region, Region):
384
+ region = region.id
385
+
386
+ if isinstance(vlan, VLAN):
387
+ vlan = vlan.label
388
+ resp = self.client.delete(
389
+ "/networking/vlans/{}/{}".format(region, vlan),
390
+ model=self,
391
+ )
392
+
393
+ if "error" in resp:
394
+ return False
395
+
396
+ return True
@@ -5,6 +5,11 @@ from urllib import parse
5
5
 
6
6
  from deprecated import deprecated
7
7
 
8
+ from linode_api4 import (
9
+ ObjectStorageEndpoint,
10
+ ObjectStorageEndpointType,
11
+ PaginatedList,
12
+ )
8
13
  from linode_api4.errors import UnexpectedResponseError
9
14
  from linode_api4.groups import Group
10
15
  from linode_api4.objects import (
@@ -272,6 +277,30 @@ class ObjectStorageGroup(Group):
272
277
 
273
278
  return MappedObject(**result)
274
279
 
280
+ def endpoints(self, *filters) -> PaginatedList:
281
+ """
282
+ Returns a paginated list of all Object Storage endpoints available in your account.
283
+
284
+ This is intended to be called from the :any:`LinodeClient`
285
+ class, like this::
286
+
287
+ endpoints = client.object_storage.endpoints()
288
+
289
+ API Documentation: https://techdocs.akamai.com/linode-api/reference/get-object-storage-endpoints
290
+
291
+ :param filters: Any number of filters to apply to this query.
292
+ See :doc:`Filtering Collections</linode_api4/objects/filtering>`
293
+ for more details on filtering.
294
+
295
+ :returns: A list of Object Storage Endpoints that matched the query.
296
+ :rtype: PaginatedList of ObjectStorageEndpoint
297
+ """
298
+ return self.client._get_and_filter(
299
+ ObjectStorageEndpoint,
300
+ *filters,
301
+ endpoint="/object-storage/endpoints",
302
+ )
303
+
275
304
  def buckets(self, *filters):
276
305
  """
277
306
  Returns a paginated list of all Object Storage Buckets that you own.
@@ -299,6 +328,8 @@ class ObjectStorageGroup(Group):
299
328
  label: str,
300
329
  acl: ObjectStorageACL = ObjectStorageACL.PRIVATE,
301
330
  cors_enabled=False,
331
+ s3_endpoint: Optional[str] = None,
332
+ endpoint_type: Optional[ObjectStorageEndpointType] = None,
302
333
  ):
303
334
  """
304
335
  Creates an Object Storage Bucket in the specified cluster. Accounts with
@@ -320,6 +351,13 @@ class ObjectStorageGroup(Group):
320
351
  should be created.
321
352
  :type cluster: str
322
353
 
354
+ :param endpoint_type: The type of s3_endpoint available to the active user in this region.
355
+ :type endpoint_type: str
356
+ Enum: E0,E1,E2,E3
357
+
358
+ :param s3_endpoint: The active user's s3 endpoint URL, based on the endpoint_type and region.
359
+ :type s3_endpoint: str
360
+
323
361
  :param cors_enabled: If true, the bucket will be created with CORS enabled for
324
362
  all origins. For more fine-grained controls of CORS, use
325
363
  the S3 API directly.
@@ -346,6 +384,8 @@ class ObjectStorageGroup(Group):
346
384
  "label": label,
347
385
  "acl": acl,
348
386
  "cors_enabled": cors_enabled,
387
+ "s3_endpoint": s3_endpoint,
388
+ "endpoint_type": endpoint_type,
349
389
  }
350
390
 
351
391
  if self.is_cluster(cluster_or_region_id):
@@ -1,3 +1,5 @@
1
+ from deprecated import deprecated
2
+
1
3
  from linode_api4.objects import Base, DerivedBase, MappedObject, Property
2
4
 
3
5
 
@@ -63,6 +65,9 @@ class DatabaseEngine(Base):
63
65
  Base.invalidate(self)
64
66
 
65
67
 
68
+ @deprecated(
69
+ reason="Backups are not supported for non-legacy database clusters."
70
+ )
66
71
  class DatabaseBackup(DerivedBase):
67
72
  """
68
73
  A generic Managed Database backup.
@@ -97,6 +102,9 @@ class DatabaseBackup(DerivedBase):
97
102
  )
98
103
 
99
104
 
105
+ @deprecated(
106
+ reason="Backups are not supported for non-legacy database clusters."
107
+ )
100
108
  class MySQLDatabaseBackup(DatabaseBackup):
101
109
  """
102
110
  A backup for an accessible Managed MySQL Database.
@@ -107,6 +115,9 @@ class MySQLDatabaseBackup(DatabaseBackup):
107
115
  api_endpoint = "/databases/mysql/instances/{database_id}/backups/{id}"
108
116
 
109
117
 
118
+ @deprecated(
119
+ reason="Backups are not supported for non-legacy database clusters."
120
+ )
110
121
  class PostgreSQLDatabaseBackup(DatabaseBackup):
111
122
  """
112
123
  A backup for an accessible Managed PostgreSQL Database.
@@ -131,7 +142,7 @@ class MySQLDatabase(Base):
131
142
  "label": Property(mutable=True),
132
143
  "allow_list": Property(mutable=True, unordered=True),
133
144
  "backups": Property(derived_class=MySQLDatabaseBackup),
134
- "cluster_size": Property(),
145
+ "cluster_size": Property(mutable=True),
135
146
  "created": Property(is_datetime=True),
136
147
  "encrypted": Property(),
137
148
  "engine": Property(),
@@ -141,7 +152,9 @@ class MySQLDatabase(Base):
141
152
  "replication_type": Property(),
142
153
  "ssl_connection": Property(),
143
154
  "status": Property(volatile=True),
144
- "type": Property(),
155
+ "type": Property(mutable=True),
156
+ "fork": Property(),
157
+ "oldest_restore_time": Property(is_datetime=True),
145
158
  "updated": Property(volatile=True, is_datetime=True),
146
159
  "updates": Property(mutable=True),
147
160
  "version": Property(),
@@ -219,6 +232,9 @@ class MySQLDatabase(Base):
219
232
  "{}/patch".format(MySQLDatabase.api_endpoint), model=self
220
233
  )
221
234
 
235
+ @deprecated(
236
+ reason="Backups are not supported for non-legacy database clusters."
237
+ )
222
238
  def backup_create(self, label, **kwargs):
223
239
  """
224
240
  Creates a snapshot backup of a Managed MySQL Database.
@@ -264,7 +280,7 @@ class PostgreSQLDatabase(Base):
264
280
  "label": Property(mutable=True),
265
281
  "allow_list": Property(mutable=True, unordered=True),
266
282
  "backups": Property(derived_class=PostgreSQLDatabaseBackup),
267
- "cluster_size": Property(),
283
+ "cluster_size": Property(mutable=True),
268
284
  "created": Property(is_datetime=True),
269
285
  "encrypted": Property(),
270
286
  "engine": Property(),
@@ -275,7 +291,9 @@ class PostgreSQLDatabase(Base):
275
291
  "replication_type": Property(),
276
292
  "ssl_connection": Property(),
277
293
  "status": Property(volatile=True),
278
- "type": Property(),
294
+ "type": Property(mutable=True),
295
+ "fork": Property(),
296
+ "oldest_restore_time": Property(is_datetime=True),
279
297
  "updated": Property(volatile=True, is_datetime=True),
280
298
  "updates": Property(mutable=True),
281
299
  "version": Property(),
@@ -354,6 +372,9 @@ class PostgreSQLDatabase(Base):
354
372
  "{}/patch".format(PostgreSQLDatabase.api_endpoint), model=self
355
373
  )
356
374
 
375
+ @deprecated(
376
+ reason="Backups are not supported for non-legacy database clusters."
377
+ )
357
378
  def backup_create(self, label, **kwargs):
358
379
  """
359
380
  Creates a snapshot backup of a Managed PostgreSQL Database.
@@ -414,6 +435,7 @@ class Database(Base):
414
435
  "region": Property(),
415
436
  "status": Property(),
416
437
  "type": Property(),
438
+ "fork": Property(),
417
439
  "updated": Property(),
418
440
  "updates": Property(),
419
441
  "version": Property(),
@@ -269,6 +269,7 @@ class Type(Base):
269
269
  "vcpus": Property(),
270
270
  "gpus": Property(),
271
271
  "successor": Property(),
272
+ "accelerated_devices": Property(),
272
273
  # type_class is populated from the 'class' attribute of the returned JSON
273
274
  }
274
275
 
@@ -1638,6 +1639,22 @@ class Instance(Base):
1638
1639
  for firewall in result["data"]
1639
1640
  ]
1640
1641
 
1642
+ def apply_firewalls(self):
1643
+ """
1644
+ Reapply assigned firewalls to a Linode in case they were not applied successfully.
1645
+
1646
+ API Documentation: https://techdocs.akamai.com/linode-api/reference/post-apply-firewalls
1647
+
1648
+ :returns: Returns True if the operation was successful
1649
+ :rtype: bool
1650
+ """
1651
+
1652
+ self._client.post(
1653
+ "{}/firewalls/apply".format(Instance.api_endpoint), model=self
1654
+ )
1655
+
1656
+ return True
1657
+
1641
1658
  def nodebalancers(self):
1642
1659
  """
1643
1660
  View a list of NodeBalancers that are assigned to this Linode and readable by the requesting User.
@@ -1919,7 +1936,7 @@ class StackScript(Base):
1919
1936
  def _expand_placement_group_assignment(
1920
1937
  pg: Union[
1921
1938
  InstancePlacementGroupAssignment, "PlacementGroup", Dict[str, Any], int
1922
- ]
1939
+ ],
1923
1940
  ) -> Optional[Dict[str, Any]]:
1924
1941
  """
1925
1942
  Expands the placement group argument into a dict for use in an API request body.
@@ -14,6 +14,7 @@ from linode_api4.objects import (
14
14
  Region,
15
15
  Type,
16
16
  )
17
+ from linode_api4.util import drop_null_keys
17
18
 
18
19
 
19
20
  class LKEType(Base):
@@ -79,8 +80,6 @@ class LKEClusterControlPlaneACLOptions(JSONObject):
79
80
  """
80
81
  LKEClusterControlPlaneACLOptions is used to set
81
82
  the ACL configuration of an LKE cluster's control plane.
82
-
83
- NOTE: Control Plane ACLs may not currently be available to all users.
84
83
  """
85
84
 
86
85
  enabled: Optional[bool] = None
@@ -116,8 +115,6 @@ class LKEClusterControlPlaneACL(JSONObject):
116
115
  """
117
116
  LKEClusterControlPlaneACL describes the ACL configuration of an LKE cluster's
118
117
  control plane.
119
-
120
- NOTE: Control Plane ACLs may not currently be available to all users.
121
118
  """
122
119
 
123
120
  include_none_values = True
@@ -257,6 +254,7 @@ class LKECluster(Base):
257
254
  "k8s_version": Property(slug_relationship=KubeVersion, mutable=True),
258
255
  "pools": Property(derived_class=LKENodePool),
259
256
  "control_plane": Property(mutable=True),
257
+ "apl_enabled": Property(),
260
258
  }
261
259
 
262
260
  def invalidate(self):
@@ -336,8 +334,6 @@ class LKECluster(Base):
336
334
  """
337
335
  Gets the ACL configuration of this cluster's control plane.
338
336
 
339
- NOTE: Control Plane ACLs may not currently be available to all users.
340
-
341
337
  API Documentation: https://techdocs.akamai.com/linode-api/reference/get-lke-cluster-acl
342
338
 
343
339
  :returns: The cluster's control plane ACL configuration.
@@ -353,6 +349,36 @@ class LKECluster(Base):
353
349
 
354
350
  return LKEClusterControlPlaneACL.from_json(self._control_plane_acl)
355
351
 
352
+ @property
353
+ def apl_console_url(self) -> Optional[str]:
354
+ """
355
+ Returns the URL of this cluster's APL installation if this cluster
356
+ is APL-enabled, else None.
357
+
358
+ :returns: The URL of the APL console for this cluster.
359
+ :rtype: str or None
360
+ """
361
+
362
+ if not self.apl_enabled:
363
+ return None
364
+
365
+ return f"https://console.lke{self.id}.akamai-apl.net"
366
+
367
+ @property
368
+ def apl_health_check_url(self) -> Optional[str]:
369
+ """
370
+ Returns the URL of this cluster's APL health check endpoint if this cluster
371
+ is APL-enabled, else None.
372
+
373
+ :returns: The URL of the APL console for this cluster.
374
+ :rtype: str or None
375
+ """
376
+
377
+ if not self.apl_enabled:
378
+ return None
379
+
380
+ return f"https://auth.lke{self.id}.akamai-apl.net/ready"
381
+
356
382
  def node_pool_create(
357
383
  self,
358
384
  node_type: Union[Type, str],
@@ -527,8 +553,6 @@ class LKECluster(Base):
527
553
  """
528
554
  Updates the ACL configuration for this cluster's control plane.
529
555
 
530
- NOTE: Control Plane ACLs may not currently be available to all users.
531
-
532
556
  API Documentation: https://techdocs.akamai.com/linode-api/reference/put-lke-cluster-acl
533
557
 
534
558
  :param acl: The ACL configuration to apply to this cluster.
@@ -543,7 +567,7 @@ class LKECluster(Base):
543
567
  result = self._client.put(
544
568
  f"{LKECluster.api_endpoint}/control_plane_acl",
545
569
  model=self,
546
- data={"acl": acl},
570
+ data={"acl": drop_null_keys(acl)},
547
571
  )
548
572
 
549
573
  acl = result.get("acl")
@@ -558,8 +582,6 @@ class LKECluster(Base):
558
582
  This has the same effect as calling control_plane_acl_update with the `enabled` field
559
583
  set to False. Access controls are disabled and all rules are deleted.
560
584
 
561
- NOTE: Control Plane ACLs may not currently be available to all users.
562
-
563
585
  API Documentation: https://techdocs.akamai.com/linode-api/reference/delete-lke-cluster-acl
564
586
  """
565
587
  self._client.delete(
@@ -112,6 +112,20 @@ class IPAddress(Base):
112
112
 
113
113
  return {"address": self.address, "linode_id": linode.id}
114
114
 
115
+ def delete(self):
116
+ """
117
+ Override the delete() function from Base to use the correct endpoint.
118
+ """
119
+ resp = self._client.delete(
120
+ "/linode/instances/{}/ips/{}".format(self.linode_id, self.address),
121
+ model=self,
122
+ )
123
+
124
+ if "error" in resp:
125
+ return False
126
+ self.invalidate()
127
+ return True
128
+
115
129
 
116
130
  @dataclass
117
131
  class VPCIPAddress(JSONObject):