linode-api4 5.41.0__tar.gz → 5.42.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 (363) hide show
  1. {linode_api4-5.41.0/linode_api4.egg-info → linode_api4-5.42.0}/PKG-INFO +4 -3
  2. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/linode.py +97 -52
  3. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/lke.py +8 -0
  4. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/util.py +8 -1
  5. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/version.py +1 -1
  6. {linode_api4-5.41.0 → linode_api4-5.42.0/linode_api4.egg-info}/PKG-INFO +4 -3
  7. {linode_api4-5.41.0 → linode_api4-5.42.0}/pyproject.toml +4 -3
  8. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/database/test_database.py +7 -1
  9. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/database/test_database_engine_config.py +1 -1
  10. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/linode/test_linode.py +9 -0
  11. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/lke/test_lke.py +15 -0
  12. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/volume/test_blockstorage.py +27 -0
  13. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/linode_test.py +41 -0
  14. {linode_api4-5.41.0 → linode_api4-5.42.0}/LICENSE +0 -0
  15. {linode_api4-5.41.0 → linode_api4-5.42.0}/MANIFEST.in +0 -0
  16. {linode_api4-5.41.0 → linode_api4-5.42.0}/README.rst +0 -0
  17. {linode_api4-5.41.0 → linode_api4-5.42.0}/examples/install-on-linode/app.py +0 -0
  18. {linode_api4-5.41.0 → linode_api4-5.42.0}/examples/install-on-linode/make_stackscript.py +0 -0
  19. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/__init__.py +0 -0
  20. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/common.py +0 -0
  21. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/errors.py +0 -0
  22. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/__init__.py +0 -0
  23. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/account.py +0 -0
  24. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/beta.py +0 -0
  25. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/database.py +0 -0
  26. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/domain.py +0 -0
  27. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/group.py +0 -0
  28. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/image.py +0 -0
  29. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/image_share_group.py +0 -0
  30. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/linode.py +0 -0
  31. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/lke.py +0 -0
  32. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/lke_tier.py +0 -0
  33. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/lock.py +0 -0
  34. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/longview.py +0 -0
  35. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/maintenance.py +0 -0
  36. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/monitor.py +0 -0
  37. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/monitor_api.py +0 -0
  38. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/networking.py +0 -0
  39. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/nodebalancer.py +0 -0
  40. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/object_storage.py +0 -0
  41. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/placement.py +0 -0
  42. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/polling.py +0 -0
  43. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/profile.py +0 -0
  44. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/region.py +0 -0
  45. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/support.py +0 -0
  46. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/tag.py +0 -0
  47. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/volume.py +0 -0
  48. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/groups/vpc.py +0 -0
  49. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/linode_client.py +0 -0
  50. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/login_client.py +0 -0
  51. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/__init__.py +0 -0
  52. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/account.py +0 -0
  53. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/base.py +0 -0
  54. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/beta.py +0 -0
  55. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/database.py +0 -0
  56. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/dbase.py +0 -0
  57. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/domain.py +0 -0
  58. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/filtering.py +0 -0
  59. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/image.py +0 -0
  60. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/image_share_group.py +0 -0
  61. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/linode_interfaces.py +0 -0
  62. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/lock.py +0 -0
  63. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/longview.py +0 -0
  64. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/monitor.py +0 -0
  65. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/monitor_api.py +0 -0
  66. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/networking.py +0 -0
  67. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/nodebalancer.py +0 -0
  68. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/object_storage.py +0 -0
  69. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/placement.py +0 -0
  70. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/profile.py +0 -0
  71. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/region.py +0 -0
  72. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/serializable.py +0 -0
  73. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/support.py +0 -0
  74. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/tag.py +0 -0
  75. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/volume.py +0 -0
  76. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/objects/vpc.py +0 -0
  77. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/paginated_list.py +0 -0
  78. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4/polling.py +0 -0
  79. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4.egg-info/SOURCES.txt +0 -0
  80. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4.egg-info/dependency_links.txt +0 -0
  81. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4.egg-info/requires.txt +0 -0
  82. {linode_api4-5.41.0 → linode_api4-5.42.0}/linode_api4.egg-info/top_level.txt +0 -0
  83. {linode_api4-5.41.0 → linode_api4-5.42.0}/setup.cfg +0 -0
  84. {linode_api4-5.41.0 → linode_api4-5.42.0}/setup.py +0 -0
  85. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/__init__.py +0 -0
  86. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account.json +0 -0
  87. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_availability.json +0 -0
  88. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_availability_us-east.json +0 -0
  89. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_betas.json +0 -0
  90. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_betas_cool.json +0 -0
  91. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_child-accounts.json +0 -0
  92. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_child-accounts_123456.json +0 -0
  93. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_child-accounts_123456_token.json +0 -0
  94. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_events_123.json +0 -0
  95. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_invoices.json +0 -0
  96. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_invoices_123.json +0 -0
  97. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_invoices_123456_items.json +0 -0
  98. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_logins.json +0 -0
  99. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_logins_123.json +0 -0
  100. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_maintenance.json +0 -0
  101. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_notifications.json +0 -0
  102. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_oauth-clients_2737bf16b39ab5d7b4a1.json +0 -0
  103. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_payment-method_123.json +0 -0
  104. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_payment-methods.json +0 -0
  105. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_payments.json +0 -0
  106. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_promo-codes.json +0 -0
  107. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_service-transfers.json +0 -0
  108. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_service-transfers_12345.json +0 -0
  109. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_settings.json +0 -0
  110. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_transfer.json +0 -0
  111. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/account_users_test-user.json +0 -0
  112. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/betas.json +0 -0
  113. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/betas_active.json +0 -0
  114. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_engines.json +0 -0
  115. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_instances.json +0 -0
  116. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_config.json +0 -0
  117. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_instances.json +0 -0
  118. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_instances_123_credentials.json +0 -0
  119. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_instances_123_credentials_reset.json +0 -0
  120. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_instances_123_patch.json +0 -0
  121. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_instances_123_resume.json +0 -0
  122. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_instances_123_ssl.json +0 -0
  123. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_mysql_instances_123_suspend.json +0 -0
  124. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_config.json +0 -0
  125. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_instances.json +0 -0
  126. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_instances_123_credentials.json +0 -0
  127. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_instances_123_credentials_reset.json +0 -0
  128. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_instances_123_patch.json +0 -0
  129. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_instances_123_resume.json +0 -0
  130. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_instances_123_ssl.json +0 -0
  131. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_postgresql_instances_123_suspend.json +0 -0
  132. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/databases_types.json +0 -0
  133. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/domains.json +0 -0
  134. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/domains_12345_clone.json +0 -0
  135. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/domains_12345_records.json +0 -0
  136. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/domains_12345_zone-file.json +0 -0
  137. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/domains_import.json +0 -0
  138. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images.json +0 -0
  139. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_private_1234_sharegroups.json +0 -0
  140. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_private_123_regions.json +0 -0
  141. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_private_1337.json +0 -0
  142. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups.json +0 -0
  143. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_1234.json +0 -0
  144. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_1234_images.json +0 -0
  145. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_1234_images_shared_1.json +0 -0
  146. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_1234_members.json +0 -0
  147. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_1234_members_abc123.json +0 -0
  148. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_tokens.json +0 -0
  149. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_tokens_abc123.json +0 -0
  150. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_tokens_abc123_sharegroup.json +0 -0
  151. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_sharegroups_tokens_abc123_sharegroup_images.json +0 -0
  152. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/images_upload.json +0 -0
  153. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances.json +0 -0
  154. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_backups.json +0 -0
  155. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_configs.json +0 -0
  156. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_configs_456789.json +0 -0
  157. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_configs_456789_interfaces.json +0 -0
  158. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_123.json +0 -0
  159. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_123_put.json +0 -0
  160. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_321.json +0 -0
  161. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_configs_456789_interfaces_456.json +0 -0
  162. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_disks.json +0 -0
  163. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_disks_12345_clone.json +0 -0
  164. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_firewalls.json +0 -0
  165. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_ips.json +0 -0
  166. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_nodebalancers.json +0 -0
  167. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_transfer.json +0 -0
  168. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_transfer_2023_4.json +0 -0
  169. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_123_volumes.json +0 -0
  170. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124.json +0 -0
  171. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124_interfaces.json +0 -0
  172. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124_interfaces_123.json +0 -0
  173. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124_interfaces_123_firewalls.json +0 -0
  174. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124_interfaces_456.json +0 -0
  175. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124_interfaces_789.json +0 -0
  176. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124_interfaces_settings.json +0 -0
  177. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_instances_124_upgrade-interfaces.json +0 -0
  178. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_stackscripts_10079.json +0 -0
  179. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_types.json +0 -0
  180. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/linode_types_g6-nanode-1.json +0 -0
  181. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters.json +0 -0
  182. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters_18881.json +0 -0
  183. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters_18881_control__plane__acl.json +0 -0
  184. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters_18881_dashboard.json +0 -0
  185. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters_18881_nodes_123456.json +0 -0
  186. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters_18881_pools_456.json +0 -0
  187. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters_18882.json +0 -0
  188. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_clusters_18882_pools_789.json +0 -0
  189. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_tiers_standard_versions.json +0 -0
  190. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_types.json +0 -0
  191. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/lke_versions.json +0 -0
  192. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/locks.json +0 -0
  193. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/locks_1.json +0 -0
  194. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/longview_clients.json +0 -0
  195. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/longview_plan.json +0 -0
  196. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/longview_subscriptions.json +0 -0
  197. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/maintenance_policies.json +0 -0
  198. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/mongodb.json +0 -0
  199. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_alert-definitions.json +0 -0
  200. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_dashboards.json +0 -0
  201. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_dashboards_1.json +0 -0
  202. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services.json +0 -0
  203. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_dbaas.json +0 -0
  204. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_dbaas_alert-definitions.json +0 -0
  205. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_dbaas_alert-definitions_12345.json +0 -0
  206. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_dbaas_dashboards.json +0 -0
  207. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_dbaas_metric-definitions.json +0 -0
  208. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_dbaas_metrics.json +0 -0
  209. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_dbaas_token.json +0 -0
  210. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/monitor_services_linode_token.json +0 -0
  211. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/network-transfer_prices.json +0 -0
  212. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls.json +0 -0
  213. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_123.json +0 -0
  214. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_123_devices.json +0 -0
  215. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_123_devices_123.json +0 -0
  216. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_123_devices_456.json +0 -0
  217. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_123_history.json +0 -0
  218. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_123_history_rules_2.json +0 -0
  219. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_123_rules.json +0 -0
  220. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_settings.json +0 -0
  221. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_templates.json +0 -0
  222. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_templates_public.json +0 -0
  223. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_firewalls_templates_vpc.json +0 -0
  224. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_ips_127.0.0.1.json +0 -0
  225. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_ipv6_pools.json +0 -0
  226. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_ipv6_ranges.json +0 -0
  227. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_ipv6_ranges_2600%3A3c01%3A%3A.json +0 -0
  228. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/networking_vlans.json +0 -0
  229. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers.json +0 -0
  230. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers_123456.json +0 -0
  231. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers_123456_configs.json +0 -0
  232. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers_123456_configs_65432_nodes.json +0 -0
  233. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers_12345_configs_4567_rebuild.json +0 -0
  234. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers_12345_firewalls.json +0 -0
  235. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers_12345_stats.json +0 -0
  236. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/nodebalancers_types.json +0 -0
  237. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets.json +0 -0
  238. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets_us-east-1.json +0 -0
  239. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket.json +0 -0
  240. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-acl.json +0 -0
  241. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-list.json +0 -0
  242. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_object-url.json +0 -0
  243. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets_us-east-1_example-bucket_ssl.json +0 -0
  244. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_buckets_us-east_example-bucket_access.json +0 -0
  245. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_clusters.json +0 -0
  246. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_keys.json +0 -0
  247. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_quotas.json +0 -0
  248. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_quotas_obj-objects-us-ord-1.json +0 -0
  249. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_quotas_obj-objects-us-ord-1_usage.json +0 -0
  250. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_transfer.json +0 -0
  251. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/object-storage_types.json +0 -0
  252. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/placement_groups.json +0 -0
  253. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/placement_groups_123.json +0 -0
  254. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile.json +0 -0
  255. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile_device_123.json +0 -0
  256. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile_devices.json +0 -0
  257. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile_logins.json +0 -0
  258. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile_logins_123.json +0 -0
  259. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile_preferences.json +0 -0
  260. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile_security-questions.json +0 -0
  261. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/profile_sshkeys.json +0 -0
  262. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/regions.json +0 -0
  263. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/regions_availability.json +0 -0
  264. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/regions_us-east_availability.json +0 -0
  265. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/regions_us-east_vpc-availability.json +0 -0
  266. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/regions_vpc-availability.json +0 -0
  267. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/support_tickets_123.json +0 -0
  268. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/tags.json +0 -0
  269. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/tags_nothing.json +0 -0
  270. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/tags_something.json +0 -0
  271. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/testmappedobj1.json +0 -0
  272. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/volumes.json +0 -0
  273. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/volumes_types.json +0 -0
  274. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/vpcs.json +0 -0
  275. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/vpcs_123456.json +0 -0
  276. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/vpcs_123456_ips.json +0 -0
  277. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/vpcs_123456_subnets.json +0 -0
  278. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/vpcs_123456_subnets_789.json +0 -0
  279. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/fixtures/vpcs_ips.json +0 -0
  280. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/__init__.py +0 -0
  281. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/conftest.py +0 -0
  282. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/filters/fixtures.py +0 -0
  283. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/filters/model_filters_test.py +0 -0
  284. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/helpers.py +0 -0
  285. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/linode_client/__init__.py +0 -0
  286. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/linode_client/test_errors.py +0 -0
  287. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/linode_client/test_linode_client.py +0 -0
  288. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/linode_client/test_retry.py +0 -0
  289. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/login_client/test_login_client.py +0 -0
  290. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/__init__.py +0 -0
  291. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/account/test_account.py +0 -0
  292. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/database/helpers.py +0 -0
  293. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/domain/test_domain.py +0 -0
  294. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/firewall/test_firewall.py +0 -0
  295. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/firewall/test_firewall_templates.py +0 -0
  296. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/image/test_image.py +0 -0
  297. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/linode/interfaces/test_interfaces.py +0 -0
  298. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/lock/__init__.py +0 -0
  299. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/lock/test_lock.py +0 -0
  300. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/longview/test_longview.py +0 -0
  301. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/maintenance/test_maintenance.py +0 -0
  302. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/monitor/test_monitor.py +0 -0
  303. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/monitor_api/test_monitor_api.py +0 -0
  304. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/networking/test_networking.py +0 -0
  305. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/nodebalancer/test_nodebalancer.py +0 -0
  306. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/object_storage/test_obj.py +0 -0
  307. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/object_storage/test_obj_quotas.py +0 -0
  308. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/placement/test_placement.py +0 -0
  309. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/profile/test_profile.py +0 -0
  310. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/region/test_region.py +0 -0
  311. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/sharegroups/test_sharegroups.py +0 -0
  312. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/tag/test_tag.py +0 -0
  313. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/volume/test_volume.py +0 -0
  314. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/integration/models/vpc/test_vpc.py +0 -0
  315. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/__init__.py +0 -0
  316. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/base.py +0 -0
  317. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/errors_test.py +0 -0
  318. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/fixtures.py +0 -0
  319. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/__init__.py +0 -0
  320. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/database_test.py +0 -0
  321. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/image_share_group_test.py +0 -0
  322. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/image_test.py +0 -0
  323. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/linode_test.py +0 -0
  324. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/lke_test.py +0 -0
  325. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/lke_tier_test.py +0 -0
  326. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/lock_test.py +0 -0
  327. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/monitor_api_test.py +0 -0
  328. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/networking_test.py +0 -0
  329. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/object_storage_test.py +0 -0
  330. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/placement_test.py +0 -0
  331. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/polling_test.py +0 -0
  332. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/region_test.py +0 -0
  333. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/groups/vpc_test.py +0 -0
  334. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/linode_client_test.py +0 -0
  335. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/login_client_test.py +0 -0
  336. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/account_test.py +0 -0
  337. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/base_test.py +0 -0
  338. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/beta_test.py +0 -0
  339. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/database_test.py +0 -0
  340. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/domain_test.py +0 -0
  341. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/firewall_test.py +0 -0
  342. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/image_share_group_test.py +0 -0
  343. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/image_test.py +0 -0
  344. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/linode_interface_test.py +0 -0
  345. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/lke_test.py +0 -0
  346. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/lock_test.py +0 -0
  347. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/longview_test.py +0 -0
  348. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/mapped_object_test.py +0 -0
  349. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/monitor_test.py +0 -0
  350. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/networking_test.py +0 -0
  351. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/nodebalancers_test.py +0 -0
  352. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/object_storage_test.py +0 -0
  353. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/placement_test.py +0 -0
  354. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/profile_test.py +0 -0
  355. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/property_alias_test.py +0 -0
  356. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/region_test.py +0 -0
  357. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/serializable_test.py +0 -0
  358. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/support_test.py +0 -0
  359. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/tag_test.py +0 -0
  360. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/volume_test.py +0 -0
  361. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/objects/vpc_test.py +0 -0
  362. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/paginated_list_test.py +0 -0
  363. {linode_api4-5.41.0 → linode_api4-5.42.0}/test/unit/util_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linode_api4
