2
Copyright (c) 2014 VMware, Inc. All Rights Reserved.
4
Licensed under the Apache License, Version 2.0 (the "License");
5
you may not use this file except in compliance with the License.
6
You may obtain a copy of the License at
8
http://www.apache.org/licenses/LICENSE-2.0
10
Unless required by applicable law or agreed to in writing, software
11
distributed under the License is distributed on an "AS IS" BASIS,
12
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
See the License for the specific language governing permissions and
14
limitations under the License.
23
"github.com/juju/govmomi/govc/cli"
24
"github.com/juju/govmomi/govc/flags"
25
"github.com/juju/govmomi/object"
26
"github.com/juju/govmomi/vim25"
27
"github.com/juju/govmomi/vim25/types"
28
"golang.org/x/net/context"
35
*flags.ResourcePoolFlag
50
Datacenter *object.Datacenter
51
Datastore *object.Datastore
52
ResourcePool *object.ResourcePool
53
HostSystem *object.HostSystem
57
cli.Register("vm.create", &create{})
60
func (cmd *create) Register(f *flag.FlagSet) {
61
f.IntVar(&cmd.memory, "m", 1024, "Size in MB of memory")
62
f.IntVar(&cmd.cpus, "c", 1, "Number of CPUs")
63
f.StringVar(&cmd.guestID, "g", "otherGuest", "Guest OS")
64
f.BoolVar(&cmd.link, "link", true, "Link specified disk")
65
f.BoolVar(&cmd.on, "on", true, "Power on VM. Default is true if -disk argument is given.")
66
f.BoolVar(&cmd.force, "force", false, "Create VM if vmx already exists")
67
f.StringVar(&cmd.iso, "iso", "", "Path to ISO")
68
f.StringVar(&cmd.controller, "disk.controller", "scsi", "Disk controller type")
69
f.StringVar(&cmd.disk, "disk", "", "Disk path name")
72
func (cmd *create) Process() error { return nil }
74
func (cmd *create) Run(f *flag.FlagSet) error {
77
if len(f.Args()) != 1 {
81
cmd.Client, err = cmd.ClientFlag.Client()
86
cmd.Datacenter, err = cmd.DatacenterFlag.Datacenter()
91
cmd.Datastore, err = cmd.DatastoreFlag.Datastore()
96
cmd.HostSystem, err = cmd.HostSystemFlag.HostSystemIfSpecified()
101
if cmd.HostSystem != nil {
102
if cmd.ResourcePool, err = cmd.HostSystem.ResourcePool(context.TODO()); err != nil {
107
if cmd.ResourcePool, err = cmd.ResourcePoolFlag.ResourcePool(); err != nil {
112
for _, file := range []*string{&cmd.iso, &cmd.disk} {
114
_, err = cmd.Stat(*file)
121
task, err := cmd.createVM(f.Arg(0))
126
info, err := task.WaitForResult(context.TODO(), nil)
131
vm := object.NewVirtualMachine(cmd.Client, info.Result.(types.ManagedObjectReference))
133
if err := cmd.addDevices(vm); err != nil {
138
task, err := vm.PowerOn(context.TODO())
143
_, err = task.WaitForResult(context.TODO(), nil)
152
func (cmd *create) addDevices(vm *object.VirtualMachine) error {
153
devices, err := vm.Device(context.TODO())
158
var add []types.BaseVirtualDevice
161
controller, err := devices.FindDiskController(cmd.controller)
166
disk := devices.CreateDisk(controller, cmd.Datastore.Path(cmd.disk))
169
disk = devices.ChildDisk(disk)
172
add = append(add, disk)
176
ide, err := devices.FindIDEController("")
181
cdrom, err := devices.CreateCdrom(ide)
186
add = append(add, devices.InsertIso(cdrom, cmd.Datastore.Path(cmd.iso)))
189
netdev, err := cmd.NetworkFlag.Device()
194
add = append(add, netdev)
196
return vm.AddDevice(context.TODO(), add...)
199
func (cmd *create) createVM(name string) (*object.Task, error) {
200
spec := types.VirtualMachineConfigSpec{
202
GuestId: cmd.guestID,
203
Files: &types.VirtualMachineFileInfo{VmPathName: fmt.Sprintf("[%s]", cmd.Datastore.Name())},
205
MemoryMB: int64(cmd.memory),
209
vmxPath := fmt.Sprintf("%s/%s.vmx", name, name)
211
_, err := cmd.Stat(vmxPath)
213
dsPath := cmd.Datastore.Path(vmxPath)
214
return nil, fmt.Errorf("File %s already exists", dsPath)
218
if cmd.controller != "ide" {
219
scsi, err := object.SCSIControllerTypes().CreateSCSIController(cmd.controller)
224
spec.DeviceChange = append(spec.DeviceChange, &types.VirtualDeviceConfigSpec{
225
Operation: types.VirtualDeviceConfigSpecOperationAdd,
230
folders, err := cmd.Datacenter.Folders(context.TODO())
235
return folders.VmFolder.CreateVM(context.TODO(), spec, cmd.ResourcePool, cmd.HostSystem)