18
from canonical.config import config
18
19
from canonical.database.sqlbase import connect
19
20
from canonical.database.postgresql import (
20
all_sequences_in_schema, all_tables_in_schema
21
all_sequences_in_schema, all_tables_in_schema, ConnectionString
22
23
from canonical.launchpad.scripts import (
23
24
logger, logger_options, db_options
37
38
def duplicate_schema():
38
39
"""Duplicate the master schema into the slaves."""
39
40
log.info('Duplicating database schema')
42
master_cs = ConnectionString(config.database.main_master)
43
master_cs.user = options.dbuser
44
slave1_cs = ConnectionString(config.database.main_slave)
45
slave1_cs.user = options.dbuser
40
47
# We can't use pg_dump to replicate security as not all of the roles
41
48
# may exist in the slave databases' clusters yet.
43
"pg_dump -x -s -U slony lpmain_demo "
44
"| psql -q -U slony authdb_demo", shell=True)
49
cmd = "pg_dump -x -s %s | psql -q %s" % (
50
master_cs.asPGCommandLineArgs(), slave1_cs.asPGCommandLineArgs())
51
log.debug('Running %s' % cmd)
52
rv = subprocess.call(cmd, shell=True)
46
54
log.fatal("Schema duplication failed, pg_dump returned %d" % rv)
49
57
# Now setup security on the slaves and create any needed roles,
50
58
log.info('Setting up security on slave')
51
rv = subprocess.call([
52
"../schema/security.py", "-d", "authdb_demo"])
59
cmd = "../schema/security.py %s" % slave1_cs.asLPCommandLineArgs()
60
log.debug("Running %s" % cmd)
61
rv = subprocess.call(cmd.split())
54
63
print >> sys.stderr, "ERR: security setup failed, returning %d" % rv
61
70
helpers.execute_slonik("""
63
72
echo 'Initializing cluster and Master node.';
64
init cluster (id=@master_id, comment='Master Node');
73
init cluster (id=@master_node, comment='Master Node');
66
75
on success { echo 'Cluster initialized.'; }
67
76
on error { echo 'Cluster initialization failed.'; exit 1; }
69
78
helpers.execute_slonik("""
71
80
echo 'Initializing Slave#1 node.';
72
store node (id=@slave1_id, comment='Slave Node #1');
81
store node (id=@slave1_node, comment='Slave Node #1');
74
83
echo 'Storing Master -> Slave#1 path.';
76
server=@master_id, client=@slave1_id,
85
server=@master_node, client=@slave1_node,
77
86
conninfo=@master_conninfo);
79
88
echo 'Storing Slave#1 -> Master path.';
81
server=@slave1_id, client=@master_id,
90
server=@slave1_node, client=@master_node,
82
91
conninfo=@slave1_conninfo);
84
93
on success { echo 'Slave#1 initialized.'; }
97
106
log.info('Creating Slony-I replication sets.')
100
echo 'Creating AuthDB replication set (@authdb_set_id)';
109
echo 'Creating AuthDB replication set (@authdb_set)';
102
id=@authdb_set_id, origin=@master_id,
111
id=@authdb_set, origin=@master_node,
103
112
comment='AuthDB tables and sequences');
107
116
for table in sorted(authdb_tables):
108
117
script.append("""
109
echo 'Adding %(table)s to replication set @authdb_set_id';
118
echo 'Adding %(table)s to replication set @authdb_set';
111
set id=@authdb_set_id,
114
123
fully qualified name='%(table)s');
118
127
for sequence in sorted(authdb_sequences):
119
128
script.append("""
120
echo 'Adding %(sequence)s to replication set @authdb_set_id';
129
echo 'Adding %(sequence)s to replication set @authdb_set';
121
130
set add sequence (
122
set id=@authdb_set_id,
125
134
fully qualified name='%(sequence)s');
129
138
script.append("""
130
echo 'Creating LPMain replication set (@lpmain_set_id)';
139
echo 'Creating LPMain replication set (@lpmain_set)';
132
id=@lpmain_set_id, origin=@master_id,
141
id=@lpmain_set, origin=@master_node,
133
142
comment='Launchpad tables and sequences');
176
185
# always need forward=yes as per Slony-I docs.
177
186
helpers.execute_slonik("""
180
provider=@master_id, receiver=@slave1_id,
189
provider=@master_node, receiver=@slave1_node,
184
provider=@master_id, receiver=@slave1_id,
193
provider=@master_node, receiver=@slave1_node,
187
196
helpers.validate_replication(cur) # Explode now if we have messed up.