Пример #1
0
 def test_volumes_for_backup(self):
     containers = self.createContainers()
     containers += [
         {
             'service': 'web',
             'labels': {
                 'restic-compose-backup.volumes': True,
             },
             'mounts': [{
                 'Source': 'test',
                 'Destination': 'test',
                 'Type': 'bind',
             }]
         },
         {
             'service': 'mysql',
             'labels': {
                 'restic-compose-backup.mysql': True,
             },
             'mounts': [{
                 'Source': 'data',
                 'Destination': 'data',
                 'Type': 'bind',
             }]
         },
     ]
     with mock.patch(list_containers_func, fixtures.containers(containers=containers)):
         cnt = RunningContainers()
         self.assertTrue(len(cnt.containers_for_backup()) == 2)
         self.assertEqual(cnt.generate_backup_mounts(), {'test': {'bind': '/volumes/web/test', 'mode': 'ro'}})
Пример #2
0
 def test_running_containers(self):
     containers = self.createContainers()
     containers += [
         {
             'service': 'web',
             'labels': {
                 'restic-compose-backup.volumes': True,
                 'test': 'test',
             },
             'mounts': [{
                 'Source': 'test',
                 'Destination': 'test',
                 'Type': 'bind',
             }]
         },
         {
             'service': 'mysql',
         },
         {
             'service': 'postgres',
         },
     ]
     with mock.patch(list_containers_func, fixtures.containers(containers=containers)):
         result = RunningContainers()
         self.assertEqual(len(result.containers), 4, msg="Three containers expected")
         self.assertNotEqual(result.this_container, None, msg="No backup container found")
         web_service = result.get_service('web')
         self.assertNotEqual(web_service, None)
         self.assertEqual(len(web_service.filter_mounts()), 1)
Пример #3
0
    def test_exclude(self):
        containers = self.createContainers()
        containers += [
            {
                'service': 'web',
                'labels': {
                    'restic-compose-backup.volumes': True,
                    'restic-compose-backup.volumes.exclude': 'stuff',
                },
                'mounts': [
                    {
                        'Source': '/srv/files/media',
                        'Destination': '/srv/media',
                        'Type': 'bind',
                    },
                    {
                        'Source': '/srv/files/stuff',
                        'Destination': '/srv/stuff',
                        'Type': 'bind',
                    },
                ]
            },
        ]
        with mock.patch(list_containers_func, fixtures.containers(containers=containers)):
            cnt = RunningContainers()

        web_service = cnt.get_service('web')
        self.assertNotEqual(web_service, None, msg="Web service not found")

        mounts = web_service.filter_mounts()
        self.assertEqual(len(mounts), 1)
        self.assertEqual(mounts[0].source, '/srv/files/media')
Пример #4
0
    def test_find_running_backup_container(self):
        containers = self.createContainers()
        with mock.patch(list_containers_func, fixtures.containers(containers=containers)):
            cnt = RunningContainers()
            self.assertFalse(cnt.backup_process_running)

        containers += [
            {
                'service': 'backup_runner',
                'labels': {
                    'restic-compose-backup.process-default': 'True',
                },
            },
        ]
        with mock.patch(list_containers_func, fixtures.containers(containers=containers)):
            cnt = RunningContainers()
            self.assertTrue(cnt.backup_process_running)
Пример #5
0
def main():
    """CLI entrypoint"""
    args = parse_args()
    config = Config()
    log.setup(level=args.log_level or config.log_level)
    containers = RunningContainers()

    # Ensure log level is propagated to parent container if overridden
    if args.log_level:
        containers.this_container.set_config_env('LOG_LEVEL', args.log_level)

    if args.no_cleanup:
        config.skip_cleanup = True

    if args.action == 'status':
        status(config, containers)

    elif args.action == 'snapshots':
        snapshots(config, containers)

    elif args.action == 'backup':
        backup(config, containers)

    elif args.action == 'start-backup-process':
        start_backup_process(config, containers)

    elif args.action == 'cleanup':
        cleanup(config, containers)

    elif args.action == 'alert':
        alert(config, containers)

    elif args.action == 'version':
        import restic_compose_backup
        print(restic_compose_backup.__version__)

    elif args.action == "crontab":
        crontab(config)

    # Random test stuff here
    elif args.action == "test":
        nodes = utils.get_swarm_nodes()
        print("Swarm nodes:")
        for node in nodes:
            addr = node.attrs['Status']['Addr']
            state = node.attrs['Status']['State']
            print(' - {} {} {}'.format(node.id, addr, state))