@@ -17,6 +17,8 @@ limitations under the License.
1717package simulator
1818
1919import (
20+ "slices"
21+
2022 "github.com/vmware/govmomi/vim25/methods"
2123 "github.com/vmware/govmomi/vim25/mo"
2224 "github.com/vmware/govmomi/vim25/soap"
@@ -51,7 +53,23 @@ type LicenseManager struct {
5153}
5254
5355func (m * LicenseManager ) init (r * Registry ) {
54- m .Licenses = []types.LicenseManagerLicenseInfo {EvalLicense }
56+ if len (m .Licenses ) == 0 {
57+ about := r .content ().About
58+ product := []types.KeyAnyValue {
59+ {
60+ Key : "ProductName" ,
61+ Value : about .LicenseProductName ,
62+ },
63+ {
64+ Key : "ProductVersion" ,
65+ Value : about .LicenseProductVersion ,
66+ },
67+ }
68+
69+ EvalLicense .Properties = append (EvalLicense .Properties , product ... )
70+
71+ m .Licenses = []types.LicenseManagerLicenseInfo {EvalLicense }
72+ }
5573
5674 if r .IsVPX () {
5775 if m .LicenseAssignmentManager == nil {
@@ -60,9 +78,16 @@ func (m *LicenseManager) init(r *Registry) {
6078 Value : "LicenseAssignmentManager" ,
6179 }
6280 }
63- r .Put (& LicenseAssignmentManager {
64- mo.LicenseAssignmentManager {Self : * m .LicenseAssignmentManager },
65- })
81+
82+ lam := new (LicenseAssignmentManager )
83+ lam .Self = * m .LicenseAssignmentManager
84+ lam .QueryAssignedLicensesResponse .Returnval = []types.LicenseAssignmentManagerLicenseAssignment {{
85+ EntityId : r .content ().About .InstanceUuid ,
86+ EntityDisplayName : "vcsim" ,
87+ AssignedLicense : EvalLicense ,
88+ }}
89+ r .Put (lam )
90+ r .AddHandler (lam )
6691 }
6792}
6893
@@ -102,6 +127,21 @@ func (m *LicenseManager) RemoveLicense(ctx *Context, req *types.RemoveLicense) s
102127 return body
103128}
104129
130+ func (m * LicenseManager ) DecodeLicense (ctx * Context , req * types.DecodeLicense ) soap.HasFault {
131+ body := & methods.DecodeLicenseBody {
132+ Res : & types.DecodeLicenseResponse {},
133+ }
134+
135+ for _ , license := range m .Licenses {
136+ if req .LicenseKey == license .LicenseKey {
137+ body .Res .Returnval = license
138+ break
139+ }
140+ }
141+
142+ return body
143+ }
144+
105145func (m * LicenseManager ) UpdateLicenseLabel (ctx * Context , req * types.UpdateLicenseLabel ) soap.HasFault {
106146 body := & methods.UpdateLicenseLabelBody {}
107147
@@ -141,42 +181,108 @@ func (m *LicenseManager) UpdateLicenseLabel(ctx *Context, req *types.UpdateLicen
141181
142182type LicenseAssignmentManager struct {
143183 mo.LicenseAssignmentManager
184+
185+ types.QueryAssignedLicensesResponse
186+ }
187+
188+ var licensedTypes = []string {"HostSystem" , "ClusterComputeResource" }
189+
190+ // PutObject assigns a license when a host or cluster is created.
191+ func (m * LicenseAssignmentManager ) PutObject (obj mo.Reference ) {
192+ ref := obj .Reference ()
193+
194+ if ! slices .Contains (licensedTypes , ref .Type ) {
195+ return
196+ }
197+
198+ if slices .ContainsFunc (m .QueryAssignedLicensesResponse .Returnval ,
199+ func (am types.LicenseAssignmentManagerLicenseAssignment ) bool {
200+ return am .EntityId == ref .Value
201+ }) {
202+ return // via vcsim -load
203+ }
204+
205+ la := types.LicenseAssignmentManagerLicenseAssignment {
206+ EntityId : ref .Value ,
207+ Scope : Map .content ().About .InstanceUuid ,
208+ EntityDisplayName : obj .(mo.Entity ).Entity ().Name ,
209+ AssignedLicense : EvalLicense ,
210+ }
211+
212+ m .QueryAssignedLicensesResponse .Returnval =
213+ append (m .QueryAssignedLicensesResponse .Returnval , la )
214+ }
215+
216+ // RemoveObject removes the license assignment when a host or cluster is removed.
217+ func (m * LicenseAssignmentManager ) RemoveObject (ctx * Context , ref types.ManagedObjectReference ) {
218+ if ! slices .Contains (licensedTypes , ref .Type ) {
219+ return
220+ }
221+
222+ m .QueryAssignedLicensesResponse .Returnval =
223+ slices .DeleteFunc (m .QueryAssignedLicensesResponse .Returnval ,
224+ func (am types.LicenseAssignmentManagerLicenseAssignment ) bool {
225+ return am .EntityId == ref .Value
226+ })
227+ }
228+
229+ func (* LicenseAssignmentManager ) UpdateObject (* Context , mo.Reference , []types.PropertyChange ) {}
230+
231+ func (m * LicenseAssignmentManager ) init (r * Registry ) {
232+ r .AddHandler (m )
144233}
145234
146235func (m * LicenseAssignmentManager ) QueryAssignedLicenses (ctx * Context , req * types.QueryAssignedLicenses ) soap.HasFault {
147236 body := & methods.QueryAssignedLicensesBody {
148237 Res : & types.QueryAssignedLicensesResponse {},
149238 }
150239
151- // EntityId can be a HostSystem or the vCenter InstanceUuid
152- if req .EntityId != "" {
153- if req .EntityId != ctx .Map .content ().About .InstanceUuid {
154- id := types.ManagedObjectReference {
155- Type : "HostSystem" ,
156- Value : req .EntityId ,
157- }
158-
159- if ctx .Map .Get (id ) == nil {
160- return body
240+ if req .EntityId == "" {
241+ body .Res = & m .QueryAssignedLicensesResponse
242+ } else {
243+ for _ , r := range m .QueryAssignedLicensesResponse .Returnval {
244+ if r .EntityId == req .EntityId {
245+ body .Res .Returnval = append (body .Res .Returnval , r )
161246 }
162247 }
163248 }
164249
165- body .Res .Returnval = []types.LicenseAssignmentManagerLicenseAssignment {
166- {
167- EntityId : req .EntityId ,
168- AssignedLicense : EvalLicense ,
169- },
170- }
171-
172250 return body
173251}
174252
175253func (m * LicenseAssignmentManager ) UpdateAssignedLicense (ctx * Context , req * types.UpdateAssignedLicense ) soap.HasFault {
176- body := & methods.UpdateAssignedLicenseBody {
177- Res : & types.UpdateAssignedLicenseResponse {
178- Returnval : licenseInfo (req .LicenseKey , nil ),
179- },
254+ body := new (methods.UpdateAssignedLicenseBody )
255+
256+ var license * types.LicenseManagerLicenseInfo
257+ lm := ctx .Map .Get (* ctx .Map .content ().LicenseManager ).(* LicenseManager )
258+
259+ for i , l := range lm .Licenses {
260+ if l .LicenseKey == req .LicenseKey {
261+ license = & lm .Licenses [i ]
262+ }
263+ }
264+
265+ if license == nil {
266+ body .Fault_ = Fault ("" , & types.InvalidArgument {InvalidProperty : "entityId" })
267+ return body
268+ }
269+
270+ for i , r := range m .QueryAssignedLicensesResponse .Returnval {
271+ if r .EntityId == req .Entity {
272+ r .AssignedLicense = * license
273+
274+ if req .EntityDisplayName != "" {
275+ r .EntityDisplayName = req .EntityDisplayName
276+ }
277+
278+ m .QueryAssignedLicensesResponse .Returnval [i ] = r
279+
280+ body .Res = & types.UpdateAssignedLicenseResponse {
281+ Returnval : r .AssignedLicense ,
282+ }
283+
284+ break
285+ }
180286 }
181287
182288 return body
0 commit comments