github.com/pingcap/tiup@v1.15.1/components/dm/ansible/import_test.go (about) 1 // Copyright 2020 PingCAP, Inc. 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 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package ansible 15 16 import ( 17 "context" 18 "os" 19 "path/filepath" 20 "strconv" 21 "strings" 22 "testing" 23 24 "github.com/pingcap/errors" 25 "github.com/pingcap/tiup/components/dm/spec" 26 "github.com/pingcap/tiup/pkg/cluster/ctxt" 27 "github.com/pingcap/tiup/pkg/cluster/executor" 28 logprinter "github.com/pingcap/tiup/pkg/logger/printer" 29 "github.com/stretchr/testify/require" 30 ) 31 32 // localExecutor only used for test. 33 type localExecutor struct { 34 host string 35 executor.Local 36 } 37 38 type executorGetter struct { 39 } 40 41 var _ ExecutorGetter = &executorGetter{} 42 43 // Get implements ExecutorGetter interface. 44 func (g *executorGetter) Get(host string) ctxt.Executor { 45 return &localExecutor{ 46 host: host, 47 } 48 } 49 50 // Transfer implements executor interface. 51 // Replace the deploy directory as the local one in testdata, so we can fetch it. 52 func (l *localExecutor) Transfer(ctx context.Context, src, target string, download bool, limit int, _ bool) error { 53 mydeploy, err := filepath.Abs("./testdata/deploy_dir/" + l.host) 54 if err != nil { 55 return errors.AddStack(err) 56 } 57 src = strings.Replace(src, "/home/tidb/deploy", mydeploy, 1) 58 return l.Local.Transfer(ctx, src, target, download, 0, false) 59 } 60 61 func TestParseRunScript(t *testing.T) { 62 assert := require.New(t) 63 64 // parse run_dm-master.sh 65 data, err := os.ReadFile("./testdata/deploy_dir/172.19.0.101/scripts/run_dm-master.sh") 66 assert.Nil(err) 67 dir, flags, err := parseRunScript(data) 68 assert.Nil(err) 69 assert.Equal("/home/tidb/deploy", dir) 70 expectedFlags := map[string]string{ 71 "master-addr": ":8261", 72 "L": "info", 73 "config": "conf/dm-master.toml", 74 "log-file": "/home/tidb/deploy/log/dm-master.log", 75 } 76 assert.Equal(expectedFlags, flags) 77 78 // parse run_dm-worker.sh 79 data, err = os.ReadFile("./testdata/deploy_dir/172.19.0.101/scripts/run_dm-worker.sh") 80 assert.Nil(err) 81 dir, flags, err = parseRunScript(data) 82 assert.Nil(err) 83 assert.Equal("/home/tidb/deploy", dir) 84 expectedFlags = map[string]string{ 85 "worker-addr": ":8262", 86 "L": "info", 87 "relay-dir": "/home/tidb/deploy/relay_log", 88 "config": "conf/dm-worker.toml", 89 "log-file": "/home/tidb/deploy/log/dm-worker.log", 90 } 91 assert.Equal(expectedFlags, flags) 92 93 // parse run_prometheus.sh 94 data, err = os.ReadFile("./testdata/deploy_dir/172.19.0.101/scripts/run_prometheus.sh") 95 assert.Nil(err) 96 dir, flags, err = parseRunScript(data) 97 assert.Nil(err) 98 assert.Equal("/home/tidb/deploy", dir) 99 expectedFlags = map[string]string{ 100 "STDOUT": "/home/tidb/deploy/log/prometheus.log", 101 "config.file": "/home/tidb/deploy/conf/prometheus.yml", 102 "web.listen-address": ":9090", 103 "web.external-url": "http://172.19.0.101:9090/", 104 "log.level": "info", 105 "storage.tsdb.path": "/home/tidb/deploy/prometheus.data.metrics", 106 "storage.tsdb.retention": "15d", 107 } 108 assert.Equal(expectedFlags, flags) 109 110 // parse run_grafana.sh 111 data, err = os.ReadFile("./testdata/deploy_dir/172.19.0.101/scripts/run_grafana.sh") 112 assert.Nil(err) 113 dir, flags, err = parseRunScript(data) 114 assert.Nil(err) 115 assert.Equal("/home/tidb/deploy", dir) 116 expectedFlags = map[string]string{ 117 "homepath": "/home/tidb/deploy/opt/grafana", 118 "config": "/home/tidb/deploy/opt/grafana/conf/grafana.ini", 119 } 120 assert.Equal(expectedFlags, flags) 121 122 // parse run_alertmanager.sh 123 data, err = os.ReadFile("./testdata/deploy_dir/172.19.0.101/scripts/run_alertmanager.sh") 124 assert.Nil(err) 125 dir, flags, err = parseRunScript(data) 126 assert.Nil(err) 127 assert.Equal("/home/tidb/deploy", dir) 128 expectedFlags = map[string]string{ 129 "STDOUT": "/home/tidb/deploy/log/alertmanager.log", 130 "config.file": "conf/alertmanager.yml", 131 "storage.path": "/home/tidb/deploy/data.alertmanager", 132 "data.retention": "120h", 133 "log.level": "info", 134 "web.listen-address": ":9093", 135 } 136 assert.Equal(expectedFlags, flags) 137 } 138 139 func TestImportFromAnsible(t *testing.T) { 140 assert := require.New(t) 141 dir := "./testdata/ansible" 142 143 im, err := NewImporter(dir, "inventory.ini", executor.SSHTypeBuiltin, 0) 144 assert.Nil(err) 145 im.testExecutorGetter = &executorGetter{} 146 clusterName, meta, err := im.ImportFromAnsibleDir(ctxt.New( 147 context.Background(), 148 0, 149 logprinter.NewLogger(""), 150 )) 151 assert.Nil(err, "verbose: %+v", err) 152 assert.Equal("test-cluster", clusterName) 153 154 assert.Equal("tidb", meta.User) 155 assert.Equal("v1.0.6", meta.Version) 156 157 // check GlobalOptions 158 topo := meta.Topology 159 assert.Equal("/home/tidb/deploy", topo.GlobalOptions.DeployDir) 160 assert.Equal("/home/tidb/deploy/log", topo.GlobalOptions.LogDir) 161 162 // check master 163 assert.Len(topo.Masters, 1) 164 master := topo.Masters[0] 165 expectedMaster := &spec.MasterSpec{ 166 Host: "172.19.0.101", 167 SSHPort: 22, 168 Port: 8261, 169 DeployDir: "", 170 LogDir: "/home/tidb/deploy/log", 171 Config: map[string]any{"log-level": "info"}, 172 Imported: true, 173 } 174 assert.Equal(expectedMaster, master) 175 176 // check worker 177 assert.Len(topo.Workers, 2) 178 if topo.Workers[0].Host > topo.Workers[1].Host { 179 topo.Workers[0], topo.Workers[1] = topo.Workers[1], topo.Workers[0] 180 } 181 182 expectedWorker := &spec.WorkerSpec{ 183 Host: "172.19.0.101", 184 SSHPort: 22, 185 Port: 8262, 186 DeployDir: "/home/tidb/deploy", 187 LogDir: "/home/tidb/deploy/log", 188 Config: map[string]any{"log-level": "info"}, 189 Imported: true, 190 } 191 192 worker := topo.Workers[0] 193 assert.Equal(expectedWorker, worker) 194 195 expectedWorker.Host = "172.19.0.102" 196 worker = topo.Workers[1] 197 assert.Equal(expectedWorker, worker) 198 199 // check Alertmanager 200 assert.Len(topo.Alertmanagers, 1) 201 aler := topo.Alertmanagers[0] 202 expectedAlter := &spec.AlertmanagerSpec{ 203 Host: "172.19.0.101", 204 SSHPort: 22, 205 WebPort: 9093, 206 DeployDir: "", 207 DataDir: "/home/tidb/deploy/data.alertmanager", 208 LogDir: "/home/tidb/deploy/log", 209 Imported: true, 210 } 211 assert.Equal(expectedAlter, aler) 212 213 // Check Grafana 214 assert.Len(topo.Grafanas, 1) 215 grafana := topo.Grafanas[0] 216 expectedGrafana := &spec.GrafanaSpec{ 217 Host: "172.19.0.101", 218 SSHPort: 22, 219 DeployDir: "", 220 Port: 3001, 221 Username: "foo", 222 Password: "bar", 223 Imported: true, 224 } 225 assert.Equal(expectedGrafana, grafana) 226 227 // Check Monitor(Prometheus) 228 assert.Len(topo.Monitors, 1) 229 monitor := topo.Monitors[0] 230 expectedMonitor := &spec.PrometheusSpec{ 231 Host: "172.19.0.101", 232 SSHPort: 22, 233 DeployDir: "", 234 DataDir: "/home/tidb/deploy/prometheus.data.metrics", 235 LogDir: "/home/tidb/deploy/log", 236 Port: 9090, 237 Imported: true, 238 } 239 assert.Equal(expectedMonitor, monitor) 240 241 // Check sources 242 assert.Len(im.sources, 2) 243 s := im.sources[topo.Workers[0].Host+":"+strconv.Itoa(topo.Workers[0].Port)] 244 assert.Equal("mysql-replica-01", s.SourceID) 245 assert.Equal(DBConfig{ 246 Host: "mysql1", 247 Password: "password1", 248 Port: 3306, 249 User: "root", 250 }, s.From) 251 252 s = im.sources[topo.Workers[1].Host+":"+strconv.Itoa(topo.Workers[1].Port)] 253 assert.Equal("mysql-replica-02", s.SourceID) 254 assert.Equal(DBConfig{ 255 Host: "mysql2", 256 Port: 3306, 257 User: "root", 258 }, s.From) 259 }