templates/autoscaled_group.py (60 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 an autoscaled IGM that will create VMs with a passed template. This is normaly to be used with a Back-End service. It essentially allows you to deploy IGM and AS combinations to X number of zones. """ import common import default # Specific properties for this component # Inside the Zones dict SIZE = default.SIZE MAX_NUM = default.MAX_NUM ZONE = default.ZONE # Generic for all autoscaled_group created PROJECT = default.PROJECT VM_TEMPLATE = default.VM_TEMPLATE def GenerateAutscaledGroup(context, zone_dict): """Generate one autoscaled_group resource Dict with a passed zone.""" name = context.env['name'] project = context.env[PROJECT] prop = context.properties zone = zone_dict[default.ZONE] zone_abbrv = common.ShortenZoneName(zone) as_name = common.AutoName(name, default.AUTOSCALER, zone_abbrv) base_name = name + '-' + default.AKA[default.INSTANCE] igm_name = common.AutoName(name, default.IGM, zone_abbrv) max_num = zone_dict[MAX_NUM] project = context.env[default.PROJECT] size = zone_dict[SIZE] vm_template = prop[VM_TEMPLATE] # pyformat: disable resource = [ { 'name': igm_name, 'type': default.IGM, 'properties': { 'project': project, 'zone': zone, 'targetSize': size, 'baseInstanceName': base_name, 'instanceTemplate': vm_template } }, { 'name': as_name, 'type': default.AUTOSCALER, 'properties': { 'project': project, 'zone': zone, 'target': common.Ref(igm_name), 'autoscalingPolicy': { 'maxNumReplicas': max_num } } } ] # pyformat: enable return resource def GenerateNAutoscaledGroup(context): """Generates N groups of IGM and AUTOSCALER combinations. The groups are all the same except the zone in which they run. That is determined by the ZoneList property. Args: context: The DM PythonEvaluationContext Returns: list of resources to be deployed. """ i_template = context.properties[default.VM_TEMPLATE] if not common.IsComputeLink(i_template): context.properties[VM_TEMPLATE] = common.GlobalComputeLink( context.env[default.PROJECT], 'instanceTemplates', i_template) replica_list = context.properties[default.REPLICAS] resource_list = [] for zone_dict in replica_list: resource_list.extend(GenerateAutscaledGroup(context, zone_dict)) return resource_list def GenerateResourceList(context): """Returns list of resources generated by this module.""" return GenerateNAutoscaledGroup(context) @common.FormatErrorsDec def GenerateConfig(context): """Generates YAML resource configuration.""" return common.MakeResource(GenerateResourceList(context))