|
Packit Service |
4d2de5 |
/*
|
|
Packit Service |
4d2de5 |
Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved.
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit Service |
4d2de5 |
you may not use this file except in compliance with the License.
|
|
Packit Service |
4d2de5 |
You may obtain a copy of the License at
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
Unless required by applicable law or agreed to in writing, software
|
|
Packit Service |
4d2de5 |
distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit Service |
4d2de5 |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit Service |
4d2de5 |
See the License for the specific language governing permissions and
|
|
Packit Service |
4d2de5 |
limitations under the License.
|
|
Packit Service |
4d2de5 |
*/
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
package esxcli
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
import (
|
|
Packit Service |
4d2de5 |
"context"
|
|
Packit Service |
4d2de5 |
"errors"
|
|
Packit Service |
4d2de5 |
"fmt"
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
"github.com/vmware/govmomi/internal"
|
|
Packit Service |
4d2de5 |
"github.com/vmware/govmomi/object"
|
|
Packit Service |
4d2de5 |
"github.com/vmware/govmomi/vim25"
|
|
Packit Service |
4d2de5 |
"github.com/vmware/govmomi/vim25/xml"
|
|
Packit Service |
4d2de5 |
)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
type Executor struct {
|
|
Packit Service |
4d2de5 |
c *vim25.Client
|
|
Packit Service |
4d2de5 |
host *object.HostSystem
|
|
Packit Service |
4d2de5 |
mme *internal.ReflectManagedMethodExecuter
|
|
Packit Service |
4d2de5 |
dtm *internal.InternalDynamicTypeManager
|
|
Packit Service |
4d2de5 |
info map[string]*CommandInfo
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func NewExecutor(c *vim25.Client, host *object.HostSystem) (*Executor, error) {
|
|
Packit Service |
4d2de5 |
ctx := context.TODO()
|
|
Packit Service |
4d2de5 |
e := &Executor{
|
|
Packit Service |
4d2de5 |
c: c,
|
|
Packit Service |
4d2de5 |
host: host,
|
|
Packit Service |
4d2de5 |
info: make(map[string]*CommandInfo),
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
{
|
|
Packit Service |
4d2de5 |
req := internal.RetrieveManagedMethodExecuterRequest{
|
|
Packit Service |
4d2de5 |
This: host.Reference(),
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
res, err := internal.RetrieveManagedMethodExecuter(ctx, c, &req)
|
|
Packit Service |
4d2de5 |
if err != nil {
|
|
Packit Service |
4d2de5 |
return nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
e.mme = res.Returnval
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
{
|
|
Packit Service |
4d2de5 |
req := internal.RetrieveDynamicTypeManagerRequest{
|
|
Packit Service |
4d2de5 |
This: host.Reference(),
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
res, err := internal.RetrieveDynamicTypeManager(ctx, c, &req)
|
|
Packit Service |
4d2de5 |
if err != nil {
|
|
Packit Service |
4d2de5 |
return nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
e.dtm = res.Returnval
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return e, nil
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func (e *Executor) CommandInfo(c *Command) (*CommandInfoMethod, error) {
|
|
Packit Service |
4d2de5 |
ns := c.Namespace()
|
|
Packit Service |
4d2de5 |
var info *CommandInfo
|
|
Packit Service |
4d2de5 |
var ok bool
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
if info, ok = e.info[ns]; !ok {
|
|
Packit Service |
4d2de5 |
req := internal.ExecuteSoapRequest{
|
|
Packit Service |
4d2de5 |
Moid: "ha-dynamic-type-manager-local-cli-cliinfo",
|
|
Packit Service |
4d2de5 |
Method: "vim.CLIInfo.FetchCLIInfo",
|
|
Packit Service |
4d2de5 |
Argument: []internal.ReflectManagedMethodExecuterSoapArgument{
|
|
Packit Service |
4d2de5 |
c.Argument("typeName", "vim.EsxCLI."+ns),
|
|
Packit Service |
4d2de5 |
},
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
info = new(CommandInfo)
|
|
Packit Service |
4d2de5 |
if err := e.Execute(&req, info); err != nil {
|
|
Packit Service |
4d2de5 |
return nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
e.info[ns] = info
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
name := c.Name()
|
|
Packit Service |
4d2de5 |
for _, method := range info.Method {
|
|
Packit Service |
4d2de5 |
if method.Name == name {
|
|
Packit Service |
4d2de5 |
return method, nil
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return nil, fmt.Errorf("method '%s' not found in name space '%s'", name, c.Namespace())
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func (e *Executor) NewRequest(args []string) (*internal.ExecuteSoapRequest, *CommandInfoMethod, error) {
|
|
Packit Service |
4d2de5 |
c := NewCommand(args)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
info, err := e.CommandInfo(c)
|
|
Packit Service |
4d2de5 |
if err != nil {
|
|
Packit Service |
4d2de5 |
return nil, nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
sargs, err := c.Parse(info.Param)
|
|
Packit Service |
4d2de5 |
if err != nil {
|
|
Packit Service |
4d2de5 |
return nil, nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
sreq := internal.ExecuteSoapRequest{
|
|
Packit Service |
4d2de5 |
Moid: c.Moid(),
|
|
Packit Service |
4d2de5 |
Method: c.Method(),
|
|
Packit Service |
4d2de5 |
Argument: sargs,
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return &sreq, info, nil
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func (e *Executor) Execute(req *internal.ExecuteSoapRequest, res interface{}) error {
|
|
Packit Service |
4d2de5 |
ctx := context.TODO()
|
|
Packit Service |
4d2de5 |
req.This = e.mme.ManagedObjectReference
|
|
Packit Service |
4d2de5 |
req.Version = "urn:vim25/5.0"
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
x, err := internal.ExecuteSoap(ctx, e.c, req)
|
|
Packit Service |
4d2de5 |
if err != nil {
|
|
Packit Service |
4d2de5 |
return err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
if x.Returnval != nil {
|
|
Packit Service |
4d2de5 |
if x.Returnval.Fault != nil {
|
|
Packit Service |
4d2de5 |
return errors.New(x.Returnval.Fault.FaultMsg)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
if err := xml.Unmarshal([]byte(x.Returnval.Response), res); err != nil {
|
|
Packit Service |
4d2de5 |
return err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return nil
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func (e *Executor) Run(args []string) (*Response, error) {
|
|
Packit Service |
4d2de5 |
req, info, err := e.NewRequest(args)
|
|
Packit Service |
4d2de5 |
if err != nil {
|
|
Packit Service |
4d2de5 |
return nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
res := &Response{
|
|
Packit Service |
4d2de5 |
Info: info,
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
if err := e.Execute(req, res); err != nil {
|
|
Packit Service |
4d2de5 |
return nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return res, nil
|
|
Packit Service |
4d2de5 |
}
|