Files
Andrews ArokiamandGitHub 51173751aa Fixed go lint error using golangci-lint tool. (#3378)
* Fixed go lint error using golangci-lint tool.

Signed-off-by: Andrews Arokiam <[email protected]>

* go lint error fix

Signed-off-by: Andrews Arokiam <[email protected]>

* golint error fix for math/random

Signed-off-by: Andrews Arokiam <[email protected]>

* fix go tests and go-lint

Signed-off-by: Andrews Arokiam <[email protected]>

* commit for code review comments

Signed-off-by: Andrews Arokiam <[email protected]>

* fix for golint errcheck

Signed-off-by: Andrews Arokiam <[email protected]>

* gosec error fix

Signed-off-by: Andrews Arokiam <[email protected]>

---------

Signed-off-by: Andrews Arokiam <[email protected]>
2024-02-27 08:10:01 -05:00

108 lines
3.0 KiB
Go

package main
import (
"fmt"
"log"
"os"
pb "github.com/kserve/kserve/tools/tf2openapi/generated/protobuf"
"github.com/kserve/kserve/tools/tf2openapi/generator"
"github.com/spf13/cobra"
"google.golang.org/protobuf/proto"
)
// Known error messages
const (
ModelBasePathError = "Error reading file %s \n%s"
OutputFilePathError = "Failed writing to %s: %s"
SavedModelFormatError = "SavedModel not in expected format. May be corrupted: "
)
var (
modelBasePath string
modelName string
modelVersion string
sigDefKey string
metaGraphTags []string
outFile string
)
/** Convert SavedModel to OpenAPI. Note that the SavedModel must have at least one signature defined**/
func main() {
rootCmd := &cobra.Command{
Use: "tf2openapi",
Short: "tf2openapi is an OpenAPI generator for TensorFlow SavedModels",
Long: `This tool takes TensorFlow SavedModel files as inputs and generates OpenAPI 3.0
specifications for HTTP prediction requests. The SavedModel files must
contain signature definitions (SignatureDefs) for models.`,
Run: viewAPI,
}
rootCmd.Flags().StringVarP(&modelBasePath, "model_base_path", "m", "", "Absolute path of SavedModel file")
if err := rootCmd.MarkFlagRequired("model_base_path"); err != nil {
log.Fatalln(err.Error())
}
rootCmd.Flags().StringVarP(&modelName, "name", "n", "model", "Name of model")
rootCmd.Flags().StringVarP(&modelVersion, "version", "v", "1", "Model version")
rootCmd.Flags().StringVarP(&outFile, "output_file", "o", "", "Absolute path of file to write OpenAPI spec to")
rootCmd.Flags().StringVarP(&sigDefKey, "signature_def", "s", "", "Serving SignatureDef Key")
rootCmd.Flags().StringSliceVarP(&metaGraphTags, "metagraph_tags", "t", []string{}, "All tags identifying desired MetaGraph")
if err := rootCmd.Execute(); err != nil {
log.Fatalln(err.Error())
}
}
func viewAPI(cmd *cobra.Command, args []string) {
modelPb, err := os.ReadFile(modelBasePath)
if err != nil {
log.Fatalf(ModelBasePathError, modelBasePath, err.Error())
}
generatorBuilder := &generator.Builder{}
if modelName != "" {
generatorBuilder.SetName(modelName)
}
if modelVersion != "" {
generatorBuilder.SetVersion(modelVersion)
}
if sigDefKey != "" {
generatorBuilder.SetSigDefKey(sigDefKey)
}
if len(metaGraphTags) != 0 {
generatorBuilder.SetMetaGraphTags(metaGraphTags)
}
model := unmarshalSavedModelPb(modelPb)
gen := generatorBuilder.Build()
spec, err := gen.GenerateOpenAPI(model)
if err != nil {
log.Fatalln(err.Error())
}
if outFile != "" {
f, err := os.Create(outFile)
if err != nil {
log.Fatalf(OutputFilePathError, outFile, err)
}
defer f.Close()
if _, err = f.WriteString(spec); err != nil {
panic(err)
}
} else {
// Default to std::out
fmt.Println(spec)
}
}
/*
*
Raises errors when model is missing fields that would pose an issue for Schema generation
*/
func unmarshalSavedModelPb(modelPb []byte) *pb.SavedModel {
model := &pb.SavedModel{}
if err := proto.Unmarshal(modelPb, model); err != nil {
log.Fatalln(SavedModelFormatError + err.Error())
}
return model
}