Пример #1
0
class LoadDataBase(object):
    _UUID_KEYSPACE_NAME = 'config_db_uuid'
    _OBJ_UUID_CF_NAME = 'obj_uuid_table'
    _OBJ_FQ_NAME_CF_NAME = 'obj_fq_name_table'
    _OBJ_SHARED_CF_NAME = 'obj_shared_table'
    _UUID_KEYSPACE = {
        _UUID_KEYSPACE_NAME: {
            _OBJ_UUID_CF_NAME: {
                'cf_args': {
                    'autopack_names': False,
                    'autopack_values': False,
                    },
                },
            _OBJ_FQ_NAME_CF_NAME: {
                'cf_args': {
                    'autopack_values': False,
                    },
                },
            _OBJ_SHARED_CF_NAME: {}
            }
        }
    # Resources supported by that script
    # The order of that list is import, that defines the resources
    # order creation
    _SUPPORTED_RESOURCES = [
        'project',
        'security-group',
        'virtual-network',
        'virtual-machine-interface',
    ]
    _PERMS2 = {
        'owner': None,
        'owner_access': 7,
        'global_access': 0,
        'share': [],
    }

    BATCH_QUEUE_SIZE = 1000
    RULES_PER_SG = 4

    def __init__(self, force, resources_file, cassandra_servers,
                 cassandra_username, cassandra_password, db_prefix,
                 cassandra_batch_size, zookeeper_servers,
                 rules_per_security_group, keystone_client,
                 dont_populate_zookeeper):
        self._force = force
        self._resource_distribution = yaml.load(resources_file)
        self._cassandra_batch_size = cassandra_batch_size
        self._rules_per_security_group = rules_per_security_group
        self._keystone_client = keystone_client
        self._dont_populate_zookeeper = dont_populate_zookeeper

        # Connect to cassandra database
        logger.debug("Initilizing the cassandra connection on %s",
                     cassandra_servers)
        cassandra_credentials = {}
        if (cassandra_username is not None and
                cassandra_password is not None):
            cassandra_credentials = {
                'username': cassandra_username,
                'password': cassandra_password,
            }

        def vnc_cassandra_client_logger(msg, level=logging.INFO):
            logger.log(msg=msg, level=level)

        self._object_db = VncObjectDBClient(
            cassandra_servers,
            db_prefix,
            self._UUID_KEYSPACE,
            None,
            vnc_cassandra_client_logger,
            credential=cassandra_credentials)
        self._uuid_cf = self._object_db.get_cf('obj_uuid_table')
        self._fqname_cf = self._object_db.get_cf('obj_fq_name_table')

        # Initilize zookeeper client
        if self._dont_populate_zookeeper:
            self._zk_client = DummyZookeeperClient()
        else:
            self._zk_client = ZookeeperClient(zookeeper_servers)

    def sanitize_resources(self):
        logger.debug("Santizing resources distribution")
        self._resource_map = OrderedDict()
        for resource_type in self._SUPPORTED_RESOURCES:
            object_path = 'contrail_db_loader.resources.%s.%s' %\
                          (resource_type.replace('-', '_'),
                           camel_case(resource_type))
            kwargs = {
                'db_manager': self._object_db,
                'batch_size': self._cassandra_batch_size,
                'zk_client': self._zk_client,
                'project_amount': self._resource_distribution.get('project',
                                                                  0),
                'amount_per_project': self._resource_distribution.get(
                    resource_type, 0),
            }
            self._resource_map[resource_type] = import_object(object_path,
                                                              **kwargs)

        resources_not_supported = (set(self._resource_distribution.keys()) -
                                   set(self._SUPPORTED_RESOURCES))
        if resources_not_supported:
            logger.warning('Loading resources %s are not supported' %
                           ', '.join(resources_not_supported))

    def summarize_resources_to_create(self):
        msg = """Will populate %(project)d projects with:
    - security groups:           %(sg)d
    - access control lists:      %(acl)d
    - virtual networks:          %(vn)d
    - routing instances:         %(ri)d
    - route targets:             %(rt)d
    - virtual machine interface: %(vmi)d
    - virtual machine:           %(vm)d
    - intance ip:                %(iip)d
That will load %(sum)d resources into database."""
        dict = {
            'project': self._resource_map['project'].total_amount,
            'sg': self._resource_map['security-group'].amount_per_project + 1,
            'acl': (self._resource_map['security-group'].amount_per_project +
                    1) * 2,
            'vn': self._resource_map['virtual-network'].amount_per_project,
            'ri': self._resource_map['virtual-network'].amount_per_project,
            'rt': self._resource_map['virtual-network'].amount_per_project,
            'vmi': self._resource_map['virtual-machine-interface'].
            amount_per_project,
            'vm': self._resource_map['virtual-machine-interface'].
            amount_per_project,
            'iip': self._resource_map['virtual-machine-interface'].
            amount_per_project,
        }
        dict['sum'] = 0
        for resource in self._resource_map.values():
            dict['sum'] += resource.total_amount
        logger.warning(msg, dict)
        if (not self._force and
                not prompt('Do you want to load that amount of resources?')):
            exit(0)

    def create_resources(self):
        self._zk_client.connect()
        for resource in self._resource_map.values():
            logger.info("Loading '%s' resources into the database...",
                        resource.type)
            if resource.type == 'project':
                _, time_elapsed = resource.create_resources(
                    self._keystone_client)
            elif resource.type == 'security-group':
                _, time_elapsed = resource.create_resources(
                    self._rules_per_security_group)
            elif resource.type == 'virtual-machine-interface':
                _, time_elapsed = resource.create_resources(
                    self._resource_map['virtual-network'].amount_per_project)
            else:
                _, time_elapsed = resource.create_resources()
            logger.info("%d resources were created to load %d '%s' in "
                        "%2.2f seconds.", resource.total_amount,
                        resource.amount_per_project, resource.type,
                        time_elapsed)
        self._zk_client.disconnect()
