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 }