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  }