vitess.io/vitess@v0.16.2/go/vt/vttablet/endtoend/connkilling/main_test.go (about)

     1  /*
     2  Copyright 2019 The Vitess Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package connkilling
    18  
    19  import (
    20  	"errors"
    21  	"flag"
    22  	"fmt"
    23  	"os"
    24  	"testing"
    25  
    26  	"vitess.io/vitess/go/mysql"
    27  	"vitess.io/vitess/go/vt/tableacl"
    28  	"vitess.io/vitess/go/vt/tableacl/simpleacl"
    29  	"vitess.io/vitess/go/vt/vttablet/endtoend/framework"
    30  	"vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv"
    31  	"vitess.io/vitess/go/vt/vttest"
    32  
    33  	vttestpb "vitess.io/vitess/go/vt/proto/vttest"
    34  )
    35  
    36  var (
    37  	connParams         mysql.ConnParams
    38  	connAppDebugParams mysql.ConnParams
    39  )
    40  
    41  func TestMain(m *testing.M) {
    42  	flag.Parse() // Do not remove this comment, import into google3 depends on it
    43  	tabletenv.Init()
    44  
    45  	exitCode := func() int {
    46  		// Launch MySQL.
    47  		// We need a Keyspace in the topology, so the DbName is set.
    48  		// We need a Shard too, so the database 'vttest' is created.
    49  		cfg := vttest.Config{
    50  			Topology: &vttestpb.VTTestTopology{
    51  				Keyspaces: []*vttestpb.Keyspace{
    52  					{
    53  						Name: "vttest",
    54  						Shards: []*vttestpb.Shard{
    55  							{
    56  								Name:           "0",
    57  								DbNameOverride: "vttest",
    58  							},
    59  						},
    60  					},
    61  				},
    62  			},
    63  			OnlyMySQL: true,
    64  			Charset:   "utf8mb4_general_ci",
    65  		}
    66  		if err := cfg.InitSchemas("vttest", testSchema, nil); err != nil {
    67  			fmt.Fprintf(os.Stderr, "InitSchemas failed: %v\n", err)
    68  			return 1
    69  		}
    70  		defer os.RemoveAll(cfg.SchemaDir)
    71  		cluster := vttest.LocalCluster{
    72  			Config: cfg,
    73  		}
    74  		if err := cluster.Setup(); err != nil {
    75  			fmt.Fprintf(os.Stderr, "could not launch mysql: %v\n", err)
    76  			return 1
    77  		}
    78  		defer cluster.TearDown()
    79  
    80  		connParams = cluster.MySQLConnParams()
    81  		connAppDebugParams = cluster.MySQLAppDebugConnParams()
    82  		config := tabletenv.NewDefaultConfig()
    83  		config.Oltp.TxTimeoutSeconds = tabletenv.Seconds(3)
    84  		err := framework.StartCustomServer(connParams, connAppDebugParams, cluster.DbName(), config)
    85  		if err != nil {
    86  			fmt.Fprintf(os.Stderr, "%v", err)
    87  			return 1
    88  		}
    89  		defer framework.StopServer()
    90  
    91  		err = initTableACL()
    92  		if err != nil {
    93  			fmt.Fprintf(os.Stderr, "%v", err)
    94  			return 1
    95  		}
    96  
    97  		return m.Run()
    98  	}()
    99  	os.Exit(exitCode)
   100  }
   101  
   102  func initTableACL() error {
   103  	file, err := os.CreateTemp("", "tableacl.json")
   104  	if err != nil {
   105  		return err
   106  	}
   107  	defer os.Remove(file.Name())
   108  
   109  	n, err := file.WriteString(tableACLConfig)
   110  	if err != nil {
   111  		return err
   112  	}
   113  	if n != len(tableACLConfig) {
   114  		return errors.New("table acl: short write")
   115  	}
   116  	file.Close()
   117  	tableacl.Register("simpleacl", &simpleacl.Factory{})
   118  	tableacl.Init(file.Name(), func() { framework.Server.ClearQueryPlanCache() })
   119  	return nil
   120  }
   121  
   122  var testSchema = `create table vitess_test(intval int default 0, floatval float default null, charval varchar(10) default null, binval varbinary(256) default null, primary key(intval));
   123  create table vitess_test_debuguser(intval int default 0, floatval float default null, charval varchar(256) default null, binval varbinary(256) default null, primary key(intval));
   124  grant select, show databases, process on *.* to 'vt_appdebug'@'localhost';
   125  revoke select on *.* from 'vt_appdebug'@'localhost';
   126  insert into vitess_test_debuguser values(1, 1.12345, 0xC2A2, 0x00FF), (2, null, '', null), (3, null, null, null);
   127  insert into vitess_test values(1, 1.12345, 0xC2A2, 0x00FF), (2, null, '', null), (3, null, null, null);
   128  
   129  create table vitess_a(eid bigint default 0, id int default 1, name varchar(128) default null, foo varbinary(128) default null, primary key(eid, id));
   130  create table vitess_b(eid bigint default 0, id int default 0, primary key(eid, id));
   131  create table vitess_c(eid bigint default 0, name varchar(128) default 'name', foo varbinary(128) default null, primary key(eid, name));
   132  create table vitess_d(eid bigint default null, id int default null);
   133  create table vitess_e(eid bigint auto_increment, id int default 1, name varchar(128) default 'name', foo varchar(128) default null, primary key(eid, id, name));
   134  create table vitess_f(vb varbinary(16) default 'ab', id int default null, primary key(vb));
   135  create table upsert_test(id1 int default 0, id2 int default null, primary key (id1));
   136  create unique index id2_idx on upsert_test(id2);
   137  insert into vitess_a(eid, id, name, foo) values(1, 1, 'abcd', 'efgh'), (1, 2, 'bcde', 'fghi');
   138  insert into vitess_b(eid, id) values(1, 1), (1, 2);
   139  insert into vitess_c(eid, name, foo) values(10, 'abcd', '20'), (11, 'bcde', '30');
   140  create table vitess_mixed_case(Col1 int default 0, COL2 int default null, primary key(col1));
   141  
   142  CREATE TABLE vitess_autoinc_seq (
   143    id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   144    name varchar(255) NOT NULL,
   145    sequence bigint(20) unsigned NOT NULL DEFAULT '0',
   146    PRIMARY KEY (id),
   147    UNIQUE KEY name (name)
   148  );
   149  
   150  create table vitess_big(id int default 0, string1 varchar(128) default null, string2 varchar(100) default null, string3 char(1) default null, string4 varchar(50) default null, string5 varchar(50) default null, string6 varchar(16) default null, string7 varchar(120) default null, bigint1 bigint(20) default null, bigint2 bigint(20) default null, integer1 int default null, tinyint1 tinyint(4) default null, primary key(id));
   151  
   152  create table vitess_ints(tiny tinyint default 0, tinyu tinyint unsigned default null, small smallint default null, smallu smallint unsigned default null, medium mediumint default null, mediumu mediumint unsigned default null, normal int default null, normalu int unsigned default null, big bigint default null, bigu bigint unsigned default null, y year default null, primary key(tiny));
   153  create table vitess_fracts(id int default 0, deci decimal(5,2) default null, num numeric(5,2) default null, f float default null, d double default null, primary key(id));
   154  create table vitess_strings(vb varbinary(16) default 'vb', c char(16) default null, vc varchar(16) default null, b binary(4) default null, tb tinyblob default null, bl blob default null, ttx tinytext default null, tx text default null, en enum('a','b') default null, s set('a','b') default null, primary key(vb));
   155  create table vitess_misc(id int default 0, b bit(8) default null, d date default null, dt datetime default null, t time default null, g geometry default null, primary key(id));
   156  create table vitess_bit_default(id bit(8) default b'101', primary key(id));
   157  
   158  create table vitess_bool(auto int auto_increment, bval tinyint(1) default 0, sval varchar(16) default '', ival int default null, primary key (auto));
   159  
   160  create table vitess_seq(id int default 0, next_id bigint default null, cache bigint default null, increment bigint default null, primary key(id)) comment 'vitess_sequence';
   161  insert into vitess_seq(id, next_id, cache) values(0, 1, 3);
   162  
   163  create table vitess_reset_seq(id int default 0, next_id bigint default null, cache bigint default null, increment bigint default null, primary key(id)) comment 'vitess_sequence';
   164  insert into vitess_reset_seq(id, next_id, cache) values(0, 1, 3);
   165  
   166  create table vitess_part(id int, data varchar(16), primary key(id));
   167  alter table vitess_part partition by range (id) (partition p0 values less than (10), partition p1 values less than (maxvalue));
   168  
   169  create table vitess_acl_no_access(key1 bigint default 0, key2 bigint default null, primary key(key1));
   170  create table vitess_acl_read_only(key1 bigint default 0, key2 bigint default null, primary key(key1));
   171  create table vitess_acl_read_write(key1 bigint default 0, key2 bigint default null, primary key(key1));
   172  create table vitess_acl_admin(key1 bigint default 0, key2 bigint default null, primary key(key1));
   173  create table vitess_acl_unmatched(key1 bigint default 0, key2 bigint default null, primary key(key1));
   174  create table vitess_acl_all_user_read_only(key1 bigint default 0, key2 bigint default null, primary key(key1));`
   175  
   176  var tableACLConfig = `{
   177    "table_groups": [
   178      {
   179        "name": "mysql",
   180        "table_names_or_prefixes": [""],
   181        "readers": ["dev"],
   182        "writers": ["dev"],
   183        "admins": ["dev"]
   184      },
   185      {
   186        "name": "vitess_cached",
   187        "table_names_or_prefixes": ["vitess_nocache", "vitess_cached%"],
   188        "readers": ["dev"],
   189        "writers": ["dev"],
   190        "admins": ["dev"]
   191      },
   192      {
   193        "name": "vitess_renamed",
   194        "table_names_or_prefixes": ["vitess_renamed%"],
   195        "readers": ["dev"],
   196        "writers": ["dev"],
   197        "admins": ["dev"]
   198      },
   199      {
   200        "name": "vitess_part",
   201        "table_names_or_prefixes": ["vitess_part%"],
   202        "readers": ["dev"],
   203        "writers": ["dev"],
   204        "admins": ["dev"]
   205      },
   206      {
   207        "name": "vitess",
   208        "table_names_or_prefixes": ["vitess_a", "vitess_b", "vitess_c", "dual", "vitess_d", "vitess_temp", "vitess_e", "vitess_f", "vitess_mixed_case", "upsert_test", "vitess_strings", "vitess_fracts", "vitess_ints", "vitess_misc", "vitess_bit_default", "vitess_big", "vitess_view", "vitess_json", "vitess_bool", "vitess_autoinc_seq"],
   209        "readers": ["dev"],
   210        "writers": ["dev"],
   211        "admins": ["dev"]
   212      },
   213      {
   214        "name": "vitess_test",
   215        "table_names_or_prefixes": ["vitess_test"],
   216        "readers": ["dev"],
   217        "writers": ["dev"],
   218        "admins": ["dev"]
   219      },
   220      {
   221        "name": "vitess_test_ddl",
   222        "table_names_or_prefixes": ["vitess_test_ddl"],
   223        "readers": ["dev"],
   224        "writers": ["dev"],
   225        "admins": ["dev"]
   226      },
   227      {
   228        "name": "vitess_seq",
   229        "table_names_or_prefixes": ["vitess_seq"],
   230        "readers": ["dev"],
   231        "writers": ["dev"],
   232        "admins": ["dev"]
   233      },
   234      {
   235        "name": "vitess_reset_seq",
   236        "table_names_or_prefixes": ["vitess_reset_seq"],
   237        "readers": ["dev"],
   238        "writers": ["dev"],
   239        "admins": ["dev"]
   240      },
   241      {
   242        "name": "vitess_acl_unmatched",
   243        "table_names_or_prefixes": ["vitess_acl_unmatched"],
   244        "readers": ["dev"],
   245        "writers": ["dev"],
   246        "admins": ["dev"]
   247      },
   248      {
   249        "name": "vitess_acl_no_access",
   250        "table_names_or_prefixes": ["vitess_acl_no_access"]
   251      },
   252      {
   253        "name": "vitess_acl_read_only",
   254        "table_names_or_prefixes": ["vitess_acl_read_only"],
   255        "readers": ["dev"]
   256      },
   257      {
   258        "name": "vitess_acl_read_write",
   259        "table_names_or_prefixes": ["vitess_acl_read_write"],
   260        "readers": ["dev"],
   261        "writers": ["dev"]
   262      },
   263      {
   264        "name": "vitess_acl_admin",
   265        "table_names_or_prefixes": ["vitess_acl_admin"],
   266        "readers": ["dev"],
   267        "writers": ["dev"],
   268        "admins": ["dev"]
   269      },
   270      {
   271        "name": "vitess_acl_all_user_read_only",
   272        "table_names_or_prefixes": ["vitess_acl_all_user_read_only"],
   273        "readers": ["dev"]
   274      },
   275      {
   276        "name": "vitess_acl_appdebug",
   277        "table_names_or_prefixes": ["vitess_test_debuguser"],
   278        "readers": ["dev", "vt_appdebug"],
   279        "writers": ["dev", "vt_appdebug"]
   280      },
   281      {
   282        "name": "version",
   283        "table_names_or_prefixes": ["vitess_version"],
   284        "readers": ["dev"],
   285        "writers": ["dev"],
   286        "admins": ["dev"]
   287      },
   288      {
   289        "name": "schema_version",
   290        "table_names_or_prefixes": ["schema_version"],
   291        "readers": ["dev"],
   292        "writers": ["dev"],
   293        "admins": ["dev"]
   294      },
   295      {
   296        "name": "historian_test1",
   297        "table_names_or_prefixes": ["historian_test1"],
   298        "readers": ["dev"],
   299        "writers": ["dev"],
   300        "admins": ["dev"]
   301      }
   302    ]
   303  }`