vManage client is a package for creating simple and parallel automatic requests via official vManage API. It is intended to serve as a multiple session handler (provider, provider as a tenant, tenant). The library is not dependent on environment which is being run in, you just need a connection to any vManage.
Installation
pip install vmngclient
Session usage example
Our session is an extension to requests.Session
designed to make it easier to communicate via API calls with vManage. We provide ready to use authenticetion, you have to simply provide the vmanage url, username and password as as if you were doing it through a GUI.
from vmngclient.session import create_vManageSession
url = "example.com"
username = "admin"
password = "password123"
session = create_vManageSession(url=url, username=username, password=password)
session.get("/dataservice/device")
API usage examples
Get devices (click to expand)
devices = session.api.devices.get()
Admin Tech (click to expand)
admin_tech_file = session.api.admin_tech.generate("172.16.255.11")
session.api.admin_tech.download(admin_tech_file)
session.api.admin_tech.delete(admin_tech_file)
Speed test (click to expand)
devices = session.api.devices.get()
speedtest = session.api.speedtest.speedtest(devices[0], devices[1])
Upgrade device (click to expand)
vsmarts = session.api.devices.get().filter(personality=Personality.VSMART)
image = "viptela-20.7.2-x86_64.tar.gz"
session.api.repository.upload_image(image)
install_task = session.api.software.install(devices=vsmarts, image=image)
install_task.wait_for_completed()
Get alarms (click to expand)
To get all alarms:
alarms = session.api.alarms.get()
To get all not viewed alarms:
not_viewed_alarms = session.api.alarms.get().filter(viewed=False)
To get all alarms from past n
hours:
n = 24
alarms_from_n_hours = session.api.alarms.get(from_time=n)
To get all critical alarms from past n
hours:
n = 48
critical_alarms = session.api.alarms.get(from_time=n).filter(severity=Severity.CRITICAL)
Users (click to expand)
session.api.users.get()
new_user = User(userName="new_user", password="new_user", group=["netadmin"], description="new user")
session.api.users.create(new_user)
new_user_update = UserUpdateRequest(userName="new_user", group=["netadmin", "netops"], locale="en_US", description="updated-new_user-description", resGroupName="global")
session.api.users.update(new_user_update)
session.api.users.update_password("new_user", "n3W-P4s$w0rd")
session.api.users.reset("new_user")
session.api.users.delete("new_user")
session.api.users.get_auth_type()
session.api.users.get_role()
User Groups (click to expand)
session.api.user_groups.get()
group = UserGroup("new_user_group", [])
group.enable_read({"Audit Log", "Alarms"})
group.enable_read_and_write({"Device Inventory"})
session.api.user_groups.create(group)
group.disable({"Alarms"})
session.api.user_groups.update(group)
session.api.user_groups.delete(group.group_name)
Sessions (click to expand)
active_sessions = session.api.sessions.get()
new_user_sessions = active_sessions.filter(raw_username="new_user")
session.api.sessions.invalidate(new_user_sessions)
Resource Groups (click to expand)
session.api.resource_groups.get()
new_resource_group = ResourceGroup(
name="new_resource_group",
desc="Custom Resource Group #1",
siteIds=[]
)
session.api.resource_groups.create(new_resource_group)
resource_group = session.api.resource_groups.get().filter(name="new_resource_group").single_or_default()
updated_resource_group = ResourceGroupUpdateRequest(
id=resource_group.id,
name=resource_group.name,
desc="Custom Resource Group #1 with updated description and site ids",
siteIds=[200]
)
session.api.resource_groups.switch("new_resource_group")
session.api.resource_groups.delete(resource_group.id)
Tenant management (click to expand)
api = session.api.tenant_management
tenants = [
Tenant(
name="tenant1",
orgName="CiscoDevNet",
subDomain="alpha.bravo.net",
desc="This is tenant for unit tests",
edgeConnectorEnable=True,
edgeConnectorSystemIp="172.16.255.81",
edgeConnectorTunnelInterfaceName="GigabitEthernet1",
wanEdgeForecast=1,
)
]
create_task = api.create(tenants)
create_task.wait_for_completed()
tenants_data = api.get_all()
tenant = tenants_data.filter(name="tenant1").single_or_default()
tenant_id = tenant.tenant_id
vsessionid = api.vsession_id(tenant_id)
delete_task = api.delete([tenant_id])
delete_task.wait_for_completed()
api.get_hosting_capacity_on_vsmarts()
api.get_statuses()
api.get_vsmart_mapping()
Tenant migration (click to expand)
from pathlib import Path
from vmngclient.session import create_vManageSession
from vmngclient.models.tenant import TenantExport
from vmngclient.workflows.tenant_migration import migration_workflow
tenant = TenantExport(
name="mango",
desc="Mango tenant description",
org_name="Provider Org-Mango Inc",
subdomain="mango.fruits.com",
wan_edge_forecast=100,
migration_key="MangoTenantMigrationKey",
is_destination_overlay_mt=True,
)
with create_vManageSession(url="10.0.1.15", username="st-admin", password="") as origin_session, \
create_vManageSession(url="10.9.0.16", username="mt-provider-admin", password="") as target_session:
migration_workflow(
origin_session=origin_session,
target_session=target_session,
workdir=Path("workdir"),
tenant=tenant,
validator="10.9.12.26"
)
migration_workflow
performs multi-step migration procedure according to Migrate Single-Tenant Cisco SD-WAN Overlay to Multitenant Cisco SD-WAN Deployment
Since 20.13 also MT to ST is supported (just provide suitable origin/target sessions, and is_destination_overlay_mt
parameter)
Each step of the migration_workflow
procedure can be executed independently using api methods: export_tenant
, download
, import_tenant
, store_token
, migrate_network
origin_api = origin_session.api.tenant_migration_api
target_api = target_session.api.tenant_migration_api
tenant_file = Path("~/tenant.tar.gz")
token_file = Path("~/tenant-token.txt")
export_task = origin_api.export_tenant(tenant=tenant)
remote_filename = export_task.wait_for_file()
origin_api.download(export_path, remote_filename)
import_task = target_api.import_tenant(export_path, tenant.migration_key)
import_task.wait_for_completed()
migration_id = import_task.import_info.migration_token_query_params.migration_id
target_api.store_token(migration_id, token_path)
migrate_task = origin_api.migrate_network(token_path)
migrate_task.wait_for_completed()
Note:
To remove InsecureRequestWarning
, you can include in your scripts (warning is suppressed when VMNGCLIENT_DEVEL
environment variable is set):
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
Catching Exceptions
try:
session.api.users.delete_user("XYZ")
except vManageBadRequestError as error:
logger.error(error.info.details)
Seeking support
You can contact us by submitting issues, or directly via mail on vmngclient@cisco.com.