def from_config(cls, config_dict: dict, schema_path: str = None):
        """Create an SBI object from the specified configuration dict.

        NOTE(BM) This should really be done as a single atomic db transaction.

        Args:
            config_dict(dict): SBI configuration dictionary
            schema_path(str, optional): Path to the SBI config schema.

        """
        # Validate the SBI config schema
        if schema_path is None:
            schema_path = join(dirname(__file__), 'schema',
                               'configure_sbi.json')
        with open(schema_path, 'r') as file:
            schema = json.loads(file.read())
            validate(config_dict, schema)

        # Add SBI status field
        config_dict['status'] = 'created'

        # Set the subarray field to None if not defined.
        if 'subarray_id' not in config_dict:
            config_dict['subarray_id'] = 'None'

        # Add created, and updated timestamps.
        timestamp = datetime.datetime.utcnow().isoformat()
        config_dict['created'] = timestamp
        config_dict['updated'] = timestamp

        # Split out the processing block data array
        pb_list = copy.deepcopy(config_dict['processing_blocks'])

        # Remove processing blocks from the SBI configuration.
        config_dict.pop('processing_blocks', None)

        # Add list of PB ids to the SBI configuration
        config_dict['processing_block_ids'] = []
        for pb in pb_list:
            config_dict['processing_block_ids'].append(pb['id'])

        # Add the SBI data object to the database.
        key = SchedulingObject.get_key(SBI_KEY, config_dict['id'])
        DB.save_dict(key, config_dict, hierarchical=False)
        # DB.set_hash_values(key, config_dict)

        # Add the SBI id to the list of active SBIs
        key = '{}:active'.format(SBI_KEY)
        DB.append_to_list(key, config_dict['id'])

        # Publish notification to subscribers
        sbi = SchedulingObject(SBI_KEY, config_dict['id'])
        sbi.set_status('created')

        for pb in pb_list:
            pb['sbi_id'] = config_dict['id']
            cls._add_pb(pb)

        return cls(config_dict['id'])
Create an SBI object from the specified configuration dict.

        NOTE(BM) This should really be done as a single atomic db transaction.

        Args:
            config_dict(dict): SBI configuration dictionary
            schema_path(str, optional): Path to the SBI config schema.