3
- Version: 5.41.0
3
+ Version: 5.42.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
@@ -14,11 +14,12 @@ Classifier: Topic :: Software Development :: Libraries
14
14
  Classifier: License :: OSI Approved :: BSD License
15
15
  Classifier: Programming Language :: Python
16
16
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
17
  Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
21
- Requires-Python: >=3.9
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Requires-Python: >=3.10
22
23
  Description-Content-Type: text/x-rst
23
24
  License-File: LICENSE
24
25
  Requires-Dist: requests
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import copy
2
4
  import string
3
5
  import sys
@@ -40,7 +42,11 @@ from linode_api4.objects.region import Region
40
42
  from linode_api4.objects.serializable import JSONObject, StrEnum
41
43
  from linode_api4.objects.vpc import VPC, VPCSubnet
42
44
  from linode_api4.paginated_list import PaginatedList
43
- from linode_api4.util import drop_null_keys, generate_device_suffixes
45
+ from linode_api4.util import (
46
+ drop_null_keys,
47
+ generate_device_suffixes,
48
+ normalize_as_list,
49
+ )
44
50
 
45
51
  PASSWORD_CHARS = string.ascii_letters + string.digits + string.punctuation
46
52
  MIN_DEVICE_LIMIT = 8
@@ -1246,14 +1252,14 @@ class Instance(Base):
1246
1252
  # create derived objects
