This repository implements a Terraform provider for Cisco Modeling Labs version 2.9 and later. It's current state is "beta". Changes can be expected, for example:
- configuration (provider, resources, data-sources)
- provider behavior
- features (additional resources, ...)
Note
The provider needs CML 2.9 or newer. This is due to some additional API
capabilities which were introduced with 2.9 and due to changes introduced
with the new gocmlclient >=0.2.0. Older versions are blocked by the
gocmlclient. If you need support for older versions then it is recommended
to use version 0.8.5 or earlier.
The current implementation provides:
- Resources and a data sources (
internal/provider/),- resource
cml2_annotationto create, update and destroy lab annotations - resource
cml2_labto create, update and destroy labs - resource
cml2_nodeto create, update and destroy nodes in a lab - resource
cml2_linkto create, update and destroy links between nodes in a lab - resource
cml2_lifecycleto control the state of a lab (likeSTARTED,STOPPED), including staged starting and configuration injection - resource
cml2_groupto create, update and destroy groups - resource
cml2_userto create, update and destroy users - data source
cml2_labto retrieve state of an existing lab - data source
cml2_nodeto retrieve state of an existing node in a lab - data source
cml2_imagesto retrieve the available node images from the controller - data source
cml2_groupsto retrieve user groups from the controller - data source
cml2_extconnto retrieve external connector information from the controller - data source
cml2_systemto retrieve system state (ready state, version, ...) from the controller - data source
cml2_usersto retrieve users from the controller
- resource
- Examples (
examples/) and generated documentation (docs/), - Miscellaneous meta files.
- Clone the repository
- Enter the repository directory
- Build the provider using the Go
installcommand:
go installFor beta-testing or local iteration, you can install a locally built provider binary so Terraform uses it instead of downloading from the public registry.
See docs/development/local-provider.md.
Please refer to the examples directory and look at the built-in documentation
provided via the registry.
Note
It's recommended to use the UI token (from the User menu, top right "Copy JWT") instead of the user-name and password as that will provide better performance. Using the token avoids repeated client authentication via the API which takes quite a bit of time.
When using username/password (instead of a pre-generated JWT), you can enable token caching so repeated Terraform runs do not re-authenticate as often.
Provider configuration is evaluated before resources are created, so HCL cannot reliably create a temporary file resource and feed its path into the provider. Recommended workflow is a wrapper script:
TOKEN_FILE="$(mktemp -t cml2-token.XXXXXX)"
trap 'rm -f "$TOKEN_FILE"' EXIT
export TF_VAR_token_cache=true
export TF_VAR_token_cache_file="$TOKEN_FILE"
terraform applyIf your CML API is fronted by a reverse proxy that expects additional request headers, you can inject static headers into every outbound request, including the initial authentication request.
provider "cml2" {
address = var.address
username = var.username
password = var.password
request_headers = {
Proxy-Authorization = "Bearer ${var.proxy_token}"
}
}This is useful when nginx or another proxy performs authentication before forwarding traffic to the CML backend.
For some basic examples look in the examples directory
If you wish to work on the provider, you'll first need Go installed on your machine (see Requirements above).
To compile the provider, run go install. This will build the provider and put
the provider binary in the $GOPATH/bin directory.
To generate or update documentation, run go generate.
In order to run the full suite of acceptance tests, run make testacc. For this
to work, the provider needs to be configured via environment variables. Here's
an example:
# for testing purposes, suggest to use direnv
TF_VAR_username="admin"
TF_VAR_password="secret"
TF_VAR_address="https://cml-controller.cml.lab"
# alternatively, this is faster:
# TF_VAR_token="your-token-here"
export TF_VAR_username TF_VAR_password TF_VAR_addressThose variables are referenced for acceptance testing in internal/provider/testing.
make testaccAcceptance testing with GitHub actions must properly set secrets which are used in the test workflow:
- the NGROK_URL where where the CML API is reachable
- the USERNAME and PASSWORD or alternatively, the CML API TOKEN
This can use Ngrok or other tunneling tools if the CML API isn't directly reachable from the internet.