Draft: CDN Requester and Instance Node first version
Introduction
Why
This merge request introduces CDN Requester. The initial goal of this tool is to separate the technical CDN from the management of CDN requests that are related to sales. This comes from the need to validate domain name ownership and move towards allowing any customer to use the CDN without risks.
Once this SR is released, the goal is to progressively move all existing CDN instances to this new SR, with the Instance Node available in any project.
The first implementation tried to implement the management of instances in the Instance node (also called slave instance) in the traditional way. But the constraints of this approach are too well known when the number of instances rises, and it was decided to move to an implementation fully in Python to ensure scalability.
Requirements
- Be able to host a large amount of instances
- Instance list should not be stored in buildout (traces in log and large reprocessing)
- Only reprocess what needs to be reprocessed
- Garbage collect: If an instance is destroyed or stopped by the user then and only then the CDN entry should also be removed
- Persistence of DNS validation: Once a domain has been validated for an instance there is no need to revalidate it on each call
Consideration about instance node
Instances in the Instance Node are independent from the instance hosting them. To understand that, you need to see that two actors are involved when using an Instance Node:
- The Instance Operator: The one managing the host instance
- The users requesting instances on the instance node. Also called "Shared"/"Slave" instances.
In SlapOS we need to be able to alert each user only when necessary: which actor should be called to solve the issue. Just like we don't inform the compute node operator if one instance is failing.
As an example, if an instance hosted on the instance node is failing because the user inputs incorrect parameters, or because the DNS validation is not done yet, or because it has not finished deploying on the CDN, only the user of that instance should be informed and no alert should be done on the Instance Node as it has no impact on it from the instance operator's point of view.
Conclusion
In the long term, an Instance Node should be independent in its processing of the instances. Eventually there should be no need to reprocess the host instance if a new instance is allocated on it (not yet available with the current API).
It should reproduce the good practices of slapos node instance:
- Only process instances that need to be processed
- Have a promise validate the instance deployment
- Reprocess until the promise passes.
Implementation
LocalInstanceDB
Introduce a generic Recipe (slapos/recipe/localinstancedb.py) to:
- Offer a generic class to manage SQLite database
- Store the list of instances
- Compare list of instances to calculate what is:
- New
- Modified
- Removed
The InstanceListComparator class performs hash-based comparison: it computes SHA256 hashes of JSON-serialized parameters (sorted keys) to efficiently detect changes without full comparison. This prevents unnecessary reprocessing when only validation status changes.
slapconfiguration
Add a new entry point slapconfiguration.jsonschema.localdb to store the list of instances in a local database. Store the validation state of the parameters as this entry point inherits the JSONSchema one that validates the instance parameters against the instance schema.
The entry point writes validated instances to the database at instance-db-path, storing both valid and invalid instances with their validation results. This database is then read by the Instance Node to determine what needs processing.
Instance Node
First attempt at the implementation of an instance node (slapos/recipe/instancenode.py). The initial implementation has been done so that it can be used as a recipe, but it was later extended to be used as a script called every minute by cron.
Main loop
Here are the main steps:
- Get the list of instances to process from the master (stored in the database filled by slapconfiguration at
instance-db-path) - Compare it to the list of instances we processed (stored at
requestinstance-db-path) to see:- New instances
- Modified instances
- Removed instances
- Get the list of instances that need reprocessing (instances marked as invalid in the database that haven't been modified or removed)
- For each instance in: new, modified, need reprocess.
- Process the instance
- For removed instances
- Destroy instance
The comparison uses InstanceListComparator which compares hashes to detect parameter changes. Instances are only considered modified if their parameter hash changed.
Instance Processing
The processing of an instance is as follows:
- Check the result if parameters are validated against JSON Schema (done by slapconfiguration and stored in the DB)
- validateInstancePreDeployment: extra validation of parameters. For CDN Requester this is where we check DNS
- Deploy instance
- validate Instance Post Deployment (Promise)
- Mark the instance as okay
If at any step the validation fails, the processing stops and the error is returned to the user by publishing it.
Any step can be overridden by inheriting the InstanceNode class. This is what the CDN Requester does to perform specialized validation for the CDN request.
Connection parameters are only published if they differ from what's already stored in the database, avoiding unnecessary updates.
Instance destruction
This method allows ensuring clean destruction of the instance before removing it from our list of instances. By default it calls request the CDN instance in destroyed state to properly clean up the instance on the master before removing it from the local database.
Usage as script
Some tools have been added here to parse a config file, run with a PID file to avoid concurrency issues and have proper log configuration.
CDN Request
This class (slapos/recipe/cdnrequest.py) inherits Instance node and specializes:
- Prevalidation:
- Domain validation: checks domain ownership via DNS TXT record containing validation token
- Domain uniqueness: ensures domain is not already validated for another instance
- DNS resolution: uses DNS resolver (dnspython) with fresh cache at initialization (to bypass server DNS cache)
- Host tracking: stores validated domains and used hosts in
DomainValidationDBwith tables:-
domain_validation: storesinstance_reference,domain,token,validated,timestamp -
used_hosts: storeshost,instance_referencepairs to track host assignments. This ensure an alias cannot be added for an already validated domain.
-
- Destruction: removes domain validation entries and frees hosts when instance is destroyed
The CDN Request recipe also validates parameters like in rapid-cdn.
A new constraint has been added on server-alias for them to be a subdomain of the custom_domain to avoid multiplying domain ownership verification.
Notes from initial discussion:
So domain name validation should be done in a separate SR that request through a remote node to the Node.
SR CDN is purely technical now called "technical CDN". New SR is business is doing a lot a validation.
Premium CDN existing Shared instance are all ported to new SR.
Remove everyone from premium CDN project aside from its operators.
New SR can use Jinja with Buildout.
At the moment the Business CDN SR will only do the Domain name validation.
XXX Maybe we want to sign the parameters provided by the Business CDN to make sure we trust the source. After cleaning up the current data.
For each shared instance on the Business CDN it request a Shared Instance on the technical CDN
TODO
TODO Before release
-
Garbage collect of stopped or destroyed slave??? -
Check domain name via CDN via software PY -
Do not request to CDN with default parameters -
Add clear parameters for computer uid / instance uid for sla -
Add Egg tests -
Use JSON parameters -
Add subroutine to check domain validation. / Non Slapos dependent checks. -
Request 1000 share instance to test scalability and garbage collection -
Add promise for failing instance to help operator debug -
Clean up connection parameters and parameters for slaves sent and received from master -
Add SR tests
TODO after release (to be validated)
-
slapconfiguration jsonschema slaves: Master doesn't send the SR of the slave. How do you check schema. -
How to create ticket to inform user its instance is failing -
Resiliency of databases?? What happens if the list of validated domain is lost?
CDN Requester: Changes Since nxd/master
Please note that the following text has been written by Cursor upon request to test that too.
Executive Summary
This document presents a comprehensive overview of all changes introduced in the cdn-requester branch since nxd/master. The branch represents a major feature addition implementing a complete CDN request management system with instance node management, domain validation, and automated instance lifecycle management.
Branch: cdn-requester
Base: nxd/master
Total Commits: 62
Date Range: September 24, 2025 - December 8, 2025
Author: Cédric Le Ninivin
Statistics
Code Changes
- Files Added: 15
- Files Modified: 5
- Total Lines Added: ~8,150
- Total Lines Removed: ~10
New Components
-
New Recipes: 3 major recipes
-
cdnrequest(721 lines) -
instancenode(936 lines) -
localinstancedb(415 lines)
-
-
New Test Suites: 3 comprehensive test files
-
test_cdnrequest.py(1,697 lines) -
test_instancenode.py(2,488 lines) -
test_localinstancedb.py(760 lines)
-
- New Software Configuration: Complete CDN requester software Release
- New JSON Schemas: 4 schema files for validation
Key Improvements and Features
1. Domain Validation System
- Token-based validation: Secure domain ownership verification
- DNS resolution: Real-time DNS checking with persistent resolver
- Uniqueness enforcement: Prevents domain conflicts across instances
- Host tracking: Comprehensive host-to-instance mapping
2. Instance Lifecycle Management
- Automated provisioning: Request new instances based on database comparison
- Update detection: Hash-based change detection for efficient updates
- Cleanup: Automatic destruction of invalid or removed instances
- Validation pipeline: Multi-stage validation ensures instance quality
3. Standalone Execution
- CLI support: Recipes can run independently of buildout
- Cron integration: Automated periodic execution
- Configuration flexibility: Flat config files and command-line options
- Logging: Comprehensive logging with rotation support
4. Database Efficiency
- WAL mode: Better concurrency for read/write operations
- Hash-based comparison: Fast change detection without full comparison
- Transaction support: Safe bulk operations
- Schema management: Automatic schema creation and migration
5. Testing Coverage
- Comprehensive tests: Over 4,900 lines of test code
- Full scenarios: End-to-end install and update tests
- Edge cases: Error handling and boundary condition tests
- Mock cleanup: Proper test isolation
6. Monitoring and Observability
- Progress tracking: Detailed logging of instance processing
- Instance counting: Total instance reporting
- Promise checks: Health monitoring for CDN requester
- Reprocessing logs: Clear visibility into instance state changes
Major Components
1. CDN Request Recipe (slapos/recipe/cdnrequest.py)
A comprehensive recipe for managing CDN instance requests with domain validation, DNS resolution, and instance lifecycle management.
Key Features:
-
Domain Validation System
- Custom domain validation with token-based verification
- DNS resolution validation using persistent DNS resolver
- Domain uniqueness checking across instances
- Host tracking and management
-
DNS Resolution
- Persistent DNS resolver with fresh cache at initialization
- Direct DNS calls for validation
- Efficient DNS validation using dnspython library
-
Instance Management
- Request new CDN instances
- Update existing instances
- Destroy invalid instances
- Parameter verification (matching rapid-cdn constraints)
-
Security Features
- Cipher suite validation and translation
- SSL/TLS configuration management
- Secure token generation for domain validation
-
Standalone Execution
- Can run as a standalone script via
cdnrequest-scriptconsole command - Command-line argument parsing
- Cron-based execution support
- Can run as a standalone script via
Database Schema:
-
domain_validationtable: Tracks domain validation status per instance -
used_hoststable: Tracks host assignments to instances
2. Instance Node Recipe (slapos/recipe/instancenode.py)
A recipe for managing instance nodes that compare instance databases and request instances accordingly.
Key Features:
-
Instance Comparison
- Compares instances from
instance-db-path(update_list) with stored instances - Uses
InstanceListComparatorfor efficient comparison - Tracks valid and invalid instances
- Compares instances from
-
Instance Lifecycle Management
- Requests new instances (if valid)
- Updates modified instances (if valid)
- Destroys instances no longer in the update list
- Only publishes if parameters have changed
-
Validation Logic
- Pre-deployment instance validation
- Connection parameter validation
- Instance validity checking (only valid if request is successful)
- Instance must have connection parameters to be considered valid
-
Request Management
- Requests made with prefix for instance reference
- Supports shared instances
- Software type and URL configuration
-
Logging and Monitoring
- Comprehensive logging configuration
- Progress tracking
- Total instance count reporting
- Reprocessing logs
-
Standalone Execution
- Command-line interface
- Configurable logging (logfile, debug mode)
- Can run outside of buildout context
3. Local Instance Database (slapos/recipe/localinstancedb.py)
A SQLite-based database accessor for managing local instance data.
Key Features:
-
Database Management
- SQLite database with WAL (Write-Ahead Logging) mode support
- Automatic schema creation and migration
- Connection pooling and timeout handling
-
Instance Storage
-
HostedInstanceLocalDB: Stores hosted instances with validation status - Instance parameter hashing for change detection
- Valid and invalid instance lists
-
-
Comparison Logic
-
InstanceListComparator: Efficient comparison of instance lists - Hash-based change detection
- Prevents database removal when lists are empty (bug prevention)
-
-
Database Operations
- Bulk insert operations
- Transaction support
- Row factory for easy data access
4. Enhanced SlapConfiguration Recipe
Extended the existing slapconfiguration recipe with new functionality:
-
New Entry Point:
slapconfiguration.jsonschema.localdb- JSON schema validation with local database support
- Enables persistent storage of configuration data
Software Release: cdn-requester
A complete SlapOS software release for CDN request management.
Configuration Files
-
software.cfg- Main software definition -
instance.cfg.in- Instance template for requester -
instancenode.cfg.in- Instance node configuration template -
instance-common.cfg.in- Common instance configuration -
buildout.hash.cfg- Buildout hash configuration
JSON Schemas
-
instance-slave-input-schema.json(381 lines)- Comprehensive validation for slave instance parameters
- Custom domain validation patterns
- Backend URL, type, path configuration
- Cache, SSL, and security settings
- Enhanced validation patterns and constraints
-
instance-slave-output-schema.json(55 lines)- Output schema for slave instances
-
instance-requester-input-schema.json(38 lines)- Input schema for requester instances
-
instance-requester-output-schema.json(7 lines)- Output schema for requester instances
Key Features:
-
Cron-based Execution
- CDN requester runs via cron.d
- Configurable frequency (default: 1 minute)
- Log rotation support
-
Logging Infrastructure
- Comprehensive logging configuration
- Log file management
- Log rotation setup
- Directory cleanup
-
Monitoring
- Promise to check if CDN requester is running
- Process tracking
- Progress reporting
-
Default Values
- Default empty values for SLA parameters
- Flat configuration for instancenode
Testing Infrastructure
Test Coverage
1. test_cdnrequest.py (1,697 lines)
Comprehensive test suite for CDN request functionality:
- Domain validation tests
- DNS resolution tests
- Instance management tests
- Full install and update scenarios
- Error handling tests
- Mock database cleanup
2. test_instancenode.py (2,488 lines)
Extensive test suite for instance node functionality:
- Instance comparison tests
- Request management tests
- Validation logic tests
- Command-line interface tests
- Logging configuration tests
- Error handling and edge cases
3. test_localinstancedb.py (760 lines)
Test suite for local database functionality:
- Database creation and schema tests
- Instance storage and retrieval tests
- Comparison logic tests
- Hash computation tests
- Edge case handling
4. Enhanced test_slaposconfiguration.py
Updated tests for the new slapconfiguration.jsonschema.localdb functionality.
Test Organization
- All test files moved to
slapos/test/recipe/directory - Added
__init__.pyfor proper test suite integration - Tests ensure proper cleanup of mock database patches
Dependencies
New Dependencies Added to setup.py:
-
dnspython- For DNS resolution and validation - Already existing dependencies utilized:
-
jsonschema- For JSON schema validation -
netaddr- For IP address manipulation
-
Console Scripts:
-
cdnrequest-script- Standalone CDN request management script
Architecture Changes
1. Recipe Entry Points
New buildout recipe entry points:
cdnrequest = slapos.recipe.cdnrequest:CDNRequestRecipeinstancenode = slapos.recipe.instancenode:Recipeslapconfiguration.jsonschema.localdb = slapos.recipe.slapconfiguration:JsonSchemaWithDB
2. Execution Model
Before: Recipes executed only within buildout context
After:
- Instance Node Recipes can run as standalone scripts
- Command-line interface support
- Cron-based execution
- Independent of buildout for requests
3. Database Architecture
New: SQLite-based local instance database
- Persistent storage of instance state
- Efficient comparison using hashing
- WAL mode for better concurrency
- Schema-based data management
4. Validation Flow
New Multi-Stage Validation:
- Pre-deployment validation (
preDeployInstanceValidation) - Domain validation with DNS resolution
- Connection parameter validation
- Instance request validation
- Post-request validation
Configuration Examples
CDN Request Recipe Usage
[cdn-request]
recipe = cdnrequest
instance-db-path = ${buildout:directory}/var/instance-db.sqlite
requestinstance-db-path = ${buildout:directory}/var/request-db.sqlite
server-url = https://slapos.example.com
computer-id = COMP-123
partition-id = PART-456
software-url = https://software.example.com/cdn-requester
software-type = cdn-requester
request-name-prefix = cdn-
Instance Node Recipe Usage
[instance-node]
recipe = instancenode
instance-db-path = ${buildout:directory}/var/instance-db.sqlite
requestinstance-db-path = ${buildout:directory}/var/request-db.sqlite
server-url = https://slapos.example.com
computer-id = COMP-123
partition-id = PART-456
software-url = https://software.example.com/cdn-requester
software-type = cdn-requester
logfile = ${buildout:directory}/var/log/instancenode.log
debug = false
Standalone Execution
# Run CDN request script
cdnrequest-script --config /path/to/config.ini --logfile /path/to/log.log
# Run instance node
python -m slapos.recipe.instancenode --config /path/to/config.ini
Migration Notes
For Existing Deployments
-
New Dependencies Required:
-
dnspythonmust be installed - Update
setup.pyor install manually
-
-
Database Migration:
- New SQLite databases will be created automatically
- No manual migration needed for new deployments
-
Configuration Changes:
- New recipe entry points available
- JSON schemas must be updated
- Cron configuration may be needed for automated execution
-
Testing:
- All tests moved to
slapos/test/recipe/ - Run test suite to verify compatibility
- All tests moved to
Future Considerations
Potential Enhancements
-
Performance Optimization:
- Batch DNS resolution
- Parallel instance processing
- Caching improvements
-
Monitoring:
- Metrics collection
- Alerting integration
- Dashboard support
-
Scalability:
- Multi-node support
- Load balancing
- Distributed database options
-
Security:
- Enhanced token management
- Rate limiting
- Audit logging
Conclusion
The cdn-requester branch represents a significant addition to the SlapOS cookbook, introducing a complete CDN request management system with:
- 3 major new recipes with over 2,000 lines of production code
- Comprehensive test coverage with over 4,900 lines of tests
- Complete software package with schemas and configurations
- Standalone execution capabilities
- Robust domain validation and DNS resolution
- Efficient instance lifecycle management
The implementation follows best practices with:
- Proper error handling
- Comprehensive logging
- Extensive testing
- Clear separation of concerns
- Modular architecture
All changes are backward compatible and can be integrated into the main branch with appropriate testing and validation.
Appendix: File Changes Summary
New Files
slapos/recipe/cdnrequest.py (721 lines)
slapos/recipe/instancenode.py (936 lines)
slapos/recipe/localinstancedb.py (415 lines)
slapos/test/recipe/__init__.py
slapos/test/recipe/test_cdnrequest.py (1,697 lines)
slapos/test/recipe/test_instancenode.py (2,488 lines)
slapos/test/recipe/test_localinstancedb.py (760 lines)
software/cdn-requester/buildout.hash.cfg
software/cdn-requester/instance-common.cfg.in
software/cdn-requester/instance-requester-input-schema.json
software/cdn-requester/instance-requester-output-schema.json
software/cdn-requester/instance-slave-input-schema.json (381 lines)
software/cdn-requester/instance-slave-output-schema.json
software/cdn-requester/instance.cfg.in
software/cdn-requester/instancenode.cfg.in
software/cdn-requester/software.cfg
software/cdn-requester/software.cfg.json
Modified Files
setup.py (added dnspython dependency, new entry points)
slapos/recipe/slapconfiguration.py (added jsonschema.localdb)
slapos/test/recipe/test_slaposconfiguration.py (updated tests)
software/rapid-cdn/instance-slave-input-schema.json (enhanced validation)
Detailed Commit History by Theme
Phase 1: Foundation (September-October 2025)
Initial Development
-
97ff80de (2025-09-24):
cdn-requester: WIP -
dc87592b (2025-09-25):
WIP -
5984a21a (2025-10-06):
wip: requesting instances -
967c1613 (2025-10-06):
wip: publish slave -
dc8d9d56 (2025-10-06):
WIP: Remove currently uneeded files -
0c81d3d4 (2025-10-15):
wip: Move to slapconfiguration.jsonschema
Focus: Initial exploration and architecture design
Phase 2: Core Implementation (November 2025)
Database and Configuration Foundation
-
e5c09612 (2025-11-07):
slapconfiguration: introduce slapconfiguration .jsonschema.localdb recipe- Added local database support to slapconfiguration
-
7abc4cc1 (2025-11-14):
reciperequestinstancelist: add recipe for instance management- Initial instance management recipe
Domain Validation
-
da200b3b (2025-11-19):
cdnrequest: add custom domain validation for CDN requests -
b1566bdc (2025-11-19):
Update instance-slave-input-schema.json to enhance validation patterns and add constraints
Enhanced Instance Management
-
b1e148d0 (2025-11-20):
cdnrequest: enhance domain validation logic and instance management -
d0c9db61 (2025-11-20):
test_cdnrequest: add full scenario for install and update -
7744d5a5 (2025-11-20):
cdnrequest: Add parameter verifications done in rapid-cdn -
83f7c843 (2025-11-20):
cdnrequest: add constraints on server alias
Database Refactoring
-
29c38f30 (2025-11-20):
localinstancedb: Rename and cleanup
Connection Parameter Publishing
-
4cff8c4e (2025-11-21):
requestinstancelist: publish connection parameters to master -
7837c61c (2025-11-21):
cdnrequest: Improve error message for requester -
7eaf8620 (2025-11-24):
requestinstancelist: Update instance handling to include error information
DNS and Caching
-
435638cb (2025-11-26):
recipe.cdnrequest: Add cache and direct dns call -
b6d28b5e (2025-11-26):
recipe.cdnrequest: Fix destroyed invalid instance logic and add tests
Schema and Setup
-
1dd96c58 (2025-11-26):
cdn-requester: fix schemas -
e1960f43 (2025-11-26):
setup.py: Fix recipe entries and add dependency to dnspython -
92a1f9ef (2025-11-26):
cdn-requester: Move to use cdnrequest recipe
Parameter Defaults
-
686d6515 (2025-11-28):
cdnrequester: Only set parameter defaults for main instance
Phase 3: Standalone Execution and Refactoring (December 2025)
Standalone Script Support
-
9ae2c461 (2025-12-03):
WIP cdnrequester: try to make it work in command line -
00158f2f (2025-12-03):
requestinstancelist: add tests on calling the code as command line -
8c6edcc5 (2025-12-03):
cdnrequest: add tests on dns resolution -
811b251a (2025-12-03):
cdn-requester: run cdn requester as a standalone script
DNS Resolver Enhancement
-
734c2bac (2025-12-03):
CDNRequestRecipe: Implement a persistent DNS resolver with fresh cache at initialization to improve DNS validation efficiency.
Database Improvements
-
c5a5397f (2025-12-03):
localinstancedb: prevent removal of database when valid and invalid list are empty (assume it is a bug)
Renaming and Refactoring
-
af147ac4 (2025-12-03):
instancenode: Rename as instancenode to reflect behaviour -
9dd70c1e (2025-12-03):
cdnrequester: instancenoce.cfg has flat config -
02738a28 (2025-12-03):
cdn-requester: set default empty values for sla parameters
Buildout Independence
-
772a7eea (2025-12-03):
instancenode: move out of buildout for requests -
85331152 (2025-12-03):
instancenode: Do not mark an instance as valid if no parameters is returned by the request
Cron and Logging
-
dce9f552 (2025-12-04):
cdnrequest: Have cdn request run with cron.d -
ef81a0b0 (2025-12-04):
cdnrequest: add basic logging config
Optimization
-
f25b5dce (2025-12-04):
localinstancedb: compute hash only from instance parameters -
dbcbb464 (2025-12-04):
instancenode: remove unused buildout section and only publish if parameters to published have changed -
3b309d3d (2025-12-04):
cdnrequest: remove useless calls to buildout -
2a1b7112 (2025-12-04):
instancenode: remove unused function -
8eecc33b (2025-12-04):
dnsrequest: remove unused variable
Validation Improvements
-
d2039b41 (2025-12-04):
instancenode: fixup instance is only valid once the request is successful -
95fe7704 (2025-12-04):
instancenode: consider an instance is valid only if it has connection parameters -
dc137f08 (2025-12-04):
instancenode: requests are made with a prefix for isntance reference
Test Updates
-
06ce7a22 (2025-12-04):
test_instancenode: Update test to match latest changes
Major Refactoring
-
caca4ace (2025-12-05):
instancenode: refactor instance processing to clarify validation and deployment flow -
02e86918 (2025-12-05):
cdnrequest: update tests -
b2fb938c (2025-12-05):
instancenode: rename validateInstance in preDeployInstanceValidation -
e278adca (2025-12-05):
test.recipe: Add missing __init__ file -
07d526b5 (2025-12-05):
instancenode: refactor logging configuration and enhance command-line argument parsing -
a10ff5c3 (2025-12-05):
test.cdnrequest: ensure cleanup of mock database patch in tests
Final Polish (December 8, 2025)
-
90927672 (2025-12-08):
test.localinstancedb: Move to test recipe folder to be run by Test suite -
572268f7 (2025-12-08):
cdn-requester: Add log, logrotate and cleanup directories -
9eda4b48 (2025-12-08):
recipe.instancenode: Add log to track process -
62de0e53 (2025-12-08):
cdn-requester: fixup logfile and move to one minute frequency -
d04e1106 (2025-12-08):
cdn-requester: add promise to check it is running -
d921f823 (2025-12-08):
instancenode: Add more clear reprocessing log -
ae95c1ac (2025-12-08):
recipe.instancenode: add more log to track progress -
b264dcf5 (2025-12-08):
recipe.instancenade: group initial logging functions -
d57d15b6 (2025-12-08):
recipe.instancenode: report total number of instances on the instance node
Document Generated: December 2025
Branch: cdn-requester
Base: nxd/master