func createNodes(ctx context.Context, sess *session.Session, pool *object.ResourcePool, node *Node, base string) error { log.Debugf("create node %+v", node) if node == nil { return nil } spec := simulator.NewResourceConfigSpec() node.Name = fmt.Sprintf("%s-%s", base, node.Name) switch node.Kind { case rpNode: child, err := pool.Create(ctx, node.Name, spec) if err != nil { return err } for _, childNode := range node.Children { return createNodes(ctx, sess, child, childNode, base) } case vappNode: confSpec := types.VAppConfigSpec{ VmConfigSpec: types.VmConfigSpec{}, } vapp, err := pool.CreateVApp(ctx, node.Name, spec, confSpec, nil) if err != nil { return err } config := types.VirtualMachineConfigSpec{ Name: node.Name, GuestId: string(types.VirtualMachineGuestOsIdentifierOtherGuest), Files: &types.VirtualMachineFileInfo{ VmPathName: fmt.Sprintf("[LocalDS_0] %s", node.Name), }, } if _, err = tasks.WaitForResult(ctx, func(ctx context.Context) (tasks.Task, error) { return vapp.CreateChildVM_Task(ctx, config, nil) }); err != nil { return err } case vmNode: config := types.VirtualMachineConfigSpec{ Name: node.Name, GuestId: string(types.VirtualMachineGuestOsIdentifierOtherGuest), Files: &types.VirtualMachineFileInfo{ VmPathName: fmt.Sprintf("[LocalDS_0] %s", node.Name), }, } folder := sess.Folders(ctx).VmFolder if _, err := tasks.WaitForResult(ctx, func(ctx context.Context) (tasks.Task, error) { return folder.CreateVM(ctx, config, pool, nil) }); err != nil { return err } default: return nil } return nil }