Add initial backup support

* sahred backup with backup feature configuration steps
* Initial structure for backup  manager
* include backup configuration steps into ceph_rgw

Change-Id: I0b88eef4e0e5e6eab93488ac99d8ea9face1c205
diff --git a/tcp_tests/managers/backup_restore_manager.py b/tcp_tests/managers/backup_restore_manager.py
new file mode 100644
index 0000000..e3b8c23
--- /dev/null
+++ b/tcp_tests/managers/backup_restore_manager.py
@@ -0,0 +1,148 @@
+#    Copyright 2018 Mirantis, Inc.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tcp_tests import logger
+
+
+LOG = logger.logger
+
+
+class BackupRestoreManager(object):
+    """Helper manager for execution backup restore"""
+
+    backup_cmd = 'backupninja -n --run /etc/backup.d/200.backup.rsync'
+
+    def __init__(self, underlay, salt_api, backup_cmd=None):
+        self.underlay = underlay
+        self.__salt_api = salt_api
+        self.backup_cmd = backup_cmd or self.backup_cmd
+
+    @property
+    def salt_api(self):
+        return self.__salt_api
+
+    def create_backup(self, tgt, backup_cmd=backup_cmd):
+        return self.salt_api.enforce_state(tgt, 'cmd.run', backup_cmd)
+
+    def restore_salt_master(self, tgt):
+        return self.salt_api.local(tgt, 'salt.master.restore')
+
+    def restore_salt_minion(self, tgt):
+        return self.salt_api.local(tgt, 'salt.minion.restore')
+
+    def create_mysql_backup_backupninja(self, tgt, ):
+        rets = []
+        res = self.salt_api.enforce_state(
+            tgt, 'cmd.run',
+            'backupninja -n --run /etc/backup.d/101.mysql')
+        rets.append(res)
+        res_rsync = self.salt_api.enforce_state(tgt, 'cmd.run')
+        rets.append(res_rsync)
+        return rets
+
+    def restore_mysql_backupninja(self, tgt):
+        # Running this state restores the databases and creates a file
+        # for every restored database in /root/mysql/flags.
+        return self.salt_api.local(tgt, 'mysql.client')
+
+    def create_mysql_xtrabackup(self, tgt, backup_cmd=backup_cmd):
+        # Should be run on mysql master node
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', '/usr/local/bin/innobackupex-runner.sh')
+
+    def check_mysql_xtrabackup_rsynced(self, tgt='I@xtrabackup:server'):
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', 'ls /var/backups/mysql/xtrabackup/full')
+
+    def stop_mysql_slave(self, tgt='I@galera:slave'):
+        return self.salt_api.enforce_state(tgt, 'service.stop mysql')
+
+    def remove_mysql_logs(self, tgt='I@galera:slave'):
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', 'rm /var/lib/mysql/ib_logfile*')
+
+    def stop_mysql_master(self, tgt='I@galera:master'):
+        return self.salt_api.enforce_state(tgt, 'service.stop mysql')
+
+    def disconnect_wresp_master(self, tgt='I@galera:master'):
+        # TODO fins the way updated wresp
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', 'wsrep_cluster_address=gcomm://')
+
+    def move_dbs_files_to_new_location(self, tgt='I@galera:master'):
+        cmds = ['mkdir -p /root/mysql/mysql.bak/',
+                'mv /var/lib/mysql/* /root/mysql/mysql.bak',
+                'rm /var/lib/mysql/.galera_bootstrap']
+        rest = []
+        for cmd in cmds:
+            res = self.salt_api.enforce_state(tgt, 'cmd.run', cmd)
+            rest.append(res)
+        return rest
+
+    def check_dbs_files_removed(self, tgt='I@galera:master'):
+        cmds = ['ls /var/lib/mysql/',
+                'ls -ld /var/lib/mysql/.?*']
+        rest = []
+        for cmd in cmds:
+            res = self.salt_api.enforce_state(tgt, 'cmd.run', cmd)
+            rest.append(res)
+        return rest
+
+    # run xtrabackup state on node where bacakup
+    def run_xtrabackup(self, tgt):
+        return self.salt_api.local(tgt, 'xtrabackup')
+
+    def start_mysql(self):
+        tgts = ['I@galera:master', 'I@galera:slave']
+        ret = []
+        for tgt in tgts:
+            res = self.salt_api.enforce_state(tgt, 'service.start mysql')
+            ret.append(res)
+        return ret
+
+    def check_galera_cluster(self, tgt='I@galera:master'):
+        return self.salt_api.enforce_state(
+            tgt, 'mysql.status | grep -A1 wsrep_cluster_size')
+
+    # #################Backup_Restore_Glance###################
+
+    def copy_glance_images_to_backup(self, path_to_backup,
+                                     tgt="I@glance:server and *01*"):
+        cmd = 'cp -a /var/lib/glance/images/. {}'.format(path_to_backup)
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', cmd)
+
+    def copy_glance_images_from_backup(self, path_to_backup,
+                                       tgt="I@glance:server and *01*"):
+        cmd = 'cp -a {}/. /var/lib/glance/images/'.format(path_to_backup)
+        return self.salt_api.enforce_state(
+            tgt, 'cmd.run', cmd)
+
+    def check_images_after_backup(self, tgt="I@keystone:client"):
+        # TODO If the context of the Glance
+        # images files is lost, run the following commands:
+        # salt -C 'I@glance:server' cmd.run
+        # "chown glance:glance <IMAGE_FILE_NAME>"
+        # salt -C 'I@glance:server' cmd.run "chmod 640 <IMAGE_FILE_NAME>"
+        cmd = '. /root/keystonercv3; openstack image list'
+        return self.salt_api.enforce_state(tgt, 'cmd.run', cmd)
+
+    # #################Backup_Restore_cinder_volumes_and_snapshots###
+    # TODO Verify that a complete backup was created on
+    # the MySQL Galera Database Master node
+    # ls /var/backups/mysql/xtrabackup/full
+    # TODO(tleontovich): add method to check needed configs
+    # TODO (tleontovich): check pillars
+    # TODO (tleontovich): check  backup is created, and
+    # restore restores