github.skymusic.top/operator-framework/operator-sdk@v0.8.2/cmd/operator-sdk/internal/genutil/k8s.go (about) 1 // Copyright 2018 The Operator-SDK Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package genutil 16 17 import ( 18 "fmt" 19 "os/exec" 20 "path/filepath" 21 "strings" 22 23 "github.com/operator-framework/operator-sdk/internal/pkg/scaffold" 24 "github.com/operator-framework/operator-sdk/internal/util/projutil" 25 26 log "github.com/sirupsen/logrus" 27 ) 28 29 // K8sCodegen performs deepcopy code-generation for all custom resources under 30 // pkg/apis. 31 func K8sCodegen() error { 32 projutil.MustInProjectRoot() 33 34 wd := projutil.MustGetwd() 35 repoPkg := projutil.CheckAndGetProjectGoPkg() 36 srcDir := filepath.Join(wd, "vendor", "k8s.io", "code-generator") 37 binDir := filepath.Join(wd, scaffold.BuildBinDir) 38 39 genDirs := []string{ 40 "./cmd/client-gen", 41 "./cmd/lister-gen", 42 "./cmd/informer-gen", 43 "./cmd/deepcopy-gen", 44 } 45 if err := buildCodegenBinaries(genDirs, binDir, srcDir); err != nil { 46 return err 47 } 48 49 gvMap, err := parseGroupVersions() 50 if err != nil { 51 return fmt.Errorf("failed to parse group versions: (%v)", err) 52 } 53 gvb := &strings.Builder{} 54 for g, vs := range gvMap { 55 gvb.WriteString(fmt.Sprintf("%s:%v, ", g, vs)) 56 } 57 58 log.Infof("Running deepcopy code-generation for Custom Resource group versions: [%v]\n", gvb.String()) 59 60 fdc := func(a string) error { return deepcopyGen(binDir, repoPkg, a, gvMap) } 61 if err = withHeaderFile(fdc); err != nil { 62 return err 63 } 64 65 log.Info("Code-generation complete.") 66 return nil 67 } 68 69 func deepcopyGen(binDir, repoPkg, hf string, gvMap map[string][]string) (err error) { 70 apisPkg := filepath.Join(repoPkg, scaffold.ApisDir) 71 args := []string{ 72 "--input-dirs", createFQApis(apisPkg, gvMap), 73 "--output-file-base", "zz_generated.deepcopy", 74 "--bounding-dirs", apisPkg, 75 // deepcopy-gen requires a boilerplate file. Either use header or an 76 // empty file if header is empty. 77 "--go-header-file", hf, 78 } 79 cmd := exec.Command(filepath.Join(binDir, "deepcopy-gen"), args...) 80 if err = projutil.ExecCmd(cmd); err != nil { 81 return fmt.Errorf("failed to perform deepcopy code-generation: %v", err) 82 } 83 return nil 84 }