1247
1253
  def config_create(
1248
1254
  self,
1249
- kernel=None,
1250
- label=None,
1251
- devices=[],
1252
- disks=[],
1253
- volumes=[],
1254
- interfaces=[],
1255
+ kernel: Kernel | str | None = None,
1256
+ label: str | None = None,
1257
+ devices: "Disk | Volume | dict[str, Any] | list[Disk | Volume | dict[str, Any]] | None" = None,
1258
+ disks: Disk | int | list[Disk | int] | None = None,
1259
+ volumes: "Volume | int | list[Volume | int] | None" = None,
1260
+ interfaces: list[ConfigInterface | dict[str, Any]] | None = None,
1255
1261
  **kwargs,
1256
- ):
1262
+ ) -> Config:
1257
1263
  """
1258
1264
  Creates a Linode Config with the given attributes.
1259
1265
 
@@ -1263,10 +1269,13 @@ class Instance(Base):
1263
1269
  :param label: The config label
1264
1270
  :param disks: The list of disks, starting at sda, to map to this config.
1265
1271
  :param volumes: The volumes, starting after the last disk, to map to this
1266
- config
1272
+ config.
1267
1273
  :param devices: A list of devices to assign to this config, in device
1268
- index order. Values must be of type Disk or Volume. If this is
1269
- given, you may not include disks or volumes.
1274
+ index order, a raw device mapping dict to pass directly to the API
1275
+ (e.g. ``{"sda": {"disk_id": 123}, "sdb": Volume(...)}``), or
1276
+ a single Disk or Volume.
1277
+ If this is given, you may not include disks or volumes.
1278
+ :param interfaces: A list of ConfigInterface objects or dicts to assign to this config.
1270
1279
  :param **kwargs: Any other arguments accepted by the api.
1271
1280
 
1272
1281
  :returns: A new Linode Config
@@ -1274,6 +1283,8 @@ class Instance(Base):
1274
1283
  # needed here to avoid circular imports
1275
1284
  from .volume import Volume # pylint: disable=import-outside-toplevel
1276
1285
 
1286
+ interfaces = [] if interfaces is None else interfaces
1287
+
1277
1288
  hypervisor_prefix = "sd" if self.hypervisor == "kvm" else "xvd"
1278
1289
 
1279
1290
  device_limit = int(
@@ -1288,52 +1299,83 @@ class Instance(Base):
1288
1299
  for suffix in generate_device_suffixes(device_limit)
1289
1300
  ]
1290
1301
 
1291
- device_map = {
1292
- device_names[i]: None for i in range(0, len(device_names))
1293
- }
1302
+ def _flatten_device(device: Disk | Volume | dict | None):
1303
+ if device is None:
1304
+ return None
1305
+ elif isinstance(device, Disk):
1306
+ return {"disk_id": device.id}
1307
+ elif isinstance(device, Volume):
1308
+ return {"volume_id": device.id}
1309
+ elif isinstance(device, dict):
1310
+ return device
1311
+
1312
+ raise TypeError("Disk, Volume, or dict expected!")
1313
+
1314
+ def _device_entry(device: Disk | Volume | int, key: str):
1315
+ if isinstance(device, (Disk, Volume)):
1316
+ return _flatten_device(device)
1317
+
1318
+ try:
1319
+ device_id = int(device)
1320
+ except (TypeError, ValueError):
1321
+ raise TypeError(
1322
+ "Disk, Volume, or integer ID expected!"
1323
+ ) from None
1324
+
1325
+ return {key: device_id}
1326
+
1327
+ def _build_devices():
1328
+ # Devices is a dict, flatten and pass through
1329
+ if isinstance(devices, dict):
1330
+ return {
1331
+ k: (
1332
+ _flatten_device(v)
1333
+ if isinstance(v, (Disk, Volume))
1334
+ else v
1335
+ )
1336
+ for k, v in devices.items()
1337
+ }
1294
1338
 
1339
+ device_list = []
1340
+
1341
+ if devices:
1342
+ device_list += [
1343
+ _flatten_device(device)
1344
+ for device in normalize_as_list(devices)
1345
+ ]
1346
+
1347
+ if disks:
1348
+ device_list += [
1349
+ _device_entry(disk, "disk_id") if disk is not None else None
1350
+ for disk in normalize_as_list(disks)
1351
+ ]
1352
+
1353
+ if volumes:
1354
+ device_list += [
1355
+ (
1356
+ _device_entry(volume, "volume_id")
1357
+ if volume is not None
1358
+ else None
1359
+ )
1360
+ for volume in normalize_as_list(volumes)
1361
+ ]
1362
+
1363
+ return {
1364
+ device_names[i]: device for i, device in enumerate(device_list)
1365
+ }
1366
+
1367
+ # This validation is enforced for backwards compatibility but isn't
1368
+ # technically needed anymore
1295
1369
  if devices and (disks or volumes):
1296
1370
  raise ValueError(
1297
1371
  'You may not call config_create with "devices" and '
1298
1372
  'either of "disks" or "volumes" specified!'
1299
1373
  )
1300
1374
 
1301
- if not devices:
1302
- if not isinstance(disks, list):
1303
- disks = [disks]
1304
- if not isinstance(volumes, list):
1305
- volumes = [volumes]
1306
-
1307
- devices = []
1308
-
1309
- for d in disks:
1310
- if d is None:
1311
- devices.append(None)
1312
- elif isinstance(d, Disk):
1313
- devices.append(d)
1314
- else:
1315
- devices.append(Disk(self._client, int(d), self.id))
1316
-
1317
- for v in volumes:
1318
- if v is None:
1319
- devices.append(None)
1320
- elif isinstance(v, Volume):
1321
- devices.append(v)
1322
- else:
1323
- devices.append(Volume(self._client, int(v)))
1324
-
1325
- if not devices:
1326
- raise ValueError("Must include at least one disk or volume!")
1375
+ device_map = _build_devices()
1327
1376
 
1328
- for i, d in enumerate(devices):
1329
- if d is None:
1330
- pass
1331
- elif isinstance(d, Disk):
1332
- device_map[device_names[i]] = {"disk_id": d.id}
1333
- elif isinstance(d, Volume):
1334
- device_map[device_names[i]] = {"volume_id": d.id}
1335
- else:
1336
- raise TypeError("Disk or Volume expected!")
1377
+ if len(device_map) < 1:
1378
+ raise ValueError("Must include at least one disk or volume!")
1337
1379
 
1338
1380
  param_interfaces = []
1339
1381
  for interface in interfaces:
@@ -1845,8 +1887,8 @@ class Instance(Base):
1845
1887
  to_linode=None,
1846
1888
  region=None,
1847
1889
  instance_type=None,
1848
- configs=[],
1849
- disks=[],
1890
+ configs=None,
1891
+ disks=None,
1850
1892
  label=None,
1851
1893
  group=None,
1852
1894
  with_backups=None,
@@ -1902,7 +1944,10 @@ class Instance(Base):
1902
1944
  'You may only specify one of "to_linode" and "region"'
1903
1945
  )
1904
1946
 
1905
- if region and not type:
1947
+ configs = [] if configs is None else configs
1948
+ disks = [] if disks is None else disks
1949
+
1950
+ if region and not instance_type:
1906
1951
  raise ValueError('Specifying a region requires a "service" as well')
1907
1952
 
1908
1953
  if not isinstance(configs, list) and not isinstance(
@@ -8,6 +8,7 @@ from linode_api4.objects import (
8
8
  Base,
9
9
  DerivedBase,
10
10
  Instance,
11
+ InstanceDiskEncryptionType,
11
12
  JSONObject,
12
13
  MappedObject,
13
14
  Property,
@@ -422,6 +423,9 @@ class LKECluster(Base):
422
423
  ] = None,
423
424
  update_strategy: Optional[str] = None,
424
425
  label: str = None,
426
+ disk_encryption: Optional[
427
+ Union[str, InstanceDiskEncryptionType]
428
+ ] = None,
425
429
  **kwargs,
426
430
  ):
427
431
  """
