{"id":20237539,"url":"https://github.com/qualisystems/spirent-testcentercontroller-shell","last_synced_at":"2026-05-12T14:06:01.412Z","repository":{"id":145182150,"uuid":"78333884","full_name":"QualiSystems/Spirent-TestCenterController-Shell","owner":"QualiSystems","description":"A cloudshell shell to enable work with TestCenter","archived":false,"fork":false,"pushed_at":"2019-09-18T09:15:19.000Z","size":1548,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-03-03T14:41:57.491Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/QualiSystems.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-08T09:41:35.000Z","updated_at":"2019-03-10T08:33:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"3620e7a9-63aa-4a26-b13a-1f38658d138e","html_url":"https://github.com/QualiSystems/Spirent-TestCenterController-Shell","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/QualiSystems/Spirent-TestCenterController-Shell","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QualiSystems%2FSpirent-TestCenterController-Shell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QualiSystems%2FSpirent-TestCenterController-Shell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QualiSystems%2FSpirent-TestCenterController-Shell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QualiSystems%2FSpirent-TestCenterController-Shell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/QualiSystems","download_url":"https://codeload.github.com/QualiSystems/Spirent-TestCenterController-Shell/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QualiSystems%2FSpirent-TestCenterController-Shell/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32942221,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T09:19:52.626Z","status":"ssl_error","status_checked_at":"2026-05-12T09:17:33.438Z","response_time":102,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T08:27:23.500Z","updated_at":"2026-05-12T14:06:01.376Z","avatar_url":"https://github.com/QualiSystems.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](https://github.com/QualiSystems/cloudshell-shells-documentaion-templates/blob/master/cloudshell_logo.png)\n\n# **Spirent TestCenter Controller 1G Shell**  \n\nRelease date: January 2019\n\nShell version: 1.5.3\n\nDocument version: A\n\n# In This Guide\n\n* [Overview](#overview)\n* [Downloading the Shell](#downloading-the-shell)\n* [Importing and Configuring the Shell](#importing-and-configuring-the-shell)\n* [Updating Python Dependencies for Shells](#updating-python-dependencies-for-shells)\n* [Associating a CloudShell Service to a Non-Global Domain](#associating-a-cloudShell-service-to-a-non-global-domain)\n* [Typical Workflows](#typical-workflows)\n* [References](#references)\n* [Release Notes](#release-notes)\n\n\n# Overview\nA shell integrates a device model, application or other technology with CloudShell. A shell consists of a data model that defines how the device and its properties are modeled in CloudShell, along with automation that enables interaction with the device via CloudShell.\n\n**Note:** We recommend using a 2nd gen shell where possible. Using a 1st gen shell may limit some shell management capabilities. For more information, see [Shell Overview – “Our Shell”](http://help.quali.com/Online%20Help/9.0/Portal/Content/CSP/LAB-MNG/Shells.htm?Highlight=shell%20overview).\n\n### Traffic Generator Shells\nCloudShell's traffic generator shells enable you to conduct traffic test activities on Devices Under Test (DUT) or Systems Under Test (SUT) from a sandbox. In CloudShell, a traffic generator is typically modeled using a chassis resource, which represents the traffic generator device and ports, and a controller service that runs the chassis commands, such as Load Configuration File, Start Traffic and Get Statistics. Chassis and controllers are modeled by different shells, allowing you to accurately model your real-life architecture. For example, scenarios where the chassis and controller are located on different machines.\n\nFor additional information on traffic generator shell architecture, and setting up and using a traffic generator in CloudShell, see the [Traffic Generators Overiew](http://help.quali.com/Online%20Help/9.0/Portal/Content/CSP/LAB-MNG/Trffc-Gens.htm?Highlight=traffic%20generator%20overview) online help topic.\n\n### **Spirent TestCenter Controller 1G Shell**\n\nTo model a Spirent TestCenter device in CloudShell, use the following shells:\n\n▪ [Spirent TestCenter Chassis 2G Shell](https://community.quali.com/repos/4080/spirent-test-center-chassis-2-gen-shell), which provides data model and autoload functionality to model and load the Spirent TestCenter Chassis to resource management.\n\n▪ [Spirent TestCenter Controller 1G Shell (service)](https://community.quali.com/repos/1280/spirent-test-center-controller-shell), which provides functionality to load test configuration, run tests, get test results, etc.\n\nFor more information on **Spirent TestCenter**, see the official device manufacturer product documentation.\n\n### Standard version\n\nFor detailed information about the shell’s structure and attributes, see the **Shells Standard: Traffic Generator Controller**.(https://github.com/QualiSystems/cloudshell-standards/blob/master/Documentation/Traffic%20Generator%20Controller%20Shell%20Standard.md) in GitHub.\n\n### Supported OS\n▪ Windows\n\n### Requirements\n\nRelease: **Spirent TestCenter Controller 1G Shell**\n\n▪ CloudShell version: 8.1 and above\n\n▪ TestCenter Rest Server: Lab Server or STC web services\n\n### Data Model\n\nThe shell's data model includes all shell metadata, families, and attributes.\n\n#### **Spirent TestCenter Controller Attributes**\n\nThe attribute names and descriptions are listed in the following table:\n\n|Attribute|Description|\n|:---|:---|\n|Controller Address|IP address of the traffic server. Relevant only if an external server is configured.|\n|Controller TCP Port|TCP port of the traffic server. Relevant only if an external server is configured. If left empty, the Default TCP port should be used.|\n|Test Files Location|Location for test related files|\n\n### Automation\nThis section describes the automation (driver) associated with the data model. The shell’s driver is provided as part of the shell package. There are two types of automation processes, Autoload and Resource. Autoload is executed when creating the resource in the **Inventory** dashboard, while resource commands are run in the sandbox.\n\nFor Traffic Generator shells, commands are configured and executed from the controller service in the sandbox, with the exception of the Autoload command, which is executed when creating the resource.\n\nThe following table describes the process that occurrs during Autoload for the controller shell:\n\n|Command|Description|\n|:-----|:-----|\n|Autoload|Discovers the chassis, its hierarchy and attributes when creating the resource. The command can be rerun in the Inventory dashboard and not in the sandbox, as for other commands.|\n\n**User Commands**\n\nThe following table lists the commands the sandbox end-user can run from the controller service:\n\n**Note**: For detailed information on running a traffic test in CloudShell, see [Traffic Generators Overview](http://help.quali.com/Online%20Help/9.0/Portal/Content/CSP/LAB-MNG/Trffc-Gens.htm?Highlight=traffic%20generators%20overview).\n\n|Command|Description|\n|:-----|:-----|\n|Load configuration|Reserves ports and loads the configuration file. \u003cbr\u003eSet the command input as follows:\u003cbr\u003e▪ **STC config file name** (String) (Mandatory): Full path to the STC configuration file name - tcc or xml.|\n|Start ARP/ND|Sends ARP/ND for all devices and streams.|\n|Start All Devices|Starts devices (these are the STC objects that emulate network devices). There are parallel commands in the STC GUI that are called start devices.|\n|Stop All Devices|Stops devices (these are the STC objects that emulate network devices). There are parallel commands in STC GUI that are called stop devices.|\n|Start Traffic|Sends traffic on all ports.\u003cbr\u003eSet the command input as follows:\u003cbr\u003e▪ **Blocking (Enum)**: **True**: Returns after traffic finishes running; **False**: Returns immediateley.|\n|Stop Traffic|Stops traffic on all ports.|\n|Get Statistics|Gets real time statistics of the traffic test in either JSON or CSV format. \u003cbr\u003eSet the command's inputs as follows: \u003cbr\u003e▪ **View Name**: (String) (Mandatory) - Type of statistics to return, such as generatorPortResults, analyzerPortResults, etc.\u003cbr\u003e▪ **Output Type (Enum)**: **JSON** or **CSV**. JSON prints the statistics to the sandbox's output, which is useful for API calls that can then use the output, while CSV attaches a CSV file with the test's statistics to the sandbox.|\n|Perform sequencer command|Set the command's inputs as follows:\u003cbr\u003e**Command** (Enum)\u003cbr\u003e ▪ **Start**, **Stop** or **Wai**t for sequencer to end (Blocking).|\n\n**Hidden Commands**\n\nThe following table describes the hidden developer commands from the controller service:\n\n|Command|Description|Parameters|\n|:-----|:-----|:-----|\n|get_session_id|Returns the REST session. This ID can be used to run directly any STC REST command.||\n|get_children|Returns a list of all children of a specific type of requested object.\u003cbr\u003eIf *child_type* **== None**, all children will be returned.|*obj_ref*: Requested object reference\u003cbr\u003e*child_type*: Requested child type|\n|get_attributes|Returns dictionary of all \u003cattribute: value\u003e of the requested object attributes.|obj_ref: Requested object reference|\n|set_attribute|Sets value of specific attribute of the requested object.|*obj_ref*: Requested object reference\u003cbr\u003e*attr_name*:\tRequested attribute name\u003cbr\u003e*attr_value*: Value to set|\n|perform_command|Performs any STC command.|*command*: Requested command (without the Command suffix)\u003cbr\u003e*parameters_json*: Command parameters dict {name: value} as serialized json|\n\nThe following is a simple code snippet demonstrating the hidden commands:\n\nThe code assumes that *reservation_id* holds the reservation ID and *session* holds the CS session.\n\n```\n# Get session ID\nsession_id = session.ExecuteCommand(reservation_id, 'TestCenter Controller',                                                 'Service', 'get_session_id')\n\n# Get project object reference.        \nproject = session.ExecuteCommand(reservation_id, 'TestCenter Controller',                                              'Service', 'get_children',\n[InputNameValue('obj_ref', 'system1'),\n InputNameValue('child_type', 'project')])\nproject_obj = json.loads(project.Output)[0]\n\n# Get all children of project.        \nproject_childs = session.ExecuteCommand(reservation_id, 'TestCenter Controller',                                                     'Service', 'get_children',\n[InputNameValue('obj_ref', project_obj)])\n\n# Get automation-options object reference.        \noptions = session.ExecuteCommand(reservation_id, 'TestCenter Controller',\n'Service', 'get_children',                                              [InputNameValue('obj_ref', 'system1'),\n InputNameValue('child_type', 'AutomationOptions')])\noptions_ref = json.loads(options.Output)[0]\n\n# Get automation-options attributes.\noptions_attrs = session.ExecuteCommand(reservation_id, 'TestCenter Controller',\n'Service', 'get_attributes',                                                    [InputNameValue('obj_ref', options_ref)])\n\n# Set automation-options log-level attribute.\nsession.ExecuteCommand(reservation_id,\n'TestCenter Controller',\n'Service', 'set_attribute',                                    [InputNameValue('obj_ref', options_ref),\n InputNameValue('attr_name', 'LogLevel'),\n InputNameValue('attr_value', 'INFO')])\n \n# Perform subscribe command.\nparameters = {'Parent': project_obj,\n              'ResultParent': project_obj,\n              'ConfigType': 'Generator',\n              'ResultType': 'GeneratorPortResults'}\nsession.ExecuteCommand(reservation_id,\n'TestCenter Controller',\n'Service', 'perform_command',                                                    [InputNameValue('command', 'ResultsSubscribe'), InputNameValue('parameters_json',json.dumps(parameters))])\n```\n\n# Downloading the Shell\nThe **Spirent TestCenter Controller 1G Shell** is available from the [Quali Community Integrations](https://community.quali.com/integrations) page. \n\nDownload the files into a temporary location on your local machine. \n\nThe shell comprises:\n\n|File name|Description|\n|:---|:---|\n|Spirent_TestCenter_controller.zip|Spirent TestCenter Controller shell package|\n|Spirent_TestCenter_controller_offline_requirements.zip|Shell Python dependencies (for offline deployments only)|\n\n# Importing and Configuring the Shell\nThis section describes how to import the **Spirent TestCenter Controller 1G Shell** and configure and modify the shell’s devices.\n\n### Importing the shell into CloudShell\n\n**To import the shell into CloudShell:**\n  1. Make sure you have the shell’s zip package. If not, download the shell from the [Quali Community's Integrations](https://community.quali.com/integrations) page.\n  \n  2. Backup your database.\n  \n  3. Log in to CloudShell Portal as administrator and access the relevant domain.\n  \n  4. In the user menu select **Import Package**.\n  \n     ![](https://github.com/QualiSystems/cloudshell-shells-documentaion-templates/blob/master/import_package.png)\n     \n  5. Browse to the location of the downloaded shell file, select the relevant *.zip* file and Click **Open**. Alternatively, drag the shell’s .zip file into CloudShell Portal.\u003cbr\u003e\u003cbr\u003eThe Spirent TestCenter controller shell is displayed in the **App/Service\u003eApplications** section of your blueprint, and can be used to run custom code and automation processes in the sandbox. For more information, see [Services Overview](http://help.quali.com/Online%20Help/9.0/Portal/Content/CSP/LAB-MNG/Services.htm?Highlight=services). \n\n### Offline installation of a shell\n\n**Note:** Offline installation instructions are relevant only if CloudShell Execution Server has no access to PyPi. You can skip this section if your execution server has access to PyPi. For additional information, see the online help topic on offline dependencies.\n\nIn offline mode, import the shell into CloudShell and place any dependencies in the appropriate dependencies folder. The dependencies folder may differ, depending on the CloudShell version you are using:\n\n* For CloudShell version 8.3 and above, see [Adding Shell and script packages to the local PyPi Server repository](#adding-shell-and-script-packages-to-the-local-pypi-server-repository).\n\n* For CloudShell version 8.2, perform the appropriate procedure: [Adding Shell and script packages to the local PyPi Server repository](#adding-shell-and-script-packages-to-the-local-pypi-server-repository) or [Setting the Python pythonOfflineRepositoryPath configuration key](#setting-the-python-pythonofflinerepositorypath-configuration-key).\n\n* For CloudShell versions prior to 8.2, see [Setting the Python pythonOfflineRepositoryPath configuration key](#setting-the-python-pythonofflinerepositorypath-configuration-key).\n\n### Adding shell and script packages to the local PyPi Server repository\nIf your Quali Server and/or execution servers work offline, you will need to copy all required Python packages, including the out-of-the-box ones, to the PyPi Server's repository on the Quali Server computer (by default *C:\\Program Files (x86)\\QualiSystems\\CloudShell\\Server\\Config\\Pypi Server Repository*).\n\nFor more information, see [Configuring CloudShell to Execute Python Commands in Offline Mode](http://help.quali.com/Online%20Help/9.0/Portal/Content/Admn/Cnfgr-Pyth-Env-Wrk-Offln.htm?Highlight=Configuring%20CloudShell%20to%20Execute%20Python%20Commands%20in%20Offline%20Mode).\n\n**To add Python packages to the local PyPi Server repository:**\n  1. If you haven't created and configured the local PyPi Server repository to work with the execution server, perform the steps in [Add Python packages to the local PyPi Server repository (offline mode)](http://help.quali.com/Online%20Help/9.0/Portal/Content/Admn/Cnfgr-Pyth-Env-Wrk-Offln.htm?Highlight=offline%20dependencies#Add). \n  \n  2. For each shell or script you add into CloudShell, do one of the following (from an online computer):\n      * Connect to the Internet and download each dependency specified in the *requirements.txt* file with the following command: \n`pip download -r requirements.txt`. \n     The shell or script's requirements are downloaded as zip files.\n\n      * In the [Quali Community's Integrations](https://community.quali.com/integrations) page, locate the shell and click the shell's **Download** link. In the page that is displayed, from the Downloads area, extract the dependencies package zip file.\n\n3. Place these zip files in the local PyPi Server repository.\n \n### Setting the Python PythonOfflineRepositoryPath configuration key\nBefore PyPi Server was introduced as CloudShell’s Python package management mechanism, the `PythonOfflineRepositoryPath` key was used to set the default offline package repository on the Quali Server machine, and could be used on specific Execution Server machines to set a different folder. \n\n**To set the offline Python repository:**\n1. Download the *Spirent_TestCenter_controller_offline_requirements.zip* file, see [Downloading the Shell](#downloading-the-shell).\n\n2. Unzip it to a local repository. Make sure the execution server has access to this folder. \n\n3.  On the Quali Server machine, in the *~\\CloudShell\\Server\\customer.config* file, add the following key to specify the path to the default Python package folder (for all Execution Servers):  \n\t`\u003cadd key=\"PythonOfflineRepositoryPath\" value=\"repository \nfull path\"/\u003e`\n\n4. If you want to override the default folder for a specific Execution Server, on the Execution Server machine, in the *~TestShell\\Execution Server\\customer.config* file, add the following key:  \n\t`\u003cadd key=\"PythonOfflineRepositoryPath\" value=\"repository \nfull path\"/\u003e`\n\n5. Restart the Execution Server.\n\n### Configuring a new service\n\n**To configure a service for the device:**\n  1. In CloudShell Resource Manager, in the **Inventory** tab, click **Resource Families**. \n         \n  2. In the **Traffic Generator Controller** folder, select **TestCenter Controller**.\n  \n     ![](https://github.com/QualiSystems/Spirent-TestCenterController-Shell/blob/master/spirent_testcenter_controller.png)\n  \n  3. In the **Attributes** tab, enter the **Default Values** for the Spirent TestCenter Controller service as follows:\n  * **Controller Address**: IP address of the STC REST server, either lab server or the machine running stcweb.\n  * **Controller TCP Port**: TCP port of the STC REST server, either lab server or the machine running stcweb.\n\t     \n  4. Click **Save**.\u003cbr\u003e\u003cbr\u003eCloudShell validates the device’s settings and updates the new resource with the device’s structure.\n\n# Updating Python Dependencies for Shells\nThis section explains how to update your Python dependencies folder. This is required when you upgrade a shell that uses new/updated dependencies. It applies to both online and offline dependencies.\n\n### Updating offline Python dependencies\n**To update offline Python dependencies:**\n1. Download the latest Python dependencies package zip file locally.\n\n2. Extract the zip file to the suitable offline package folder(s). \n\n3. Terminate the shell’s instance, as explained [here](http://help.quali.com/Online%20Help/9.0/Portal/Content/CSP/MNG/Mng-Exctn-Srv-Exct.htm#Terminat).\n\n### Updating online Python dependencies\nIn online mode, the execution server automatically downloads and extracts the appropriate dependencies file to the online Python dependencies repository every time a new instance of the driver or script is created.\n\n**To update online Python dependencies:**\n* If there is a live instance of the shell's driver or script, terminate the shell’s instance, as explained [here](http://help.quali.com/Online%20Help/9.0/Portal/Content/CSP/MNG/Mng-Exctn-Srv-Exct.htm#Terminat). If an instance does not exist, the execution server will download the Python dependencies the next time a command of the driver or script runs.\n\n# Associating a CloudShell Service to a Non-Global Domain\n\nIn order to expose a service to users of a domain that is not the Global domain, you must associate the service to the domain. To do this, you need to associate the service to a category that is assigned to the domain.\n\nWhen you import a service shell, most shells are automatically assigned a default service category which is associated with the Global domain. For custom shells, this may not be true.\n\n**To associate the Spirent TestCenter Controller 1G service to a non-global domain:**\n\n**Note:** The association process differs depending on the type of shell - second generation (2G) shell or first generation (1G) shell. The instructions below detail the steps for a 1G service shell.\n\n*  (Optional) You can associate the service to a service category that already exists in CloudShell or associate the service to a new category.\n\n\t**Note:** If you do not want to change the category(s) of this shell, you can use the default category that comes out-of-the-box (if it exists).\n\t\n\tDo one of the following:\n\t \n\t* Associate the service family to an existing category(s).\n\t\n\t\t1. In Resource Manager Client, open the **Resource Families** explorer and click the relevant service family.\n\t\n\t\t2. From the right pane, open the **Categories** tab.\n\t\n\t\t3. Click **Add**. The **Select Category** dialog box is displayed. \n\t\n\t\t4. Select a category from the catalog and click **OK**.\n\t\n\t or\n\n\t* Modify the 1G category(s) in the shell project’s configuration files to add a new category(s). See [Associating categories to 1st Gen Service Shells](https://devguide.quali.com/reference/9.0.0/associating-service-categories.html).\n\n* Associate the shell’s service category to a domain.\n\t1. In the **Manage** dashboard, click **Categories** from the left sidebar, or **Domains** if you are a domain admin.\n\t\n\t2. Select **Services Categories**.\n\t\n\t3. Click the service category that is associated with your service shell.\n\t\n\t4. In the **Edit Category** dialog box, from the **Domains** drop-down list, select the desired domain(s).\n\t\n\t5. Click **Save**.\n\n# Typical Workflows \n\n**Workflow** - *Using the Spirent controller to run TestCenter traffic* \n\n1. Create a new blueprint.\n\n   a. In CloudShell Portal, in the top left section of the **Blueprint Catalog**, click **+ Create Blueprint**.\n   \n   b. Give the blueprint a name.\n   \n2. Add resources and services to the blueprint. \n\n   a. Click the **App/Services** tab and add the **TestCenter Controller** service.\n\n   b. Click the **Resource** button and add the TestCenter chassis resource and all needed ports into the diagram. The number of STC ports in the blueprint should match the number of ports in the TestCenter configuration. For example, if you have a configuration with two ports:\n   \n     ![](https://github.com/QualiSystems/Spirent-TestCenterController-Shell/blob/master/spirent_testcenter_ports.png)\n \n     ![](https://github.com/QualiSystems/Spirent-TestCenterController-Shell/blob/master/spirent_testcenter_blueprint_ports.png)\n\n3. Reserve the blueprint to create a sandbox.\n\n4. Edit the TestCenter Controller Service parameters if required.\n\n   ![](https://github.com/QualiSystems/Spirent-TestCenterController-Shell/blob/master/spirent_testcenter_service_parameters.png)\n\n   See [Configuring a new service](#configuring-a-new-service).\n\n5. Click **Add**.\n\n6. Map the configuration ports to the sandbox ports. For each port in the TestCenter configuration, assign a physical port from the ports in the sandbox. To do this, open the attributes tab and set the **Logical Name** to the port name in the configuration:\n          \n   ![](https://github.com/QualiSystems/Spirent-TestCenterController-Shell/blob/master/spirent_testcenter_port_logical_name.png)  \n\n# References\nTo download and share integrations, see [Quali Community's Integrations](https://community.quali.com/integrations). \n\nFor instructional training and documentation, see [Quali University](https://www.quali.com/university/).\n\nTo suggest an idea for the product, see [Quali's Idea box](https://community.quali.com/ideabox). \n\nTo connect with Quali users and experts from around the world, ask questions and discuss issues, see [Quali's Community forums](https://community.quali.com/forums). \n\nTo use traffic generator ports as abstract resources, see [CloudShell's Online Help](https://help.quali.com/Online%20Help/9.1/Portal/Content/CSP/LAB-MNG/Traffic-Gens-Abst.htm?Highlight=traffic%20generator).\n\n# Release Notes \n\n### What's New\n\n• The **Get Statistics** command does not fail, if there are no results available on the STC chassis (for example, if traffic did not start) and instead, returns an empty statistics table. \n\nFor release updates, see the shell's [GitHub releases page](https://github.com/QualiSystems/Spirent-TestCenterController-Shell/releases). \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualisystems%2Fspirent-testcentercontroller-shell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqualisystems%2Fspirent-testcentercontroller-shell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualisystems%2Fspirent-testcentercontroller-shell/lists"}