aws / aws/aws-tools-for-powershell

Tag Model not portable between Services

Open
#53 7 comments 3 reactions 1 assignee Claimed by @jnunn-aws View on GitHub
feature-request module/powershell-cmdlets p2 queued
Dominant language
C#
Stars
298
Forks
102
Avg merge
7d 17m
Merged PRs (30d)
2

Description

Explicit \*.Tag types should be portable between services.

**Expected Behavior**

I would like to be able to re-use an object of type `[Amazon.EC2.Model.Tag]` when tagging within the `ElasticLoadBalancingV2` service.

```powershell
PS > $tag = [Amazon.EC2.Model.Tag]@{Key='foo';Value='bar'}
PS > New-EC2Tag -ResourceId $vpcId -Tag $tag
PS > Add-ELB2Tag -ResourceArn $arn -Tag $tag
```

**Current Behavior**

ELB2 rejects strongly typed EC2 tags and disallows allow explicit casting from `[Amazon.EC2.Model.Tag]` to `[Amazon.ElasticLoadBalancingV2.Model.Tag]`

**Steps to Reproduce (for bugs)**

```powershell
PS > Add-ELB2Tag -ResourceArn $arn -Tag $tag
Add-ELB2Tag : Cannot bind parameter 'Tag'. Cannot convert the "Amazon.EC2.Model.Tag" value of type "Amazon.EC2.Model.Tag" to type "Amazon.ElasticLoadBalancingV2.Model.Tag".
At line:1 char:36
+ Add-ELB2Tag -ResourceArn $arn -Tag $tag
+ ~~~~
+ CategoryInfo : InvalidArgument: (:) [Add-ELB2Tag], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Amazon.PowerShell.Cmdlets.ELB2.AddELB2TagCmdlet

PS > $tag = [Amazon.ElasticLoadBalancingV2.Model.Tag]$tag
Cannot convert the "Amazon.EC2.Model.Tag" value of type "Amazon.EC2.Model.Tag" to type "Amazon.ElasticLoadBalancingV2.Model.Tag".
At line:1 char:1
+ $tag = [Amazon.ElasticLoadBalancingV2.Model.Tag]$tag
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : ConvertToFinalInvalidCastException

```

**Possible Solution**

As a workaround, currently you can strip the typing from the tag and convert it to a generic hash (optionally re-casting to the Tag type of your target service if needed)

```powershell
PS > $tag = [Amazon.ElasticLoadBalancingV2.Model.Tag]($tag | ConvertTo-Json | ConvertFrom-Json)
PS > Add-ELB2Tag -ResourceArn $arn -Tag $tag
PS > (Get-ELB2Tag -ResourceArn $arn).Tags | Where Key -eq $tag.Key

Key Value
--- -----
foo bar
```

**Context**

I was extracting tags from a [TagSpecification](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/EC2/TTagSpecification.html) object used for deploying EC2 instances into an [ELB2 tag](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/ElasticLoadBalancingV2/TTag.html) array so that I could have common tags on the load balancer infrastructure as on the EC2 hosts.

As a point of interest, it appears that tag types are silo'd between other services not named here as well.

```powershell
PS > [Amazon.IdentityManagement.Model.Tag]$tag
Cannot convert the "Amazon.ElasticLoadBalancingV2.Model.Tag" value of type "Amazon.ElasticLoadBalancingV2.Model.Tag" to type "Amazon.IdentityManagement.Model.Tag".
At line:1 char:1
+ [Amazon.IdentityManagement.Model.Tag]$tag
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : ConvertToFinalInvalidCastException

```

**Your Environment**

```powershell
PS > Get-Module AWSPowerShell

ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Binary 3.3.563.1 AWSPowerShell {Add-AASScalableTarget, Add-ACMCertificateTag, Add-ADSConfigurationItemsToAppli…

PS > $PSVersionTable

Name Value
---- -----
PSVersion 6.2.3
PSEdition Core
GitCommitId 6.2.3
OS Darwin 18.7.0 Darwin Kernel Version 18.7.0: Tue Aug 20 16:57:14 PDT 2019; root:xnu-4903.271.2~2/RELEASE_X8…
Platform Unix
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.