templates/http_load_balancer.py (76 lines of code) (raw):
# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Connects services to HTTP Load Balancer.
This is normaly to be used with a Back-End service (replicated_service.py).
It essentially allows you to deploy IGM and AS combinations to X number
of zones and places an http load balancer in front of the service.
"""
import common
import default
# Properties for this component
DEFAULT_SERVICE = default.DEFAULT_SERVICE
HOST_RULES = default.HOST_RULES
IP_PROTO = default.IP_PROTO
PATH_MATCHERS = default.PATH_MATCHERS
PORT = default.PORT
SRC_RANGES = default.SRC_RANGES
ADD_FIREWALL = 'addFirewall'
N_OF_IPS = 'numberOfIps'
def GenerateLoadBalancer(context):
"""Generates the urlMap and globalForwardingRule part of the LB."""
name = context.env['name']
prop = context.properties
resource = [
{
'name': common.AutoName(name, default.URL_MAP),
'type': default.URL_MAP,
'properties': {
'defaultService': prop[DEFAULT_SERVICE],
'hostRules': prop[HOST_RULES],
'pathMatchers': prop[PATH_MATCHERS],
}
}, {
'name': common.AutoName(name, default.PROXY),
'type': default.PROXY,
'properties': {
'urlMap': common.AutoRef(name, default.URL_MAP),
}
},
] # pyformat: disable
return resource
def GenerateGlobalForwardingRule(context, number):
"""Generates a Global Forwarding Rule with the passed name."""
name = context.env['name']
prop = context.properties
protocol = prop[IP_PROTO]
return {
'name': common.AutoName(name, default.GF_RULE, str(number)),
'type': default.GF_RULE,
'properties': {
'IPProtocol': protocol,
'portRange': prop[PORT],
'target': common.AutoRef(name, default.PROXY),
}
} # pyformat: disable
def GenerateNGlobalForwardingRules(context):
"""Generates one or more ip addresses that points to this Load Balancer."""
prop = context.properties
n_of_ips = prop[N_OF_IPS]
return [GenerateGlobalForwardingRule(context, idx)
for idx in xrange(0, n_of_ips)]
def GenerateFirewall(context):
"""Generates a firewall if prop[ADD_FIREWALL] is true."""
name = context.env['name']
prop = context.properties
src_ranges = prop[SRC_RANGES]
add_firewall = prop[ADD_FIREWALL]
instances = []
if add_firewall:
# pyformat: disable
instances.append({
'name': common.AutoName(name, default.FIREWALL),
'type': default.FIREWALL,
'properties': {
'sourceRanges': src_ranges,
'allowed': [{
'IPProtocol': prop[IP_PROTO],
'ports': [prop[PORT]],
}],
}
})
# pyformat: enable
return instances
def GenerateResourceList(context):
"""Returns list of resources generated by this module."""
resources = GenerateLoadBalancer(context)
resources += GenerateNGlobalForwardingRules(context)
resources += GenerateFirewall(context)
return resources
@common.FormatErrorsDec
def GenerateConfig(context):
"""Generates YAML resource configuration."""
return common.MakeResource(GenerateResourceList(context))