Has anyone had luck creating a script to update the traffic filtering and marking area of a port group on a 5.5 vSphere Distributed Switch? The settings are only exposed in the web client so Onyx isn't an option.
I need to create a rule with the below values.
Traffic Filterig and Marking:
Set Status to Enabled
New Network Traffic Rule
Name: Traffic Rule Name
Action: Tag
CoS Value: Update CoS tag value: 4
Traffic Qualifiers:
Traffic Direction: Egress
New System Traffic Qualifier: vMotion
This is about as far as I can get.
$VDSPortGroup = Get-VDSwitch Test-dvSwitch | Get-VDPortGroup Test-PG
$Spec = New-Object VMware.Vim.DVPortgroupConfigSpec
$Spec.configVersion = $VDSPortGroup.ExtensionData.Config.ConfigVersion
$Spec.defaultPortConfig = New-Object VMware.Vim.VMwareDVSPortSetting
$Spec.defaultPortConfig.FilterPolicy = New-Object VMware.Vim.DvsFilterPolicy
Sorry, it took a bit longer than expected.
Try like this
$dvSwName = 'dvSw1'
$dvPgNames = 'dvPg1'
$dvSw = Get-VDSwitch -Name $dvSwName
# Enable LBT
foreach($pg in (Get-View -Id $dvSw.ExtensionData.Portgroup | Where {$dvPgNames -contains $_.Name})){
$spec = New-Object VMware.Vim.DVPortgroupConfigSpec
$spec.ConfigVersion = $pg.Config.ConfigVersion
$spec.DefaultPortConfig = New-Object VMware.Vim.VMwareDVSPortSetting
$spec.DefaultPortConfig.FilterPolicy = New-Object VMware.Vim.DvsFilterPolicy
$filter = New-Object VMware.Vim.DvsTrafficFilterConfig
$filter.AgentName = 'dvfilter-generic-vmware'
$ruleSet = New-Object VMware.Vim.DvsTrafficRuleset
$ruleSet.Enabled = $true
$rule =New-Object VMware.Vim.DvsTrafficRule
$rule.Description = 'Traffic Rule Name'
$rule.Direction = 'outgoingPackets'
$action = New-Object VMware.Vim.DvsUpdateTagNetworkRuleAction
$action.QosTag = 4
$rule.Action += $action
$ruleSet.Rules += $rule
$filter.TrafficRuleSet += $ruleSet
$spec.DefaultPortConfig.FilterPolicy.FilterConfig += $filter
$pg.ReconfigureDVPortgroup($spec)
}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Got a little further.
I'm able to add the DvsTrafficFilterConfig object into the spec, but not able to add the DvsTrafficRuleset object where the values are stored.
$VDSPortGroup = Get-VDSwitch Test-dvSwitch | Get-VDPortGroup Test-PG
$Spec = New-Object VMware.Vim.DVPortgroupConfigSpec
$Spec.ConfigVersion = $VDSPortGroup.ExtensionData.Config.ConfigVersion
$Spec.DefaultPortConfig = New-Object VMware.Vim.VMwareDVSPortSetting
$Spec.DefaultPortConfig.FilterPolicy = New-Object VMware.Vim.DvsFilterPolicy
$Spec.DefaultPortConfig.FilterPolicy.FilterConfig = New-Object VMware.Vim.DvsTrafficFilterConfig
$Spec.DefaultPortConfig.FilterPolicy.FilterConfig.TrafficRuleset = New-Object VMware.Vim.DvsTrafficRuleset
*****Error*****
Property 'TrafficRuleset' cannot be found on this object; make sure it exists and is settable.
At line:1 char:74
+ $Spec.DefaultPortConfig.FilterPolicy.FilterConfig.DvsTrafficFilterConfig. <<<< TrafficRuleset = New-Object VMware.Vim.DvsTrafficRuleset
+ CategoryInfo : InvalidOperation: (TrafficRuleset:String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
*************
I was also able to map put where the values are stored.
FilterPolicy : VMware.Vim.DvsFilterPolicy
FilterConfig Property VMware.Vim.DvsFilterConfig[] FilterConfig {get;set;}
TrafficRuleset Property VMware.Vim.DvsTrafficRuleset TrafficRuleset {get;set;}
Enabled Property System.Nullable`1[[System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] Enabled {get;set;} #True
Rules Property VMware.Vim.DvsTrafficRule[] Rules {get;set;}
Description Property System.String Description {get;set;} #Network Traffic Rule 1
Direction Property System.String Direction {get;set;} #outgoingPackets
Qualifier Property VMware.Vim.DvsNetworkRuleQualifier[] Qualifier {get;set;}
TypeOfSystemTraffic Property VMware.Vim.StringExpression TypeOfSystemTraffic {get;set;}
Value Property System.String Value {get;set;} #vmotion
Action Property VMware.Vim.DvsNetworkRuleAction Action {get;set;}
QosTag Property System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] QosTag {get;set;} #4
I'm still stuck on this one.
$VDSPortGroup = Get-VDSwitch Test-dvSwitch | Get-VDPortGroup Test-PG
$Spec = New-Object VMware.Vim.DVPortgroupConfigSpec
$Spec.ConfigVersion = $VDSPortGroup.ExtensionData.Config.ConfigVersion
$Spec.DefaultPortConfig = New-Object VMware.Vim.VMwareDVSPortSetting
$Spec.DefaultPortConfig.FilterPolicy = New-Object VMware.Vim.DvsFilterPolicy
$Spec.DefaultPortConfig.FilterPolicy.FilterConfig = New-Object VMware.Vim.DvsTrafficFilterConfig
Everything works until this point. If you run $Spec.DefaultPortConfig.FilterPolicy.FilterConfig | gm you are able to see that TrafficRuleSet is part of it. However, when attempting to add the below line it errors.
$Spec.DefaultPortConfig.FilterPolicy.FilterConfig.TrafficRuleset = New-Object VMware.Vim.DvsTrafficRuleset
Property 'TrafficRuleset' cannot be found on this object; make sure it exists and is settable.
At line:1 char:51
+ $Spec.DefaultPortConfig.FilterPolicy.FilterConfig. <<<< TrafficRuleset = New-Object VMware.Vim.DvsTrafficRuleset
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
Maybe, I'm not even looking in the right place to update the Traffic Filtering and Marking? I'm not sure at this point, but any help is greatly appreciated.
Sorry, it took a bit longer than expected.
Try like this
$dvSwName = 'dvSw1'
$dvPgNames = 'dvPg1'
$dvSw = Get-VDSwitch -Name $dvSwName
# Enable LBT
foreach($pg in (Get-View -Id $dvSw.ExtensionData.Portgroup | Where {$dvPgNames -contains $_.Name})){
$spec = New-Object VMware.Vim.DVPortgroupConfigSpec
$spec.ConfigVersion = $pg.Config.ConfigVersion
$spec.DefaultPortConfig = New-Object VMware.Vim.VMwareDVSPortSetting
$spec.DefaultPortConfig.FilterPolicy = New-Object VMware.Vim.DvsFilterPolicy
$filter = New-Object VMware.Vim.DvsTrafficFilterConfig
$filter.AgentName = 'dvfilter-generic-vmware'
$ruleSet = New-Object VMware.Vim.DvsTrafficRuleset
$ruleSet.Enabled = $true
$rule =New-Object VMware.Vim.DvsTrafficRule
$rule.Description = 'Traffic Rule Name'
$rule.Direction = 'outgoingPackets'
$action = New-Object VMware.Vim.DvsUpdateTagNetworkRuleAction
$action.QosTag = 4
$rule.Action += $action
$ruleSet.Rules += $rule
$filter.TrafficRuleSet += $ruleSet
$spec.DefaultPortConfig.FilterPolicy.FilterConfig += $filter
$pg.ReconfigureDVPortgroup($spec)
}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Thanks Luc! This worked great. I really appreciate the help!