To generate a service account token please refer to the authentication chapter.
jq can be used to easily format and parse the outputs.
This document describes how to use Studio APIs to interact with Cloudvision Studios. They follow the Resource API semantics that are documented at https://aristanetworks.github.io/cloudvision-apis/. In this document, we illustrate the APIs using HTTP endpoints with JSON requests and responses. Using protobuf bindings, these operations can be done in a supported programming language (Go and Python) as well. See the above link for further details on how to use those bindings.
All changes that impact device configuration must be made in a workspace and submitted. The typical sequence of operations is 1.Create a workspace 2.Add objects that you want to modify into the workspace (either brand new objects, or copies of existing objects from mainline, or content that’s already submitted via a previous workspace); 3.Build the workspace 4.Submit.
Below are example APIs to use an existing studio, and also to create a brand new studio that generates timezone configuration. Given are the HTTP URL for each API and the body to POST to that URL.
You can use the below curl command to POST the body. “$token” is obtained from the access_token cookie returned by authenticating to CVP.
curl -sS -k -X POST $URL --cookie "access_token=$token" -d “$BODY”
e.g.
curl -sS -k -X POST "https://192.0.2.100/api/resources/workspace/v1/WorkspaceConfig" --cookie "access_token=$token" -d '{"key":{"workspace_id":"ws-change-timezone"}, "display_name": "Set timezone to EST"}'
Note that for the field names in the POST body, both snake case (such as
studio_id
) and camel case (such asstudioId
) are accepted. Responses are always in camel case.
curl -sS -k -X GET https://$CVP/api/resources/workspace/v1/WorkspaceConfig/all -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/workspace/v1/WorkspaceConfig?key.workspaceId=ws-timezone -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/workspace/v1/Workspace/all -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/workspace/v1/Workspace?key.workspaceId=ws-timezone -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/workspace/v1/WorkspaceBuild?key.workspaceId=ws-timezone&key.buildId=b1 -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/studio/v1/StudioConfig/all -b access_token=`cat token.tok`
grpcurl -H "Authorization: Bearer `cat token.tok`" -import-path $GOPATH/src/arista/resources -proto $GOPATH/src/arista/resources/arista/studio.v1/services.gen.proto -cacert cvp.crt 192.0.2.100:8443 arista.studio.v1.StudioConfigService/GetAll
curl -sS -k -X GET https://$CVP/api/resources/studio/v1/Studio/all -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/studio/v1/StudioConfig?key.studioId=studio-timezone&key.workspaceId=ws-timezone -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/studio/v1/StudioConfig?key.studioId=studio-timezone&key.workspaceId= -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/studio/v1/Studio?key.studioId=studio-timezone&key.workspaceId=ws-timezone -b access_token=`cat token.tok`
curl -sS -k -X GET https://$CVP/api/resources/studio/v1/Studio?key.studioId=studio-timezone&key.workspaceId= -b access_token=`cat token.tok`
Output:
{
"value": {
"key": {
"studioId": "studio-timezone",
"workspaceId": ""
},
"displayName": "Set timezone",
"description": "This studio generates timezone configuration",
"template": {
"type": "TEMPLATE_TYPE_MAKO",
"body": "%if timezoneAssignment[\"timezone\"]:\nclock timezone ${timezoneAssignment[\"timezone\"]}\n%endif\n"
},
"inputSchema": {
...
...
}
}
URL: https://$CVP_INSTANCE/api/resources/workspace/v1/WorkspaceConfig
POST BODY (workspace.json
):
{
"key":{
"workspace_id":"ws-change-timezone"
},
"display_name":"Configure timezone",
"description":"Configure timezone on all devices",
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat workspace.json`"
URL: https://$CVP/api/resources/studio/v1/InputsConfig
POST BODY (studio-payload.json
):
Note the embedded JSON string.
{
"key": {
"studio_id": "studio-date-time",
"workspace_id": "ws-change-timezone",
"path": {"values": []}
},
"inputs": "{\"ntpServerResolver\": [{\"inputs\": {\"ntpServers\": [{\"iburst\": false, \"ntpServer\": \"time.google.com\", \"preferred\": false, \"vrf\": \"MGMT\"}, {\"iburst\": false, \"ntpServer\": \"pool.ntp.org\", \"preferred\": false, \"vrf\": \"MGMT\"}]}, \"tags\": {\"query\": \"datacenter:NY\"}}], \"timezoneResolver\": [{\"inputs\": {\"timezoneGroup\": {\"otherTimezone\": \"\", \"timezone\": \"GMT\"}}, \"tags\": {\"query\": \"datacenter:NY\"}}]}"
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/studio/v1/InputsConfig' \
-d "`cat studio-payload.json`"
URL: https://$CVP/api/resources/studio/v1/AssignedTagsConfig
POST BODY (assigntags.json
):
{
"key": {
"studio_id": "studio-date-time",
"workspace_id": "ws-change-timezone"
},
"query": "datacenter:NY"
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/studio/v1/AssignedTagsConfig' \
-d "`cat assigntags.json`"
URL: https://$CVP/api/resources/workspace/v1/WorkspaceConfig
POST BODY (ws-build.json
):
{
"key":{
"workspace_id":"ws-change-timezone"
},
"request":"REQUEST_START_BUILD",
"request_params":{
"request_id":"b1"
}
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat workspace.json`"
URL: https://$CVP/api/resources/workspace/v1/WorkspaceConfig
POST BODY:
{
"key":{
"workspace_id":"ws-change-timezone"
},
"request":"REQUEST_SUBMIT",
"request_params":{
"request_id":"s1"
}
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat ws-submit.json`"
URL: https://$CVP_INSTANCE/api/resources/workspace/v1/WorkspaceConfig
POST BODY:
{
"key":{
"workspace_id":"ws-timezone"
}
"display_name":"Configure timezone",
"description":"Configure timezone on all devices",
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat workspace.json`"
URL: https://$CVP_INSTANCE/api/resources/studio/v1/StudioConfig
POST BODY (newstudio.json
):
{
"key": {
"studio_id": "studio-timezone",
"workspace_id": "ws-timezone"
},
"display_name": "Set timezone",
"description": "This configlet generates timezone configuration",
"template": {
"type": "TEMPLATE_TYPE_MAKO",
"body": "% if timezone:\n clock timezone ${timezone}\n% endif\n"
},
"input_schema": {
"fields": {
"values": {
"root": {
"id": "root",
"type": "INPUT_FIELD_TYPE_GROUP",
"name": "",
"label": "",
"group_props": {
"members": {
"values": [
"inputfield_timezoneAssignment"
]
}
}
},
"inputfield_timezoneAssignment": {
"id": "inputfield_timezoneAssignment",
"type": "INPUT_FIELD_TYPE_RESOLVER",
"name": "timezoneAssignment",
"label": "Timezone Assignment",
"description": "Timezone resolver input",
"required": false,
"resolver_props": {
"base_field_id": "inputfield_timezone",
"display_mode": "RESOLVER_FIELD_DISPLAY_MODE_SPARSE",
"input_mode": "RESOLVER_FIELD_INPUT_MODE_MULTI_DEVICE_TAG"
}
},
"inputfield_timezone": {
"id": "inputfield_timezone",
"type": "INPUT_FIELD_TYPE_STRING",
"name": "timezone",
"label": "Timezone",
"description": "Timezone value configured on the device",
"string_props": {
"default_value": "GMT",
"static_options": {
"values": [
"CST",
"EST",
"GMT",
"PST"
]
}
}
}
}
}
}
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/studio/v1/StudioConfig' \
-d "`cat newstudio.json`"
URL: https://$CVP/api/resources/workspace/v1/WorkspaceConfig
POST BODY (ws-build.json
):
{
"key":{
"workspace_id":"ws-timezone"
},
"request":"REQUEST_START_BUILD",
"request_params":{
"request_id":"b1"
}
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat ws-build.json`"
URL: https://$CVP/api/resources/workspace/v1/WorkspaceConfig
POST BODY (ws-submit.json
):
{
"key":{
"workspace_id":"ws-timezone"
},
"request":"REQUEST_SUBMIT",
"request_params":{
"request_id":"s1"
}
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat ws-submit.json`"
POST BODY (workspace.json
):
{
"key":{
"workspace_id":"del-studio"
},
"display_name":"Delete timezone studio",
"description":"Remove timezone on all devices"
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat workspace.json`"
Output:
{
"value": {
"key": {
"workspaceId": "del-studio"
},
"displayName": "Delete timezone studio",
"description": "Remove timezone on all devices"
},
"time": "2022-08-16T23:59:35.551Z"
}
POST BODY (unassigntags.json
):
{
"key": {
"studio_id": "studio-timezone",
"workspace_id": "del-studio"
},
"query": ""
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/studio/v1/AssignedTagsConfig' \
-d "`cat unassigntags.json`"
Output:
{
"value": {
"key": {
"studioId": "studio-timezone",
"workspaceId": "ws-timezone-delete"
},
"query": ""
},
"time": "2022-08-16T23:24:30.397673655Z"
}
POST BODY (deletestudio.json
):
{
"key": {
"studio_id": "studio-timezone",
"workspace_id": "del-studio"
},
"remove": true
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/studio/v1/StudioConfig' \
-d "`cat deletestudio.json`"
{
"value": {
"key": {
"studioId": "studio-timezone",
"workspaceId": "del-studio"
},
"remove": true
},
"time": "2022-08-17T00:00:45.225196219Z"
}
POST BODY (ws-build.json
):
{
"key":{
"workspace_id":"del-studio"
},
"request":"REQUEST_START_BUILD",
"request_params":{
"request_id":"b1"
}
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat ws-build.json`"
Output:
{
"value": {
"key": {
"workspaceId": "del-studio"
},
"request": "REQUEST_START_BUILD",
"requestParams": {
"requestId": "b1"
}
},
"time": "2022-08-17T00:00:54.195Z"
}
POST BODY (ws-submit.json
):
{
"key":{
"workspace_id": "del-studio"
},
"request": "REQUEST_SUBMIT",
"request_params":{
"request_id":"s1"
}
}
curl -sS -kX POST --header 'Accept: application/json' \
-b access_token=`cat token.tok` \
'https://192.0.2.79/api/resources/workspace/v1/WorkspaceConfig' \
-d "`cat ws-submit.json`"
Output:
{
"value": {
"key": {
"workspaceId": "del-studio"
},
"request": "REQUEST_SUBMIT",
"requestParams": {
"requestId": "s1"
}
},
"time": "2022-08-17T00:00:57.894Z"
}
URL: https://$CVP_INSTANCE/api/resources/workspace/v1/WorkspaceConfig
POST BODY:
{
"key":{
"workspace_id":"ws-timezone"
}
}
grpcurl -H "Authorization: Bearer `cat token.tok`" -import-path $GOPATH/src/arista/resources -proto $GOPATH/src/arista/resources/arista/workspace.v1/services.gen.proto -cacert cvp.crt -d '{"key":{"workspaceId": "builtin-studios-V0-l3ls"}}' 192.0.2.100:8443 arista.workspace.v1.WorkspaceConfigService/Delete
Result:
{
"key": {
"workspaceId": "builtin-studios-V0-l3ls"
},
"time": "2021-07-22T17:09:51.788962287Z"
}
curl -sS -kX DELETE --header 'Accept: application/json' -H "Authorization: Bearer `cat token.tok`" 'https://192.0.2.100/api/resources/workspace/v1/WorkspaceConfig?key.workspaceId=builtin-studios-V0-l3ls'
Result:
{
"key": {
"workspaceId": "builtin-studios-V0-l3ls"
},
"time": "2021-07-22T17:39:28.789768498Z"
}