diff --git a/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go b/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go index be4e5dc2810..c04e8efe30c 100644 --- a/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go +++ b/cmd/libs/go2idl/go-to-protobuf/protobuf/cmd.go @@ -39,6 +39,7 @@ type Generator struct { Common args.GeneratorArgs Packages string OutputBase string + VendorOutputBase string ProtoImport []string Conditional string Clean bool @@ -56,9 +57,10 @@ func New() *Generator { } defaultProtoImport := filepath.Join(sourceTree, "k8s.io", "kubernetes", "vendor", "github.com", "gogo", "protobuf", "protobuf") return &Generator{ - Common: common, - OutputBase: sourceTree, - ProtoImport: []string{defaultProtoImport}, + Common: common, + OutputBase: sourceTree, + VendorOutputBase: filepath.Join(sourceTree, "k8s.io", "kubernetes", "vendor"), + ProtoImport: []string{defaultProtoImport}, Packages: strings.Join([]string{ `+k8s.io/kubernetes/pkg/util/intstr`, `+k8s.io/kubernetes/pkg/api/resource`, @@ -80,7 +82,7 @@ func New() *Generator { `k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1`, `k8s.io/kubernetes/pkg/apis/storage/v1beta1`, }, ","), - DropEmbeddedFields: "k8s.io/kubernetes/pkg/apis/meta/v1.TypeMeta", + DropEmbeddedFields: "k8s.io/apimachinery/pkg/apis/meta/v1.TypeMeta", } } @@ -187,12 +189,25 @@ func Run(g *Generator) { c.Verify = g.Common.VerifyOnly c.FileTypes["protoidl"] = NewProtoFile() + var vendoredOutputPackages, localOutputPackages generator.Packages + for _, p := range protobufNames.packages { + p.Vendored = strings.Contains(c.Universe[p.PackagePath].SourcePath, "/vendor/") + if p.Vendored { + vendoredOutputPackages = append(vendoredOutputPackages, p) + } else { + localOutputPackages = append(localOutputPackages, p) + } + } + if err := protobufNames.AssignTypesToPackages(c); err != nil { log.Fatalf("Failed to identify Common types: %v", err) } - if err := c.ExecutePackages(g.OutputBase, outputPackages); err != nil { - log.Fatalf("Failed executing generator: %v", err) + if err := c.ExecutePackages(g.VendorOutputBase, vendoredOutputPackages); err != nil { + log.Fatalf("Failed executing vendor generator: %v", err) + } + if err := c.ExecutePackages(g.OutputBase, localOutputPackages); err != nil { + log.Fatalf("Failed executing local generator: %v", err) } if g.OnlyIDL { @@ -222,6 +237,10 @@ func Run(g *Generator) { path := filepath.Join(g.OutputBase, p.ImportPath()) outputPath := filepath.Join(g.OutputBase, p.OutputPath()) + if p.Vendored { + path = filepath.Join(g.VendorOutputBase, p.ImportPath()) + outputPath = filepath.Join(g.VendorOutputBase, p.OutputPath()) + } // generate the gogoprotobuf protoc cmd := exec.Command("protoc", append(args, path)...) @@ -277,8 +296,11 @@ func Run(g *Generator) { p := outputPackage.(*protobufPackage) p.OmitGogo = true } - if err := c.ExecutePackages(g.OutputBase, outputPackages); err != nil { - log.Fatalf("Failed executing generator: %v", err) + if err := c.ExecutePackages(g.VendorOutputBase, vendoredOutputPackages); err != nil { + log.Fatalf("Failed executing vendor generator: %v", err) + } + if err := c.ExecutePackages(g.OutputBase, localOutputPackages); err != nil { + log.Fatalf("Failed executing local generator: %v", err) } } @@ -290,6 +312,9 @@ func Run(g *Generator) { } pattern := filepath.Join(g.OutputBase, p.PackagePath, "*.go") + if p.Vendored { + pattern = filepath.Join(g.VendorOutputBase, p.PackagePath, "*.go") + } files, err := filepath.Glob(pattern) if err != nil { log.Fatalf("Can't glob pattern %q: %v", pattern, err) diff --git a/cmd/libs/go2idl/go-to-protobuf/protobuf/package.go b/cmd/libs/go2idl/go-to-protobuf/protobuf/package.go index 055d71577d0..bed4c3e3061 100644 --- a/cmd/libs/go2idl/go-to-protobuf/protobuf/package.go +++ b/cmd/libs/go2idl/go-to-protobuf/protobuf/package.go @@ -57,6 +57,10 @@ func newProtobufPackage(packagePath, packageName string, generateAll bool, omitF type protobufPackage struct { generator.DefaultPackage + // If true, this package has been vendored into our source tree and thus can + // only be generated by changing the vendor tree. + Vendored bool + // If true, generate protobuf serializations for all public types. // If false, only generate protobuf serializations for structs that // request serialization.