Blame vendor/github.com/vmware/govmomi/govc/host/esxcli/executor.go

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
}