github.com/jmrodri/operator-sdk@v0.5.0/pkg/scaffold/gopkgtoml.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 scaffold
    16  
    17  import (
    18  	"bytes"
    19  	"encoding/json"
    20  	"errors"
    21  	"fmt"
    22  	"strings"
    23  	"text/tabwriter"
    24  
    25  	"github.com/operator-framework/operator-sdk/pkg/scaffold/input"
    26  
    27  	"github.com/BurntSushi/toml"
    28  )
    29  
    30  const GopkgTomlFile = "Gopkg.toml"
    31  
    32  type GopkgToml struct {
    33  	input.Input
    34  }
    35  
    36  func (s *GopkgToml) GetInput() (input.Input, error) {
    37  	if s.Path == "" {
    38  		s.Path = GopkgTomlFile
    39  	}
    40  	s.TemplateBody = gopkgTomlTmpl
    41  	return s.Input, nil
    42  }
    43  
    44  const gopkgTomlTmpl = `# Force dep to vendor the code generators, which aren't imported just used at dev time.
    45  required = [
    46    "k8s.io/code-generator/cmd/defaulter-gen",
    47    "k8s.io/code-generator/cmd/deepcopy-gen",
    48    "k8s.io/code-generator/cmd/conversion-gen",
    49    "k8s.io/code-generator/cmd/client-gen",
    50    "k8s.io/code-generator/cmd/lister-gen",
    51    "k8s.io/code-generator/cmd/informer-gen",
    52    "k8s.io/kube-openapi/cmd/openapi-gen",
    53    "k8s.io/gengo/args",
    54    "sigs.k8s.io/controller-tools/pkg/crd/generator",
    55  ]
    56  
    57  [[override]]
    58    name = "k8s.io/code-generator"
    59    # revision for tag "kubernetes-1.13.1"
    60    revision = "c2090bec4d9b1fb25de3812f868accc2bc9ecbae"
    61  
    62  [[override]]
    63    name = "k8s.io/kube-openapi"
    64    revision = "0cf8f7e6ed1d2e3d47d02e3b6e559369af24d803"
    65  
    66  [[override]]
    67    name = "github.com/go-openapi/spec"
    68    branch = "master"
    69  
    70  [[override]]
    71    name = "sigs.k8s.io/controller-tools"
    72    version = "=v0.1.8"
    73  
    74  [[override]]
    75    name = "k8s.io/api"
    76    # revision for tag "kubernetes-1.13.1"
    77    revision = "05914d821849570fba9eacfb29466f2d8d3cd229"
    78  
    79  [[override]]
    80    name = "k8s.io/apiextensions-apiserver"
    81    # revision for tag "kubernetes-1.13.1"
    82    revision = "0fe22c71c47604641d9aa352c785b7912c200562"
    83  
    84  [[override]]
    85    name = "k8s.io/apimachinery"
    86    # revision for tag "kubernetes-1.13.1"
    87    revision = "2b1284ed4c93a43499e781493253e2ac5959c4fd"
    88  
    89  [[override]]
    90    name = "k8s.io/client-go"
    91    # revision for tag "kubernetes-1.13.1"
    92    revision = "8d9ed539ba3134352c586810e749e58df4e94e4f"
    93  
    94  [[override]]
    95    name = "github.com/coreos/prometheus-operator"
    96    version = "=v0.26.0"
    97  
    98  [[override]]
    99    name = "sigs.k8s.io/controller-runtime"
   100    version = "=v0.1.10"
   101  
   102  [[constraint]]
   103    name = "github.com/operator-framework/operator-sdk"
   104    # The version rule is used for a specific release and the master branch for in between releases.
   105    # branch = "master" #osdk_branch_annotation
   106    version = "=v0.5.0" #osdk_version_annotation
   107  
   108  [prune]
   109    go-tests = true
   110    non-go = true
   111  
   112    [[prune.project]]
   113      name = "k8s.io/code-generator"
   114      non-go = false
   115  
   116    [[prune.project]]
   117      name = "k8s.io/gengo"
   118      non-go = false
   119  `
   120  
   121  func PrintDepsAsFile() {
   122  	fmt.Println(gopkgTomlTmpl)
   123  }
   124  
   125  func PrintDeps() error {
   126  	gopkgData := make(map[string]interface{})
   127  	_, err := toml.Decode(gopkgTomlTmpl, &gopkgData)
   128  	if err != nil {
   129  		return err
   130  	}
   131  
   132  	buf := &bytes.Buffer{}
   133  	w := tabwriter.NewWriter(buf, 16, 8, 0, '\t', 0)
   134  	_, err = w.Write([]byte("NAME\tVERSION\tBRANCH\tREVISION\t\n"))
   135  	if err != nil {
   136  		return err
   137  	}
   138  
   139  	constraintList, ok := gopkgData["constraint"]
   140  	if !ok {
   141  		return errors.New("constraints not found")
   142  	}
   143  	for _, dep := range constraintList.([]map[string]interface{}) {
   144  		err = writeDepRow(w, dep)
   145  		if err != nil {
   146  			return err
   147  		}
   148  	}
   149  	overrideList, ok := gopkgData["override"]
   150  	if !ok {
   151  		return errors.New("overrides not found")
   152  	}
   153  	for _, dep := range overrideList.([]map[string]interface{}) {
   154  		err = writeDepRow(w, dep)
   155  		if err != nil {
   156  			return err
   157  		}
   158  	}
   159  	if err := w.Flush(); err != nil {
   160  		return err
   161  	}
   162  
   163  	requiredList, ok := gopkgData["required"]
   164  	if !ok {
   165  		return errors.New("required list not found")
   166  	}
   167  	pl, err := json.MarshalIndent(requiredList, "", " ")
   168  	if err != nil {
   169  		return err
   170  	}
   171  	_, err = buf.Write([]byte(fmt.Sprintf("\nrequired = %v", string(pl))))
   172  	if err != nil {
   173  		return err
   174  	}
   175  
   176  	fmt.Println(buf.String())
   177  
   178  	return nil
   179  }
   180  
   181  func writeDepRow(w *tabwriter.Writer, dep map[string]interface{}) error {
   182  	name := dep["name"].(string)
   183  	ver, col := "", 0
   184  	if v, ok := dep["version"]; ok {
   185  		ver, col = v.(string), 1
   186  	} else if v, ok = dep["branch"]; ok {
   187  		ver, col = v.(string), 2
   188  	} else if v, ok = dep["revision"]; ok {
   189  		ver, col = v.(string), 3
   190  	} else {
   191  		return fmt.Errorf("no version, revision, or branch found for %s", name)
   192  	}
   193  
   194  	_, err := w.Write([]byte(name + strings.Repeat("\t", col) + ver + "\t\n"))
   195  	return err
   196  }