1/* 2Copyright (c) 2016 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 vm 18 19import ( 20 "context" 21 "flag" 22 23 "github.com/vmware/govmomi/govc/cli" 24 "github.com/vmware/govmomi/govc/flags" 25) 26 27type register struct { 28 *flags.DatastoreFlag 29 *flags.ResourcePoolFlag 30 *flags.HostSystemFlag 31 *flags.FolderFlag 32 33 name string 34 template bool 35} 36 37func init() { 38 cli.Register("vm.register", ®ister{}) 39} 40 41func (cmd *register) Register(ctx context.Context, f *flag.FlagSet) { 42 cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx) 43 cmd.DatastoreFlag.Register(ctx, f) 44 45 cmd.ResourcePoolFlag, ctx = flags.NewResourcePoolFlag(ctx) 46 cmd.ResourcePoolFlag.Register(ctx, f) 47 48 cmd.HostSystemFlag, ctx = flags.NewHostSystemFlag(ctx) 49 cmd.HostSystemFlag.Register(ctx, f) 50 51 cmd.FolderFlag, ctx = flags.NewFolderFlag(ctx) 52 cmd.FolderFlag.Register(ctx, f) 53 54 f.StringVar(&cmd.name, "name", "", "Name of the VM") 55 f.BoolVar(&cmd.template, "template", false, "Mark VM as template") 56} 57 58func (cmd *register) Process(ctx context.Context) error { 59 if err := cmd.DatastoreFlag.Process(ctx); err != nil { 60 return err 61 } 62 if err := cmd.ResourcePoolFlag.Process(ctx); err != nil { 63 return err 64 } 65 if err := cmd.HostSystemFlag.Process(ctx); err != nil { 66 return err 67 } 68 if err := cmd.FolderFlag.Process(ctx); err != nil { 69 return err 70 } 71 72 return nil 73} 74 75func (cmd *register) Usage() string { 76 return "VMX" 77} 78 79func (cmd *register) Description() string { 80 return `Add an existing VM to the inventory. 81 82VMX is a path to the vm config file, relative to DATASTORE. 83 84Examples: 85 govc vm.register path/name.vmx 86 govc vm.register -template -host $host path/name.vmx` 87} 88 89func (cmd *register) Run(ctx context.Context, f *flag.FlagSet) error { 90 if len(f.Args()) != 1 { 91 return flag.ErrHelp 92 } 93 94 pool, err := cmd.ResourcePoolIfSpecified() 95 if err != nil { 96 return err 97 } 98 99 host, err := cmd.HostSystemFlag.HostSystemIfSpecified() 100 if err != nil { 101 return err 102 } 103 104 if cmd.template { 105 if pool != nil || host == nil { 106 return flag.ErrHelp 107 } 108 } else if pool == nil { 109 if host != nil { 110 pool, err = host.ResourcePool(ctx) 111 if err != nil { 112 return err 113 } 114 } else { 115 // neither -host nor -pool were specified, so use the default pool (ESX) 116 pool, err = cmd.ResourcePool() 117 if err != nil { 118 return err 119 } 120 } 121 } 122 123 folder, err := cmd.FolderFlag.Folder() 124 if err != nil { 125 return err 126 } 127 128 path, err := cmd.DatastorePath(f.Arg(0)) 129 if err != nil { 130 return err 131 } 132 133 task, err := folder.RegisterVM(ctx, path, cmd.name, cmd.template, pool, host) 134 if err != nil { 135 return err 136 } 137 138 return task.Wait(ctx) 139} 140