# Copyright 2013 Eucalyptus Systems, Inc. # # Redistribution and use of this software in source and binary forms, # with or without modification, are permitted provided that the following # conditions are met: # # Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from euca2ools.commands.elasticloadbalancing import ELBRequest from requestbuilder import Arg from requestbuilder.mixins import TabifyingMixin class DescribeLoadBalancers(ELBRequest, TabifyingMixin): DESCRIPTION = 'Show information about load balancers' ARGS = [Arg('LoadBalancerNames.member', metavar='ELB', nargs='*', help='limit results to specific load balancers'), Arg('--show-long', action='store_true', route_to=None, help="show all of the load balancers' info")] LIST_TAGS = ['LoadBalancerDescriptions', 'AvailabilityZones', 'BackendServerDescriptions', 'Instances', 'ListenerDescriptions', 'PolicyNames', 'AppCookieStickinessPolicies', 'LBCookieStickinessPolicies', 'OtherPolicies', 'SecurityGroups', 'Subnets'] def print_result(self, result): for desc in result.get('LoadBalancerDescriptions', []): bits = ['LOAD_BALANCER', desc.get('LoadBalancerName'), desc.get('DNSName')] if self.args['show_long']: bits.append(desc.get('CanonicalHostedZoneName')) bits.append(desc.get('CanonicalHostedZoneNameID')) check = desc.get('HealthCheck') if check is not None: check_str_bits = [] elem_map = (('interval', 'Interval'), ('target', 'Target'), ('timeout', 'Timeout'), ('healthy-threshold', 'HealthyThreshold'), ('unhealthy-threshold', 'UnhealthyThreshold')) for name, xmlname in elem_map: if check.get(xmlname): check_str_bits.append(name + '=' + check[xmlname]) if len(check_str_bits) > 0: bits.append('{' + ','.join(check_str_bits) + '}') else: bits.append(None) else: bits.append(None) bits.append(','.join(zone for zone in desc.get('AvailabilityZones', []))) bits.append(','.join(net for net in desc.get('Subnets', []))) bits.append(desc.get('VPCId')) bits.append(','.join(instance.get('InstanceId') for instance in desc.get('Instances', []))) listeners = [] for listenerdesc in desc.get('ListenerDescriptions', []): listener = listenerdesc.get('Listener', {}) listener_str_bits = [] elem_map = (('protocol', 'Protocol'), ('lb-port', 'LoadBalancerPort'), ('instance-protocol', 'InstanceProtocol'), ('instance-port', 'InstancePort'), ('cert-id', 'SSLCertificateId')) for name, xmlname in elem_map: if listener.get(xmlname): listener_str_bits.append(name + '=' + listener[xmlname]) if listenerdesc.get('PolicyNames'): listener_str_bits.append( '{' + ','.join(listenerdesc['PolicyNames']) + '}') listeners.append('{' + ','.join(listener_str_bits) + '}') if len(listeners) > 0: bits.append(','.join(listeners)) else: bits.append(None) beservers = [] for bedesc in desc.get('BackendServerDescriptions', []): beserver_str_bits = [] if 'InstancePort' in bedesc: beserver_str_bits.append('instance-port=' + bedesc['InstancePort']) if 'PolicyNames' in bedesc: policies = ','.join(policy for policy in bedesc['PolicyNames']) beserver_str_bits.append('policies={' + policies + '}') beservers.append('{' + ','.join(beserver_str_bits) + '}') if len(beservers) > 0: bits.append(','.join(beservers)) else: bits.append(None) all_policies = desc.get('Policies') or {} app_policies = all_policies.get( 'AppCookieStickinessPolicies') or {} app_policy_strs = ['{{policy-name={0},cookie-name={1}}}' .format(policy.get('PolicyName'), policy.get('CookieName')) for policy in app_policies] bits.append(','.join(app_policy_strs) or None) lb_policies = all_policies.get( 'LBCookieStickinessPolicies') or {} lb_policy_strs = ['{{policy-name={0},expiration-period={1}}}' .format(policy.get('PolicyName'), policy.get('CookieExpirationPeriod')) for policy in lb_policies] bits.append(','.join(lb_policy_strs) or None) other_policies = all_policies.get('OtherPolicies') or {} if other_policies: bits.append('{' + ','.join(other_policies) + '}') else: bits.append(None) group = desc.get('SourceSecurityGroup') if group: bits.append('{{owner-alias={0},group-name={1}}}'.format( group.get('OwnerAlias', ''), group.get('GroupName', ''))) else: bits.append(None) if desc.get('SecurityGroups'): bits.append('{' + ','.join(desc['SecurityGroups']) + '}') else: bits.append(None) bits.append(desc.get('CreatedTime')) bits.append(desc.get('Scheme')) print self.tabify(bits)