Конвейерный ввод в функции

У меня есть следующий рабочий код, который используется для создания кластера HDInsight:

New-AzureHDInsightClusterConfig    -ClusterSizeInNodes $ClusterNodes  `
                                                -VirtualNetworkId ($VNet.Id)       `
                                                -SubnetName $subnetName            `
                                                -ClusterType $ClusterType |        `
                    Set-AzureHDInsightDefaultStorage   -StorageAccountName        "$StorageAccountName.blob.core.windows.net"  `
                                                            -StorageAccountKey         $StorageAccountKey                           `
                                                            -StorageContainerName      $StorageContainerName |                      `
                    New-AzureHDInsightCluster          -Credential                $ClusterCreds                                `
                                                            -Location                  $Location                                    `
                                                            -Name                      $ClusterName                                 `
                                                            -Version                   $HDInsightVersion

Обратите внимание, что я использую конвейерную обработку. Теперь я хотел бы написать несколько автоматических тестов (используя Pester) для проверки этого кода. Для этого я оборачиваю вызовы командлетов в так называемые прокси-функции и передаю значения параметров с помощью сплаттинга, что упрощает имитацию их для целей тестирования. Вот пример:

function Set-AzureHDInsightDefaultStorageProxy{
<#
    .SYNOPSIS 
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
    .DESCRIPTION
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
#>
    [CmdletBinding()]
    Param(
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage @PSBoundParameters
}
New-AzureHDInsightClusterConfigProxy    -ClusterSizeInNodes $ClusterNodes  `
                                                -VirtualNetworkId ($VNet.Id)       `
                                                -SubnetName $subnetName            `
                                                -ClusterType $ClusterType |        `
                    Set-AzureHDInsightDefaultStorageProxy   -StorageAccountName        "$StorageAccountName.blob.core.windows.net"  `
                                                            -StorageAccountKey         $StorageAccountKey                           `
                                                            -StorageContainerName      $StorageContainerName |                      `
                    New-AzureHDInsightClusterProxy          -Credential                $ClusterCreds                                `
                                                            -Location                  $Location                                    `
                                                            -Name                      $ClusterName                                 `
                                                            -Version                   $HDInsightVersion

Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке:

Set-AzureHDInsightDefaultStorageProxy -StorageAccountName ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [‹* == >>] Исключение: Объект ввода не может быть привязан к каким-либо параметрам команды либо потому, что команда не принимает ввод конвейерной линии, либо ввод и его свойства не соответствуют ни одному из параметров, принимающих ввод конвейера.

Хорошо, поэтому мне нужно изменить мою функцию, чтобы она принимала ввод конвейера. Я прочитал Написать функции PowerShell, которые принимают конвейерный ввод, и на основе этого я переписал свою функцию прокси на:

function Set-AzureHDInsightDefaultStorageProxy{
    [CmdletBinding()]
    Param(
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage -Config $input -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -StorageContainerName $StorageContainerName
}

но это не удалось с той же ошибкой.

Ясно, что отсутствие навыков / знаний Powershell подводит меня к этому, поэтому я надеюсь, что кто-то там скажет мне, как переписать мою функцию, чтобы успешно принимать и использовать ввод конвейера.

Вот определение командлета, для которого я пишу функцию прокси: Set-AzureHDInsightDefaultStorage. Я заметил, что параметр -Config настроен так, чтобы разрешить ввод в конвейер: введите здесь описание изображения, так что, думаю, мне нужно укажите то же самое в моей функции прокси, но я не знаю, как это сделать.


person jamiet    schedule 08.12.2014    source источник


Ответы (1)


Хорошо, думаю, я понял это:

function Set-AzureHDInsightDefaultStorageProxy{
<#
    .SYNOPSIS 
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
    .DESCRIPTION
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
#>
    [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline=$true)]$Config,
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage -Config $input -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -StorageContainerName $StorageContainerName
}

он все еще не работает так, как хотелось бы, потому что я не передаю правильное значение из предыдущего командлета в конвейере, поэтому я получаю сообщение об ошибке:

Ошибка: 12.08.2014 12:19:55: в E: \ DeployUtilities.psm1: 984 символа: 21 + Set- AzureHDInsightDefaultStorageProxy
-StorageAccountName ... + ~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~~~ [‹* == >>] Исключение: невозможно преобразовать System.Object [] в тип Microsoft.WindowsAzure.Manag ement.HDInsight. Cmdlet.DataObjects.AzureHDInsightConfig »требуется параметром« Config ». Указанный метод не поддерживается. -> Указанный метод не поддерживается.

но это другая (не требующая пояснений) проблема, которую я сейчас постараюсь решить!

person jamiet    schedule 08.12.2014
comment
Вы пытались привести тип [AzureHDInsightConfig] $config в свой список параметров? - person Micky Balladelli; 08.12.2014
comment
Привет, Микки Балладелли. Все в порядке, я понял. По сути, столкнулся с той же проблемой, только позже в процессе разработки. Исправил так же, и теперь все хорошо. - person jamiet; 08.12.2014