make wallet server payments a component

This commit is contained in:
Victor Shyba 2020-02-18 13:50:41 -03:00
parent 3950715237
commit f0e1db319c
6 changed files with 41 additions and 17 deletions

View file

@ -21,6 +21,7 @@ from lbry.extras.daemon.component import Component
from lbry.extras.daemon.exchange_rate_manager import ExchangeRateManager from lbry.extras.daemon.exchange_rate_manager import ExchangeRateManager
from lbry.extras.daemon.storage import SQLiteStorage from lbry.extras.daemon.storage import SQLiteStorage
from lbry.wallet import WalletManager from lbry.wallet import WalletManager
from lbry.wallet.usage_payment import WalletServerPayer
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -29,6 +30,7 @@ log = logging.getLogger(__name__)
DATABASE_COMPONENT = "database" DATABASE_COMPONENT = "database"
BLOB_COMPONENT = "blob_manager" BLOB_COMPONENT = "blob_manager"
WALLET_COMPONENT = "wallet" WALLET_COMPONENT = "wallet"
WALLET_SERVER_PAYMENTS_COMPONENT = "wallet_server_payments"
DHT_COMPONENT = "dht" DHT_COMPONENT = "dht"
HASH_ANNOUNCER_COMPONENT = "hash_announcer" HASH_ANNOUNCER_COMPONENT = "hash_announcer"
STREAM_MANAGER_COMPONENT = "stream_manager" STREAM_MANAGER_COMPONENT = "stream_manager"
@ -154,13 +156,40 @@ class WalletComponent(Component):
log.info("Starting wallet") log.info("Starting wallet")
self.wallet_manager = await WalletManager.from_lbrynet_config(self.conf) self.wallet_manager = await WalletManager.from_lbrynet_config(self.conf)
await self.wallet_manager.start() await self.wallet_manager.start()
self.wallet_manager.usage_payment_service.analytics_manager = self.component_manager.analytics_manager
async def stop(self): async def stop(self):
await self.wallet_manager.stop() await self.wallet_manager.stop()
self.wallet_manager = None self.wallet_manager = None
class WalletServerPaymentsComponent(Component):
component_name = WALLET_SERVER_PAYMENTS_COMPONENT
depends_on = [WALLET_COMPONENT]
def __init__(self, component_manager):
super().__init__(component_manager)
self.usage_payment_service = WalletServerPayer(
max_fee=self.conf.max_wallet_server_fee, analytics_manager=self.component_manager.analytics_manager,
)
@property
def component(self) -> typing.Optional[WalletServerPayer]:
return self.usage_payment_service
async def start(self):
wallet_manager = self.component_manager.get_component(WALLET_COMPONENT)
await self.usage_payment_service.start(wallet_manager.ledger, wallet_manager.default_wallet)
async def stop(self):
await self.usage_payment_service.stop()
async def get_status(self):
return {
'max_fee': self.usage_payment_service.max_fee,
'running': self.usage_payment_service.running
}
class BlobComponent(Component): class BlobComponent(Component):
component_name = BLOB_COMPONENT component_name = BLOB_COMPONENT
depends_on = [DATABASE_COMPONENT] depends_on = [DATABASE_COMPONENT]

View file

@ -15,7 +15,6 @@ from .account import Account
from .ledger import Ledger, LedgerRegistry from .ledger import Ledger, LedgerRegistry
from .transaction import Transaction, Output from .transaction import Transaction, Output
from .database import Database from .database import Database
from .usage_payment import WalletServerPayer
from .wallet import Wallet, WalletStorage, ENCRYPT_ON_DISK from .wallet import Wallet, WalletStorage, ENCRYPT_ON_DISK
from .rpc.jsonrpc import CodeMessageError from .rpc.jsonrpc import CodeMessageError
@ -34,7 +33,6 @@ class WalletManager:
self.ledgers = ledgers or {} self.ledgers = ledgers or {}
self.running = False self.running = False
self.config: Optional[Config] = None self.config: Optional[Config] = None
self.usage_payment_service = WalletServerPayer()
@classmethod @classmethod
def from_config(cls, config: dict) -> 'WalletManager': def from_config(cls, config: dict) -> 'WalletManager':
@ -81,15 +79,11 @@ class WalletManager:
await asyncio.gather(*( await asyncio.gather(*(
l.start() for l in self.ledgers.values() l.start() for l in self.ledgers.values()
)) ))
await self.usage_payment_service.start(
self.ledger, self.default_wallet, self.config.max_wallet_server_fee if self.config else None
)
async def stop(self): async def stop(self):
await asyncio.gather(*( await asyncio.gather(*(
l.stop() for l in self.ledgers.values() l.stop() for l in self.ledgers.values()
)) ))
await self.usage_payment_service.stop()
self.running = False self.running = False
def get_wallet_or_default(self, wallet_id: Optional[str]) -> Wallet: def get_wallet_or_default(self, wallet_id: Optional[str]) -> Wallet:

