diff --git a/lib/apiservers/service/restapi/handlers/common.go b/lib/apiservers/service/restapi/handlers/common.go index 915cb57369..339ea15ce6 100644 --- a/lib/apiservers/service/restapi/handlers/common.go +++ b/lib/apiservers/service/restapi/handlers/common.go @@ -94,12 +94,12 @@ func validateTarget(ctx context.Context, d *data.Data) (*validate.Validator, err } // Copied from list.go, and appears to be present other places. TODO: deduplicate -func upgradeStatusMessage(ctx context.Context, vch *vm.VirtualMachine, installerVer *version.Build, vchVer *version.Build) string { +func upgradeStatusMessage(op trace.Operation, vch *vm.VirtualMachine, installerVer *version.Build, vchVer *version.Build) string { if sameVer := installerVer.Equal(vchVer); sameVer { return "Up to date" } - upgrading, err := vch.VCHUpdateStatus(ctx) + upgrading, err := vch.VCHUpdateStatus(op) if err != nil { return fmt.Sprintf("Unknown: %s", err) } diff --git a/lib/apiservers/service/restapi/handlers/vch_create.go b/lib/apiservers/service/restapi/handlers/vch_create.go index 66b5e691b8..c1c9661da3 100644 --- a/lib/apiservers/service/restapi/handlers/vch_create.go +++ b/lib/apiservers/service/restapi/handlers/vch_create.go @@ -15,7 +15,6 @@ package handlers import ( - "context" "fmt" "io" "math" @@ -44,6 +43,7 @@ import ( "github.com/vmware/vic/lib/install/vchlog" "github.com/vmware/vic/pkg/ip" viclog "github.com/vmware/vic/pkg/log" + "github.com/vmware/vic/pkg/trace" "github.com/vmware/vic/pkg/version" ) @@ -77,17 +77,18 @@ func (h *VCHCreate) Handle(params operations.PostTargetTargetVchParams, principa return operations.NewPostTargetTargetVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - validator, err := validateTarget(params.HTTPRequest.Context(), d) + op := trace.NewOperation(params.HTTPRequest.Context(), "vch create handler") + validator, err := validateTarget(op, d) if err != nil { return operations.NewPostTargetTargetVchDefault(400).WithPayload(&models.Error{Message: err.Error()}) } - c, err := buildCreate(params.HTTPRequest.Context(), d, validator.Session.Finder, params.Vch) + c, err := buildCreate(op, d, validator.Session.Finder, params.Vch) if err != nil { return operations.NewPostTargetTargetVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - task, err := handleCreate(params.HTTPRequest.Context(), c, validator) + task, err := handleCreate(op, c, validator) if err != nil { return operations.NewPostTargetTargetVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -113,17 +114,18 @@ func (h *VCHDatacenterCreate) Handle(params operations.PostTargetTargetDatacente return operations.NewPostTargetTargetDatacenterDatacenterVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - validator, err := validateTarget(params.HTTPRequest.Context(), d) + op := trace.NewOperation(params.HTTPRequest.Context(), "vch create handler") + validator, err := validateTarget(op, d) if err != nil { return operations.NewPostTargetTargetDatacenterDatacenterVchDefault(400).WithPayload(&models.Error{Message: err.Error()}) } - c, err := buildCreate(params.HTTPRequest.Context(), d, validator.Session.Finder, params.Vch) + c, err := buildCreate(op, d, validator.Session.Finder, params.Vch) if err != nil { return operations.NewPostTargetTargetDatacenterDatacenterVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - task, err := handleCreate(params.HTTPRequest.Context(), c, validator) + task, err := handleCreate(op, c, validator) if err != nil { return operations.NewPostTargetTargetDatacenterDatacenterVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -157,7 +159,7 @@ func setUpLogger() *os.File { return localLogFile } -func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *models.VCH) (*create.Create, error) { +func buildCreate(op trace.Operation, d *data.Data, finder *find.Finder, vch *models.VCH) (*create.Create, error) { c := &create.Create{Data: d} // TODO: deduplicate with create.processParams @@ -193,7 +195,7 @@ func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *mo c.ResourceLimits.VCHMemoryShares = fromShares(vch.Compute.Memory.Shares) } - resourcePath, err := fromManagedObject(ctx, finder, "ResourcePool", vch.Compute.Resource) // TODO: Do we need to handle clusters differently? + resourcePath, err := fromManagedObject(op, finder, "ResourcePool", vch.Compute.Resource) // TODO: Do we need to handle clusters differently? if err != nil { return nil, util.NewError(400, fmt.Sprintf("Error finding resource pool: %s", err)) } @@ -205,7 +207,7 @@ func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *mo if vch.Network != nil { if vch.Network.Bridge != nil { - path, err := fromManagedObject(ctx, finder, "Network", vch.Network.Bridge.PortGroup) + path, err := fromManagedObject(op, finder, "Network", vch.Network.Bridge.PortGroup) if err != nil { return nil, util.NewError(400, fmt.Sprintf("Error finding bridge network: %s", err)) } @@ -221,7 +223,7 @@ func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *mo } if vch.Network.Client != nil { - path, err := fromManagedObject(ctx, finder, "Network", vch.Network.Client.PortGroup) + path, err := fromManagedObject(op, finder, "Network", vch.Network.Client.PortGroup) if err != nil { return nil, util.NewError(400, fmt.Sprintf("Error finding client network portgroup: %s", err)) } @@ -238,7 +240,7 @@ func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *mo } if vch.Network.Management != nil { - path, err := fromManagedObject(ctx, finder, "Network", vch.Network.Management.PortGroup) + path, err := fromManagedObject(op, finder, "Network", vch.Network.Management.PortGroup) if err != nil { return nil, util.NewError(400, fmt.Sprintf("Error finding management network portgroup: %s", err)) } @@ -255,7 +257,7 @@ func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *mo } if vch.Network.Public != nil { - path, err := fromManagedObject(ctx, finder, "Network", vch.Network.Public.PortGroup) + path, err := fromManagedObject(op, finder, "Network", vch.Network.Public.PortGroup) if err != nil { return nil, util.NewError(400, fmt.Sprintf("Error finding public network portgroup: %s", err)) } @@ -282,7 +284,7 @@ func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *mo for _, cnetwork := range vch.Network.Container { alias := cnetwork.Alias - path, err := fromManagedObject(ctx, finder, "Network", cnetwork.PortGroup) + path, err := fromManagedObject(op, finder, "Network", cnetwork.PortGroup) if err != nil { return nil, util.NewError(400, fmt.Sprintf("Error finding portgroup for container network %s: %s", alias, err)) } @@ -422,7 +424,7 @@ func buildCreate(ctx context.Context, d *data.Data, finder *find.Finder, vch *mo return c, nil } -func handleCreate(ctx context.Context, c *create.Create, validator *validate.Validator) (*strfmt.URI, error) { +func handleCreate(op trace.Operation, c *create.Create, validator *validate.Validator) (*strfmt.URI, error) { vchConfig, err := validator.Validate(validator.Context, c.Data) vConfig := validator.AddDeprecatedFields(validator.Context, vchConfig, c.Data) @@ -462,10 +464,10 @@ func fromNetworkAddress(m *models.NetworkAddress) string { return string(m.Hostname) } -func fromManagedObject(ctx context.Context, finder *find.Finder, t string, m *models.ManagedObject) (string, error) { +func fromManagedObject(op trace.Operation, finder *find.Finder, t string, m *models.ManagedObject) (string, error) { if m.ID != "" { managedObjectReference := types.ManagedObjectReference{Type: t, Value: m.ID} - element, err := finder.Element(ctx, managedObjectReference) + element, err := finder.Element(op, managedObjectReference) if err != nil { return "", err diff --git a/lib/apiservers/service/restapi/handlers/vch_get.go b/lib/apiservers/service/restapi/handlers/vch_get.go index ddd6579bd0..9a06e81866 100644 --- a/lib/apiservers/service/restapi/handlers/vch_get.go +++ b/lib/apiservers/service/restapi/handlers/vch_get.go @@ -16,7 +16,6 @@ package handlers import ( "bytes" - "context" "encoding/pem" "fmt" "net" @@ -37,6 +36,7 @@ import ( "github.com/vmware/vic/lib/install/data" "github.com/vmware/vic/lib/install/management" "github.com/vmware/vic/lib/install/validate" + "github.com/vmware/vic/pkg/trace" "github.com/vmware/vic/pkg/version" "github.com/vmware/vic/pkg/vsphere/vm" ) @@ -63,8 +63,8 @@ func (h *VCHGet) Handle(params operations.GetTargetTargetVchVchIDParams, princip d.ID = params.VchID - vch, err := getVCH(params.HTTPRequest.Context(), d) - + op := trace.NewOperation(params.HTTPRequest.Context(), "vch: %s", params.VchID) + vch, err := getVCH(op, d) if err != nil { return operations.NewGetTargetTargetVchVchIDDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -86,8 +86,8 @@ func (h *VCHDatacenterGet) Handle(params operations.GetTargetTargetDatacenterDat d.ID = params.VchID - vch, err := getVCH(params.HTTPRequest.Context(), d) - + op := trace.NewOperation(params.HTTPRequest.Context(), "vch: %s", params.VchID) + vch, err := getVCH(op, d) if err != nil { return operations.NewGetTargetTargetDatacenterDatacenterVchVchIDDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -95,8 +95,8 @@ func (h *VCHDatacenterGet) Handle(params operations.GetTargetTargetDatacenterDat return operations.NewGetTargetTargetDatacenterDatacenterVchVchIDOK().WithPayload(vch) } -func getVCH(ctx context.Context, d *data.Data) (*models.VCH, error) { - validator, err := validateTarget(ctx, d) +func getVCH(op trace.Operation, d *data.Data) (*models.VCH, error) { + validator, err := validateTarget(op, d) if err != nil { return nil, util.WrapError(400, err) } @@ -112,7 +112,7 @@ func getVCH(ctx context.Context, d *data.Data) (*models.VCH, error) { return nil, util.NewError(500, fmt.Sprintf("Failed to load VCH data: %s", err)) } - model, err := vchToModel(vch, d, executor) + model, err := vchToModel(op, vch, d, executor) if err != nil { return nil, util.WrapError(500, err) } @@ -120,7 +120,7 @@ func getVCH(ctx context.Context, d *data.Data) (*models.VCH, error) { return model, nil } -func vchToModel(vch *vm.VirtualMachine, d *data.Data, executor *management.Dispatcher) (*models.VCH, error) { +func vchToModel(op trace.Operation, vch *vm.VirtualMachine, d *data.Data, executor *management.Dispatcher) (*models.VCH, error) { vchConfig, err := executor.GetNoSecretVCHConfig(vch) if err != nil { return nil, fmt.Errorf("Unable to retrieve VCH information: %s", err) @@ -237,10 +237,10 @@ func vchToModel(vch *vm.VirtualMachine, d *data.Data, executor *management.Dispa model.Runtime = &models.VCHRuntime{} installerVer := version.GetBuild() - upgradeStatus := upgradeStatusMessage(context.Background(), vch, installerVer, vchConfig.Version) + upgradeStatus := upgradeStatusMessage(op, vch, installerVer, vchConfig.Version) model.Runtime.UpgradeStatus = upgradeStatus - powerState, err := vch.PowerState(context.Background()) + powerState, err := vch.PowerState(op) if err != nil { powerState = "error" } diff --git a/lib/apiservers/service/restapi/handlers/vch_list_get.go b/lib/apiservers/service/restapi/handlers/vch_list_get.go index f31e7e7bf4..738370bdc3 100644 --- a/lib/apiservers/service/restapi/handlers/vch_list_get.go +++ b/lib/apiservers/service/restapi/handlers/vch_list_get.go @@ -15,7 +15,6 @@ package handlers import ( - "context" "fmt" "net/url" "path" @@ -28,6 +27,7 @@ import ( "github.com/vmware/vic/lib/apiservers/service/restapi/operations" "github.com/vmware/vic/lib/install/data" "github.com/vmware/vic/lib/install/management" + "github.com/vmware/vic/pkg/trace" "github.com/vmware/vic/pkg/version" "github.com/vmware/vic/pkg/vsphere/vm" ) @@ -52,7 +52,8 @@ func (h *VCHListGet) Handle(params operations.GetTargetTargetVchParams, principa return operations.NewGetTargetTargetVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - vchs, err := listVCHs(params.HTTPRequest.Context(), d) + op := trace.NewOperation(params.HTTPRequest.Context(), "vch_list get handler") + vchs, err := listVCHs(op, d) if err != nil { return operations.NewGetTargetTargetVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -72,7 +73,8 @@ func (h *VCHDatacenterListGet) Handle(params operations.GetTargetTargetDatacente return operations.NewGetTargetTargetVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - vchs, err := listVCHs(params.HTTPRequest.Context(), d) + op := trace.NewOperation(params.HTTPRequest.Context(), "vch_list get handler") + vchs, err := listVCHs(op, d) if err != nil { return operations.NewGetTargetTargetVchDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -80,8 +82,8 @@ func (h *VCHDatacenterListGet) Handle(params operations.GetTargetTargetDatacente return operations.NewGetTargetTargetVchOK().WithPayload(operations.GetTargetTargetVchOKBody{Vchs: vchs}) } -func listVCHs(ctx context.Context, d *data.Data) ([]*models.VCHListItem, error) { - validator, err := validateTarget(ctx, d) +func listVCHs(op trace.Operation, d *data.Data) ([]*models.VCHListItem, error) { + validator, err := validateTarget(op, d) if err != nil { return nil, util.WrapError(400, err) } @@ -92,10 +94,10 @@ func listVCHs(ctx context.Context, d *data.Data) ([]*models.VCHListItem, error) return nil, util.NewError(500, fmt.Sprintf("Failed to search VCHs in %s: %s", validator.ResourcePoolPath, err)) } - return vchsToModels(ctx, vchs, executor), nil + return vchsToModels(op, vchs, executor), nil } -func vchsToModels(ctx context.Context, vchs []*vm.VirtualMachine, executor *management.Dispatcher) []*models.VCHListItem { +func vchsToModels(op trace.Operation, vchs []*vm.VirtualMachine, executor *management.Dispatcher) []*models.VCHListItem { installerVer := version.GetBuild() payload := make([]*models.VCHListItem, 0) for _, vch := range vchs { @@ -124,7 +126,7 @@ func vchsToModels(ctx context.Context, vchs []*vm.VirtualMachine, executor *mana if version != nil { model.Version = version.ShortVersion() - model.UpgradeStatus = upgradeStatusMessage(ctx, vch, installerVer, version) + model.UpgradeStatus = upgradeStatusMessage(op, vch, installerVer, version) } payload = append(payload, model) diff --git a/lib/apiservers/service/restapi/handlers/vch_log_get.go b/lib/apiservers/service/restapi/handlers/vch_log_get.go index 9d76579dfd..60321c2910 100644 --- a/lib/apiservers/service/restapi/handlers/vch_log_get.go +++ b/lib/apiservers/service/restapi/handlers/vch_log_get.go @@ -16,7 +16,6 @@ package handlers import ( "bytes" - "context" "fmt" "net/http" "net/url" @@ -63,17 +62,17 @@ func (h *VCHLogGet) Handle(params operations.GetTargetTargetVchVchIDLogParams, p d.ID = params.VchID op := trace.NewOperation(params.HTTPRequest.Context(), "vch: %s", params.VchID) - helper, err := getDatastoreHelper(op.Context, d) + helper, err := getDatastoreHelper(op, d) if err != nil { return operations.NewGetTargetTargetVchVchIDLogDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - logFilePaths, err := getAllLogFilePaths(op.Context, helper) + logFilePaths, err := getAllLogFilePaths(op, helper) if err != nil { return operations.NewGetTargetTargetVchVchIDLogDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - output, err := getContentFromLogFiles(op.Context, helper, logFilePaths) + output, err := getContentFromLogFiles(op, helper, logFilePaths) if err != nil { return operations.NewGetTargetTargetVchVchIDLogDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -96,17 +95,17 @@ func (h *VCHDatacenterLogGet) Handle(params operations.GetTargetTargetDatacenter d.ID = params.VchID op := trace.NewOperation(params.HTTPRequest.Context(), "vch: %s", params.VchID) - helper, err := getDatastoreHelper(op.Context, d) + helper, err := getDatastoreHelper(op, d) if err != nil { return operations.NewGetTargetTargetDatacenterDatacenterVchVchIDLogDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - logFilePaths, err := getAllLogFilePaths(op.Context, helper) + logFilePaths, err := getAllLogFilePaths(op, helper) if err != nil { return operations.NewGetTargetTargetDatacenterDatacenterVchVchIDLogDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } - output, err := getContentFromLogFiles(op.Context, helper, logFilePaths) + output, err := getContentFromLogFiles(op, helper, logFilePaths) if err != nil { return operations.NewGetTargetTargetDatacenterDatacenterVchVchIDLogDefault(util.StatusCode(err)).WithPayload(&models.Error{Message: err.Error()}) } @@ -115,9 +114,9 @@ func (h *VCHDatacenterLogGet) Handle(params operations.GetTargetTargetDatacenter } // getDatastoreHelper validates the VCH and returns the datastore helper for the VCH. It errors when validation fails or when datastore is not ready -func getDatastoreHelper(ctx context.Context, d *data.Data) (*datastore.Helper, error) { +func getDatastoreHelper(op trace.Operation, d *data.Data) (*datastore.Helper, error) { // TODO (angiew): abstract some of the boilerplate into helpers in common.go - validator, err := validateTarget(ctx, d) + validator, err := validateTarget(op, d) if err != nil { return nil, util.WrapError(http.StatusBadRequest, err) } @@ -148,7 +147,7 @@ func getDatastoreHelper(ctx context.Context, d *data.Data) (*datastore.Helper, e } // Create a new datastore helper for file finding - helper, err := datastore.NewHelper(ctx, validator.Session, ds, vmPath) + helper, err := datastore.NewHelper(op, validator.Session, ds, vmPath) if err != nil { return nil, fmt.Errorf("Unable to get datastore helper: %s", err) } @@ -157,8 +156,8 @@ func getDatastoreHelper(ctx context.Context, d *data.Data) (*datastore.Helper, e } // getAllLogFilePaths returns a list of all log file paths under datastore folder, errors out when no log file found -func getAllLogFilePaths(ctx context.Context, helper *datastore.Helper) ([]string, error) { - res, err := helper.Ls(ctx, "") +func getAllLogFilePaths(op trace.Operation, helper *datastore.Helper) ([]string, error) { + res, err := helper.Ls(op, "") if err != nil { return nil, fmt.Errorf("Unable to list all files under datastore: %s", err) } @@ -179,14 +178,14 @@ func getAllLogFilePaths(ctx context.Context, helper *datastore.Helper) ([]string } // getContentFromLogFile downloads all log files in the list, concatenates the content of each log file and outputs a string of contents -func getContentFromLogFiles(ctx context.Context, helper *datastore.Helper, paths []string) (string, error) { +func getContentFromLogFiles(op trace.Operation, helper *datastore.Helper, paths []string) (string, error) { var buffer bytes.Buffer // sort log files based on timestamp sort.Strings(paths) for _, p := range paths { - reader, err := helper.Download(ctx, p) + reader, err := helper.Download(op, p) if err != nil { return "", fmt.Errorf("Unable to download log file %s: %s", p, err) }