diff --git a/powershell/autorest-configuration.md b/powershell/autorest-configuration.md
index 048f6282ca0..2c9dd6aacab 100644
--- a/powershell/autorest-configuration.md
+++ b/powershell/autorest-configuration.md
@@ -63,6 +63,7 @@ module-folder: $(current-folder)/generated
cmdlet-folder: $(module-folder)/cmdlets
model-cmdlet-folder: $(module-folder)/model-cmdlets
custom-cmdlet-folder: $(current-folder)/custom
+utils-cmdlet-folder: $(current-folder)/utils
internal-cmdlet-folder: $(current-folder)/internal
test-folder: $(current-folder)/test
runtime-folder: $(module-folder)/runtime
diff --git a/powershell/generators/nuspec.ts b/powershell/generators/nuspec.ts
index fb44a1df572..598b8250418 100644
--- a/powershell/generators/nuspec.ts
+++ b/powershell/generators/nuspec.ts
@@ -41,6 +41,7 @@ export async function generateNuspec(project: Project | NewProject) {
+
`, undefined, 'source-file-other');
}
diff --git a/powershell/internal/project.ts b/powershell/internal/project.ts
index 1d0feb10bb0..9afaf33d7e8 100644
--- a/powershell/internal/project.ts
+++ b/powershell/internal/project.ts
@@ -92,6 +92,7 @@ export class Project extends codeDomProject {
public cmdletFolder!: string;
public customFolder!: string;
+ public utilsFolder!: string;
public internalFolder!: string;
public testFolder!: string;
public runtimeFolder!: string;
@@ -193,6 +194,7 @@ export class Project extends codeDomProject {
this.cmdletFolder = await this.state.getValue('cmdlet-folder');
this.customFolder = await this.state.getValue('custom-cmdlet-folder');
+ this.utilsFolder = await this.state.getValue('utils-cmdlet-folder');
this.internalFolder = await this.state.getValue('internal-cmdlet-folder');
this.testFolder = await this.state.getValue('test-folder');
this.runtimeFolder = await this.state.getValue('runtime-folder');
@@ -250,6 +252,7 @@ export class NewProject extends codeDomProject {
public cmdletFolder!: string;
public customFolder!: string;
+ public utilsFolder!: string;
public internalFolder!: string;
public testFolder!: string;
public runtimeFolder!: string;
@@ -353,6 +356,7 @@ export class NewProject extends codeDomProject {
this.cmdletFolder = await this.state.getValue('cmdlet-folder');
this.customFolder = await this.state.getValue('custom-cmdlet-folder');
+ this.utilsFolder = await this.state.getValue('utils-cmdlet-folder');
this.internalFolder = await this.state.getValue('internal-cmdlet-folder');
this.testFolder = await this.state.getValue('test-folder');
this.runtimeFolder = await this.state.getValue('runtime-folder');
diff --git a/powershell/llcsharp/model/namespace.ts b/powershell/llcsharp/model/namespace.ts
index 57680266b50..58d0d0d64ac 100644
--- a/powershell/llcsharp/model/namespace.ts
+++ b/powershell/llcsharp/model/namespace.ts
@@ -179,6 +179,11 @@ export class NewModelsNamespace extends Namespace {
this.NewResolveTypeDeclaration(schema, true, state);
}
}
+ if (schemas.dictionaries) {
+ for (const schema of schemas.dictionaries) {
+ this.NewResolveTypeDeclaration(schema, true, state);
+ }
+ }
if (schemas.any) {
for (const schema of schemas.any) {
diff --git a/powershell/llcsharp/schema/schema-resolver.ts b/powershell/llcsharp/schema/schema-resolver.ts
index fe51afa73ef..bd1eab1c708 100644
--- a/powershell/llcsharp/schema/schema-resolver.ts
+++ b/powershell/llcsharp/schema/schema-resolver.ts
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-import { codeModelSchema, ArraySchema, CodeModel, Schema as NewSchema, StringSchema, BooleanSchema, NumberSchema, ByteArraySchema, DateTimeSchema, ObjectSchema, GroupSchema, isObjectSchema, SchemaType, GroupProperty, ParameterLocation, Operation, Parameter, VirtualParameter, getAllProperties, ImplementationLocation, OperationGroup, Request, SchemaContext, ConstantSchema, ChoiceSchema, DurationSchema, BinarySchema, DateSchema } from '@azure-tools/codemodel';
+import { codeModelSchema, ArraySchema, UnixTimeSchema, CodeModel, Schema as NewSchema, StringSchema, BooleanSchema, NumberSchema, ByteArraySchema, DateTimeSchema, ObjectSchema, GroupSchema, isObjectSchema, SchemaType, GroupProperty, ParameterLocation, Operation, Parameter, VirtualParameter, getAllProperties, ImplementationLocation, OperationGroup, Request, SchemaContext, ConstantSchema, ChoiceSchema, DurationSchema, BinarySchema, DateSchema } from '@azure-tools/codemodel';
import { ModelState, codemodel, IntegerFormat, NumberFormat, StringFormat, JsonType } from '@azure-tools/codemodel-v3';
import { Schema } from '../code-model';
@@ -222,6 +222,9 @@ export class NewSchemaDefinitionResolver {
// fallback to int if the format isn't recognized
return new NewNumeric(schema, required, required ? 'int' : 'int?');
+ case SchemaType.UnixTime:
+ return new NewUnixTime(schema, required);
+
case SchemaType.Number:
switch ((schema).precision) {
case 64:
diff --git a/powershell/plugins/powershell-v2.ts b/powershell/plugins/powershell-v2.ts
index 12d8802b7b1..b92c5643a41 100644
--- a/powershell/plugins/powershell-v2.ts
+++ b/powershell/plugins/powershell-v2.ts
@@ -32,6 +32,9 @@ async function copyRequiredFiles(project: NewProject) {
// Runtime files
await copyResources(join(resources, 'psruntime'), async (fname, content) => project.state.writeFile(join(project.runtimeFolder, fname), content, undefined, sourceFileCSharp), project.overrides, transformOutput);
+ // utils cmdlets
+ await copyResources(join(resources, 'utils'), async (fname, content) => project.state.writeFile(join(project.utilsFolder, fname), content, undefined, sourceFileCSharp), project.overrides, transformOutput);
+
// Modules files
await copyBinaryResources(join(resources, 'modules'), async (fname, content) => project.state.writeFile(join(project.dependencyModuleFolder, fname), content, undefined, 'binary-file'));
diff --git a/powershell/resources/utils/Unprotect-SecureString.ps1 b/powershell/resources/utils/Unprotect-SecureString.ps1
new file mode 100644
index 00000000000..cb05b51a622
--- /dev/null
+++ b/powershell/resources/utils/Unprotect-SecureString.ps1
@@ -0,0 +1,16 @@
+#This script converts securestring to plaintext
+
+param(
+ [Parameter(Mandatory, ValueFromPipeline)]
+ [System.Security.SecureString]
+ ${SecureString}
+)
+
+$ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString)
+try {
+ $plaintext = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)
+} finally {
+ [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)
+}
+
+return $plaintext
\ No newline at end of file
diff --git a/tests-upgrade/AutoRestUpgradeTest.ps1 b/tests-upgrade/AutoRestUpgradeTest.ps1
index 938758f39bf..66c2e796052 100644
--- a/tests-upgrade/AutoRestUpgradeTest.ps1
+++ b/tests-upgrade/AutoRestUpgradeTest.ps1
@@ -66,6 +66,9 @@ function IsNeedIgnore([string]$inputFileName , [Array]$ignoreArray)
{
$Ignore =$True
break
+ } elseif ($ignoreDetail.Contains("*.") -and $inputFileName.EndsWith($ignoreDetail.Split(".")[-1])) {
+ $Ignore =$True
+ break
}
}
return $Ignore
@@ -117,8 +120,8 @@ function CompareGeneratedCode([string]$inputSourcePath,[string]$inputTargetPath,
#in m3Path
cd $inputSourcePath
$initFileList = Get-ChildItem -Recurse -force
- $initIgnoreFileList = (($inputSourcePath+'\generated\modules'), ($inputSourcePath+'\.gitignore'),($inputSourcePath+'\tools\Resources\.gitignore'))
- $targetIgnoreFileList = (($inputTargetPath+'\generated\modules'), ($inputTargetPath+'\.gitignore'),($inputTargetPath+'\tools\Resources\.gitignore'))
+ $initIgnoreFileList = (($inputSourcePath+'\generated\modules'), ($inputSourcePath+'\utils'), ($inputSourcePath+'\*.nuspec'), ($inputSourcePath+'\.gitignore'),($inputSourcePath+'\tools\Resources\.gitignore'))
+ $targetIgnoreFileList = (($inputTargetPath+'\generated\modules'), ($inputTargetPath+'\utils'),($inputTargetPath+'\*.nuspec'),($inputTargetPath+'\.gitignore'),($inputTargetPath+'\tools\Resources\.gitignore'))
#foreach initFileList and get the hashcode of them
foreach( $initFile in $initFileList)
{
diff --git a/tests-upgrade/Configuration.json b/tests-upgrade/Configuration.json
index 9d25b6c293d..045f89ef52b 100644
--- a/tests-upgrade/Configuration.json
+++ b/tests-upgrade/Configuration.json
@@ -24,6 +24,7 @@
"datamodels-datatypes-integer",
"datamodels-datatypes-string",
"datamodels-datatypes-object",
+ "datamodels-datatypes-unixtime",
"datamodels-combineschema",
"directive-model",
"directive-tableformat",
diff --git a/tests-upgrade/datamodels-datatypes-unixtime/readme.md b/tests-upgrade/datamodels-datatypes-unixtime/readme.md
new file mode 100644
index 00000000000..cd6b9c0ac24
--- /dev/null
+++ b/tests-upgrade/datamodels-datatypes-unixtime/readme.md
@@ -0,0 +1,10 @@
+### AutoRest Configuration
+> see https://aka.ms/autorest
+
+``` yaml
+require:
+ - $(this-folder)/../readme.azure.noprofile.md
+input-file:
+ - $(this-folder)/swagger.json
+
+```
diff --git a/tests-upgrade/datamodels-datatypes-unixtime/swagger.json b/tests-upgrade/datamodels-datatypes-unixtime/swagger.json
new file mode 100644
index 00000000000..27427d16396
--- /dev/null
+++ b/tests-upgrade/datamodels-datatypes-unixtime/swagger.json
@@ -0,0 +1,76 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "title": "DatabricksClient",
+ "version": "2018-04-01",
+ "description": "ARM Databricks"
+ },
+ "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/resourceGroup": {
+ "get": {
+ "tags": [
+ "Workspaces"
+ ],
+ "operationId": "Workspaces_Get",
+ "description": "Gets the workspace.",
+ "responses": {
+ "200": {
+ "description": "OK-Return workspace."
+ },
+ "default": {
+ "description": "Error response describing why the operation failed.",
+ "schema": {
+ "$ref": "#/definitions/BasicErrorModel"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "BasicErrorModel": {
+ "type": "object",
+ "required": [
+ "message",
+ "code"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "code": {
+ "type": "integer",
+ "format": "unixtime"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file