def build_model_df_data( config_map: ClientConfigAdapter, to_print: Optional[List[str]] = None) -> List[Tuple[str, Any]]: model_data = [] for traversal_item in config_map.traverse(): if to_print is not None and traversal_item.attr not in to_print: continue attr_printout = (" " * (traversal_item.depth - 1) + (u"\u221F " if not is_windows() else " ") + traversal_item.attr ) if traversal_item.depth else traversal_item.attr model_data.append((attr_printout, traversal_item.printable_value)) return model_data
def _maybe_migrate_encrypted_confs(config_keys: BaseConnectorConfigMap) -> List[str]: cm = ClientConfigAdapter(config_keys) found_one = False files_to_remove = [] missing_fields = [] for el in cm.traverse(): if el.client_field_data is not None: if el.attr == "celo_address" and celo_address is not None: cm.setattr_no_validation(el.attr, celo_address) continue key_path = conf_dir_path / f"{encrypted_conf_prefix}{el.attr}{encrypted_conf_postfix}" if key_path.exists(): with open(key_path, 'r') as f: json_str = f.read() value = binascii.hexlify(json_str.encode()).decode() if not el.client_field_data.is_secure: value = Security.secrets_manager.decrypt_secret_value(el.attr, value) cm.setattr_no_validation(el.attr, value) files_to_remove.append(key_path) found_one = True else: missing_fields.append(el.attr) errors = [] if found_one: if len(missing_fields) != 0: errors = [f"{config_keys.connector} - missing fields: {missing_fields}"] if len(errors) == 0: errors = cm.validate_model() if errors: errors = [f"{config_keys.connector} - {e}" for e in errors] logging.getLogger().error(f"The migration of {config_keys.connector} failed with errors: {errors}") else: Security.update_secure_config(cm) logging.getLogger().info(f"Migrated secure keys for {config_keys.connector}") for f in files_to_remove: f.unlink() return errors
def test_traverse(self): class DoubleNestedModel(BaseClientModel): double_nested_attr: float = Field(default=3.0) class Config: title = "double_nested_model" class NestedModelOne(BaseClientModel): nested_attr: str = Field(default="some value") double_nested_model: DoubleNestedModel = Field(default=DoubleNestedModel()) class Config: title = "nested_mode_one" class NestedModelTwo(BaseClientModel): class Config: title = "nested_mode_two" class DummyModel(BaseClientModel): some_attr: int = Field(default=1, client_data=ClientFieldData()) nested_model: Union[NestedModelTwo, NestedModelOne] = Field(default=NestedModelOne()) another_attr: Decimal = Field(default=Decimal("1.0")) class Config: title = "dummy_model" expected_values = [ ConfigTraversalItem(0, "some_attr", "some_attr", 1, "1", ClientFieldData(), None, int), ConfigTraversalItem( 0, "nested_model", "nested_model", ClientConfigAdapter(NestedModelOne()), "nested_mode_one", None, None, NestedModel, ), ConfigTraversalItem( 1, "nested_model.nested_attr", "nested_attr", "some value", "some value", None, None, str ), ConfigTraversalItem( 1, "nested_model.double_nested_model", "double_nested_model", ClientConfigAdapter(DoubleNestedModel()), "", None, None, DoubleNestedModel, ), ConfigTraversalItem( 2, "nested_model.double_nested_model.double_nested_attr", "double_nested_attr", 3.0, "3.0", None, None, float, ), ] cm = ClientConfigAdapter(DummyModel()) for expected, actual in zip(expected_values, cm.traverse()): self.assertEqual(expected.depth, actual.depth) self.assertEqual(expected.config_path, actual.config_path) self.assertEqual(expected.attr, actual.attr) self.assertEqual(expected.value, actual.value) self.assertEqual(expected.printable_value, actual.printable_value) self.assertEqual(expected.client_field_data, actual.client_field_data) self.assertIsInstance(actual.field_info, FieldInfo)