github.com/vmware/govmomi@v0.51.0/cli/kms/export.go (about)

     1  // © Broadcom. All Rights Reserved.
     2  // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package kms
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"net/url"
    12  
    13  	"github.com/vmware/govmomi/cli"
    14  	"github.com/vmware/govmomi/cli/flags"
    15  	"github.com/vmware/govmomi/vapi/crypto"
    16  )
    17  
    18  type export struct {
    19  	*flags.ClientFlag
    20  
    21  	spec crypto.KmsProviderExportSpec
    22  	file string
    23  }
    24  
    25  func init() {
    26  	cli.Register("kms.export", &export{})
    27  }
    28  
    29  func (cmd *export) Register(ctx context.Context, f *flag.FlagSet) {
    30  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    31  	cmd.ClientFlag.Register(ctx, f)
    32  
    33  	f.StringVar(&cmd.file, "f", "", "File name")
    34  	f.StringVar(&cmd.spec.Password, "p", "", "Password")
    35  }
    36  
    37  func (cmd *export) Usage() string {
    38  	return "NAME"
    39  }
    40  
    41  func (cmd *export) Description() string {
    42  	return `Export KMS cluster for backup.
    43  
    44  Examples:
    45    govc kms.export my-kp
    46    govc kms.export -f my-backup.p12 my-kp`
    47  }
    48  
    49  func (cmd *export) Run(ctx context.Context, f *flag.FlagSet) error {
    50  	id := f.Arg(0)
    51  	if id == "" {
    52  		return flag.ErrHelp
    53  	}
    54  
    55  	rc, err := cmd.RestClient()
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	m := crypto.NewManager(rc)
    61  
    62  	cmd.spec.Provider = id
    63  	export, err := m.KmsProviderExport(ctx, cmd.spec)
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	if export.Type != "LOCATION" {
    69  		return fmt.Errorf("unsupported export type: %s", export.Type)
    70  	}
    71  
    72  	// Rewrite URL to use the host we connected to vCenter with
    73  	u, err := url.Parse(export.Location.URL)
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	u.Host = rc.URL().Host
    79  	export.Location.URL = u.String()
    80  
    81  	req, err := m.KmsProviderExportRequest(ctx, export.Location)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	return rc.DownloadAttachment(ctx, req, cmd.file)
    87  }