influxdb/http/swagger_noassets.go

93 lines
2.8 KiB
Go

// +build !assets
package http
import (
"errors"
"io/ioutil"
"os"
"path/filepath"
"go.uber.org/zap"
)
// asset returns swaggerData if present;
// otherwise it looks in the following locations in this order:
// the location specified in environment variable INFLUXDB_SWAGGER_YML_PATH;
// <path to executable>/../../http/swagger.yml (binary built with make but without assets tag);
// <path to executable>/http/swagger.yml (user ran go build ./cmd/influxd && ./influxd);
// ./http/swagger.yml (user ran go run ./cmd/influxd).
//
// None of these lookups happen in production builds, which have the assets build tag.
func (s *swaggerLoader) asset(swaggerData []byte, _ error) ([]byte, error) {
if len(swaggerData) > 0 {
return swaggerData, nil
}
path := findSwaggerPath(s.log)
if path == "" {
// Couldn't find it.
return nil, errors.New("this developer binary not built with assets, and could not locate swagger.yml on disk")
}
b, err := ioutil.ReadFile(path)
if err != nil {
s.log.Info("Unable to load swagger.yml from disk", zap.String("path", path), zap.Error(err))
return nil, errors.New("this developer binary not built with assets, and unable to load swagger.yml from disk")
}
s.log.Info("Successfully loaded swagger.yml", zap.String("path", path))
return b, nil
}
// findSwaggerPath makes a best-effort to find the path of the swagger file on disk.
// If it can't find the path, it returns the empty string.
func findSwaggerPath(log *zap.Logger) string {
// First, look for environment variable pointing at swagger.
path := os.Getenv("INFLUXDB_VALID_SWAGGER_PATH")
if path != "" {
// Environment variable set.
return path
}
log.Info("INFLUXDB_VALID_SWAGGER_PATH not set; falling back to checking relative paths")
// Get the path to the executable so we can do a relative lookup.
execPath, err := os.Executable()
if err != nil {
// Give up.
log.Info("Can't determine path of currently running executable", zap.Error(err))
return ""
}
execDir := filepath.Dir(execPath)
// Assume the executable is in bin/$OS/, i.e. the developer built with make, but somehow without assets.
path = filepath.Join(execDir, "..", "..", "http", "swagger.yml")
if _, err := os.Stat(path); err == nil {
// Looks like we found it.
return path
}
// We didn't build from make... maybe the developer ran something like "go build ./cmd/influxd && ./influxd".
path = filepath.Join(execDir, "http", "swagger.yml")
if _, err := os.Stat(path); err == nil {
// Looks like we found it.
return path
}
// Maybe they're in the influxdb root, and ran something like "go run ./cmd/influxd".
wd, err := os.Getwd()
if err == nil {
path = filepath.Join(wd, "http", "swagger.yml")
if _, err := os.Stat(path); err == nil {
// Looks like we found it.
return path
}
}
log.Info("Couldn't guess path to swagger definition")
return ""
}