diff --git a/specification/digitaltwins/resource-manager/Microsoft.DigitalTwins/stable/2020-10-31/digitaltwins.json b/specification/digitaltwins/resource-manager/Microsoft.DigitalTwins/stable/2020-10-31/digitaltwins.json new file mode 100644 index 000000000000..a649d243d702 --- /dev/null +++ b/specification/digitaltwins/resource-manager/Microsoft.DigitalTwins/stable/2020-10-31/digitaltwins.json @@ -0,0 +1,1162 @@ +{ + "swagger": "2.0", + "info": { + "version": "2020-10-31", + "title": "AzureDigitalTwinsManagementClient", + "description": "Azure Digital Twins Client for managing DigitalTwinsInstance" + }, + "host": "management.azure.com", + "schemes": [ + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "security": [ + { + "azure_auth": [ + "user_impersonation" + ] + } + ], + "securityDefinitions": { + "azure_auth": { + "type": "oauth2", + "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/authorize", + "flow": "implicit", + "description": "Azure Active Directory OAuth2 Flow", + "scopes": { + "user_impersonation": "impersonate your user account" + } + } + }, + "paths": { + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DigitalTwins/digitalTwinsInstances/{resourceName}": { + "get": { + "tags": [ + "DigitalTwinsInstance" + ], + "description": "Get DigitalTwinsInstances resource.", + "operationId": "DigitalTwins_Get", + "x-ms-examples": { + "Get a DigitalTwinsInstance resource": { + "$ref": "./examples/DigitalTwinsGet_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + } + ], + "responses": { + "200": { + "description": "The body contains all the non-security properties of the DigitalTwinsInstance. Security-related properties are set to null.", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescription" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "tags": [ + "DigitalTwinsInstance" + ], + "description": "Create or update the metadata of a DigitalTwinsInstance. The usual pattern to modify a property is to retrieve the DigitalTwinsInstance and security metadata, and then combine them with the modified values in a new body to update the DigitalTwinsInstance.", + "operationId": "DigitalTwins_CreateOrUpdate", + "x-ms-long-running-operation": true, + "x-ms-examples": { + "Put a DigitalTwinsInstance resource": { + "$ref": "./examples/DigitalTwinsPut_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + }, + { + "name": "digitalTwinsCreate", + "in": "body", + "description": "The DigitalTwinsInstance and security metadata.", + "required": true, + "schema": { + "$ref": "#/definitions/DigitalTwinsDescription" + } + } + ], + "responses": { + "200": { + "description": "This is returned as a response when the resource already exists and was updated successfully.", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescription" + } + }, + "201": { + "description": "Created - Put request accepted; the operation will complete asynchronously.", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescription" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "patch": { + "tags": [ + "DigitalTwinsInstance" + ], + "description": "Update metadata of DigitalTwinsInstance.", + "operationId": "DigitalTwins_Update", + "x-ms-long-running-operation": true, + "x-ms-examples": { + "Patch a DigitalTwinsInstance resource": { + "$ref": "./examples/DigitalTwinsPatch_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + }, + { + "name": "digitalTwinsPatchDescription", + "in": "body", + "description": "The DigitalTwinsInstance and security metadata.", + "required": true, + "schema": { + "$ref": "#/definitions/DigitalTwinsPatchDescription" + } + } + ], + "responses": { + "200": { + "description": "This is returned as a response to the status polling request for the create or update operation. The body contains the resource representation that indicates a transitional provisioning state.", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescription" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "tags": [ + "DigitalTwinsInstance" + ], + "description": "Delete a DigitalTwinsInstance.", + "operationId": "DigitalTwins_Delete", + "x-ms-long-running-operation": true, + "x-ms-examples": { + "Delete a DigitalTwinsInstance resource": { + "$ref": "./examples/DigitalTwinsDelete_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + } + ], + "responses": { + "200": { + "description": "Returned if the operation was canceled or failed.", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescription" + } + }, + "202": { + "description": "Accepted - Delete request accepted; the operation will complete asynchronously.", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescription" + } + }, + "204": { + "description": "Returned when the long running delete operation has finished, or the Digital Twins instance does not exist." + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DigitalTwins/digitalTwinsInstances/{resourceName}/endpoints": { + "get": { + "tags": [ + "Endpoints" + ], + "description": "Get DigitalTwinsInstance Endpoints.", + "operationId": "DigitalTwinsEndpoint_List", + "x-ms-examples": { + "Get a DigitalTwinsInstance endpoints": { + "$ref": "./examples/DigitalTwinsEndpointsGet_example.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + } + ], + "responses": { + "200": { + "description": "The body contains all the non-security properties of the DigitalTwinsInstance. Security-related properties are set to null.", + "schema": { + "$ref": "#/definitions/DigitalTwinsEndpointResourceListResult" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DigitalTwins/digitalTwinsInstances/{resourceName}/endpoints/{endpointName}": { + "get": { + "tags": [ + "Endpoints" + ], + "description": "Get DigitalTwinsInstances Endpoint.", + "operationId": "DigitalTwinsEndpoint_Get", + "x-ms-examples": { + "Get a DigitalTwinsInstance endpoint": { + "$ref": "./examples/DigitalTwinsEndpointGet_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + }, + { + "$ref": "#/parameters/endpointName" + } + ], + "responses": { + "200": { + "description": "The body contains all the non-security properties of the DigitalTwinsInstance. Security-related properties are set to null.", + "schema": { + "$ref": "#/definitions/DigitalTwinsEndpointResource" + } + }, + "default": { + "description": "Default error response", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "tags": [ + "Endpoints" + ], + "description": "Create or update DigitalTwinsInstance endpoint.", + "operationId": "DigitalTwinsEndpoint_CreateOrUpdate", + "x-ms-long-running-operation": true, + "x-ms-examples": { + "Put a DigitalTwinsInstance resource": { + "$ref": "./examples/DigitalTwinsEndpointPut_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + }, + { + "$ref": "#/parameters/endpointName" + }, + { + "name": "endpointDescription", + "in": "body", + "description": "The DigitalTwinsInstance endpoint metadata and security metadata.", + "required": true, + "schema": { + "$ref": "#/definitions/DigitalTwinsEndpointResource" + } + } + ], + "responses": { + "200": { + "description": "This is returned as a response to the status polling request for the create or update operation. The body contains the resource representation that indicates a transitional provisioning state.", + "schema": { + "$ref": "#/definitions/DigitalTwinsEndpointResource" + } + }, + "201": { + "description": "Created - Put request accepted; the operation will complete asynchronously.", + "schema": { + "$ref": "#/definitions/DigitalTwinsEndpointResource" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "delete": { + "tags": [ + "Endpoints" + ], + "description": "Delete a DigitalTwinsInstance endpoint.", + "operationId": "DigitalTwinsEndpoint_Delete", + "x-ms-long-running-operation": true, + "x-ms-examples": { + "Delete a DigitalTwinsInstance endpoint": { + "$ref": "./examples/DigitalTwinsEndpointDelete_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + }, + { + "$ref": "#/parameters/resourceName" + }, + { + "$ref": "#/parameters/endpointName" + } + ], + "responses": { + "200": { + "description": "Returned if the operation was canceled or failed.", + "schema": { + "$ref": "#/definitions/DigitalTwinsEndpointResource" + } + }, + "202": { + "description": "Accepted - Delete request accepted; the operation will complete asynchronously.", + "schema": { + "$ref": "#/definitions/DigitalTwinsEndpointResource" + } + }, + "204": { + "description": "Returned when the long running delete operation has finished, or the egress endpoint does not exist." + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/providers/Microsoft.DigitalTwins/digitalTwinsInstances": { + "get": { + "tags": [ + "DigitalTwinsInstance" + ], + "description": "Get all the DigitalTwinsInstances in a subscription.", + "operationId": "DigitalTwins_List", + "x-ms-examples": { + "Get DigitalTwinsInstance resources by subscription": { + "$ref": "./examples/DigitalTwinsList_example.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + } + ], + "responses": { + "200": { + "description": "This is a synchronous operation. The body contains a JSON-serialized array of the metadata from all the DigitalTwinsInstances in the subscription.", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescriptionListResult" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DigitalTwins/digitalTwinsInstances": { + "get": { + "tags": [ + "DigitalTwinsInstance" + ], + "description": "Get all the DigitalTwinsInstances in a resource group.", + "operationId": "DigitalTwins_ListByResourceGroup", + "x-ms-examples": { + "Get DigitalTwinsInstance resources by resource group": { + "$ref": "./examples/DigitalTwinsListByResourceGroup_example.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/resourceGroupName" + } + ], + "responses": { + "200": { + "description": "This is a synchronous operation. The body contains a JSON-serialized array of the metadata from all the DigitalTwinsInstances in the resource group. If more data is available, the body will contain a link to the next page of items (nextLink).", + "schema": { + "$ref": "#/definitions/DigitalTwinsDescriptionListResult" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/providers/Microsoft.DigitalTwins/operations": { + "get": { + "tags": [ + "Operations" + ], + "description": "Lists all of the available DigitalTwins service REST API operations.", + "operationId": "Operations_List", + "x-ms-examples": { + "Get available operations": { + "$ref": "./examples/DigitalTwinsOperationsList_example.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + } + ], + "responses": { + "200": { + "description": "OK. The request has succeeded.", + "schema": { + "$ref": "#/definitions/OperationListResult" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/subscriptions/{subscriptionId}/providers/Microsoft.DigitalTwins/locations/{location}/checkNameAvailability": { + "post": { + "tags": [ + "CheckNameAvailability" + ], + "description": "Check if a DigitalTwinsInstance name is available.", + "operationId": "DigitalTwins_CheckNameAvailability", + "x-ms-examples": { + "Check name Availability": { + "$ref": "./examples/DigitalTwinsCheckNameAvailability_example.json" + } + }, + "parameters": [ + { + "$ref": "#/parameters/api-version" + }, + { + "$ref": "#/parameters/subscriptionId" + }, + { + "$ref": "#/parameters/location" + }, + { + "name": "digitalTwinsInstanceCheckName", + "in": "body", + "description": "Set the name parameter in the DigitalTwinsInstanceCheckName structure to the name of the DigitalTwinsInstance to check.", + "required": true, + "schema": { + "$ref": "#/definitions/CheckNameRequest" + } + } + ], + "responses": { + "200": { + "description": "This is a synchronous operation. The body contains a JSON-serialized response that specifies whether the DigitalTwins service name is available. If the name is not available, the body contains the reason.", + "schema": { + "$ref": "#/definitions/CheckNameResult" + } + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + } + }, + "definitions": { + "DigitalTwinsProperties": { + "description": "The properties of a DigitalTwinsInstance.", + "type": "object", + "properties": { + "createdTime": { + "description": "Time when DigitalTwinsInstance was created.", + "readOnly": true, + "type": "string", + "format": "date-time" + }, + "lastUpdatedTime": { + "description": "Time when DigitalTwinsInstance was updated.", + "readOnly": true, + "type": "string", + "format": "date-time" + }, + "provisioningState": { + "description": "The provisioning state.", + "enum": [ + "Provisioning", + "Deleting", + "Succeeded", + "Failed", + "Canceled", + "Deleted", + "Warning", + "Suspending", + "Restoring", + "Moving" + ], + "type": "string", + "readOnly": true, + "x-ms-enum": { + "name": "provisioningState", + "modelAsString": true + } + }, + "hostName": { + "description": "Api endpoint to work with DigitalTwinsInstance.", + "type": "string", + "x-nullable": true, + "readOnly": true + } + } + }, + "DigitalTwinsDescription": { + "description": "The description of the DigitalTwins service.", + "type": "object", + "properties": { + "properties": { + "x-ms-client-flatten": true, + "description": "DigitalTwins instance properties.", + "$ref": "#/definitions/DigitalTwinsProperties" + } + }, + "allOf": [ + { + "$ref": "#/definitions/DigitalTwinsResource" + } + ] + }, + "DigitalTwinsPatchDescription": { + "description": "The description of the DigitalTwins service.", + "type": "object", + "properties": { + "tags": { + "description": "Instance tags", + "type": "object", + "x-nullable": true, + "additionalProperties": { + "type": "string" + } + } + } + }, + "DigitalTwinsResource": { + "description": "The common properties of a DigitalTwinsInstance.", + "properties": { + "id": { + "readOnly": true, + "type": "string", + "description": "The resource identifier." + }, + "name": { + "readOnly": true, + "type": "string", + "description": "The resource name.", + "pattern": "^(?!-)[A-Za-z0-9-]{3,63}(?`. + +``` yaml $(tag) == 'package-2020-10' && $(java) && $(multiapi) +java: + namespace: com.microsoft.azure.management.digitaltwins.v2020_10_31 + output-folder: $(azure-libraries-for-java-folder)/sdk/digitaltwins/mgmt-v2020_10_31 +regenerate-manager: true +generate-interface: true +``` + ### Tag: package-2020-03-01-preview and java These settings apply only when `--tag=package-2020-03-01-preview --java` is specified on the command line. diff --git a/specification/digitaltwins/resource-manager/readme.md b/specification/digitaltwins/resource-manager/readme.md index 16f8921d5221..456d45dee6c9 100644 --- a/specification/digitaltwins/resource-manager/readme.md +++ b/specification/digitaltwins/resource-manager/readme.md @@ -26,7 +26,16 @@ These are the global settings for the digitaltwins. ``` yaml openapi-type: arm -tag: package-2020-03-01-preview +tag: package-2020-10 +``` + +### Tag: package-2020-10 + +These settings apply only when `--tag=package-2020-10` is specified on the command line. + +``` yaml $(tag) == 'package-2020-10' +input-file: + - Microsoft.DigitalTwins/stable/2020-10-31/digitaltwins.json ``` ### Tag: package-2020-03-01-preview @@ -50,6 +59,8 @@ This is not used by Autorest itself. ``` yaml $(swagger-to-sdk) swagger-to-sdk: - repo: azure-sdk-for-python + after_scripts: + - python ./scripts/multiapi_init_gen.py azure-mgmt-digitaltwins - repo: azure-sdk-for-java - repo: azure-sdk-for-go - repo: azure-sdk-for-js @@ -101,12 +112,13 @@ require: $(this-folder)/../../../profiles/readme.md # all the input files across all versions input-file: + - $(this-folder)/Microsoft.DigitalTwins/stable/2020-10-31/digitaltwins.json - $(this-folder)/Microsoft.DigitalTwins/preview/2020-03-01-preview/digitaltwins.json ``` If there are files that should not be in the `all-api-versions` set, -uncomment the `exclude-file` section below and add the file paths. +uncomment the `exclude-file` section below and add the file paths. ``` yaml $(tag) == 'all-api-versions' #exclude-file: @@ -123,4 +135,28 @@ directive: reason: |- Flattening properties generates SDK (using autorest) that does not support polymorphism. In this case DigitalTwinsEndpointResourceProperties is used as a base class for EventGrid, EventHub and ServiceBus. Flattening DigitalTwinsEndpointResourceProperties removes the link between DigitalTwinsEndpointResource and resources above. + - suppress: TrackedResourceListByImmediateParent + where: $.definitions + from: digitaltwins.json + reason: 'This is a proxy resource, not a tracked resource.' + - suppress: EnumInsteadOfBoolean + where: $.definitions.CheckNameResult.properties.nameAvailable + from: digitaltwins.json + reason: The value will always be a boolean. + - suppress: SECRET_PROPERTY + where: '$.definitions.ServiceBus.allOf["1"].properties.primaryConnectionString' + from: digitaltwins.json + reason: 'Secrets are obfuscated on GETs. E.g., "Endpoint=sb://mysb.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=***". This is to allow customers to identify the namespace of the resource.' + - suppress: SECRET_PROPERTY + where: '$.definitions.ServiceBus.allOf["1"].properties.secondaryConnectionString' + from: digitaltwins.json + reason: Secrets are obfuscated on read. + - suppress: SECRET_PROPERTY + where: '$.definitions.EventHub.allOf["1"].properties.connectionStringPrimaryKey' + from: digitaltwins.json + reason: Secrets are obfuscated on read. + - suppress: SECRET_PROPERTY + where: '$.definitions.EventHub.allOf["1"].properties.connectionStringSecondaryKey' + from: digitaltwins.json + reason: Secrets are obfuscated on read. ``` diff --git a/specification/digitaltwins/resource-manager/readme.python.md b/specification/digitaltwins/resource-manager/readme.python.md index 24e1b64ff0e7..b6ac8b85de37 100644 --- a/specification/digitaltwins/resource-manager/readme.python.md +++ b/specification/digitaltwins/resource-manager/readme.python.md @@ -10,7 +10,6 @@ python: payload-flattening-threshold: 2 namespace: azure.mgmt.digitaltwins package-name: azure-mgmt-digitaltwins - package-version: 2020-03-01-preview clear-output-folder: true ``` @@ -19,3 +18,35 @@ python: no-namespace-folders: true output-folder: $(python-sdks-folder)/digitaltwins/azure-mgmt-digitaltwins/azure/mgmt/digitaltwins ``` + +### Python multi-api + +Generate all API versions currently shipped for this package + +```yaml $(python) && $(multiapi) +batch: + - tag: package-2020-10 + - tag: package-2020-03-01-preview +``` + +### Tag: package-2020-10 and python + +These settings apply only when `--tag=package-2020-10 --python` is specified on the command line. +Please also specify `--python-sdks-folder=`. + +``` yaml $(tag) == 'package-2020-10' && $(python) +python: + namespace: azure.mgmt.digitaltwins.v2020_10_31 + output-folder: $(python-sdks-folder)/digitaltwins/azure-mgmt-digitaltwins/azure/mgmt/digitaltwins/v2020_10_31_preview +``` + +### Tag: package-2020-03-01-preview and python + +These settings apply only when `--tag=package-2020-03-01-preview --python` is specified on the command line. +Please also specify `--python-sdks-folder=`. + +``` yaml $(tag) == 'package-2020-03-01-preview' && $(python) +python: + namespace: azure.mgmt.digitaltwins.v2020_03_01_preview + output-folder: $(python-sdks-folder)/digitaltwins/azure-mgmt-digitaltwins/azure/mgmt/digitaltwins/v2020_03_01_preview +``` diff --git a/specification/digitaltwins/resource-manager/readme.ruby.md b/specification/digitaltwins/resource-manager/readme.ruby.md index 31f23b70c07d..ea228f0d9175 100644 --- a/specification/digitaltwins/resource-manager/readme.ruby.md +++ b/specification/digitaltwins/resource-manager/readme.ruby.md @@ -4,10 +4,20 @@ These settings apply only when `--ruby` is specified on the command line. ```yaml package-name: azure_mgmt_digitaltwins -package-version: 2020-03-01-preview +package-version: 2020-10-31 azure-arm: true ``` +### Tag: package-2020-10 and ruby + +These settings apply only when `--tag=package-2020-10 --ruby` is specified on the command line. +Please also specify `--ruby-sdks-folder=`. + +```yaml $(tag) == 'package-2020-10' && $(ruby) +namespace: Microsoft.DigitalTwins +output-folder: $(ruby-sdks-folder)/digitaltwins +``` + ### Tag: package-2020-03-01-preview and ruby These settings apply only when `--tag=package-2020-03-01-preview --ruby` is specified on the command line.