Skip to content

Commit ea31333

Browse files
committed
Add volume backup commands
Change-Id: Iedccd329ff6fb3155eb29649cd0bc84cfc5ebedf Implements: blueprint volume-backup
1 parent f4f85a2 commit ea31333

2 files changed

Lines changed: 177 additions & 0 deletions

File tree

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
# Copyright 2012-2013 OpenStack, LLC.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
# not use this file except in compliance with the License. You may obtain
5+
# 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, WITHOUT
11+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
# License for the specific language governing permissions and limitations
13+
# under the License.
14+
#
15+
16+
"""Volume v1 Backup action implementations"""
17+
18+
import logging
19+
20+
from cliff import command
21+
from cliff import lister
22+
from cliff import show
23+
24+
from openstackclient.common import utils
25+
26+
27+
class CreateBackup(show.ShowOne):
28+
"""Create backup command"""
29+
30+
api = 'volume'
31+
log = logging.getLogger(__name__ + '.CreateBackup')
32+
33+
def get_parser(self, prog_name):
34+
parser = super(CreateBackup, self).get_parser(prog_name)
35+
parser.add_argument(
36+
'volume',
37+
metavar='<volume>',
38+
help='The name or ID of the volume to backup',
39+
)
40+
parser.add_argument(
41+
'--container',
42+
metavar='<container>',
43+
required=False,
44+
help='Optional Backup container name.',
45+
)
46+
parser.add_argument(
47+
'--name',
48+
metavar='<name>',
49+
required=False,
50+
help='Name of the backup',
51+
)
52+
parser.add_argument(
53+
'--description',
54+
metavar='<description>',
55+
help='Description of the backup',
56+
)
57+
return parser
58+
59+
def take_action(self, parsed_args):
60+
self.log.debug('take_action(%s)' % parsed_args)
61+
volume_client = self.app.client_manager.volume
62+
volume_id = utils.find_resource(volume_client.volumes,
63+
parsed_args.volume).id
64+
backup = volume_client.backups.create(
65+
volume_id,
66+
parsed_args.volume,
67+
parsed_args.name,
68+
parsed_args.description
69+
)
70+
71+
backup._info.pop('links')
72+
return zip(*sorted(backup._info.iteritems()))
73+
74+
75+
class DeleteBackup(command.Command):
76+
"""Delete backup command"""
77+
78+
api = 'volume'
79+
log = logging.getLogger(__name__ + '.DeleteBackup')
80+
81+
def get_parser(self, prog_name):
82+
parser = super(DeleteBackup, self).get_parser(prog_name)
83+
parser.add_argument(
84+
'backup',
85+
metavar='<backup>',
86+
help='Name or ID of backup to delete',
87+
)
88+
return parser
89+
90+
def take_action(self, parsed_args):
91+
self.log.debug('take_action(%s)' % parsed_args)
92+
volume_client = self.app.client_manager.volume
93+
backup_id = utils.find_resource(volume_client.backups,
94+
parsed_args.backup).id
95+
volume_client.backups.delete(backup_id)
96+
return
97+
98+
99+
class ListBackup(lister.Lister):
100+
"""List backup command"""
101+
102+
api = 'volume'
103+
log = logging.getLogger(__name__ + '.ListBackup')
104+
105+
def take_action(self, parsed_args):
106+
self.log.debug('take_action(%s)' % parsed_args)
107+
columns = (
108+
'ID',
109+
'Display Name',
110+
'Display Description',
111+
'Status',
112+
'Size'
113+
)
114+
data = self.app.client_manager.volume.backups.list()
115+
return (columns,
116+
(utils.get_item_properties(
117+
s, columns,
118+
formatters={},
119+
) for s in data))
120+
121+
122+
class RestoreBackup(command.Command):
123+
"""Restore backup command"""
124+
125+
api = 'volume'
126+
log = logging.getLogger(__name__ + '.RestoreBackup')
127+
128+
def get_parser(self, prog_name):
129+
parser = super(RestoreBackup, self).get_parser(prog_name)
130+
parser.add_argument(
131+
'backup',
132+
metavar='<backup>',
133+
help='ID of backup to restore')
134+
parser.add_argument(
135+
'volume',
136+
metavar='<dest-volume>',
137+
help='ID of volume to restore to')
138+
return parser
139+
140+
def take_action(self, parsed_args):
141+
self.log.debug('take_action(%s)' % parsed_args)
142+
volume_client = self.app.client_manager.volume
143+
backup = utils.find_resource(volume_client.backups,
144+
parsed_args.backup)
145+
destination_volume = utils.find_resource(volume_client.volumes,
146+
parsed_args.volume)
147+
return volume_client.restores.restore(backup.id,
148+
destination_volume.id)
149+
150+
151+
class ShowBackup(show.ShowOne):
152+
"""Show backup command"""
153+
154+
api = 'volume'
155+
log = logging.getLogger(__name__ + '.ShowBackup')
156+
157+
def get_parser(self, prog_name):
158+
parser = super(ShowBackup, self).get_parser(prog_name)
159+
parser.add_argument(
160+
'backup',
161+
metavar='<backup>',
162+
help='Name or ID of backup to display')
163+
return parser
164+
165+
def take_action(self, parsed_args):
166+
self.log.debug('take_action(%s)' % parsed_args)
167+
volume_client = self.app.client_manager.volume
168+
backup = utils.find_resource(volume_client.backups,
169+
parsed_args.backup)
170+
backup._info.pop('links')
171+
return zip(*sorted(backup._info.iteritems()))

setup.cfg

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,12 @@ openstack.volume.v1 =
189189
snapshot_set = openstackclient.volume.v1.snapshot:SetSnapshot
190190
snapshot_show = openstackclient.volume.v1.snapshot:ShowSnapshot
191191

192+
backup_create = openstackclient.volume.v1.backup:CreateBackup
193+
backup_delete = openstackclient.volume.v1.backup:DeleteBackup
194+
backup_list = openstackclient.volume.v1.backup:ListBackup
195+
backup_restore = openstackclient.volume.v1.backup:RestoreBackup
196+
backup_show = openstackclient.volume.v1.backup:ShowBackup
197+
192198
volume_create = openstackclient.volume.v1.volume:CreateVolume
193199
volume_delete = openstackclient.volume.v1.volume:DeleteVolume
194200
volume_list = openstackclient.volume.v1.volume:ListVolume

0 commit comments

Comments
 (0)