diff --git a/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py b/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py index 7fa2e255..4e57659d 100644 --- a/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py +++ b/stack_orchestrator/deploy/webapp/deploy_webapp_from_registry.py @@ -360,6 +360,9 @@ def dump_known_requests(filename, requests, status="SEEN"): @click.option( "--private-key-file", help="The private key for decrypting config.", required=True ) +@click.option( + "--registry-lock-file", help="File path to use for registry mutex lock", default=None +) @click.option( "--private-key-passphrase", help="The passphrase for the private key.", @@ -393,6 +396,7 @@ def command( # noqa: C901 private_key_passphrase, all_requests, auction_requests, + registry_lock_file, ): if request_id and discover: print("Cannot specify both --request-id and --discover", file=sys.stderr) @@ -444,7 +448,7 @@ def command( # noqa: C901 include_tags = [tag.strip() for tag in include_tags.split(",") if tag] exclude_tags = [tag.strip() for tag in exclude_tags.split(",") if tag] - laconic = LaconicRegistryClient(laconic_config, log_file=sys.stderr) + laconic = LaconicRegistryClient(laconic_config, log_file=sys.stderr, mutex_lock_file=registry_lock_file) webapp_deployer_record = laconic.get_record(lrn, require=True) payment_address = webapp_deployer_record.attributes.paymentAddress main_logger.log(f"Payment address: {payment_address}") @@ -649,7 +653,7 @@ def command( # noqa: C901 ) run_log_file = open(run_log_file_path, "wt") run_reg_client = LaconicRegistryClient( - laconic_config, log_file=run_log_file + laconic_config, log_file=run_log_file, mutex_lock_file=registry_lock_file ) build_logger = TimedLogger(run_id, run_log_file) diff --git a/stack_orchestrator/deploy/webapp/handle_deployment_auction.py b/stack_orchestrator/deploy/webapp/handle_deployment_auction.py index 380e8b49..0a3c65c0 100644 --- a/stack_orchestrator/deploy/webapp/handle_deployment_auction.py +++ b/stack_orchestrator/deploy/webapp/handle_deployment_auction.py @@ -120,6 +120,9 @@ def dump_known_auction_requests(filename, requests, status="SEEN"): help="Bid to place on application deployment auctions (in alnt)", required=True, ) +@click.option( + "--registry-lock-file", help="File path to use for registry mutex lock", default=None +) @click.option( "--dry-run", help="Don't do anything, just report what would be done.", is_flag=True ) @@ -129,6 +132,7 @@ def command( laconic_config, state_file, bid_amount, + registry_lock_file, dry_run, ): if int(bid_amount) < 0: @@ -138,7 +142,7 @@ def command( logger = TimedLogger(file=sys.stderr) try: - laconic = LaconicRegistryClient(laconic_config, log_file=sys.stderr) + laconic = LaconicRegistryClient(laconic_config, log_file=sys.stderr, mutex_lock_file=registry_lock_file) auctions_requests = laconic.app_deployment_auctions() previous_requests = {} diff --git a/stack_orchestrator/deploy/webapp/registry_mutex.py b/stack_orchestrator/deploy/webapp/registry_mutex.py index 82efdcf3..392b74d9 100644 --- a/stack_orchestrator/deploy/webapp/registry_mutex.py +++ b/stack_orchestrator/deploy/webapp/registry_mutex.py @@ -1,21 +1,25 @@ import fcntl from functools import wraps -# Define the file path for the lock -LOCK_FILE_PATH = "/tmp/registry_mutex_lock_file" +# Define default file path for the lock +DEFAULT_LOCK_FILE_PATH = "/tmp/registry_mutex_lock_file" def registry_mutex(): def decorator(func): @wraps(func) - def wrapper(*args, **kwargs): - with open(LOCK_FILE_PATH, 'w') as lock_file: + def wrapper(self, *args, **kwargs): + lock_file_path = DEFAULT_LOCK_FILE_PATH + if self.mutex_lock_file is not None: + lock_file_path = self.mutex_lock_file + + with open(lock_file_path, 'w') as lock_file: try: # Try to acquire the lock fcntl.flock(lock_file, fcntl.LOCK_EX) # Call the actual function - result = func(*args, **kwargs) + result = func(self, *args, **kwargs) finally: # Always release the lock fcntl.flock(lock_file, fcntl.LOCK_UN) diff --git a/stack_orchestrator/deploy/webapp/undeploy_webapp_from_registry.py b/stack_orchestrator/deploy/webapp/undeploy_webapp_from_registry.py index b134e158..90e62197 100644 --- a/stack_orchestrator/deploy/webapp/undeploy_webapp_from_registry.py +++ b/stack_orchestrator/deploy/webapp/undeploy_webapp_from_registry.py @@ -178,6 +178,9 @@ def dump_known_requests(filename, requests): "my payment address are examined).", is_flag=True, ) +@click.option( + "--registry-lock-file", help="File path to use for registry mutex lock", default=None +) @click.pass_context def command( # noqa: C901 ctx, @@ -195,6 +198,7 @@ def command( # noqa: C901 min_required_payment, lrn, all_requests, + registry_lock_file, ): if request_id and discover: print("Cannot specify both --request-id and --discover", file=sys.stderr) @@ -212,7 +216,7 @@ def command( # noqa: C901 include_tags = [tag.strip() for tag in include_tags.split(",") if tag] exclude_tags = [tag.strip() for tag in exclude_tags.split(",") if tag] - laconic = LaconicRegistryClient(laconic_config, log_file=sys.stderr) + laconic = LaconicRegistryClient(laconic_config, log_file=sys.stderr, mutex_lock_file=registry_lock_file) deployer_record = laconic.get_record(lrn, require=True) payment_address = deployer_record.attributes.paymentAddress main_logger.log(f"Payment address: {payment_address}")