codecraftai-restclient-vsphere 1.2.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 (77) hide show
  1. codecraftai_restclient_vsphere-1.2.0/LICENSE.md +204 -0
  2. codecraftai_restclient_vsphere-1.2.0/PKG-INFO +94 -0
  3. codecraftai_restclient_vsphere-1.2.0/README.rst +72 -0
  4. codecraftai_restclient_vsphere-1.2.0/pyproject.toml +70 -0
  5. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/__init__.py +3 -0
  6. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/__init__.py +7 -0
  7. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/basegroup.py +139 -0
  8. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/certificatemanagementgroup.py +29 -0
  9. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/clustergroup.py +29 -0
  10. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/computegroup.py +29 -0
  11. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/contentgroup.py +270 -0
  12. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/cryptomanagergroup.py +29 -0
  13. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/customizationrenderers.py +261 -0
  14. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/datacentergroup.py +124 -0
  15. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/datastoregroup.py +82 -0
  16. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/deploymentgroup.py +29 -0
  17. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/eventsgroup.py +123 -0
  18. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/eventstream.py +213 -0
  19. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/foldergroup.py +136 -0
  20. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/guestgroup.py +461 -0
  21. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/hostgroup.py +121 -0
  22. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/hvcgroup.py +29 -0
  23. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/identitygroup.py +29 -0
  24. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/inventoryerrors.py +60 -0
  25. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/inventorygroup.py +359 -0
  26. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/isogroup.py +82 -0
  27. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/lcmgroup.py +29 -0
  28. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/namespacemanagementgroup.py +29 -0
  29. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/namespacesgroup.py +29 -0
  30. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/networkgroup.py +302 -0
  31. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/ovfgroup.py +278 -0
  32. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/resourcepoolgroup.py +29 -0
  33. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/servicesgroup.py +29 -0
  34. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/storagegroup.py +29 -0
  35. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/systemconfiggroup.py +29 -0
  36. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/tagginggroup.py +256 -0
  37. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/tokenservicegroup.py +29 -0
  38. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/topologygroup.py +29 -0
  39. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/trustedinfrastructuregroup.py +29 -0
  40. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/vmgroup.py +610 -0
  41. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/apigroups/waiters.py +63 -0
  42. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/aspectsvsphere.py +171 -0
  43. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/enums/__init__.py +3 -0
  44. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/enums/guestos.py +221 -0
  45. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/enums/hardwareversion.py +39 -0
  46. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/enums/powerstate.py +23 -0
  47. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/enums/vmpoweraction.py +27 -0
  48. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/linkedmode.py +174 -0
  49. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/__init__.py +3 -0
  50. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/datastore.py +40 -0
  51. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/event.py +28 -0
  52. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/library.py +28 -0
  53. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/linkedvcenter.py +26 -0
  54. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/network.py +34 -0
  55. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/ovf.py +36 -0
  56. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/summary.py +56 -0
  57. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/task.py +18 -0
  58. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/model/vm.py +58 -0
  59. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/py.typed +0 -0
  60. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/__init__.py +3 -0
  61. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/contentdeploy.py +28 -0
  62. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/eventfilter.py +30 -0
  63. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/networkconfig.py +40 -0
  64. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/ovfdeploy.py +30 -0
  65. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmclone.py +26 -0
  66. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmcreate.py +27 -0
  67. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmguestcustomization.py +28 -0
  68. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmhardware.py +25 -0
  69. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmplacement.py +27 -0
  70. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmpoweraction.py +22 -0
  71. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmsnapshot.py +25 -0
  72. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/specs/vmstorage.py +32 -0
  73. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/vsphereclient.py +565 -0
  74. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/vspherefilterstate.py +102 -0
  75. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/vspherehealth.py +32 -0
  76. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/vspheresession.py +95 -0
  77. codecraftai_restclient_vsphere-1.2.0/source/packages/ccai/restclient/vsphere/vspheretaskhandle.py +471 -0