Пример #2
0
class LoadDataBase(object):
    _UUID_KEYSPACE_NAME = 'config_db_uuid'
    _OBJ_UUID_CF_NAME = 'obj_uuid_table'
    _OBJ_FQ_NAME_CF_NAME = 'obj_fq_name_table'
    _OBJ_SHARED_CF_NAME = 'obj_shared_table'
    _UUID_KEYSPACE = {
        _UUID_KEYSPACE_NAME: {
            _OBJ_UUID_CF_NAME: {
                'cf_args': {
                    'autopack_names': False,
                    'autopack_values': False,
                },
            },
            _OBJ_FQ_NAME_CF_NAME: {
                'cf_args': {
                    'autopack_values': False,
                },
            },
            _OBJ_SHARED_CF_NAME: {}
        }
    }
    # Resources supported by that script
    # The order of that list is import, that defines the resources
    # order creation
    _SUPPORTED_RESOURCES = [
        'project',
        'security-group',
        'virtual-network',
        'virtual-machine-interface',
    ]
    _PERMS2 = {
        'owner': None,
        'owner_access': 7,
        'global_access': 0,
        'share': [],
    }

    BATCH_QUEUE_SIZE = 1000
    RULES_PER_SG = 4

    def __init__(self, force, resources_file, cassandra_servers,
                 cassandra_username, cassandra_password, cassandra_use_ssl,
                 cassandra_ca_certs, db_prefix, cassandra_batch_size,
                 zookeeper_servers, rules_per_security_group, keystone_client,
                 dont_populate_zookeeper):
        self._force = force
        self._resource_distribution = yaml.load(resources_file)
        self._cassandra_batch_size = cassandra_batch_size
        self._rules_per_security_group = rules_per_security_group
        self._keystone_client = keystone_client
        self._dont_populate_zookeeper = dont_populate_zookeeper

        # Connect to cassandra database
        logger.debug("Initilizing the cassandra connection on %s",
                     cassandra_servers)
        cassandra_credentials = {}
        if (cassandra_username is not None and cassandra_password is not None):
            cassandra_credentials = {
                'username': cassandra_username,
                'password': cassandra_password,
            }

        def vnc_cassandra_client_logger(msg, level=logging.INFO):
            logger.log(msg=msg, level=level)

        self._object_db = VncObjectDBClient(cassandra_servers,
                                            db_prefix,
                                            self._UUID_KEYSPACE,
                                            None,
                                            vnc_cassandra_client_logger,
                                            credential=cassandra_credentials,
                                            ssl_enabled=cassandra_use_ssl,
                                            ca_certs=cassandra_ca_certs)
        self._uuid_cf = self._object_db.get_cf('obj_uuid_table')
        self._fqname_cf = self._object_db.get_cf('obj_fq_name_table')

        # Initilize zookeeper client
        if self._dont_populate_zookeeper:
            self._zk_client = DummyZookeeperClient()
        else:
            self._zk_client = ZookeeperClient(zookeeper_servers)

    def sanitize_resources(self):
        logger.debug("Santizing resources distribution")
        self._resource_map = OrderedDict()
        for resource_type in self._SUPPORTED_RESOURCES:
            object_path = 'contrail_db_loader.resources.%s.%s' %\
                          (resource_type.replace('-', '_'),
                           camel_case(resource_type))
            kwargs = {
                'db_manager':
                self._object_db,
                'batch_size':
                self._cassandra_batch_size,
                'zk_client':
                self._zk_client,
                'project_amount':
                self._resource_distribution.get('project', 0),
                'amount_per_project':
                self._resource_distribution.get(resource_type, 0),
            }
            self._resource_map[resource_type] = import_object(
                object_path, **kwargs)

        resources_not_supported = (set(self._resource_distribution.keys()) -
                                   set(self._SUPPORTED_RESOURCES))
        if resources_not_supported:
            logger.warning('Loading resources %s are not supported' %
                           ', '.join(resources_not_supported))

    def summarize_resources_to_create(self):
        msg = """Will populate %(project)d projects with:
    - security groups:           %(sg)d
    - access control lists:      %(acl)d
    - virtual networks:          %(vn)d
    - routing instances:         %(ri)d
    - route targets:             %(rt)d
    - virtual machine interface: %(vmi)d
    - virtual machine:           %(vm)d
    - intance ip:                %(iip)d
That will load %(sum)d resources into database."""
        dict = {
            'project':
            self._resource_map['project'].total_amount,
            'sg':
            self._resource_map['security-group'].amount_per_project + 1,
            'acl':
            (self._resource_map['security-group'].amount_per_project + 1) * 2,
            'vn':
            self._resource_map['virtual-network'].amount_per_project,
            'ri':
            self._resource_map['virtual-network'].amount_per_project,
            'rt':
            self._resource_map['virtual-network'].amount_per_project,
            'vmi':
            self._resource_map['virtual-machine-interface'].amount_per_project,
            'vm':
            self._resource_map['virtual-machine-interface'].amount_per_project,
            'iip':
            self._resource_map['virtual-machine-interface'].amount_per_project,
        }
        dict['sum'] = 0
        for resource in self._resource_map.values():
            dict['sum'] += resource.total_amount
        logger.warning(msg, dict)
        if (not self._force and
                not prompt('Do you want to load that amount of resources?')):
            exit(0)

    def create_resources(self):
        self._zk_client.connect()
        for resource in self._resource_map.values():
            logger.info("Loading '%s' resources into the database...",
                        resource.type)
            if resource.type == 'project':
                _, time_elapsed = resource.create_resources(
                    self._keystone_client)
            elif resource.type == 'security-group':
                _, time_elapsed = resource.create_resources(
                    self._rules_per_security_group)
            elif resource.type == 'virtual-machine-interface':
                _, time_elapsed = resource.create_resources(
                    self._resource_map['virtual-network'].amount_per_project,
                    self._resource_map['security-group'].amount_per_project)
            else:
                _, time_elapsed = resource.create_resources()
            logger.info(
                "%d resources were created to load %d '%s' in "
                "%2.2f seconds.", resource.total_amount,
                resource.amount_per_project, resource.type, time_elapsed)
        self._zk_client.disconnect()