@@ -443,6 +447,9 @@ class LKECluster(Base):
443
447
  :param update_strategy: The strategy to use when updating this node pool.
444
448
  NOTE: This field is specific to enterprise clusters.
445
449
  :type update_strategy: str
450
+ :param disk_encryption: Local disk encryption setting for this LKE node pool.
451
+ One of 'enabled' or 'disabled'. Defaults to 'disabled'.
452
+ :type disk_encryption: str or InstanceDiskEncryptionType
446
453
  :param kwargs: Any other arguments to pass to the API. See the API docs
447
454
  for possible values.
448
455
 
@@ -459,6 +466,7 @@ class LKECluster(Base):
459
466
  "taints": taints,
460
467
  "k8s_version": k8s_version,
461
468
  "update_strategy": update_strategy,
469
+ "disk_encryption": disk_encryption,
462
470
  }
463
471
  params.update(kwargs)
464
472
 
@@ -3,7 +3,7 @@ Contains various utility functions.
3
3
  """
4
4
 
5
5
  import string
6
- from typing import Any, Dict
6
+ from typing import Any, Dict, List, Tuple, Union
7
7
 
8
8
 
9
9
  def drop_null_keys(data: Dict[Any, Any], recursive=True) -> Dict[Any, Any]:
@@ -30,6 +30,13 @@ def drop_null_keys(data: Dict[Any, Any], recursive=True) -> Dict[Any, Any]:
30
30
  return recursive_helper(data)
31
31
 
32
32
 
33
+ def normalize_as_list(value: Any) -> Union[List, Tuple]:
34
+ """
35
+ Returns the value wrapped in a list if it isn't already a list or tuple.
36
+ """
37
+ return value if isinstance(value, (list, tuple)) else [value]
38
+
39
+
33
40
  def generate_device_suffixes(n: int) -> list[str]:
34
41
  """
35
42
  Generate n alphabetical suffixes starting with a, b, c, etc.
@@ -2,4 +2,4 @@
2
2
  The version of this linode_api4 package.
3
3
  """
4
4
 
5
- __version__ = "v5.41.0"
5
+ __version__ = "v5.42.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linode_api4
3
- Version: 5.41.0
3
+ Version: 5.42.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
@@ -14,11 +14,12 @@ Classifier: Topic :: Software Development :: Libraries
14
14
  Classifier: License :: OSI Approved :: BSD License
15
15
  Classifier: Programming Language :: Python
16
16
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
17
  Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
21
- Requires-Python: >=3.9
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Requires-Python: >=3.10
22
23
  Description-Content-Type: text/x-rst
23
24
  License-File: LICENSE
24
25
  Requires-Dist: requests
@@ -8,7 +8,7 @@ name = "linode_api4"
8
8
  authors = [{ name = "Linode", email = "devs@linode.com" }]
9
9
  description = "The official Python SDK for Linode API v4"
10
10
  readme = "README.rst"
11
- requires-python = ">=3.9"
11
+ requires-python = ">=3.10"
12
12
  keywords = [
13
13
  "akamai",
14
14
  "Akamai Connected Cloud",
@@ -25,10 +25,11 @@ classifiers = [
25
25
  "License :: OSI Approved :: BSD License",
26
26
  "Programming Language :: Python",
27
27
  "Programming Language :: Python :: 3",
28
- "Programming Language :: Python :: 3.9",
29
28
  "Programming Language :: Python :: 3.10",
30
29
  "Programming Language :: Python :: 3.11",
31
30
  "Programming Language :: Python :: 3.12",
31
+ "Programming Language :: Python :: 3.13",
32
+ "Programming Language :: Python :: 3.14",
32
33
  ]
33
34
  dependencies = ["requests", "polling", "deprecated"]
34
35
  dynamic = ["version"]
@@ -78,7 +79,7 @@ line_length = 80
78
79
 
79
80
  [tool.black]
80
81
  line-length = 80
81
- target-version = ["py38", "py39", "py310", "py311", "py312"]
82
+ target-version = ["py310", "py311", "py312", "py313", "py314"]
82
83
 
83
84
  [tool.autoflake]
84
85
  expand-star-imports = true
@@ -230,6 +230,9 @@ def test_update_sql_db(test_linode_client, test_create_sql_db):
230
230
 
231
231
  assert res
232
232
  assert database.allow_list == new_allow_list
233
+ # Label assertion is commented out because the API updates
234
+ # the label intermittently, causing test failures. The issue
235
+ # is tracked in TPT-4268.
233
236
  # assert database.label == label
234
237
  assert database.updates.day_of_week == 2
235
238
 
@@ -354,7 +357,10 @@ def test_update_postgres_db(test_linode_client, test_create_postgres_db):
354
357
 
355
358
  assert res
356
359
  assert database.allow_list == new_allow_list
357
- assert database.label == label
360
+ # Label assertion is commented out because the API updates
361
+ # the label intermittently, causing test failures. The issue
362
+ # is tracked in TPT-4268.
363
+ # assert database.label == label
358
364
  assert database.updates.day_of_week == 2
359
365
 
360
366
 
@@ -100,7 +100,7 @@ def test_get_mysql_config(test_linode_client):
100
100
  assert isinstance(brp, dict)
101
101
  assert brp["type"] == "integer"
102
102
  assert brp["minimum"] == 600
103
- assert brp["maximum"] == 86400
103
+ assert brp["maximum"] == 9007199254740991
104
104
  assert brp["requires_restart"] is False
105
105
 
106
106
  # mysql sub-keys
@@ -790,6 +790,15 @@ def test_get_config(test_linode_client, create_linode):
790
790
  assert config.id == linode.configs[0].id
791
791
 
792
792
 
793
+ def test_config_create_without_devices_raises_error(create_linode):
794
+ linode = create_linode
795
+
796
+ with pytest.raises(ValueError) as err:
797
+ linode.config_create(label="test-config-no-devices")
798
+
799
+ assert "Must include at least one disk or volume!" in str(err.value)
800
+
801
+
793
802
  def test_get_linode_types(test_linode_client):
794
803
  types = test_linode_client.linode.types()
795
804
 
@@ -211,6 +211,21 @@ def test_get_lke_pool(test_linode_client, lke_cluster):
211
211
  )
212
212
 
213
213
 
214
+ def test_node_pool_create_with_disk_encryption(test_linode_client, lke_cluster):
215
+ node_type = test_linode_client.linode.types()[1]
216
+
217
+ pool = lke_cluster.node_pool_create(
218
+ node_type,
219
+ 1,
220
+ disk_encryption=InstanceDiskEncryptionType.enabled,
221
+ )
222
+
223
+ try:
224
+ assert pool.disk_encryption == InstanceDiskEncryptionType.enabled
225
+ finally:
226
+ pool.delete()
227
+
228
+
214
229
  def test_cluster_dashboard_url_view(lke_cluster):
215
230
  cluster = lke_cluster
216
231
 
@@ -38,3 +38,30 @@ def test_config_create_with_extended_volume_limit(test_linode_client):
38
38
  linode.delete()
39
39
  for v in volumes:
40
40
  retry_sending_request(3, v.delete)
41
+
42
+
43
+ def test_config_create_with_device_map(test_linode_client):
44
+ client = test_linode_client
45
+
46
+ region = get_region(client, {"Linodes", "Block Storage"}, site_type="core")
47
+ label = get_test_label()
48
+
49
+ linode, _ = client.linode.instance_create(
50
+ "g6-standard-6",
51
+ region,
52
+ image="linode/debian12",
53
+ label=label,
54
+ )
55
+
56
+ disk_id = linode.disks[0].id
57
+ devices = {
58
+ "sdl": {"disk_id": disk_id},
59
+ }
60
+
61
+ config = linode.config_create(label=f"{label}-config", devices=devices)
62
+
63
+ result_devices = config._raw_json["devices"]
64
+ assert result_devices["sdl"] is not None
65
+ assert result_devices["sdl"]["disk_id"] == disk_id
66
+
67
+ linode.delete()
@@ -459,6 +459,47 @@ class LinodeTest(ClientBaseCase):
459
459
  assert disk.id == 12345
460
460
  assert disk.disk_encryption == InstanceDiskEncryptionType.disabled
461
461
 
462
+ def test_create_config_with_device_map(self):
463
+ """
464
+ Tests that config_create passes through a raw device map unchanged.
465
+ """
466
+ linode = Instance(self.client, 123)
467
+ devices = {
468
+ "sda": {"disk_id": 111},
469
+ "sdb": {"volume_id": 222},
470
+ "sdc": None,
471
+ }
472
+
473
+ with self.mock_post(
474
+ {"id": 456, "devices": devices, "interfaces": []}
475
+ ) as m:
476
+ config = linode.config_create(label="test-config", devices=devices)
477
+
478
+ self.assertEqual(m.call_url, "/linode/instances/123/configs")
479
+ self.assertEqual(
480
+ m.call_data,
481
+ {
482
+ "label": "test-config",
483
+ "devices": devices,
484
+ "interfaces": [],
485
+ },
486
+ )
487
+
488
+ self.assertEqual(config.id, 456)
489
+
490
+ def test_create_config_without_devices_raises_error(self):
491
+ """
492
+ Tests that config_create raises ValueError when no devices, disks, or volumes are specified.
493
+ """
494
+ linode = Instance(self.client, 123)
495
+
496
+ with self.assertRaises(ValueError) as context:
497
+ linode.config_create(label="test-config")
498
+
499
+ assert "Must include at least one disk or volume!" in str(
500
+ context.exception
501
+ )
502
+
462
503
  def test_get_placement_group(self):
463
504
  """
464
505
  Tests that you can get the placement group for a Linode
File without changes
File without changes
File without changes