Skip to content

duploctl

Unit Tests PyPI - Version Docker Image Version GitHub Release Static Badge

CLI and Python SDK for managing DuploCloud infrastructure. Works as a standalone command-line tool or as a Python module in your own scripts and CI/CD pipelines.

  • 30+ resource types -- tenants, services, infrastructure, hosts, RDS, S3, Lambda, ECS, Batch, Argo Workflows, and more
  • Plugin architecture -- resources discovered via Python entry points, easy to extend
  • Multiple output formats -- JSON (default), YAML, CSV, env vars, string
  • JMESPath queries -- filter and reshape output with -q
  • Interactive login -- browser-based OAuth flow with token caching
  • Model validation -- optional Pydantic validation against DuploCloud SDK schemas

Installation

pip install duplocloud-client
brew install duplocloud/tap/duploctl

For pinned version installs and alternative methods (GitHub release, git tag, Docker, standalone binary), see the release notes.

Quick Start

Set your DuploCloud credentials:

export DUPLO_HOST=https://example.duplocloud.net
export DUPLO_TOKEN=AQAAA...
export DUPLO_TENANT=dev01

Run commands:

# List services in the current tenant
duploctl service list

# Find a specific tenant
duploctl tenant find mytenant

# Create a service from a YAML file
duploctl service create -f service.yaml

# Get output as YAML
duploctl service list -o yaml

# Filter output with JMESPath
duploctl service list -q '[].Name'

Configuration

Flag Env Variable Default Description
--host, -H DUPLO_HOST -- DuploCloud portal URL (required)
--token, -t DUPLO_TOKEN -- Authentication token (required unless using -I)
--tenant, -T DUPLO_TENANT -- Tenant name
--output, -o DUPLO_OUTPUT json Output format (json, yaml, csv, env, string)
--query, -q -- -- JMESPath query to filter output
--wait, -w -- false Wait for async operations to complete
--file, -f -- -- YAML/JSON file for resource body input
--interactive, -I -- false Use interactive browser-based login
--admin, --isadmin -- false Request admin JIT credentials (use with -I)
--log-level, -L DUPLO_LOG_LEVEL INFO Log level
--config-file DUPLO_CONFIG -- Path to duploctl config file
--ctx DUPLO_CONTEXT -- Named context from config file
--validate DUPLO_VALIDATE false Validate inputs against SDK model schemas
--dry-run -- false Print changes without submitting

Full argument reference: cli.duplocloud.com/Args

CLI Usage

duploctl <resource> <command> [args...]

Cloud Access (JIT)

# Configure AWS credentials
duploctl jit update_aws_config myportal

# Open AWS web console
duploctl jit web

# Get Kubernetes config
duploctl jit update_kubeconfig myinfra

Resource Management

# Infrastructure and tenants
duploctl infrastructure list
duploctl tenant find mytenant

# Services
duploctl service list
duploctl service create -f service.yaml -w
duploctl service update_image myservice nginx:latest

# Kubernetes resources
duploctl configmap list
duploctl secret find mysecret
duploctl cronjob list
duploctl pod list

# AWS resources
duploctl rds list
duploctl s3 list
duploctl lambda list
duploctl hosts list

Python Module

Use duploctl programmatically in your own scripts.

From Environment Variables

from duplocloud.controller import DuploCtl

# Reads DUPLO_HOST, DUPLO_TOKEN, DUPLO_TENANT from env
duplo, args = DuploCtl.from_env()

# Callable interface (like CLI syntax)
services = duplo("service", "list")
tenant = duplo("tenant", "find", "mytenant")

From Explicit Credentials

from duplocloud.controller import DuploCtl

duplo = DuploCtl.from_creds(
    host="https://example.duplocloud.net",
    token="AQAAA...",
    tenant="dev01",
)

# Load a resource and call methods directly
svc = duplo.load("service")
services = svc.list()
my_service = svc.find("myservice")

# JMESPath filtering
names = duplo("service", "list", query="[].Name")

Create Resources

duplo = DuploCtl.from_creds(host="...", token="...", tenant="dev01")

# Create from a dict
duplo("service", "create", body={
    "Name": "myservice",
    "Image": "nginx:latest",
    "Replicas": 2,
})

# Or load the resource directly
svc = duplo.load("service")
svc.create(body={"Name": "myservice", "Image": "nginx:latest"})

Docker

# Run any duploctl command
docker run -e DUPLO_HOST=... -e DUPLO_TOKEN=... -e DUPLO_TENANT=... \
  duplocloud/duploctl service list

# Output as YAML
docker run -e DUPLO_HOST=... -e DUPLO_TOKEN=... -e DUPLO_TENANT=... \
  duplocloud/duploctl service list -o yaml

CI/CD

duploctl integrates with all major CI/CD platforms. See the DuploCloud CI/CD docs for detailed guides.

Platform Project Marketplace
GitHub Actions duplocloud/actions Marketplace
Bitbucket Pipelines duplocloud/duploctl-pipe
CircleCI duplocloud/orbs Orb Registry
GitLab CI duplocloud/ci CI/CD Catalog

Development

git clone --recurse-submodules https://github.com/duplocloud/duploctl.git
cd duploctl
pip install -e '.[build,test,aws,docs]'
pytest src -m unit

See CONTRIBUTING.md for full development guidelines.

Resources