templates/replicated_service.py (59 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.
"""Creates a backend-service that replicates autoscaled_group across X zones."""
import copy
import autoscaled_group
import common
import default
# Properties in use by this component
HEALTH_PATH = default.HEALTH_PATH
PORT = default.PORT
REPLICAS = default.REPLICAS
SERVICE = default.SERVICE
# Generated in the REPLICAS properties
GENERATED_PROP = default.GENERATED_PROP
GEN_NAME = 'generatedName'
def GenerateBackendService(context):
"""Generates one backendService resource."""
prop = context.properties
port = prop[default.PORT]
health_path = prop[default.HEALTH_PATH]
default_srv = prop[default.SERVICE]
outputs = prop.setdefault(GENERATED_PROP, dict())
be_name = common.AutoName(context.env['name'], default.BACKEND_SERVICE)
hc_name = common.AutoName(context.env['name'], default.HEALTHCHECK)
# pyformat: disable
resource = [
{
'name': hc_name,
'type': default.HEALTHCHECK,
'properties': {
'port': port,
'requestPath': health_path,
}
}, {
'name': be_name,
'type': default.BACKEND_SERVICE,
'properties': {
'port': port,
'portName': default_srv,
'backends': GenerateBackends(context),
'healthChecks': [common.Ref(hc_name)],
'generatedProperties': outputs
}
}
]
# pyformat: enable
return resource
def GenerateBackends(context):
"""Generates dictionary of IGMs connected to a backeend service."""
name = context.env['name']
prop = context.properties
replicas = prop[REPLICAS]
backends = []
for zone_dict in replicas:
short_abbrv = common.ShortenZoneName(zone_dict[default.ZONE])
ig_name = common.AutoName(name, default.IGM, short_abbrv)
zone_dict[GEN_NAME] = ig_name
backend = {'name': ig_name, 'group': common.RefGroup(ig_name)}
backends.append(backend)
prop[GENERATED_PROP][REPLICAS] = copy.deepcopy(replicas)
return backends
def GenerateResourceList(context):
"""Returns list of resources generated by this module."""
resources = autoscaled_group.GenerateNAutoscaledGroup(context)
resources += GenerateBackendService(context)
return resources
@common.FormatErrorsDec
def GenerateConfig(context):
"""Generates YAML resource configuration."""
return common.MakeResource(GenerateResourceList(context))