###########################################################################
#
# This test suite checks the following statements:
#   - SET <instance id>.<option name> = <option value>;
#   - UNSET <instance id>.<option name> = <option value>;
#   - FLUSH INSTANCES;
#
# For SET/UNSET we check that:
#   - SET ignores spaces correctly;
#   - UNSET does not allow option-value part (= <option value>);
#   - SET/UNSET can be applied several times w/o error;
#   - SET/UNSET is allowed only for stopped instances;
#   - SET/UNSET updates both the configuration cache in IM and
#     the configuration file;
#
# For FLUSH INSTANCES we check that:
#   - FLUSH INSTANCES is allowed only when all instances are stopped;
#
# According to the IM implementation details, we should play at least with the
# following options:
#   - server_id
#   - port
#   - nonguarded

# Let's test SET statement on the option 'server_id'. It's expected that
# originally the instances have the following server ids and states:
#  - mysqld1: server_id: 1; running (online)
#  - mysqld2: server_id: 2; stopped (offline)
#
###########################################################################

--source include/im_check_os.inc

###########################################################################
#
# Check starting conditions.
#
###########################################################################

# - check the configuration file;

--echo --------------------------------------------------------------------
--exec grep server_id $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------

# - check the running instances.

--connect (mysql1_con,localhost,root,,mysql,$IM_MYSQLD1_PORT,$IM_MYSQLD1_SOCK)

--connection mysql1_con

SHOW VARIABLES LIKE 'server_id';

--connection default

# - check the internal cache.

SHOW INSTANCES;

###########################################################################
#
# Check that SET/UNSET is allowed only for stopped instances.
#
###########################################################################

# - check that SET/UNSET is denied for running instances;

--error 3015 # ER_INSTANCE_IS_ACTIVE
UNSET mysqld1.server_id;

--error 3015 # ER_INSTANCE_IS_ACTIVE
SET mysqld1.server_id = 11;

# - check that SET/UNSET is denied for active instances:
#   - create dummy misconfigured instance;
#   - start it;
#   - try to set/unset options;

CREATE INSTANCE mysqld3 datadir = '/';
START INSTANCE mysqld3;

# FIXME: START INSTANCE should be synchronous.
--sleep 3
# should be longer than monitoring interval and enough to start instance.

# NOTE: We can not analyze state of the instance here -- it can be Failed or
# Starting because Instance Manager is trying to start the misconfigured
# instance several times.

--error 3015 # ER_INSTANCE_IS_ACTIVE
UNSET mysqld3.server_id;

--error 3015 # ER_INSTANCE_IS_ACTIVE
SET mysqld3.server_id = 11;

STOP INSTANCE mysqld3;

# FIXME: STOP INSTANCE should be synchronous.
--sleep 3
# should be longer than monitoring interval and enough to stop instance.

--replace_column 3 VERSION_NUMBER 4 VERSION
SHOW INSTANCE STATUS mysqld3;

# - check that SET/UNSET succeed for stopped instances;
# - check that SET/UNSET can be applied multiple times;

UNSET mysqld2.server_id;
UNSET mysqld2.server_id;

--replace_column 2 option_value
SHOW INSTANCE OPTIONS mysqld2;

SET mysqld2.server_id = 2;
SET mysqld2.server_id = 2;

--replace_column 2 option_value
SHOW INSTANCE OPTIONS mysqld2;

# - check that UNSET does not allow option-value part (= <option value>);

--error ER_SYNTAX_ERROR
UNSET mysqld2.server_id = 11;

# - check that SET/UNSET working properly with multiple options;

SET mysqld2.aaa, mysqld3.bbb, mysqld2.ccc = 0010, mysqld3.ddd = 0020;

--echo --------------------------------------------------------------------
--exec grep aaa $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------
--exec grep bbb $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------
--exec grep ccc $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------
--exec grep ddd $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------

UNSET mysqld2.aaa, mysqld3.bbb, mysqld2.ccc, mysqld3.ddd;

--echo --------------------------------------------------------------------
--exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep ccc $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep ddd $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------

# - check that if some instance name is invalid or the active is active,
#   whole SET-statement will not be executed;

--error 3000 # ER_BAD_INSTANCE_NAME
SET mysqld2.aaa, mysqld3.bbb, mysqld.ccc = 0010;

--echo --------------------------------------------------------------------
--exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep ccc $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------

--error 3015 # ER_INSTANCE_IS_ACTIVE
SET mysqld2.aaa, mysqld3.bbb, mysqld1.ccc = 0010;

--echo --------------------------------------------------------------------
--exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep ccc $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------

# - check that if some instance name is invalid or the active is active,
#   whole UNSET-statement will not be executed;

--error 3000 # ER_BAD_INSTANCE_NAME
UNSET mysqld2.server_id, mysqld3.server_id, mysqld.ccc;

--echo --------------------------------------------------------------------
--exec grep server_id $MYSQLTEST_VARDIR/im.cnf;
--echo --------------------------------------------------------------------

--error 3015 # ER_INSTANCE_IS_ACTIVE
UNSET mysqld2.server_id, mysqld3.server_id, mysqld1.ccc;

--echo --------------------------------------------------------------------
--exec grep server_id $MYSQLTEST_VARDIR/im.cnf;
--echo --------------------------------------------------------------------

DROP INSTANCE mysqld3;

# - check that spaces are handled correctly;

SET mysqld2.server_id=222;
SET mysqld2.server_id = 222;
SET   mysqld2.server_id   =  222  ;
SET   mysqld2  .  server_id  =  222  ;
SET   mysqld2  .  server_id  =  222  , mysqld2  .  aaa  , mysqld2  .  bbb  ;

--echo --------------------------------------------------------------------
--exec grep server_id $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------
--exec grep aaa $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------
--exec grep bbb $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------

UNSET mysqld2  . aaa  ,  mysqld2  .  bbb ;

--echo --------------------------------------------------------------------
--exec grep server_id $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------
--exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------
--exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true;
--echo --------------------------------------------------------------------

###########################################################################
#
# Check that SET/UNSET updates both the configuration cache in IM and
# the configuration file.
#
###########################################################################

#   - check that the configuration file has been updated (i.e. contains
#     server_id=SERVER_ID for mysqld2);

--echo --------------------------------------------------------------------
--exec grep server_id $MYSQLTEST_VARDIR/im.cnf ;
--echo --------------------------------------------------------------------

#   - (for mysqld1) check that the running instance has not been affected:
#     connect to the instance and check that 'SHOW VARIABLES LIKE 'server_id''
#     returns zero;

--connection mysql1_con

SHOW VARIABLES LIKE 'server_id';

--connection default

#   - check that internal cache of Instance Manager has been affected;
#     TODO: we should check only server_id option here.

# SHOW INSTANCE OPTIONS mysqld2;

###########################################################################
#
# Check that FLUSH INSTANCES is allowed only when all instances are stopped.
#
###########################################################################

SHOW INSTANCES;

--error 3016 # ER_THERE_IS_ACTIVE_INSTACE
FLUSH INSTANCES;

STOP INSTANCE mysqld1;
# FIXME: STOP INSTANCE should be synchronous.
--sleep 3
# should be longer than monitoring interval and enough to stop instance.

SHOW INSTANCES;

FLUSH INSTANCES;
