Skip to content

Commit df03a5c

Browse files
committed
Added snapshot_name for versions, THIS MAKES THE EXPORT/IMPORT FORMAT INCOMPATIBLE
1 parent 08d4390 commit df03a5c

File tree

14 files changed

+25691
-112
lines changed

14 files changed

+25691
-112
lines changed

TEST

+25,602
Large diffs are not rendered by default.

alembic

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
#!/bin/bash
22

3-
alembic -c src/backy2/meta_backends/sql_migrations/alembic_cli.ini "$@"
3+
# ./alembic revision --autogenerate -m "Added snapshot_name to versions"
4+
5+
alembic -c src/backy2/meta_backends/sql_migrations/alembic.ini "$@"

smoketest.py

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ def __exit__(self, type, value, traceback):
116116
backy = backy_from_config(Config)()
117117
version_uid = backy.backup(
118118
'data-backup',
119+
'snapshot-name',
119120
'file://'+os.path.join(testpath, 'data'),
120121
hints_from_rbd_diff(open(os.path.join(testpath, 'hints')).read()),
121122
from_version

src/backy2/backy.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def __init__(self, meta_backend, data_backend, config, block_size=None,
5858
self.locking.unlock('backy')
5959

6060

61-
def _prepare_version(self, name, size_bytes, from_version_uid=None):
61+
def _prepare_version(self, name, snapshot_name, size_bytes, from_version_uid=None):
6262
""" Prepares the metadata for a new version.
6363
If from_version_uid is given, this is taken as the base, otherwise
6464
a pure sparse version is created.
@@ -72,7 +72,7 @@ def _prepare_version(self, name, size_bytes, from_version_uid=None):
7272
old_blocks = None
7373
size = math.ceil(size_bytes / self.block_size)
7474
# we always start with invalid versions, then validate them after backup
75-
version_uid = self.meta_backend.set_version(name, size, size_bytes, 0)
75+
version_uid = self.meta_backend.set_version(name, snapshot_name, size, size_bytes, 0)
7676
if not self.locking.lock(version_uid):
7777
raise LockError('Version {} is locked.'.format(version_uid))
7878
for id in range(size):
@@ -346,7 +346,7 @@ def rm(self, version_uid, force=True, disallow_rm_when_younger_than_days=0):
346346
self.locking.unlock(version_uid)
347347

348348

349-
def backup(self, name, source, hints, from_version):
349+
def backup(self, name, snapshot_name, source, hints, from_version):
350350
""" Create a backup from source.
351351
If hints are given, they must be tuples of (offset, length, exists)
352352
where offset and length are integers and exists is a boolean. Then, only
@@ -391,7 +391,7 @@ def backup(self, name, source, hints, from_version):
391391
read_blocks = set(read_blocks)
392392

393393
try:
394-
version_uid = self._prepare_version(name, source_size, from_version)
394+
version_uid = self._prepare_version(name, snapshot_name, source_size, from_version)
395395
except RuntimeError as e:
396396
logger.error(str(e))
397397
logger.error('Backy exiting.')

src/backy2/enterprise/nbd.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def read(self, version_uid, offset, length):
9898

9999
def get_cow_version(self, from_version):
100100
cow_version_uid = self.backy._prepare_version(
101-
'cow from {}'.format(from_version.uid),
101+
'copy on write', from_version.uid,
102102
from_version.size_bytes, from_version.uid)
103103
self.cow[cow_version_uid] = {} # contains version_uid: dict() of block id -> uid
104104
return cow_version_uid

src/backy2/logging.py

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ def init_logging(logfile, console_level): # pragma: no cover
1919

2020
logging.basicConfig(handlers = [console, logfile], level=logging.DEBUG)
2121

22+
# make alembic quiet
23+
logging.getLogger('alembic').setLevel(logging.WARN)
24+
2225
logger.info('$ ' + ' '.join(sys.argv))
2326

2427

src/backy2/meta_backends/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ class MetaBackend():
77
def __init__(self):
88
pass
99

10-
def set_version(self, version_name, size, size_bytes):
11-
""" Creates a new version with a given name.
10+
def set_version(self, version_name, snapshot_name, size, size_bytes):
11+
""" Creates a new version with a given name and snapshot_name.
1212
size is the number of blocks this version will contain.
1313
Returns a uid for this version.
1414
"""

src/backy2/meta_backends/sql.py

+26-18
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import uuid
1717

1818

19-
METADATA_VERSION = '2.1'
19+
METADATA_VERSION = '2.2'
2020

2121
DELETE_CANDIDATE_MAYBE = 0
2222
DELETE_CANDIDATE_SURE = 1
@@ -47,15 +47,16 @@ class Version(Base):
4747
__tablename__ = 'versions'
4848
uid = Column(String(36), primary_key=True)
4949
date = Column("date", DateTime , default=func.now(), nullable=False)
50-
name = Column(String, nullable=False)
50+
name = Column(String, nullable=False, default='')
51+
snapshot_name = Column(String, nullable=False, server_default='', default='')
5152
size = Column(BigInteger, nullable=False)
5253
size_bytes = Column(BigInteger, nullable=False)
5354
valid = Column(Integer, nullable=False)
5455
protected = Column(Integer, nullable=False)
5556

5657
def __repr__(self):
57-
return "<Version(uid='%s', name='%s', date='%s')>" % (
58-
self.uid, self.name, self.date)
58+
return "<Version(uid='%s', name='%s', snapshot_name='%s', date='%s')>" % (
59+
self.uid, self.name, self.snapshot_name, self.date)
5960

6061

6162
DereferencedBlock = namedtuple('Block', ['uid', 'version_uid', 'id', 'date', 'checksum', 'size', 'valid'])
@@ -121,18 +122,20 @@ def __init__(self, config):
121122
from alembic.config import Config
122123
from alembic import command
123124
alembic_cfg = Config(os.path.join(os.path.dirname(os.path.realpath(__file__)), "sql_migrations", "alembic.ini"))
124-
try:
125-
Base.metadata.create_all(engine, checkfirst=False) # checkfirst False will raise when it finds an existing table
126-
except sqlalchemy.exc.OperationalError:
127-
# tables already exist, see if there are any db schema upgrades
128-
with engine.begin() as connection:
129-
alembic_cfg.attributes['connection'] = connection
130-
#command.upgrade(alembic_cfg, "head", sql=True)
131-
command.upgrade(alembic_cfg, "head")
132-
else:
133-
# new database.
134-
# mark the version table, "stamping" it with the most recent rev:
135-
command.stamp(alembic_cfg, "head")
125+
with engine.begin() as connection:
126+
alembic_cfg.attributes['connection'] = connection
127+
try:
128+
Base.metadata.create_all(engine, checkfirst=False) # checkfirst False will raise when it finds an existing table
129+
except sqlalchemy.exc.OperationalError:
130+
# tables already exist, see if there are any db schema upgrades
131+
with engine.begin() as connection:
132+
alembic_cfg.attributes['connection'] = connection
133+
#command.upgrade(alembic_cfg, "head", sql=True)
134+
command.upgrade(alembic_cfg, "head")
135+
else:
136+
# new database.
137+
# mark the version table, "stamping" it with the most recent rev:
138+
command.stamp(alembic_cfg, "head")
136139

137140
Session = sessionmaker(bind=engine)
138141
self.session = Session()
@@ -147,11 +150,12 @@ def _commit(self):
147150
self.session.commit()
148151

149152

150-
def set_version(self, version_name, size, size_bytes, valid, protected=0):
153+
def set_version(self, version_name, snapshot_name, size, size_bytes, valid, protected=0):
151154
uid = self._uid()
152155
version = Version(
153156
uid=uid,
154157
name=version_name,
158+
snapshot_name=snapshot_name,
155159
size=size,
156160
size_bytes=size_bytes,
157161
valid=valid,
@@ -404,9 +408,11 @@ def export(self, version_uid, f):
404408
version.uid,
405409
version.date.strftime('%Y-%m-%d %H:%M:%S'),
406410
version.name,
411+
version.snapshot_name,
407412
version.size,
408413
version.size_bytes,
409414
version.valid,
415+
version.protected,
410416
])
411417
for block in blocks:
412418
_csv.writerow([
@@ -426,7 +432,7 @@ def import_(self, f):
426432
signature = next(_csv)
427433
if signature[0] != 'backy2 Version {} metadata dump'.format(METADATA_VERSION):
428434
raise ValueError('Wrong import format.')
429-
version_uid, version_date, version_name, version_size, version_size_bytes, version_valid = next(_csv)
435+
version_uid, version_date, version_name, version_snapshot_name, version_size, version_size_bytes, version_valid, version_protected = next(_csv)
430436
try:
431437
self.get_version(version_uid)
432438
except KeyError:
@@ -437,9 +443,11 @@ def import_(self, f):
437443
uid=version_uid,
438444
date=datetime.datetime.strptime(version_date, '%Y-%m-%d %H:%M:%S'),
439445
name=version_name,
446+
snapshot_name=version_snapshot_name,
440447
size=version_size,
441448
size_bytes=version_size_bytes,
442449
valid=version_valid,
450+
protected=version_protected,
443451
)
444452
self.session.add(version)
445453
for uid, version_uid, id, date, checksum, size, valid in _csv:

src/backy2/meta_backends/sql_migrations/alembic.ini

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ keys = generic
4444

4545
[logger_root]
4646
level = WARN
47-
handlers = null
47+
handlers = console
4848
qualname =
4949

5050
[logger_sqlalchemy]
@@ -54,7 +54,7 @@ qualname = sqlalchemy.engine
5454

5555
[logger_alembic]
5656
level = INFO
57-
handlers = null
57+
handlers =
5858
qualname = alembic
5959

6060
[handler_null]

src/backy2/meta_backends/sql_migrations/alembic/env.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313

1414
# Interpret the config file for Python logging.
1515
# This line sets up loggers basically.
16-
fileConfig(config.config_file_name)
16+
#fileConfig(config.config_file_name)
1717

1818
# add your model's MetaData object here
1919
# for 'autogenerate' support
2020
# from myapp import mymodel
2121
# target_metadata = mymodel.Base.metadata
22-
target_metadata = None
22+
from backy2.meta_backends.sql import Base
23+
target_metadata = Base.metadata
2324

2425
# other values from the config, defined by the needs of env.py,
2526
# can be acquired:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""Added snapshot_name to versions
2+
3+
Revision ID: bbe7904bfc3a
4+
Revises:
5+
Create Date: 2017-04-11 18:11:04.786199
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
12+
# revision identifiers, used by Alembic.
13+
revision = 'bbe7904bfc3a'
14+
down_revision = None
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column('versions', sa.Column('snapshot_name', sa.String(), server_default='', nullable=False))
22+
# ### end Alembic commands ###
23+
24+
25+
def downgrade():
26+
# ### commands auto generated by Alembic - please adjust! ###
27+
op.drop_column('versions', 'snapshot_name')
28+
# ### end Alembic commands ###

src/backy2/meta_backends/sql_migrations/alembic_cli.ini

-73
This file was deleted.

src/backy2/scripts/backy.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ def __init__(self, machine_output, Config):
2727
self.backy = backy_from_config(Config)
2828

2929

30-
def backup(self, name, source, rbd, from_version):
30+
def backup(self, name, snapshot_name, source, rbd, from_version):
3131
backy = self.backy()
3232
hints = None
3333
if rbd:
3434
data = ''.join([line for line in fileinput.input(rbd).readline()])
3535
hints = hints_from_rbd_diff(data)
36-
backy.backup(name, source, hints, from_version)
36+
backy.backup(name, snapshot_name, source, hints, from_version)
3737
backy.close()
3838

3939

@@ -106,7 +106,7 @@ def _ls_blocks_machine_output(self, blocks):
106106
def _ls_versions_tbl_output(self, versions):
107107
tbl = PrettyTable()
108108
# TODO: number of invalid blocks, used disk space, shared disk space
109-
tbl.field_names = ['date', 'name', 'size', 'size_bytes', 'uid',
109+
tbl.field_names = ['date', 'name', 'snapshot_name', 'size', 'size_bytes', 'uid',
110110
'valid', 'protected']
111111
tbl.align['name'] = 'l'
112112
tbl.align['size'] = 'r'
@@ -115,6 +115,7 @@ def _ls_versions_tbl_output(self, versions):
115115
tbl.add_row([
116116
version.date,
117117
version.name,
118+
version.snapshot_name,
118119
version.size,
119120
version.size_bytes,
120121
version.uid,
@@ -125,13 +126,14 @@ def _ls_versions_tbl_output(self, versions):
125126

126127

127128
def _ls_versions_machine_output(self, versions):
128-
field_names = ['type', 'date', 'name', 'size', 'size_bytes', 'uid', 'valid', 'protected']
129+
field_names = ['type', 'date', 'name', 'snapshot_name', 'size', 'size_bytes', 'uid', 'valid', 'protected']
129130
print(' '.join(field_names))
130131
for version in versions:
131132
print(' '.join(map(str, [
132133
'version',
133134
version.date,
134135
version.name,
136+
version.snapshot_name,
135137
version.size,
136138
version.size_bytes,
137139
version.uid,
@@ -353,7 +355,8 @@ def main():
353355
help='Source (url-like, e.g. file:///dev/sda or rbd://pool/imagename@snapshot)')
354356
p.add_argument(
355357
'name',
356-
help='Backup name')
358+
help='Backup name (e.g. the hostname)')
359+
p.add_argument('-s', '--snapshot-name', default='', help='Snapshot name (e.g. the name of the rbd snapshot)')
357360
p.add_argument('-r', '--rbd', default=None, help='Hints as rbd json format')
358361
p.add_argument('-f', '--from-version', default=None, help='Use this version-uid as base')
359362
p.set_defaults(func='backup')

0 commit comments

Comments
 (0)