github.com/percona/percona-xtradb-cluster-operator@v1.14.0/pkg/controller/pxc/vs.go (about)

     1  package pxc
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/url"
     7  	"strings"
     8  	"time"
     9  
    10  	api "github.com/percona/percona-xtradb-cluster-operator/pkg/apis/pxc/v1"
    11  	vsc "github.com/percona/percona-xtradb-cluster-operator/version/client"
    12  	"github.com/percona/percona-xtradb-cluster-operator/version/client/models"
    13  	"github.com/percona/percona-xtradb-cluster-operator/version/client/version_service"
    14  )
    15  
    16  const productName = "pxc-operator"
    17  
    18  func (vs VersionServiceClient) GetExactVersion(cr *api.PerconaXtraDBCluster, endpoint string, vm versionMeta) (DepVersion, error) {
    19  	if strings.Contains(endpoint, "https://check.percona.com/versions") {
    20  		endpoint = api.GetDefaultVersionServiceEndpoint()
    21  	}
    22  	requestURL, err := url.Parse(endpoint)
    23  	if err != nil {
    24  		return DepVersion{}, err
    25  	}
    26  
    27  	srvCl := vsc.NewHTTPClientWithConfig(nil, &vsc.TransportConfig{
    28  		Host:     requestURL.Host,
    29  		BasePath: requestURL.Path,
    30  		Schemes:  []string{requestURL.Scheme},
    31  	})
    32  
    33  	applyParams := &version_service.VersionServiceApplyParams{
    34  		Apply:               vm.Apply,
    35  		BackupVersion:       &vm.BackupVersion,
    36  		CustomResourceUID:   &vm.CRUID,
    37  		DatabaseVersion:     &vm.PXCVersion,
    38  		HaproxyVersion:      &vm.HAProxyVersion,
    39  		KubeVersion:         &vm.KubeVersion,
    40  		LogCollectorVersion: &vm.LogCollectorVersion,
    41  		NamespaceUID:        new(string),
    42  		OperatorVersion:     cr.Spec.CRVersion,
    43  		Platform:            &vm.Platform,
    44  		PmmVersion:          &vm.PMMVersion,
    45  		Product:             productName,
    46  		ProxysqlVersion:     &vm.ProxySQLVersion,
    47  		Context:             nil,
    48  		ClusterWideEnabled:  &vm.ClusterWideEnabled,
    49  		HTTPClient:          &http.Client{Timeout: 10 * time.Second},
    50  	}
    51  	applyParams = applyParams.WithTimeout(10 * time.Second)
    52  
    53  	resp, err := srvCl.VersionService.VersionServiceApply(applyParams)
    54  
    55  	if err != nil {
    56  		return DepVersion{}, err
    57  	}
    58  
    59  	if !versionUpgradeEnabled(cr) {
    60  		return DepVersion{}, nil
    61  	}
    62  
    63  	if len(resp.Payload.Versions) == 0 {
    64  		return DepVersion{}, fmt.Errorf("empty versions response")
    65  	}
    66  
    67  	pxcVersion, err := getVersion(resp.Payload.Versions[0].Matrix.Pxc)
    68  	if err != nil {
    69  		return DepVersion{}, err
    70  	}
    71  
    72  	backupVersion, err := getVersion(resp.Payload.Versions[0].Matrix.Backup)
    73  	if err != nil {
    74  		return DepVersion{}, err
    75  	}
    76  
    77  	pmmVersion, err := getVersion(resp.Payload.Versions[0].Matrix.Pmm)
    78  	if err != nil {
    79  		return DepVersion{}, err
    80  	}
    81  
    82  	proxySqlVersion, err := getVersion(resp.Payload.Versions[0].Matrix.Proxysql)
    83  	if err != nil {
    84  		return DepVersion{}, err
    85  	}
    86  
    87  	haproxyVersion, err := getVersion(resp.Payload.Versions[0].Matrix.Haproxy)
    88  	if err != nil {
    89  		return DepVersion{}, err
    90  	}
    91  
    92  	dv := DepVersion{
    93  		PXCImage:        resp.Payload.Versions[0].Matrix.Pxc[pxcVersion].ImagePath,
    94  		PXCVersion:      pxcVersion,
    95  		BackupImage:     resp.Payload.Versions[0].Matrix.Backup[backupVersion].ImagePath,
    96  		BackupVersion:   backupVersion,
    97  		ProxySqlImage:   resp.Payload.Versions[0].Matrix.Proxysql[proxySqlVersion].ImagePath,
    98  		ProxySqlVersion: proxySqlVersion,
    99  		PMMImage:        resp.Payload.Versions[0].Matrix.Pmm[pmmVersion].ImagePath,
   100  		PMMVersion:      pmmVersion,
   101  		HAProxyImage:    resp.Payload.Versions[0].Matrix.Haproxy[haproxyVersion].ImagePath,
   102  		HAProxyVersion:  haproxyVersion,
   103  	}
   104  
   105  	if cr.CompareVersionWith("1.7.0") >= 0 {
   106  		logCollectorVersion, err := getVersion(resp.Payload.Versions[0].Matrix.LogCollector)
   107  		if err != nil {
   108  			return DepVersion{}, err
   109  		}
   110  
   111  		dv.LogCollectorVersion = logCollectorVersion
   112  		dv.LogCollectorImage = resp.Payload.Versions[0].Matrix.LogCollector[logCollectorVersion].ImagePath
   113  
   114  	}
   115  
   116  	return dv, nil
   117  }
   118  
   119  func getVersion(versions map[string]models.VersionVersion) (string, error) {
   120  	if len(versions) != 1 {
   121  		return "", fmt.Errorf("response has multiple or zero versions")
   122  	}
   123  
   124  	for k := range versions {
   125  		return k, nil
   126  	}
   127  	return "", nil
   128  }
   129  
   130  type DepVersion struct {
   131  	PXCImage            string `json:"pxcImage,omitempty"`
   132  	PXCVersion          string `json:"pxcVersion,omitempty"`
   133  	BackupImage         string `json:"backupImage,omitempty"`
   134  	BackupVersion       string `json:"backupVersion,omitempty"`
   135  	ProxySqlImage       string `json:"proxySqlImage,omitempty"`
   136  	ProxySqlVersion     string `json:"proxySqlVersion,omitempty"`
   137  	HAProxyImage        string `json:"haproxyImage,omitempty"`
   138  	HAProxyVersion      string `json:"haproxyVersion,omitempty"`
   139  	PMMImage            string `json:"pmmImage,omitempty"`
   140  	PMMVersion          string `json:"pmmVersion,omitempty"`
   141  	LogCollectorVersion string `json:"logCollectorVersion,omitempty"`
   142  	LogCollectorImage   string `json:"LogCollectorImage,omitempty"`
   143  }
   144  
   145  type VersionService interface {
   146  	GetExactVersion(cr *api.PerconaXtraDBCluster, endpoint string, vm versionMeta) (DepVersion, error)
   147  }
   148  
   149  type VersionServiceClient struct {
   150  	OpVersion string
   151  }
   152  
   153  type versionMeta struct {
   154  	Apply               string
   155  	PXCVersion          string
   156  	KubeVersion         string
   157  	Platform            string
   158  	PMMVersion          string
   159  	BackupVersion       string
   160  	ProxySQLVersion     string
   161  	HAProxyVersion      string
   162  	LogCollectorVersion string
   163  	CRUID               string
   164  	ClusterWideEnabled  bool
   165  }