Skip to content

Add MSP onboarding workflow - #152

Open
KarthikSKumar98 wants to merge 9 commits into
v2from
karthik-satheesh-kumar-hpeprod-msp-onboarding
Open

Add MSP onboarding workflow#152
KarthikSKumar98 wants to merge 9 commits into
v2from
karthik-satheesh-kumar-hpeprod-msp-onboarding

Conversation

@KarthikSKumar98

Copy link
Copy Markdown
Collaborator

MSP Onboarding

Adds a new workflow for common MSP onboarding operations using MSP API credentials.

Supports:

  • Create tenants - creates MSP tenants and provisions a Central service in each
  • Assign devices to tenants - assigns MSP-owned devices and subscriptions to existing tenants

Ships as:

  • Web workflow (server.py) - guided onboarding with review, confirmation, progress tracking, CSV upload, and demo mode
  • CLI (onboarding.py) - manifest-driven discovery, planning, execution, and resume commands

Note

Proof of concept for getting started with the MSP onboarding APIs in GreenLake and Central. Not optimized for large-scale production use.

Comment thread msp-onboarding/run_samples.py Fixed
Comment thread msp-onboarding/msp_onboarding/engine.py Fixed
Comment thread msp-onboarding/onboarding.py Fixed


class AdapterProtocol(Protocol):
def now(self) -> datetime: ...

class AdapterProtocol(Protocol):
def now(self) -> datetime: ...
def list_tenants(self) -> list[TenantInfo]: ...
class AdapterProtocol(Protocol):
def now(self) -> datetime: ...
def list_tenants(self) -> list[TenantInfo]: ...
def fresh_tenant_listing(self) -> list[TenantInfo]: ...
def now(self) -> datetime: ...
def list_tenants(self) -> list[TenantInfo]: ...
def fresh_tenant_listing(self) -> list[TenantInfo]: ...
def resolve_tenant(self, workspace_id: str) -> TenantInfo: ...
def list_tenants(self) -> list[TenantInfo]: ...
def fresh_tenant_listing(self) -> list[TenantInfo]: ...
def resolve_tenant(self, workspace_id: str) -> TenantInfo: ...
def find_tenant_by_name(self, name: str) -> Optional[TenantInfo]: ...
phone_number: str = "",
address: Optional[AddressNew] = None,
known_tenants: Optional[list[TenantInfo]] = None,
) -> TenantInfo: ...
address: Optional[AddressNew] = None,
known_tenants: Optional[list[TenantInfo]] = None,
) -> TenantInfo: ...
def list_eligible_services(self, workspace_id: Optional[str]) -> list[ServiceInfo]: ...
def list_eligible_services(self, workspace_id: Optional[str]) -> list[ServiceInfo]: ...
def services_for_tenants(
self, tenant_ids: list[str]
) -> dict[str, list[ServiceInfo]]: ...
KarthikSKumar98 and others added 2 commits August 26, 2026 01:03
Prevent sample output from exposing device and subscription identifiers.\nAlso address adjacent static-analysis findings.
) -> dict[str, list[ServiceInfo]]: ...
def submit_service_provisioning(
self, workspace_id: str, service_manager_id: str, region: str
) -> None: ...
) -> None: ...
def observe_service_provisioning(
self, workspace_id: str, service_manager_id: str, region: str
) -> str: ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants