Policy versioning & provisioning¶
Security policy objects — rule sets, rules, deny rules, IP lists, services, label groups, virtual services, enforcement boundaries, firewall settings — exist in two versions: draft and active.
Draft is your editable working copy. Creating or updating a policy object changes the draft.
Active is what the PCE actually enforces. Draft changes become active only when you provision them.
Endpoints for these objects are prefixed with /sec_policy/{draft|active}/.
Resources registered with is_sec_policy=True get this prefix automatically;
get takes a policy_version argument ('draft' by default):
pce.rule_sets.get(policy_version='active') # GET /sec_policy/active/rule_sets
pce.rule_sets.get() # GET /sec_policy/draft/rule_sets
Nested policy objects¶
Some policy objects live under a parent. Rules and deny rules, for example,
belong to a rule set. Pass the parent with the parent argument, and the
client builds the nested path for you:
pce.rules.create(rule, parent=rule_set)
# POST /orgs/{org}/sec_policy/draft/rule_sets/{id}/sec_rules
Provisioning¶
Newly created draft objects are not enforced until provisioned. Provision by passing the hrefs of the draft objects to apply:
pce.provision_policy_changes(
'Apply new segmentation policy',
hrefs=[rule_set.href, ip_list.href]
)
Related helpers make the workflow manageable:
get_pending_policy_changes/discard_pending_policy_changesget_policy_dependencies— what else must be provisioned alongside an objectanalyze_policy_impact— the effect of provisioning a set of changescheck_policy— validate the policy before provisioningrestore_policy— roll back to a prior version
See also
The Deny and override-deny rules tutorial for an end-to-end draft-then-provision example.