iControl 101 - #22 - GTM Data Centers
The components that make up the BIG-IP Global Traffic Manager can be divided into two categories: logical and physical components. Logical Components are abstractions of network resources, such as virtual servers. Physical components, on the other hand, have a direct correlation with one or more physical entities on the network. In this article, I will disucss Data Centers (one of the physical network components in the Global Traffic Manager) and illustrate how to programmatically manage them with the iControl API.
A data center defines the group of Global Traffic Managers, Local Traffic Managers, and host systems that reside in a single physical location. Within the Global Traffic Manager, a data center contains at least one server and one link. Every resource, whether physical or logical, is associated in some way with a data center. The Global Traffic Manager consolidates the paths and metrics data collected from both servers, virtual servers, and links into the data center, and uses that consolidated data when conducting load balancing operations.
Any server or link that you add to the Global Traffic Manager configuration must belong to one and only one data center, and you must configure at least one data center before you can add servers to the Global Traffic Manager configuration.
Usage
The following code samples will build a PowerShell command line application allowing control over GTM Data Centers. This program takes as input the bigip, username, and password as well as a subcommand and optional parameters. Usage is displayed with the Write-Usage function
param ( $g_bigip = $null, $g_uid = $null, $g_pwd = $null, $g_cmd = $null, $g_name = $null, $g_arg1 = $null, $g_arg2 = $null ); Set-PSDebug -strict; function Write-Usage() { Write-Host @" Usage: GtmDataCenter.ps1 host uid pwd [options] options ------- list - Get a list of rate classess create name location contact - Create a data center. setcontact name contact - Set the contact info for the given data center. setlocation name location - Set the location info for the given data center. setstate name [enabled|disabled] - Set the enabled state for the given data center. getstatistics name - Get the statisics for the given data center. "@; exit; }
Initialization
As is with all of my iControl PowerShell scripts, validation is made as to whether the iControlSnapin is loaded into the current powershell context. The Initialize-F5.iControl cmdlet is then called to setup the connection to the BIG-IP for subsequent calls.
The main application logic checks for the passed in command and then passes control to one of the local functions defined below:
function Do-Initialize() { if ( (Get-PSSnapin | Where-Object { $_.Name -eq "iControlSnapIn"}) -eq $null ) { Add-PSSnapIn iControlSnapIn } $success = Initialize-F5.iControl -HostName $g_bigip -Username $g_uid -Password $g_pwd; return $success; } if ( ($g_bigip -eq $null) -or ($g_uid -eq $null) -or ($g_pwd -eq $null) ) { Write-Usage; } if ( Do-Initialize ) { switch ($g_cmd) { "" { Get-DataCenterList; } "list" { Get-DataCenterList $g_name; } "create" { Create-DataCenter $g_name $g_arg1 $g_arg2; } "delete" { Delete-DataCenter $g_name; } "setcontact" { Set-DataCenterContact $g_name $g_arg1; } "setlocation" { Set-DataCenterLocation $g_name $g_arg1; } "setstate" { Set-DataCenterEnabledState $g_name $g_arg1; } "getstatistics" { Get-DataCenterStatistics $g_name; } default { Write-Usage; } } } else { Write-Error "ERROR: iControl subsystem not initialized" }
Retrieving Information About Existing Data Centers
A Data Center is comprised of its Name, a location, and a contact. These can be retrieved with the iControl GlobalLBDataCenter.get_list(), get_location_information(), and get_contact_information() methods respectively. Several other attributes that are read-only include the enabled states, object status, and the links and servers that are part of the specific data center.
The following Get-DataCenterList function will aggregate all the information about a specifed data center (or all data centers if none are supplied) and the results are displayed to the host output stream.
function Get-DataCenterList() { param([string]$dc = $null ); if ( $dc ) { $dc_list = ,$dc; } else { $dc_list = (Get-F5.iControl).GlobalLBDataCenter.get_list(); } Write-Host "Data Centers:"; if ( $dc_list ) { $contacts = (Get-F5.iControl).GlobalLBDataCenter.get_contact_information($dc_list); $locations = (Get-F5.iControl).GlobalLBDataCenter.get_location_information($dc_list); $enabled_states = (Get-F5.iControl).GlobalLBDataCenter.get_enabled_state($dc_list); $statuses = (Get-F5.iControl).GlobalLBDataCenter.get_object_status($dc_list); $links = (Get-F5.iControl).GlobalLBDataCenter.get_link($dc_list); $servers = (Get-F5.iControl).GlobalLBDataCenter.get_server($dc_list); for($i=0; $i -lt $dc_list.Length; $i++) { Write-Host @" -------------------- Data Center $($dc_list[$i]) Contact : $($contacts[$i]) Location : $($locations[$i]) Enabled State : $($enabled_states[$i]) Availability : $($statuses[$i].availability_status) Enabled Status: $($statuses[$i].enabled_status) Status Desc :$($statuses[$i].status_description) "@ Write-Host " Links :"; for($j=0; $j -lt $links[$i].links.Length; $j++) { Write-Host " [$j] $($links[$i].links[$j])" } Write-Host " Servers :"; for($j=0; $j -lt $servers[$i].servers.Length; $j++) { Write-Host " [$j] $($servers[$i].servers[$j])" } } } }
PS C:\> .\PsGtmDataCenter.ps1 bigip username password Data Centers: -------------------- Data Center JoesRack Contact : Joe Pruitt Location : Joes Cube Enabled State : STATE_ENABLED Availability : AVAILABILITY_STATUS_BLUE Enabled Status: ENABLED_STATUS_ENABLED Status Desc : DC JoesRack: Checking Links : Servers : [0] theboss2
Creating Data Centers
Creating a data center only requires you specify the name location and contact information. The Name is intended to be a descriptive name for the data center such as "New York 1" or "West Coast". The Location should be a description of the geographic area in which the data center resides such as "New York City - Building A". And the contact information is for the name of the individual responsible for managing the network at the data center.
The following Create-DataCenter function will take these parameters as input and pass them to the iControl GlobalLBDataCenter.create() method. After the data center is created, it's attributes will be queried with the Get-DataCenterList function.
function Create-DataCenter() { param([string]$name = $null, [string]$location = $null, [string]$contact = $null); if ( $name -and $location -and $contact ) { $dca = New-Object -TypeName iControl.GlobalLBDataCenterDataCenterAttribute; $dca.name = $name; $dca.location = $location; $dca.contact = $contact; (Get-F5.iControl).GlobalLBDataCenter.create( (,$dca) ); Get-DataCenterList $name; } }
PS C:\> .\PsGtmDataCenter.ps1 bigip username password create "Seattle DC" "Elliot Ave W" "Joe Pruitt" Data Centers: -------------------- Data Center Seattle DC Contact : Joe Pruitt Location : Elliot Ave W Enabled State : STATE_ENABLED Availability : AVAILABILITY_STATUS_BLUE Enabled Status: ENABLED_STATUS_ENABLED Status Desc : DC Seattle DC: Checking Links : Servers :
Deleteing Data Centers
Well, if you want to create a data center, odds are someday you will want to delete one. this can be accomplished with the iControl GlobalLBDataCenter.delete_data_center() method as illustrated in the following Delete-DataCenter function.
function Delete-DataCenter() { param([string]$name = $null); if ( $name ) { $dca = New-Object -TypeName iControl.GlobalLBDataCenterDataCenterAttribute; (Get-F5.iControl).GlobalLBDataCenter.delete_data_center( (,$name) ); Get-DataCenterList; } }
PS C:\> .\PsGtmDataCenter.ps1 bigip username password delete "Seattle DC" Data Centers: -------------------- Data Center JoesRack Contact : Joe Pruitt Location : Joes Cube Enabled State : STATE_ENABLED Availability : AVAILABILITY_STATUS_BLUE Enabled Status: ENABLED_STATUS_ENABLED Status Desc : DC JoesRack: Checking Links : Servers : [0] theboss2
Modifying the Data Center Contact
As I mentioned above, the contact refers to the individual who is responsible for managing the network at the data center. This property can be changed with the iControl GlobalLBDataCenter.set_contact_information() method as illustrated in the Set-DataCenterContact function below. After the contact is updated, the information about the given data center is then queried to verify that the contact information was changed.
function Set-DataCenterContact() { param([string]$name = $null, [string]$contact = $null); if ( $name -and $contact ) { (Get-F5.iControl).GlobalLBDataCenter.set_contact_information( (, $name), (, $contact) ); Get-DataCenterList $name; } }
PS C:\> .\PsGtmDataCenter.ps1 bigip username password setcontact "Seattle DC" "Fred Garvin" Data Centers: -------------------- Data Center Seattle DC Contact : Fred Garvin Location : Elliot Ave W Enabled State : STATE_ENABLED Availability : AVAILABILITY_STATUS_BLUE Enabled Status: ENABLED_STATUS_ENABLED Status Desc : DC Seattle DC: Checking Links : Servers :
Modifying the Data Center Location
If you didn't get the location correct when you created the data center, you can easily change it with the iControl GlobalLBDataCenter.set_location_information() method. The Set-DataCenterLocation function works very similarly to the Set-DataCenterContact function as you'll see below.
function Set-DataCenterLocation() { param([string]$name = $null, [string]$location = $null); if ( $name -and $location ) { (Get-F5.iControl).GlobalLBDataCenter.set_location_information( (, $name), (, $location) ); Get-DataCenterList $name; } }
PS C:\> .\PsGtmDataCenter.ps1 bigip username password setlocation "Seattle DC" "30 Rock" Data Centers: -------------------- Data Center Seattle DC Contact : Fred Garvin Location : 30 Rock Enabled State : STATE_ENABLED Availability : AVAILABILITY_STATUS_BLUE Enabled Status: ENABLED_STATUS_ENABLED Status Desc : DC Seattle DC: Checking Links : Servers :
Modifying the Data Center Enabled State
When you create a data center, you'll need to determine whether you want the data center enabled or not. The default value is enabled so if you want it disabled, you'll have to explicity call the iControl GlobalLBDataCenter.set_enabled_state() method as shown in the Set-DataCenterEnabledState function.
Resources associated with a data center are available only if the following criteria are met:
- The data center is enabled.
- The data center is avialable, based on metrics collected by the Global Traffic Manager.
You can enable or disable a data center, allowing you to remove a data center temporarily (for a maintenance window) from the Global Traffic Manager's load balancing operations.
function Set-DataCenterEnabledState() { param([string]$name = $null, [string]$state = $null); if ( $name -and $state ) { $EnabledState = "STATE_DISABLED"; if ( $state -eq "enabled" ) { $EnabledState = "STATE_ENABLED"; } (Get-F5.iControl).GlobalLBDataCenter.set_enabled_state( (, $name), (, $EnabledState) ); Get-DataCenterList $name; } }
PS C:\> .\PsGtmDataCenter.ps1 bigip username password setstate "Seattle DC" disabled Data Centers: -------------------- Data Center Seattle DC Contact : Fred Garvin Location : 30 Rock Enabled State : STATE_DISABLED Availability : AVAILABILITY_STATUS_BLUE Enabled Status: ENABLED_STATUS_DISABLED Status Desc : DC Seattle DC: Checking : disabled directly Links : Servers :
Querying Data Center Statistics
Statistics are available for the data center by calling the iControl GlobalLBDataCenter.get_statistics() method. The following Get-DataCenterStatistics function calls that method and prints out the statistics such as CPU usage, available memory, throughput and connections.
function Get-DataCenterStatistics { param([string]$name = $null); if ( $name ) { $DataCenterStats = (Get-F5.iControl).GlobalLBDataCenter.get_statistics( (,$name) ); $stats = $DataCenterStats.statistics[0]; Write-Host "Statistics for Data Center '$(${stats}.data_center)'" foreach ($stat in $stats.statistics) { $val = Convert-To64Bit $stat.value.high $stat.value.low; Write-Host " " ("{0,-44}" -f ${stat}.type) "=" $val } } }
PS C:\> .\PsGtmDataCenter.ps1 bigip username password getstatistics "Seattle DC" Statistics for Data Center 'Seattle DC' STATISTIC_GTM_METRICS_CPU_USAGE = 0 STATISTIC_GTM_METRICS_MEMORY_AVAILABLE = 0 STATISTIC_GTM_METRICS_BITS_PER_SECOND_IN = 0 STATISTIC_GTM_METRICS_BITS_PER_SECOND_OUT = 0 STATISTIC_GTM_METRICS_PACKETS_PER_SECOND_IN = 0 STATISTIC_GTM_METRICS_PACKETS_PER_SECOND_OUT = 0 STATISTIC_GTM_METRICS_TOTAL_CONNECTIONS = 0
Utility Functions
The Convert-To64Bit function will take as input the low and high 32 bit values from the iControl Common.UInt64 structure returned in the get_statistics() method.
function Convert-To64Bit() { param($high, $low); $low = [Convert]::ToString($low,2).PadLeft(32,'0') if($low.length -eq "64") { $low = $low.substring(32,32) } return [Convert]::ToUint64([Convert]::ToString($high,2).PadLeft(32,'0')+$low,2); }
Conclusion
Now you have all the tools to automate the monitoring and management of your Global Traffic Manager's Data Centers.
The full source code for this application can be found under the PsGtmDataCenter entry in the iControl CodeShare.