@@ -0,0 +1,204 @@
1
+ # Code Craft AI - Source Available License
2
+ Version 1.0, October 2026
3
+
4
+ Copyright (C) 2026, Code Craft AI LLC
5
+
6
+ Everyone is permitted to copy and distribute verbatim copies of *This License* document, but changing it is not allowed.
7
+
8
+ *This License* covers the Python Automation Kit, the full suite of software published by *Licensor* that consists of every `codecraftai-*` package, every `pychestrate` package, and the `pychestrate` server.
9
+
10
+ *The Software* is source available. Its source code is published so that anyone can read it, learn from it, and use it, but *This License* is not an open source license. *The Software* is free to use for *Non-Commercial Use*. *Commercial Use* is permitted in exchange for a *Usage Fee* that is based on a reasonable estimation of the income derived from *The Software*, as described in section 5. When a company migrates a product or service to *The Software* from another code base, the *Profit* from that product or service is not counted toward the *Usage Fee* for two years, as described in section 5.4. For assurance of costs, a company can disclose its usage and estimated returns to *Licensor* and negotiate a fixed license cost, as described in section 5.10.
11
+
12
+ ## 1. Definitions
13
+
14
+ ### 1.1 *This License* or *The License*
15
+ **This License** or **The License** refers to version 1.0 of the Code Craft AI - Source Available License.
16
+
17
+ ### 1.2 Licensor
18
+ **Licensor** refers to Code Craft AI LLC.
19
+
20
+ ### 1.3 The Software
21
+ **The Software** refers to the Python Automation Kit, the full suite of software that *Licensor* publishes under *This License*. The Python Automation Kit consists of the following components (each, a **Component**), together with their source code, documentation, and other materials:
22
+
23
+ 1. Every Python package published by *Licensor* whose name begins with `codecraftai-`
24
+ 2. Every Python package published by *Licensor* whose name begins with `pychestrate`
25
+ 3. The `pychestrate` server
26
+
27
+ ### 1.4 You
28
+ **You** refers to the individual or legal entity that exercises rights under *This License*. When an individual exercises rights under *This License* on behalf of a company, organization, or other legal entity, **You** refers to that entity.
29
+
30
+ ### 1.5 Use
31
+ **Use** means to install, execute, load, access, operate, display, copy, modify, configure, customize, and otherwise use.
32
+
33
+ ### 1.6 Non-Commercial Use
34
+ **Non-Commercial Use** means any *Use* of *The Software* that is not *Commercial Use*. Examples of *Non-Commercial Use* include personal use, hobby projects, study, teaching, academic research, evaluation, and use by a non-profit organization for its non-profit purposes.
35
+
36
+ ### 1.7 Commercial Use
37
+ **Commercial Use** means any *Use* of *The Software* by or on behalf of a for-profit entity, and any *Use* of *The Software* in connection with a product, service, or activity that generates revenue. *Commercial Use* includes, without limitation, *Use* of *The Software* to develop, build, test, validate, deploy, operate, or support commercial products and services, and *Use* of *The Software* to provide services to others.
38
+
39
+ ### 1.8 Commercial Activity
40
+ **Commercial Activity** means the products, services, and business operations in connection with which *You* make *Commercial Use* of *The Software*.
41
+
42
+ ### 1.9 Fiscal Year
43
+ **Fiscal Year** means the annual accounting period that *You* use for financial reporting.
44
+
45
+ ### 1.10 Profit
46
+ **Profit** means the net profit that *You* earn from the *Commercial Activity* during a *Fiscal Year*, determined under the accounting principles that *You* regularly use for financial reporting.
47
+
48
+ ### 1.11 Contribution Estimate
49
+ **Contribution Estimate** means *Your* reasonable, good faith estimate of the portion of the *Profit* that *The Software* contributed to, expressed as a number from 0 to 1.
50
+
51
+ ### 1.12 Derived Income
52
+ **Derived Income** means the portion of the *Profit* for a *Fiscal Year* that is derived from *The Software*, calculated as described in section 5.2.
53
+
54
+ ### 1.13 Usage Fee
55
+ **Usage Fee** means the yearly fee for *Commercial Use* that is set by the table in section 5.3.
56
+
57
+ ### 1.14 Migration
58
+ **Migration** means moving the work for one of *Your* products or services from a code base other than *The Software*, such as another framework, another library, or *Your* own code, to *The Software*.
59
+
60
+ ### 1.15 Migration Period
61
+ **Migration Period** means the two (2) year period, described in section 5.4, during which the *Profit* from a product or service that *You* are migrating to *The Software* is not counted.
62
+
63
+ ## 2. License Grant
64
+
65
+ Subject to the terms and conditions of *This License*, *Licensor* hereby grants to *You* a non-exclusive, worldwide, non-transferable license to *Use*, copy, modify, create derivative works of, and distribute *The Software*.
66
+
67
+ *Licensor* also grants to *You* a license under any patents that *Licensor* can license, and that are necessarily infringed by *The Software*, for the same purposes and subject to the same conditions as the license granted above.
68
+
69
+ *This License* covers the Python Automation Kit as a whole. *Use* of one, some, or all of the *Components* is *Use* of *The Software*.
70
+
71
+ The licenses granted by *This License* are free of charge for *Non-Commercial Use*. The licenses granted by *This License* for *Commercial Use* are conditioned on the payment of the *Usage Fee* described in section 5.
72
+
73
+ ## 3. Conditions
74
+
75
+ ### 3.1 License Notice
76
+ Every copy of *The Software* that *You* distribute, in original or modified form, must include a complete copy of *This License* and must keep all copyright, patent, trademark, and attribution notices that appear in *The Software*.
77
+
78
+ ### 3.2 Recipients
79
+ Anyone who receives *The Software* from *You* receives it under the terms of *This License*. *You* may not impose terms on a recipient that conflict with *This License*, and *You* may not grant a recipient rights that *This License* does not grant to *You*.
80
+
81
+ ### 3.3 Modified Versions
82
+ *You* must clearly mark any modified version of *The Software* as modified. *The Software* is published by *Licensor* under a specific identity, such as a package name. *You* may not publish a modified version of *The Software* under the identity that *Licensor* originally published it under. Every copy of *The Software* that *You* redistribute under its original identity must be an exact copy of *The Software* as *Licensor* published it.
83
+
84
+ ### 3.4 Trademarks
85
+ *This License* does not grant any rights to use the names, logos, or trademarks of *Licensor*, except as required to comply with section 3.1 and to describe the origin of *The Software*.
86
+
87
+ ## 4. Non-Commercial Use
88
+
89
+ *Non-Commercial Use* of *The Software* is free. No *Usage Fee*, registration, or report is required for *Non-Commercial Use*.
90
+
91
+ ## 5. Commercial Use
92
+
93
+ ### 5.1 Usage Fee Obligation
94
+ For each *Fiscal Year* in which *You* make *Commercial Use* of *The Software*, *You* must pay *Licensor* a *Usage Fee*. A single *Usage Fee* covers all of *Your* *Commercial Use* of the *Components*. *Usage Fees* are not owed separately for each *Component*.
95
+
96
+ ### 5.2 Derived Income
97
+ The *Derived Income* for a *Fiscal Year* is calculated as follows:
98
+
99
+ (Contribution Estimate) * (Profit) = (Derived Income)
100
+
101
+ If *You* make *Commercial Use* of *The Software* for more than one product or service, calculate the *Derived Income* for each product or service using its own *Contribution Estimate* and *Profit*, and add the results together. The *Profit* from a product or service that is in its *Migration Period* is not counted, as described in section 5.4.
102
+
103
+ If the *Profit* from a product or service for a *Fiscal Year* is zero or less, then the *Derived Income* from that product or service for that *Fiscal Year* is zero.
104
+
105
+ ### 5.3 Usage Fee
106
+ The *Usage Fee* for a *Fiscal Year* is set by the *Derived Income* for that *Fiscal Year*, as shown in the following table.
107
+
108
+ | Derived Income for the Fiscal Year | Usage Fee per Fiscal Year |
109
+ |------------------------------------|---------------------------|
110
+ | 1,000,000 or less | Free |
111
+ | More than 1,000,000, up to and including 10,000,000 | 50,000 |
112
+ | More than 10,000,000, up to and including 100,000,000 | 100,000 |
113
+ | More than 100,000,000, up to and including 1,000,000,000 | 250,000 |
114
+ | More than 1,000,000,000 | 500,000 |
115
+
116
+ All amounts in this section 5 are in United States dollars. If *You* report *Profit* in a different currency, convert the *Derived Income* to United States dollars using the average exchange rate for the *Fiscal Year*.
117
+
118
+ ### 5.4 Migration Allowance
119
+ When *You* migrate a product or service to *The Software*, the *Profit* from that product or service is not counted when calculating the *Derived Income* during its *Migration Period* (the **Migration Allowance**).
120
+
121
+ The *Migration Period* for a product or service begins on the date that *You* first make *Commercial Use* of *The Software* for that product or service as part of its *Migration*, and ends two (2) years after that date.
122
+
123
+ The *Migration Allowance* applies to each product or service separately, and *You* may use it for every product or service that *You* migrate. Each product or service has only one *Migration Period*.
124
+
125
+ If a *Fiscal Year* is only partly within the *Migration Period* of a product or service, the *Profit* from that product or service for that *Fiscal Year* is reduced in proportion to the number of days of that *Fiscal Year* that fall within its *Migration Period*.
126
+
127
+ For example, a company tests product A with *The Software* and pays a *Usage Fee* based on the *Profit* from product A. On March 1, 2027, the company begins moving the testing of product B from a different test framework to *The Software*. The company does not count the *Profit* from product B in its *Derived Income* from March 1, 2027 until March 1, 2029. Starting March 1, 2029, the *Profit* from product B is counted. If the company later migrates product C, the *Profit* from product C is not counted for two years from the start of its own *Migration*.
128
+
129
+ ### 5.5 Contribution Estimate
130
+ *You* are responsible for making the *Contribution Estimate*. A *Contribution Estimate* must be reasonable and made in good faith. The *Contribution Estimate* for a product or service covers all of the *Components* that *You* *Use* for that product or service. When making the *Contribution Estimate*, *You* should consider how important *The Software* is to the *Commercial Activity*, how much of the *Commercial Activity* depends on *The Software*, and the effort and cost that *You* would otherwise need to spend to accomplish what *The Software* accomplishes for *You*.
131
+
132
+ The following table is a guide for making the *Contribution Estimate*. When *Your* *Commercial Use* of *The Software* matches an entry in the table, the *Contribution Estimate* in that entry is a reasonable *Contribution Estimate*. When *Your* *Commercial Use* does not match an entry in the table, make the *Contribution Estimate* by comparing *Your* *Commercial Use* with the entries in the table. When more than one entry matches the same *Commercial Activity*, use the entry with the highest *Contribution Estimate*.
133
+
134
+ | Commercial Use of *The Software* | Contribution Estimate |
135
+ |----------------------------------|-----------------------|
136
+ | Quality Assurance (QA) and Continuous Integration (CI): *The Software* is used to test or validate the products or services of the *Commercial Activity*, or to run their build and test pipelines | 0.3 |
137
+ | Products Completely Based on *The Software*: the products or services of the *Commercial Activity* are built completely on *The Software* | 0.5 |
138
+
139
+ ### 5.6 Examples
140
+ A company earns 1,000,000,000 in *Profit* from a product line during a *Fiscal Year*. The company uses *The Software* for the QA and CI of that product line, so the *Contribution Estimate* is 0.3.
141
+
142
+ 0.3 * 1,000,000,000 = 300,000,000
143
+
144
+ The *Derived Income* of 300,000,000 is more than 100,000,000 and not more than 1,000,000,000, so the *Usage Fee* for that *Fiscal Year* is 250,000.
145
+
146
+ A company earns 4,000,000 in *Profit* from a product during a *Fiscal Year*. The product is built completely on *The Software*, so the *Contribution Estimate* is 0.5.
147
+
148
+ 0.5 * 4,000,000 = 2,000,000
149
+
150
+ The *Derived Income* of 2,000,000 is more than 1,000,000 and not more than 10,000,000, so the *Usage Fee* for that *Fiscal Year* is 50,000.
151
+
152
+ A company earns 3,000,000 in *Profit* from a product line during a *Fiscal Year*. The company uses *The Software* for the QA and CI of that product line, so the *Contribution Estimate* is 0.3.
153
+
154
+ 0.3 * 3,000,000 = 900,000
155
+
156
+ The *Derived Income* of 900,000 is 1,000,000 or less, so there is no *Usage Fee* for that *Fiscal Year*.
157
+
158
+ ### 5.7 Reporting and Payment
159
+ Within one hundred twenty (120) days after the end of each *Fiscal Year* for which a *Usage Fee* is owed, *You* must pay the *Usage Fee* to *Licensor* and provide *Licensor* with a written statement that shows the *Profit*, the *Contribution Estimate*, the reasoning used to make the *Contribution Estimate*, the *Derived Income*, and the *Usage Fee*. *Usage Fees* are payable in United States dollars. If any *Profit* is not counted under section 5.4, the statement must also identify each product or service that is in a *Migration Period* and show the dates of its *Migration Period*. No statement is required for a *Fiscal Year* in which no *Usage Fee* is owed.
160
+
161
+ ### 5.8 Records and Review
162
+ *You* must keep records that reasonably support each *Contribution Estimate*, each *Profit* figure, and the dates of any *Migration Period* for at least three (3) years after the end of the *Fiscal Year* that they apply to. No more than once in any twelve (12) month period, *Licensor* may ask in writing for the records that support a statement, and *You* must provide them within sixty (60) days of the request. *Licensor* will treat those records as confidential.
163
+
164
+ ### 5.9 Disputes About the Usage Fee
165
+ If *Licensor* believes that a *Contribution Estimate*, a *Profit* figure, or the dates of a *Migration Period* are not reasonable, *Licensor* will notify *You* in writing and explain why. *You* and *Licensor* will then negotiate in good faith for at least sixty (60) days to agree on a reasonable *Usage Fee*. If *You* and *Licensor* cannot agree, either party may resolve the dispute as described in section 8.
166
+
167
+ ### 5.10 Fixed License Cost
168
+ For assurance of costs, *You* may disclose to *Licensor* how *You* *Use* *The Software* and the returns that *You* estimate *You* will derive from it, and negotiate a fixed license cost with *Licensor*. A fixed license cost, and any other terms that *You* and *Licensor* agree to, must be set out in a writing signed by both *You* and *Licensor* (a **Fixed License Agreement**).
169
+
170
+ While a *Fixed License Agreement* is in effect, the fixed license cost replaces the *Usage Fee* for the *Commercial Use* that the *Fixed License Agreement* covers, and sections 5.7 through 5.9 apply to that *Commercial Use* only as the *Fixed License Agreement* provides. To the extent that a *Fixed License Agreement* conflicts with this section 5, the *Fixed License Agreement* controls.
171
+
172
+ *Licensor* will treat the information that *You* disclose under this section 5.10 as confidential.
173
+
174
+ ## 6. Termination
175
+
176
+ If *You* violate *This License*, the licenses granted to *You* by *This License* end. If *Licensor* notifies *You* in writing of the violation and *You* correct the violation within thirty (30) days of receiving the notice, including by paying any *Usage Fee* that is owed, then the licenses granted to *You* are reinstated. This reinstatement is available to *You* only once. Termination does not release *You* from any *Usage Fee* that is owed for *Commercial Use* that took place before the termination.
177
+
178
+ ## 7. No Warranty and Limitation of Liability
179
+
180
+ ### 7.1 No Warranty
181
+ *THE SOFTWARE* IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
182
+
183
+ ### 7.2 Limitation of Liability
184
+ TO THE EXTENT PERMITTED BY LAW, IN NO EVENT WILL *LICENSOR* BE LIABLE TO *YOU* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL, OR EXEMPLARY DAMAGES OF ANY KIND ARISING OUT OF OR RELATED TO *THIS LICENSE* OR THE *USE* OF *THE SOFTWARE*, EVEN IF *LICENSOR* HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
185
+
186
+ ### 7.3 Support
187
+ *This License* does not entitle *You* to support, maintenance, or other services. Support and services are available only under a separate written agreement with *Licensor*.
188
+
189
+ ## 8. Governing Law and Jurisdiction
190
+
191
+ *This License* is governed by the laws of the State of Washington and the United States as though fully performed in Washington, without regard to provisions relating to conflicts of laws. The UN Convention for the International Sale of Goods and the Uniform Computer Information Transactions Act (UCITA) will not apply. The state and federal courts located in King County, Washington will have exclusive jurisdiction to adjudicate any disputes arising under *This License*, and *You* and *Licensor* agree to submit to the jurisdiction of those courts.
192
+
193
+ ## 9. General
194
+
195
+ ### 9.1 Severability
196
+ If any provision of *This License* is held to be unenforceable, that provision will be enforced to the maximum extent permitted, and the remaining provisions of *This License* will remain in effect.
197
+
198
+ ### 9.2 Interpretation
199
+ The section headings in *This License* are for reference purposes only and do not modify or restrict any term of *This License*. *This License* is written in the English language, and the English text prevails over any translation.
200
+
201
+ ### 9.3 Contact
202
+ Questions about *This License*, *Usage Fee* statements, payments, and requests to negotiate a *Fixed License Agreement* may be sent to *Licensor* using the contact information published at:
203
+
204
+ https://code-craft.ai
@@ -0,0 +1,94 @@
1
+ Metadata-Version: 2.4
2
+ Name: codecraftai-restclient-vsphere
3
+ Version: 1.2.0
4
+ Summary: Code Craft AI - vSphere REST Client Package
5
+ License-Expression: LicenseRef-CodeCraftAI-Source-Available
6
+ License-File: LICENSE.md
7
+ Keywords: python,automation,ccai,vsphere,vmware
8
+ Author: Myron Walker
9
+ Author-email: myron.walker@gmail.com
10
+ Requires-Python: >=3.10,<4.0
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Operating System :: POSIX
13
+ Requires-Dist: codecraftai-credentials (<2.0.0)
14
+ Requires-Dist: codecraftai-foundations (<2.0.0)
15
+ Requires-Dist: codecraftai-restclient-base (<2.0.0)
16
+ Requires-Dist: codecraftai-testbase (<2.0.0)
17
+ Requires-Dist: requests (>=2.32.5,<3.0.0)
18
+ Project-URL: Issues, https://github.com/code-craft-ai-company/codecraftai-restclient-vsphere/issues
19
+ Project-URL: Repository, https://github.com/code-craft-ai-company/codecraftai-restclient-vsphere
20
+ Description-Content-Type: text/x-rst
21
+
22
+ ===================================
23
+ Code Craft AI Interop - vSphere
24
+ ===================================
25
+
26
+ The ``codecraftai-restclient-vsphere`` package is a typed, aspect-driven REST client for the VMware vCenter API. It implements the ``IVPNControlPlane``-adjacent virtualization surface as a sibling to other vendor packages in the ccai suite, built on top of ``codecraftai-restclient-base``. The client replaces the legacy ``VSphereAgent`` from ``codecraftai-landscaping/services/vmware/`` — a 606-line agent class plus 29 extension modules — with a ``RestClientBase``-derived ``VSphereClient`` and 29 ``RestApiGroup`` subclasses.
27
+
28
+ This package is hand-authored against the documented vCenter REST surface and does **not** use OpenAPI code generation. The reasoning is recorded in the ``AGENTS.md`` "Codegen Decision" section and in the workspace-level ``PLAN-VPN-AND-CLOUD-PROVISIONING.md`` §9.2a.
29
+
30
+ Highlights
31
+ ==========
32
+
33
+ - ``VSphereClient`` — the ``RestClientBase`` subclass that handles session-token mint, dual ``/api`` and ``/rest`` URL composition, and the 29 lazy-cached api-group properties.
34
+ - ``VSphereTaskHandle`` — implements ``ITaskHandle`` from ``codecraftai-foundations``; sync-polling with aspects-controlled interval and timeout, injectable clock/sleeper/fetcher for test determinism.
35
+ - 29 ``apigroups/*Group`` classes covering certificate management, clusters, compute, content library, crypto manager, datacenter, datastore, deployment, folder, guest, host, hvc, identity, inventory, iso, lcm, namespace management, networks, OVF, resource pool, services, storage, system config, tagging, token service, topology, trusted infrastructure, and VMs.
36
+ - Content Library deploy (``ContentGroup.deploy_ovf_item``), OVF deploy from URL or local file (``OvfGroup.deploy_from_url`` / ``deploy_from_local_ovf``), and guest customization (Linux cloud-init + Windows sysprep renderers).
37
+ - VM lifecycle waiters: ``wait_for_power_state``, ``wait_for_tools_ready``, ``wait_for_ip_address``.
38
+ - Inventory helpers: ``find_vm_by_name``, ``find_vm_by_tag``, ``find_datastore_with_free_gb``, ``pick_least_loaded_host`` — with total tie-breaking ordering and hypothesis property-tested selection determinism.
39
+ - Events stream (``EventsGroup.stream`` with backpressure + dropped-event counting) and linked-mode helpers (``linked_vcenters``, ``for_vcenter``).
40
+
41
+ Repository Structure
42
+ ====================
43
+
44
+ - ``development/`` - Runtime environment scripts.
45
+ - ``repository-setup/`` - Repository homing and setup scripts.
46
+ - ``source/packages/ccai/restclient/vsphere/`` - Package source code.
47
+ - ``source/testroots/testbase/ccai/tests/restclient/vsphere/`` - TestBase test roots.
48
+ - ``specs/`` - Requirements, design, and task documentation (Kiro-style).
49
+ - ``userguide/`` - Standards, conventions, and documentation.
50
+
51
+ Environment Setup
52
+ =================
53
+
54
+ When working in a Codex container:
55
+
56
+ .. code-block:: bash
57
+
58
+ ./development/setup-agent-container
59
+
60
+ For local development:
61
+
62
+ .. code-block:: bash
63
+
64
+ ./repository-setup/rehome-repository
65
+ ./development/setup-environment
66
+
67
+ Running Tests
68
+ =============
69
+
70
+ Activate the virtual environment:
71
+
72
+ .. code-block:: bash
73
+
74
+ source .venv/bin/activate
75
+
76
+ Run the test suite:
77
+
78
+ .. code-block:: bash
79
+
80
+ testbase testing run --root ./source/testroots/testbase --includes=testbase.ccai.tests
81
+
82
+ Standards and Conventions
83
+ =========================
84
+
85
+ - Naming conventions: ``userguide/10-02-naming-conventions.rst``
86
+ - Code organization: ``userguide/10-01-code-organization.rst``
87
+ - Coding standards: ``userguide/10-00-coding-standards.rst``
88
+
89
+ Additional Resources
90
+ ====================
91
+
92
+ - User guide entry point: ``userguide/userguide.rst``
93
+ - Codegen decision: ``AGENTS.md`` (Codegen Decision section)
94
+
@@ -0,0 +1,72 @@
1
+ ===================================
2
+ Code Craft AI Interop - vSphere
3
+ ===================================
4
+
5
+ The ``codecraftai-restclient-vsphere`` package is a typed, aspect-driven REST client for the VMware vCenter API. It implements the ``IVPNControlPlane``-adjacent virtualization surface as a sibling to other vendor packages in the ccai suite, built on top of ``codecraftai-restclient-base``. The client replaces the legacy ``VSphereAgent`` from ``codecraftai-landscaping/services/vmware/`` — a 606-line agent class plus 29 extension modules — with a ``RestClientBase``-derived ``VSphereClient`` and 29 ``RestApiGroup`` subclasses.
6
+
7
+ This package is hand-authored against the documented vCenter REST surface and does **not** use OpenAPI code generation. The reasoning is recorded in the ``AGENTS.md`` "Codegen Decision" section and in the workspace-level ``PLAN-VPN-AND-CLOUD-PROVISIONING.md`` §9.2a.
8
+
9
+ Highlights
10
+ ==========
11
+
12
+ - ``VSphereClient`` — the ``RestClientBase`` subclass that handles session-token mint, dual ``/api`` and ``/rest`` URL composition, and the 29 lazy-cached api-group properties.
13
+ - ``VSphereTaskHandle`` — implements ``ITaskHandle`` from ``codecraftai-foundations``; sync-polling with aspects-controlled interval and timeout, injectable clock/sleeper/fetcher for test determinism.
14
+ - 29 ``apigroups/*Group`` classes covering certificate management, clusters, compute, content library, crypto manager, datacenter, datastore, deployment, folder, guest, host, hvc, identity, inventory, iso, lcm, namespace management, networks, OVF, resource pool, services, storage, system config, tagging, token service, topology, trusted infrastructure, and VMs.
15
+ - Content Library deploy (``ContentGroup.deploy_ovf_item``), OVF deploy from URL or local file (``OvfGroup.deploy_from_url`` / ``deploy_from_local_ovf``), and guest customization (Linux cloud-init + Windows sysprep renderers).
16
+ - VM lifecycle waiters: ``wait_for_power_state``, ``wait_for_tools_ready``, ``wait_for_ip_address``.
17
+ - Inventory helpers: ``find_vm_by_name``, ``find_vm_by_tag``, ``find_datastore_with_free_gb``, ``pick_least_loaded_host`` — with total tie-breaking ordering and hypothesis property-tested selection determinism.
18
+ - Events stream (``EventsGroup.stream`` with backpressure + dropped-event counting) and linked-mode helpers (``linked_vcenters``, ``for_vcenter``).
19
+
20
+ Repository Structure
21
+ ====================
22
+
23
+ - ``development/`` - Runtime environment scripts.
24
+ - ``repository-setup/`` - Repository homing and setup scripts.
25
+ - ``source/packages/ccai/restclient/vsphere/`` - Package source code.
26
+ - ``source/testroots/testbase/ccai/tests/restclient/vsphere/`` - TestBase test roots.
27
+ - ``specs/`` - Requirements, design, and task documentation (Kiro-style).
28
+ - ``userguide/`` - Standards, conventions, and documentation.
29
+
30
+ Environment Setup
31
+ =================
32
+
33
+ When working in a Codex container:
34
+
35
+ .. code-block:: bash
36
+
37
+ ./development/setup-agent-container
38
+
39
+ For local development:
40
+
41
+ .. code-block:: bash
42
+
43
+ ./repository-setup/rehome-repository
44
+ ./development/setup-environment
45
+
46
+ Running Tests
47
+ =============
48
+
49
+ Activate the virtual environment:
50
+
51
+ .. code-block:: bash
52
+
53
+ source .venv/bin/activate
54
+
55
+ Run the test suite:
56
+
57
+ .. code-block:: bash
58
+
59
+ testbase testing run --root ./source/testroots/testbase --includes=testbase.ccai.tests
60
+
61
+ Standards and Conventions
62
+ =========================
63
+
64
+ - Naming conventions: ``userguide/10-02-naming-conventions.rst``
65
+ - Code organization: ``userguide/10-01-code-organization.rst``
66
+ - Coding standards: ``userguide/10-00-coding-standards.rst``
67
+
68
+ Additional Resources
69
+ ====================
70
+
71
+ - User guide entry point: ``userguide/userguide.rst``
72
+ - Codegen decision: ``AGENTS.md`` (Codegen Decision section)
@@ -0,0 +1,70 @@
1
+ [project]
2
+ name = "codecraftai-restclient-vsphere"
3
+ version = "1.2.0"
4
+ description = "Code Craft AI - vSphere REST Client Package"
5
+ readme = "README.rst"
6
+ license = "LicenseRef-CodeCraftAI-Source-Available"
7
+ authors = [{name = "Myron Walker", email = "myron.walker@gmail.com"}]
8
+ keywords = [
9
+ "python",
10
+ "automation",
11
+ "ccai",
12
+ "vsphere",
13
+ "vmware"
14
+ ]
15
+ classifiers = [
16
+ "Programming Language :: Python :: 3",
17
+ "Operating System :: POSIX",
18
+ ]
19
+ requires-python = ">=3.10,<4.0"
20
+ dependencies = [
21
+ "requests>=2.32.5,<3.0.0",
22
+ "codecraftai-foundations<2.0.0",
23
+ "codecraftai-credentials<2.0.0",
24
+ "codecraftai-restclient-base<2.0.0",
25
+ "codecraftai-testbase<2.0.0",
26
+ ]
27
+
28
+ [project.urls]
29
+ Repository = "https://github.com/code-craft-ai-company/codecraftai-restclient-vsphere"
30
+ Issues = "https://github.com/code-craft-ai-company/codecraftai-restclient-vsphere/issues"
31
+
32
+ [dependency-groups]
33
+ dev = [
34
+ "requests-mock>=1.11.0",
35
+ ]
36
+
37
+ [tool.poetry]
38
+ packages = [{include="ccai", from="source/packages"}]
39
+
40
+ [tool.poetry.dependencies]
41
+ codecraftai-foundations = {source = "codecraftai"}
42
+ codecraftai-credentials = {source = "codecraftai"}
43
+ codecraftai-restclient-base = {source = "codecraftai"}
44
+ codecraftai-testbase = {source = "codecraftai"}
45
+
46
+ [[tool.poetry.source]]
47
+ name = "codecraftai"
48
+ url = "https://code-craft.ai/licensed-repository/simple/"
49
+ priority = "supplemental"
50
+
51
+ [[tool.uv.index]]
52
+ # Same licensed index as [[tool.poetry.source]]. Listed before PyPI so that
53
+ # codecraftai-* packages (direct and transitive) resolve from it; everything
54
+ # else falls through to PyPI. Credentials: UV_INDEX_CODECRAFTAI_USERNAME /
55
+ # UV_INDEX_CODECRAFTAI_PASSWORD, or `uv auth login`.
56
+ name = "codecraftai"
57
+ url = "https://code-craft.ai/licensed-repository/simple/"
58
+
59
+ [tool.ruff.lint]
60
+ # Deliberately narrow. This gate exists for one reason: a bare `except:`
61
+ # swallows ConfigurationError and SemanticError, which derive from
62
+ # BaseException precisely so that they pass through ordinary handlers and end
63
+ # the run. Catching them hides the original cause behind whatever error
64
+ # happens next. See userguide/10-00-coding-standards.rst, exception-handling
65
+ # rules 5-7. Use `except Exception:` when you mean "any ordinary failure".
66
+ select = ["E722"]
67
+
68
+ [build-system]
69
+ requires = ["poetry-core"]
70
+ build-backend = "poetry.core.masonry.api"
@@ -0,0 +1,3 @@
1
+ """
2
+ Package marker for ``ccai.restclient.vsphere``.
3
+ """
@@ -0,0 +1,7 @@
1
+ """
2
+ Package marker for ``ccai.restclient.vsphere.apigroups``.
3
+
4
+ Each ``*Group`` module owns its own class. This package init does
5
+ not eagerly import the groups; importing happens lazily through
6
+ :meth:`VSphereClient.__getattr__` so the package is cheap to load.
7
+ """
@@ -0,0 +1,139 @@
1
+ """
2
+ .. module:: basegroup
3
+ :platform: Darwin, Linux, Unix, Windows
4
+ :synopsis: Shared base class for every vSphere ``*Group`` API
5
+ surface. Adds filter-state-aware URL composition on top of the
6
+ generic :class:`RestApiGroup`.
7
+
8
+ .. moduleauthor:: Myron Walker <myron.walker@gmail.com>
9
+ """
10
+
11
+ __author__ = "Myron Walker"
12
+ __copyright__ = "Copyright 2025, Code Craft AI LLC"
13
+ __credits__ = []
14
+
15
+
16
+ import os
17
+
18
+ from typing import TYPE_CHECKING
19
+
20
+ from ccai.errors.exceptions import SemanticError
21
+ from ccai.restclient.base.restapigroup import RestApiGroup
22
+
23
+
24
+ if TYPE_CHECKING:
25
+ from ccai.restclient.vsphere.vsphereclient import VSphereClient
26
+
27
+
28
+ _API_PREFIX = "/api/"
29
+ _REST_PREFIX = "/rest/"
30
+
31
+
32
+ class BaseGroup(RestApiGroup):
33
+ """
34
+ Common ancestor for every vSphere API group.
35
+
36
+ Subclasses MUST set :data:`BASE_LEAF` to a value that begins
37
+ with either ``/api/`` or ``/rest/`` so the client knows which
38
+ root to compose against. The prefix is validated at subclass
39
+ registration time (``__init_subclass__``) so misconfiguration
40
+ fails fast.
41
+ """
42
+
43
+ BASE_LEAF: str = ""
44
+
45
+ def __init_subclass__(cls, **kwargs) -> None:
46
+ """
47
+ Validate ``BASE_LEAF`` of subclasses at class-definition
48
+ time.
49
+
50
+ :returns: ``None``
51
+
52
+ :raises: SemanticError
53
+ """
54
+ super().__init_subclass__(**kwargs)
55
+ # An empty BASE_LEAF is permitted only on the base class itself
56
+ # which is the class statically declared in this module.
57
+ if cls is BaseGroup:
58
+ return None
59
+
60
+ base = cls.BASE_LEAF
61
+ if base is None or len(base) == 0:
62
+ err_msg_lines = [
63
+ "API group must declare a non-empty BASE_LEAF.",
64
+ "CLASS: {}".format(cls.__name__),
65
+ ]
66
+ err_msg = os.linesep.join(err_msg_lines)
67
+ raise SemanticError(err_msg)
68
+
69
+ if not (base.startswith(_API_PREFIX) or base.startswith(_REST_PREFIX)):
70
+ err_msg_lines = [
71
+ "API group BASE_LEAF must begin with '/api/' or '/rest/'.",
72
+ "CLASS: {}".format(cls.__name__),
73
+ "GOT: {!r}".format(base),
74
+ ]
75
+ err_msg = os.linesep.join(err_msg_lines)
76
+ raise SemanticError(err_msg)
77
+
78
+ return None
79
+
80
+ def __init__(self, client: "VSphereClient") -> None:
81
+ """
82
+ Initialise the group with a back-reference to the client.
83
+
84
+ :param client: Owning :class:`VSphereClient` instance.
85
+
86
+ :returns: ``None``
87
+ """
88
+ super().__init__(client)
89
+ return
90
+
91
+ # ------------------------------------------------------------------
92
+ # URL composition wrapped over RestApiGroup.build_leaf
93
+ # ------------------------------------------------------------------
94
+
95
+ def compose_url(self, *, parts=None, params=None) -> str:
96
+ """
97
+ Compose an absolute URL by joining BASE_LEAF with any
98
+ additional path parts.
99
+
100
+ Query parameters are not embedded into the returned URL;
101
+ they are emitted via the `params=` argument to requests in
102
+ sorted-key order. The sort key ordering invariant is
103
+ enforced at the call site (e.g. the ``params`` dict passed
104
+ to ``session.get``) so the property-test suite need not
105
+ inspect raw URLs.
106
+
107
+ :param parts: Optional list of additional path segments
108
+ to append after BASE_LEAF.
109
+ :param params: Optional dict of query parameters (forwarded
110
+ to callers; not embedded into the URL string here).
111
+
112
+ :returns: The absolute URL composed against the client.
113
+ """
114
+ _ = params
115
+ client = self.client
116
+ if parts is None or len(parts) == 0:
117
+ leaf = self.BASE_LEAF
118
+ else:
119
+ leaf = self.build_leaf(parts=parts)
120
+ if not leaf.startswith("/"):
121
+ leaf = "/" + leaf
122
+
123
+ rtnval = client.build_url(leaf=leaf)
124
+ return rtnval
125
+
126
+ def sort_params(self, *, params) -> dict:
127
+ """
128
+ Return the params dict re-keyed alphabetically.
129
+
130
+ :param params: Raw params dict (may be ``None``).
131
+
132
+ :returns: A new dict with keys in sorted order.
133
+ """
134
+ rtnval = {}
135
+ if params is None:
136
+ return rtnval
137
+ for key in sorted(params.keys()):
138
+ rtnval[key] = params[key]
139
+ return rtnval
@@ -0,0 +1,29 @@
1
+ """
2
+ .. module:: certificatemanagementgroup
3
+ :platform: Darwin, Linux, Unix, Windows
4
+ :synopsis: Certificate management API group for :class:`VSphereClient`.
5
+
6
+ .. moduleauthor:: Myron Walker <myron.walker@gmail.com>
7
+ """
8
+
9
+ __author__ = "Myron Walker"
10
+ __copyright__ = "Copyright 2025, Code Craft AI LLC"
11
+ __credits__ = []
12
+
13
+
14
+ from ccai.restclient.vsphere.apigroups.basegroup import BaseGroup
15
+
16
+
17
+ class CertificateManagementGroup(BaseGroup):
18
+ """
19
+ Certificate management operations.
20
+
21
+ The legacy ``*Ext`` class in ``codecraftai-landscaping`` did not
22
+ expose any public methods on this group; the structural
23
+ migration is complete and feature methods will be added by
24
+ downstream specs as needed (see ``vsphere-content-library-deploy``,
25
+ ``vsphere-events-stream``, ``vsphere-linked-mode``,
26
+ ``vsphere-inventory-helpers`` for the planned additions).
27
+ """
28
+
29
+ BASE_LEAF = "/api/vcenter/certificate-management"
@@ -0,0 +1,29 @@
1
+ """
2
+ .. module:: clustergroup
3
+ :platform: Darwin, Linux, Unix, Windows
4
+ :synopsis: Cluster API group for :class:`VSphereClient`.
5
+
6
+ .. moduleauthor:: Myron Walker <myron.walker@gmail.com>
7
+ """
8
+
9
+ __author__ = "Myron Walker"
10
+ __copyright__ = "Copyright 2025, Code Craft AI LLC"
11
+ __credits__ = []
12
+
13
+
14
+ from ccai.restclient.vsphere.apigroups.basegroup import BaseGroup
15
+
16
+
17
+ class ClusterGroup(BaseGroup):
18
+ """
19
+ Cluster operations.
20
+
21
+ The legacy ``*Ext`` class in ``codecraftai-landscaping`` did not
22
+ expose any public methods on this group; the structural
23
+ migration is complete and feature methods will be added by
24
+ downstream specs as needed (see ``vsphere-content-library-deploy``,
25
+ ``vsphere-events-stream``, ``vsphere-linked-mode``,
26
+ ``vsphere-inventory-helpers`` for the planned additions).
27
+ """
28
+
29
+ BASE_LEAF = "/api/vcenter/cluster"