User Tools

Site Tools


zededa:projects:deployment_type

This is an old revision of the document!


Policy deployments, and the tags that drive them

How an edge node gets a whole site — network, storage, apps — without anyone naming that node anywhere.

What a deployment is

A deployment is a saved recipe for a site: the network to create, the storage to create, the apps to run. It lives inside a project.

It never names an edge node. Instead, nodes qualify for it. That is the whole idea: you add a site by tagging hardware, not by editing a deployment project.

Watch out: the project holding a deployment must be of type TAG_TYPE_DEPLOYMENT — not the ordinary project type. This is the most common setup mistake, and the error message points at the deployment rather than the project.

How a node qualifies

Two things must line up, and a third wires the app to its network. Each is a pair that must be equal on both sides — nothing matches by name.

First, membership

The edge node has to be moved into the deployment's project. A node belongs to exactly one project at a time, so this is a move, not an addition. Nothing below is even evaluated until this is true.

Match 1 — picks which deployment

On the node On the deployment
deployment_tag = cisco-policy-demo must equal deployment_tag = cisco-policy-demo

A project can hold more than one recipe. This says which one this node gets.

Match 2 — picks which policies

On the node — tags On each policy — target condition
demo = policy-demo must equal demo = policy-demo

One deployment can carry policies for several kinds of site. Each node receives only the ones whose condition its tags satisfy.

Match 3 — plumbing, never touched in a demo

On the network policy — tags On the app's NIC — netinsttag
demo = policy-demo-ni must equal demo = policy-demo-ni

The network does not exist until a node qualifies, so the app cannot refer to it by name. It finds it by tag instead.

Tip: matches 2 and 3 both use the key demo with different values, which makes them look related when they are not. Renaming the network tag key to something like net makes it read unambiguously — demo= always means nodes, net= always means networks.

Only matches 1 and 2 are set on the node.

What you actually do

  1. Move the node into the project. In ZedControl, change the node's project to the deployment project.
  2. Set its deployment tag: deployment_tag = cisco-policy-demo
  3. Set its tags: demo = policy-demo

That is the entire action. No Terraform run, no touching the node. Within a minute or two the controller creates the network instance and the app instance, and the app comes up.

Instances are named from the project, the app and the device, so two nodes under one deployment never collide:

cisco-policy-demo.nginx.TF-CISCO-UCS-130C-M8-32

To drain a node, clear its deployment tag. To reset between runs, set it again.

Changing the recipe

A deployment cannot be edited in place. Terraform will report a successful apply and the controller will keep the old policies. Nothing warns you; the plan even goes clean afterwards.

Any change to a deployment needs a destroy and recreate — and the delete is refused while a node is still attached, so unbind first:

1. clear the node's deployment_tag, apply
2. terraform apply -replace='...zedcloud_deployment.demo'
3. set the deployment_tag back, apply

If you edited a deployment and nothing changed on the node, this is almost always why.

Nothing deployed — what to check

Every one of these fails silently. There is no error to read, so work down the list.

  • Is the project type TAG_TYPE_DEPLOYMENT?
  • Is the node in that project — not its old one?
  • Does the node's deployment_tag match the deployment's, exactly?
  • Do the node's tags satisfy every policy's target condition?
  • Does the controller still hold policies you thought you deleted?
  • Does the app rely on a default network instance the node does not have?

Two red herrings

A node reading ADMIN_STATE_REGISTERED is normal — working nodes read that too. It does not mean the node is inactive.

Testing a published port from the node itself always fails, because traffic originating on the host skips the rule that redirects it. Test from another machine.


Verified end to end on a Cisco UCS edge node: network instance, volume and nginx all created by policy, reachable on the node's published port.

Terraform reference: cisco-ot-ign-demo-policy-based/ — see README-full.md for API queries and the full history.

zededa/projects/deployment_type.1786450538.txt.gz · Last modified: by mc