View file

@ -8,13 +8,13 @@ log = logging.getLogger(__name__)
class WalletServerPayer: class WalletServerPayer:
def __init__(self, payment_period=24 * 60 * 60, max_fee='1.0'): def __init__(self, payment_period=24 * 60 * 60, max_fee='1.0', analytics_manager=None):
self.ledger = None self.ledger = None
self.wallet = None self.wallet = None
self.running = False self.running = False
self.task = None self.task = None
self.payment_period = payment_period self.payment_period = payment_period
self.analytics_manager = None self.analytics_manager = analytics_manager
self.max_fee = max_fee self.max_fee = max_fee
async def pay(self): async def pay(self):
@ -53,10 +53,9 @@ class WalletServerPayer:
if self.analytics_manager: if self.analytics_manager:
await self.analytics_manager.send_credits_sent() await self.analytics_manager.send_credits_sent()
async def start(self, ledger, default_wallet, max_fee=None): async def start(self, ledger=None, wallet=None):
self.max_fee = max_fee or self.max_fee
self.ledger = ledger self.ledger = ledger
self.wallet = default_wallet self.wallet = wallet
self.running = True self.running = True
self.task = asyncio.ensure_future(self.pay()) self.task = asyncio.ensure_future(self.pay())
self.task.add_done_callback(lambda _: log.info("Stopping wallet server payments.")) self.task.add_done_callback(lambda _: log.info("Stopping wallet server payments."))

View file

@ -55,9 +55,10 @@ class TestSegwitServer(IntegrationTestCase):
class TestUsagePayment(CommandTestCase): class TestUsagePayment(CommandTestCase):
async def test_single_server_payment(self): async def test_single_server_payment(self):
self.manager.usage_payment_service.payment_period = 1 wallet_pay_service = self.daemon.component_manager.get_component('wallet_server_payments')
await self.manager.usage_payment_service.stop() wallet_pay_service.payment_period = 1
await self.manager.usage_payment_service.start(self.ledger, self.wallet) await wallet_pay_service.stop()
await wallet_pay_service.start(ledger=self.ledger, wallet=self.wallet)
address = (await self.account.receiving.get_addresses(limit=1, only_usable=True))[0] address = (await self.account.receiving.get_addresses(limit=1, only_usable=True))[0]
_, history = await self.ledger.get_local_status_and_history(address) _, history = await self.ledger.get_local_status_and_history(address)

View file

@ -7,7 +7,7 @@ from lbry.extras import cli
from lbry.extras.daemon.components import ( from lbry.extras.daemon.components import (
DATABASE_COMPONENT, BLOB_COMPONENT, WALLET_COMPONENT, DHT_COMPONENT, DATABASE_COMPONENT, BLOB_COMPONENT, WALLET_COMPONENT, DHT_COMPONENT,
HASH_ANNOUNCER_COMPONENT, STREAM_MANAGER_COMPONENT, PEER_PROTOCOL_SERVER_COMPONENT, HASH_ANNOUNCER_COMPONENT, STREAM_MANAGER_COMPONENT, PEER_PROTOCOL_SERVER_COMPONENT,
UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT, WALLET_SERVER_PAYMENTS_COMPONENT
) )
from lbry.extras.daemon.daemon import Daemon from lbry.extras.daemon.daemon import Daemon
@ -22,7 +22,7 @@ class CLIIntegrationTest(AsyncioTestCase):
conf.components_to_skip = ( conf.components_to_skip = (
DATABASE_COMPONENT, BLOB_COMPONENT, WALLET_COMPONENT, DHT_COMPONENT, DATABASE_COMPONENT, BLOB_COMPONENT, WALLET_COMPONENT, DHT_COMPONENT,
HASH_ANNOUNCER_COMPONENT, STREAM_MANAGER_COMPONENT, PEER_PROTOCOL_SERVER_COMPONENT, HASH_ANNOUNCER_COMPONENT, STREAM_MANAGER_COMPONENT, PEER_PROTOCOL_SERVER_COMPONENT,
UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT, WALLET_SERVER_PAYMENTS_COMPONENT
) )
Daemon.component_attributes = {} Daemon.component_attributes = {}
self.daemon = Daemon(conf) self.daemon = Daemon(conf)

View file

@ -27,6 +27,7 @@ class TestComponentManager(AsyncioTestCase):
components.HashAnnouncerComponent, components.HashAnnouncerComponent,
components.PeerProtocolServerComponent, components.PeerProtocolServerComponent,
components.StreamManagerComponent, components.StreamManagerComponent,
components.WalletServerPaymentsComponent
] ]
] ]
self.component_manager = ComponentManager(Config()) self.component_manager = ComponentManager(Config())