1/*
2Copyright (c) 2015 VMware, Inc. All Rights Reserved.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package object
18
19import (
20	"context"
21
22	"github.com/vmware/govmomi/vim25"
23	"github.com/vmware/govmomi/vim25/methods"
24	"github.com/vmware/govmomi/vim25/mo"
25	"github.com/vmware/govmomi/vim25/types"
26)
27
28type ExtensionManager struct {
29	Common
30}
31
32// GetExtensionManager wraps NewExtensionManager, returning ErrNotSupported
33// when the client is not connected to a vCenter instance.
34func GetExtensionManager(c *vim25.Client) (*ExtensionManager, error) {
35	if c.ServiceContent.ExtensionManager == nil {
36		return nil, ErrNotSupported
37	}
38	return NewExtensionManager(c), nil
39}
40
41func NewExtensionManager(c *vim25.Client) *ExtensionManager {
42	o := ExtensionManager{
43		Common: NewCommon(c, *c.ServiceContent.ExtensionManager),
44	}
45
46	return &o
47}
48
49func (m ExtensionManager) List(ctx context.Context) ([]types.Extension, error) {
50	var em mo.ExtensionManager
51
52	err := m.Properties(ctx, m.Reference(), []string{"extensionList"}, &em)
53	if err != nil {
54		return nil, err
55	}
56
57	return em.ExtensionList, nil
58}
59
60func (m ExtensionManager) Find(ctx context.Context, key string) (*types.Extension, error) {
61	req := types.FindExtension{
62		This:         m.Reference(),
63		ExtensionKey: key,
64	}
65
66	res, err := methods.FindExtension(ctx, m.c, &req)
67	if err != nil {
68		return nil, err
69	}
70
71	return res.Returnval, nil
72}
73
74func (m ExtensionManager) Register(ctx context.Context, extension types.Extension) error {
75	req := types.RegisterExtension{
76		This:      m.Reference(),
77		Extension: extension,
78	}
79
80	_, err := methods.RegisterExtension(ctx, m.c, &req)
81	return err
82}
83
84func (m ExtensionManager) SetCertificate(ctx context.Context, key string, certificatePem string) error {
85	req := types.SetExtensionCertificate{
86		This:           m.Reference(),
87		ExtensionKey:   key,
88		CertificatePem: certificatePem,
89	}
90
91	_, err := methods.SetExtensionCertificate(ctx, m.c, &req)
92	return err
93}
94
95func (m ExtensionManager) Unregister(ctx context.Context, key string) error {
96	req := types.UnregisterExtension{
97		This:         m.Reference(),
98		ExtensionKey: key,
99	}
100
101	_, err := methods.UnregisterExtension(ctx, m.c, &req)
102	return err
103}
104
105func (m ExtensionManager) Update(ctx context.Context, extension types.Extension) error {
106	req := types.UpdateExtension{
107		This:      m.Reference(),
108		Extension: extension,
109	}
110
111	_, err := methods.UpdateExtension(ctx, m.c, &req)
112	return err
113}
114