Blame vendor/github.com/vmware/govmomi/object/diagnostic_log.go

Packit 63bb0d
/*
Packit 63bb0d
Copyright (c) 2015 VMware, Inc. All Rights Reserved.
Packit 63bb0d
Packit 63bb0d
Licensed under the Apache License, Version 2.0 (the "License");
Packit 63bb0d
you may not use this file except in compliance with the License.
Packit 63bb0d
You may obtain a copy of the License at
Packit 63bb0d
Packit 63bb0d
    http://www.apache.org/licenses/LICENSE-2.0
Packit 63bb0d
Packit 63bb0d
Unless required by applicable law or agreed to in writing, software
Packit 63bb0d
distributed under the License is distributed on an "AS IS" BASIS,
Packit 63bb0d
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 63bb0d
See the License for the specific language governing permissions and
Packit 63bb0d
limitations under the License.
Packit 63bb0d
*/
Packit 63bb0d
Packit 63bb0d
package object
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"context"
Packit 63bb0d
	"fmt"
Packit 63bb0d
	"io"
Packit 63bb0d
	"math"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// DiagnosticLog wraps DiagnosticManager.BrowseLog
Packit 63bb0d
type DiagnosticLog struct {
Packit 63bb0d
	m DiagnosticManager
Packit 63bb0d
Packit 63bb0d
	Key  string
Packit 63bb0d
	Host *HostSystem
Packit 63bb0d
Packit 63bb0d
	Start int32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Seek to log position starting at the last nlines of the log
Packit 63bb0d
func (l *DiagnosticLog) Seek(ctx context.Context, nlines int32) error {
Packit 63bb0d
	h, err := l.m.BrowseLog(ctx, l.Host, l.Key, math.MaxInt32, 0)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	l.Start = h.LineEnd - nlines
Packit 63bb0d
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Copy log starting from l.Start to the given io.Writer
Packit 63bb0d
// Returns on error or when end of log is reached.
Packit 63bb0d
func (l *DiagnosticLog) Copy(ctx context.Context, w io.Writer) (int, error) {
Packit 63bb0d
	const max = 500 // VC max == 500, ESX max == 1000
Packit 63bb0d
	written := 0
Packit 63bb0d
Packit 63bb0d
	for {
Packit 63bb0d
		h, err := l.m.BrowseLog(ctx, l.Host, l.Key, l.Start, max)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			return 0, err
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		for _, line := range h.LineText {
Packit 63bb0d
			n, err := fmt.Fprintln(w, line)
Packit 63bb0d
			written += n
Packit 63bb0d
			if err != nil {
Packit 63bb0d
				return written, err
Packit 63bb0d
			}
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		l.Start += int32(len(h.LineText))
Packit 63bb0d
Packit 63bb0d
		if l.Start >= h.LineEnd {
Packit 63bb0d
			break
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return written, nil
Packit 63bb0d
}