示例#1
0
 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)