github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cmd/opts/version.go (about)

     1  package opts
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/olli-ai/jx/v2/pkg/versionstream/versionstreamrepo"
     7  
     8  	"github.com/olli-ai/jx/v2/pkg/versionstream"
     9  
    10  	"github.com/jenkins-x/jx-logging/pkg/log"
    11  	"github.com/olli-ai/jx/v2/pkg/table"
    12  	"github.com/olli-ai/jx/v2/pkg/util"
    13  )
    14  
    15  // CreateVersionResolver creates a new VersionResolver service
    16  func (o *CommonOptions) CreateVersionResolver(repo string, gitRef string) (*versionstream.VersionResolver, error) {
    17  	versionsDir, _, err := o.CloneJXVersionsRepo(repo, gitRef)
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  	return &versionstream.VersionResolver{
    22  		VersionsDir: versionsDir,
    23  	}, nil
    24  }
    25  
    26  // GetVersionResolver gets a VersionResolver, lazy creating one if required so we can reuse it later
    27  func (o *CommonOptions) GetVersionResolver() (*versionstream.VersionResolver, error) {
    28  	var err error
    29  	if o.versionResolver == nil {
    30  		o.versionResolver, err = o.CreateVersionResolver("", "")
    31  	}
    32  	return o.versionResolver, err
    33  }
    34  
    35  // SetVersionResolver gets a VersionResolver, lazy creating one if required
    36  func (o *CommonOptions) SetVersionResolver(resolver *versionstream.VersionResolver) {
    37  	o.versionResolver = resolver
    38  }
    39  
    40  // GetPackageVersions returns the package versions and a table if they need to be rendered
    41  func (o *CommonOptions) GetPackageVersions(ns string, helmTLS bool) (map[string]string, table.Table) {
    42  	info := util.ColorInfo
    43  	packages := map[string]string{}
    44  	table := o.CreateTable()
    45  	table.AddRow("NAME", "VERSION")
    46  	// Jenkins X version
    47  	releases, _, err := o.Helm().ListReleases(ns)
    48  	if err != nil {
    49  		log.Logger().Warnf("Failed to find helm installs: %s", err)
    50  	} else {
    51  		for _, release := range releases {
    52  			if release.Chart == "jenkins-x-platform" {
    53  				table.AddRow("jenkins x platform", info(release.ChartVersion))
    54  			}
    55  		}
    56  	}
    57  	// Kubernetes version
    58  	client, err := o.KubeClient()
    59  	if err != nil {
    60  		log.Logger().Warnf("Failed to connect to Kubernetes: %s", err)
    61  	} else {
    62  		serverVersion, err := client.Discovery().ServerVersion()
    63  		if err != nil {
    64  			log.Logger().Warnf("Failed to get Kubernetes server version: %s", err)
    65  		} else if serverVersion != nil {
    66  			version := serverVersion.String()
    67  			packages["kubernetesCluster"] = version
    68  			table.AddRow("Kubernetes cluster", info(version))
    69  		}
    70  	}
    71  	// kubectl version
    72  	output, err := o.GetCommandOutput("", "kubectl", "version", "--short")
    73  	if err != nil {
    74  		log.Logger().Warnf("Failed to get kubectl version: %s", err)
    75  	} else {
    76  		for i, line := range strings.Split(output, "\n") {
    77  			fields := strings.Fields(line)
    78  			if len(fields) > 1 {
    79  				v := fields[2]
    80  				if v != "" {
    81  					switch i {
    82  					case 0:
    83  						table.AddRow("kubectl (installed in JX_BIN)", info(v))
    84  						packages["kubectl"] = v
    85  					case 1:
    86  						// Ignore K8S server details as we have these above
    87  					}
    88  				}
    89  			}
    90  		}
    91  	}
    92  
    93  	// helm version
    94  	output, err = o.Helm().Version(helmTLS)
    95  	if err != nil {
    96  		log.Logger().Warnf("Failed to get helm version: %s", err)
    97  	} else {
    98  		helmBinary, noTiller, helmTemplate, _ := o.TeamHelmBin()
    99  		if helmBinary == "helm3" || noTiller || helmTemplate {
   100  			table.AddRow("helm client", info(output))
   101  		} else {
   102  			for i, line := range strings.Split(output, "\n") {
   103  				fields := strings.Fields(line)
   104  				if len(fields) > 1 {
   105  					v := fields[1]
   106  					if v != "" {
   107  						switch i {
   108  						case 0:
   109  							table.AddRow("helm client", info(v))
   110  							packages["helm"] = v
   111  						case 1:
   112  							table.AddRow("helm server", info(v))
   113  						}
   114  					}
   115  				}
   116  			}
   117  		}
   118  	}
   119  
   120  	// git version
   121  	version, err := o.Git().Version()
   122  	if err != nil {
   123  		log.Logger().Warnf("Failed to get git version: %s", err)
   124  	} else {
   125  		table.AddRow("git", info(version))
   126  		packages["git"] = version
   127  	}
   128  	return packages, table
   129  }
   130  
   131  // GetVersionNumber returns the version number for the given kind and name or blank string if there is no locked version
   132  func (o *CommonOptions) GetVersionNumber(kind versionstream.VersionKind, name, repo string, gitRef string) (string, error) {
   133  	versioner, err := o.CreateVersionResolver(repo, gitRef)
   134  	if err != nil {
   135  		return "", err
   136  	}
   137  	return versioner.StableVersionNumber(kind, name)
   138  }
   139  
   140  // CloneJXVersionsRepo clones the jenkins-x versions repo to a local working dir
   141  func (o *CommonOptions) CloneJXVersionsRepo(versionRepository string, versionRef string) (string, string, error) {
   142  	settings, err := o.TeamSettings()
   143  	if err != nil {
   144  		log.Logger().Debugf("Unable to load team settings because %v", err)
   145  	}
   146  	return versionstreamrepo.CloneJXVersionsRepo(versionRepository, versionRef, settings, o.Git(), o.BatchMode, o.AdvancedMode, o.GetIOFileHandles())
   147  }