Skip to content

Commit

Permalink
api: Helpers for key management servers
Browse files Browse the repository at this point in the history
This patch adds support for object/crypto_manager.go, which introduces
an object for a CryptoManager and several of its APIs, such as getting
the default provider, checking if the provider is native, listing
providers, and generating a new key.
  • Loading branch information
akutz committed Sep 11, 2024
1 parent 139b19e commit 0a640ad
Showing 1 changed file with 171 additions and 0 deletions.
171 changes: 171 additions & 0 deletions object/crypto_manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
/*
Copyright (c) 2024-2024 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package object

import (
"context"

"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/methods"
"github.com/vmware/govmomi/vim25/types"
)

type CryptoManager struct {
Common
}

func NewCryptoManager(
c *vim25.Client,
ref types.ManagedObjectReference) *CryptoManager {

return &CryptoManager{
Common: NewCommon(c, ref),
}
}

func (m CryptoManager) ListKmipClusters(
ctx context.Context) ([]types.KmipClusterInfo, error) {

req := types.ListKmipServers{
This: m.Reference(),
}
res, err := methods.ListKmipServers(ctx, m.Client(), &req)
if err != nil {
return nil, err
}
return res.Returnval, nil
}

func (m CryptoManager) IsDefaultProviderNative(
ctx context.Context) (bool, error) {

defaultProviderID, err := m.GetDefaultKmsClusterId(ctx)
if err != nil {
return false, err
}
if defaultProviderID == "" {
return false, nil
}
return m.IsNativeProvider(ctx, defaultProviderID)
}

func (m CryptoManager) IsNativeProvider(
ctx context.Context,
providerID string) (bool, error) {

info, err := m.GetClusterStatus(ctx, providerID)
if err != nil {
return false, err
}
if info == nil {
return false, nil
}
return info.ManagementType == string(
types.KmipClusterInfoKmsManagementTypeNativeProvider), nil
}

func (m CryptoManager) GetDefaultKmsClusterId(
ctx context.Context) (string, error) {

req := types.GetDefaultKmsCluster{
This: m.Reference(),
}
res, err := methods.GetDefaultKmsCluster(ctx, m.Client(), &req)
if err != nil {
return "", err
}
if res.Returnval != nil {
return res.Returnval.Id, nil
}
return "", nil
}

func (m CryptoManager) GetClusterStatus(
ctx context.Context,
providerID string) (*types.CryptoManagerKmipClusterStatus, error) {

req := types.RetrieveKmipServersStatus_Task{
This: m.Reference(),
Clusters: []types.KmipClusterInfo{
{
ClusterId: types.KeyProviderId{
Id: providerID,
},
},
},
}
res, err := methods.RetrieveKmipServersStatus_Task(ctx, m.Client(), &req)
if err != nil {
return nil, err
}

task := NewTask(m.Client(), res.Returnval)
taskInfo, err := task.WaitForResultEx(ctx)
if err != nil {
return nil, err
}

if taskInfo.Result == nil {
return nil, nil
}
result, ok := taskInfo.Result.(types.ArrayOfCryptoManagerKmipClusterStatus)
if !ok {
return nil, nil
}
if len(result.CryptoManagerKmipClusterStatus) == 0 {
return nil, nil
}

return &result.CryptoManagerKmipClusterStatus[0], nil

}

func (m CryptoManager) GenerateKey(
ctx context.Context,
providerID string) (string, error) {

req := types.GenerateKey{
This: m.Reference(),
KeyProvider: &types.KeyProviderId{
Id: providerID,
},
}
res, err := methods.GenerateKey(ctx, m.Client(), &req)
if err != nil {
return "", err
}
if !res.Returnval.Success {
return "", generateKeyError{
reason: res.Returnval.Reason,
fault: res.Returnval.Fault,
}
}
return res.Returnval.KeyId.KeyId, nil
}

type generateKeyError struct {
reason string
fault *types.LocalizedMethodFault
}

func (e generateKeyError) Error() string {
return e.reason
}

func (e generateKeyError) GetLocalizedMethodFault() *types.LocalizedMethodFault {
return e.fault
}

0 comments on commit 0a640ad

Please sign in to comment.