cf_factory 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. data/examples/base_vpc.rb +40 -0
  2. data/examples/cloudinit_script_for_one_instance.rb +77 -0
  3. data/examples/cloudinit_script_with_autoscaling.rb +85 -0
  4. data/examples/elb_with_cloudfront.rb +101 -0
  5. data/examples/instance_with_eip.rb +38 -0
  6. data/examples/instance_with_yum.rb +38 -0
  7. data/examples/just_an_instance.rb +29 -0
  8. data/examples/play_with_region_and_zones.rb +26 -0
  9. data/examples/ra_web_hosting.rb +146 -0
  10. data/examples/s3_with_cloudfront.rb +36 -0
  11. data/examples/test_vpc.rb +53 -0
  12. data/lib/cf_factory/as/cf_as_group.rb +75 -0
  13. data/lib/cf_factory/as/cf_as_launch_config.rb +53 -0
  14. data/lib/cf_factory/as/cf_as_scaling_policy.rb +33 -0
  15. data/lib/cf_factory/base/cf_base.rb +97 -0
  16. data/lib/cf_factory/base/cf_ec2_tag.rb +32 -0
  17. data/lib/cf_factory/base/cf_generator.rb +18 -0
  18. data/lib/cf_factory/base/cf_helper.rb +91 -0
  19. data/lib/cf_factory/base/cf_inner.rb +55 -0
  20. data/lib/cf_factory/base/cf_main.rb +101 -0
  21. data/lib/cf_factory/base/cf_mapping.rb +26 -0
  22. data/lib/cf_factory/base/cf_named_inner.rb +0 -0
  23. data/lib/cf_factory/base/cf_output.rb +24 -0
  24. data/lib/cf_factory/base/cf_parameter.rb +25 -0
  25. data/lib/cf_factory/base/cf_script_reader.rb +32 -0
  26. data/lib/cf_factory/cloudformation/cf_cloud_formation_init.rb +25 -0
  27. data/lib/cf_factory/cloudformation/cf_cloudformation_command.rb +37 -0
  28. data/lib/cf_factory/cloudformation/cf_cloudformation_commands.rb +25 -0
  29. data/lib/cf_factory/cloudformation/cf_cloudformation_config.rb +33 -0
  30. data/lib/cf_factory/cloudformation/cf_cloudformation_file.rb +38 -0
  31. data/lib/cf_factory/cloudformation/cf_cloudformation_files.rb +25 -0
  32. data/lib/cf_factory/cloudformation/cf_cloudformation_inner.rb +28 -0
  33. data/lib/cf_factory/cloudformation/cf_cloudformation_package.rb +34 -0
  34. data/lib/cf_factory/cloudformation/cf_cloudformation_packages.rb +42 -0
  35. data/lib/cf_factory/cloudformation/cf_cloudformation_sources.rb +30 -0
  36. data/lib/cf_factory/cloudformation/cf_init_script.rb +73 -0
  37. data/lib/cf_factory/cloudfront/cf_cache_behavior.rb +37 -0
  38. data/lib/cf_factory/cloudfront/cf_cache_behaviors.rb +28 -0
  39. data/lib/cf_factory/cloudfront/cf_cloudfront_distribution.rb +64 -0
  40. data/lib/cf_factory/cloudfront/cf_custom_origin_config.rb +37 -0
  41. data/lib/cf_factory/cloudfront/cf_default_cache_behavior.rb +32 -0
  42. data/lib/cf_factory/cloudfront/cf_distribution_config.rb +31 -0
  43. data/lib/cf_factory/cloudfront/cf_forwarded_values.rb +25 -0
  44. data/lib/cf_factory/cloudfront/cf_logging.rb +24 -0
  45. data/lib/cf_factory/cloudfront/cf_origin.rb +40 -0
  46. data/lib/cf_factory/cloudfront/cf_s3_origin_config.rb +25 -0
  47. data/lib/cf_factory/cloudwatch/cf_cloud_watch_alarm.rb +58 -0
  48. data/lib/cf_factory/ec2/cf_ebs_volume.rb +54 -0
  49. data/lib/cf_factory/ec2/cf_ec2_instance.rb +62 -0
  50. data/lib/cf_factory/ec2/cf_ec2_security_group.rb +40 -0
  51. data/lib/cf_factory/ec2/cf_ec2_security_group_egress.rb +28 -0
  52. data/lib/cf_factory/ec2/cf_ec2_security_group_ingress.rb +39 -0
  53. data/lib/cf_factory/ec2/cf_eip.rb +26 -0
  54. data/lib/cf_factory/ec2/cf_eip_association.rb +29 -0
  55. data/lib/cf_factory/elb/cf_app_cookie_stickiness_policy.rb +15 -0
  56. data/lib/cf_factory/elb/cf_elb.rb +49 -0
  57. data/lib/cf_factory/elb/cf_health_check.rb +23 -0
  58. data/lib/cf_factory/elb/cf_lb_cookie_stickiness_policy.rb +15 -0
  59. data/lib/cf_factory/elb/cf_listener.rb +26 -0
  60. data/lib/cf_factory/help/fixes.rb +14 -0
  61. data/lib/cf_factory/help/ip_mask.rb +165 -0
  62. data/lib/cf_factory/help/template_validation.rb +28 -0
  63. data/lib/cf_factory/iam/cf_iam_access_key.rb +32 -0
  64. data/lib/cf_factory/iam/cf_iam_group.rb +30 -0
  65. data/lib/cf_factory/iam/cf_iam_instance_profile.rb +30 -0
  66. data/lib/cf_factory/iam/cf_iam_policy.rb +18 -0
  67. data/lib/cf_factory/iam/cf_iam_role.rb +56 -0
  68. data/lib/cf_factory/iam/cf_iam_statement.rb +23 -0
  69. data/lib/cf_factory/iam/cf_iam_user.rb +34 -0
  70. data/lib/cf_factory/iam/cf_policy_document.rb +19 -0
  71. data/lib/cf_factory/modules/base_vpc.rb +61 -0
  72. data/lib/cf_factory/rds/cf_rds_instance.rb +53 -0
  73. data/lib/cf_factory/rds/cf_rds_security_group.rb +33 -0
  74. data/lib/cf_factory/rds/cf_rds_security_group_ingress.rb +29 -0
  75. data/lib/cf_factory/rds/cf_rds_subnet_group.rb +29 -0
  76. data/lib/cf_factory/route53/cf_elb_alias_target.rb +21 -0
  77. data/lib/cf_factory/route53/cf_record_set.rb +61 -0
  78. data/lib/cf_factory/route53/cf_route53_record_set.rb +61 -0
  79. data/lib/cf_factory/route53/cf_route53_record_set_group.rb +42 -0
  80. data/lib/cf_factory/s3/cf_s3_bucket.rb +32 -0
  81. data/lib/cf_factory/s3/cf_web_site_config.rb +24 -0
  82. data/lib/cf_factory/sqs/cf_sqs_queue.rb +26 -0
  83. data/lib/cf_factory/vpc/cf_attach_gateway.rb +28 -0
  84. data/lib/cf_factory/vpc/cf_internet_gateway.rb +30 -0
  85. data/lib/cf_factory/vpc/cf_network_acl.rb +39 -0
  86. data/lib/cf_factory/vpc/cf_network_acl_association.rb +24 -0
  87. data/lib/cf_factory/vpc/cf_network_acl_entry.rb +37 -0
  88. data/lib/cf_factory/vpc/cf_route.rb +43 -0
  89. data/lib/cf_factory/vpc/cf_route_table.rb +41 -0
  90. data/lib/cf_factory/vpc/cf_route_table_association.rb +24 -0
  91. data/lib/cf_factory/vpc/cf_subnet.rb +48 -0
  92. data/lib/cf_factory/vpc/cf_vpc.rb +64 -0
  93. data/lib/cf_factory.rb +103 -0
  94. metadata +140 -0
@@ -0,0 +1,53 @@
1
+ require 'help/include_libraries'
2
+
3
+ cf = CfMain.new("Bla bla bla")
4
+ ####### input parameters
5
+ parameter = CfParameter.new("KeyName", "Name of the key", "String", {"Default" => "majung"})
6
+ cf.add_parameter(parameter)
7
+ parameter2 = CfParameter.new("SecurityGroup", "Name of the security group", "String", {"Default" => "Blubber"})
8
+ cf.add_parameter(parameter2)
9
+
10
+ ####### mappings
11
+ mapping = CfMapping.new("Default","AMI",{"us-east-1" => "ami-c6699baf", "us-west-2" => "ami-52ff7262"})
12
+ cf.add_mapping(mapping)
13
+
14
+ ####### resources
15
+ #vpc
16
+ vpc = CfVpc.new("10.10.0.0/16")
17
+ cf.add_vpc(vpc)
18
+ igw = CfInternetGateway.new("MyInternetGateway", vpc)
19
+ vpc.add_internet_gateway(igw)
20
+ route_table = CfRouteTable.new("MyRouteTable")
21
+ vpc.add_route_table(route_table)
22
+ route1 = CfRoute.new("MyRoute1", "88.44.22.11/32", igw)
23
+ route2 = CfRoute.new("MyRoute2", "188.144.122.111/32", igw)
24
+ route_table.add_route(route1)
25
+ route_table.add_route(route2)
26
+
27
+ network_acl = CfNetworkAcl.new("MyAcl1")
28
+ vpc.add_network_acl(network_acl)
29
+ network_acl_entry = CfNetworkAclEntry.new("Acl1", "110", "6", "ALLOW", false, "0.0.0.0/0", 80, 80)
30
+ network_acl.add_network_acl_entry(network_acl_entry)
31
+
32
+ subnet1 = CfSubnet.new("WebTier1", "10.10.0.0/24", "eu-west-1a", route_table, network_acl)
33
+ vpc.add_subnet(subnet1)
34
+ subnet2 = CfSubnet.new("AppTier1", "10.10.1.0/24", "eu-west-1a", route_table, network_acl)
35
+ vpc.add_subnet(subnet2)
36
+ subnet3 = CfSubnet.new("DbTier1", "10.10.2.0/24", "eu-west-1a", route_table, network_acl)
37
+ vpc.add_subnet(subnet2)
38
+
39
+ #elb
40
+ #elb = CfElb.new("MyElb", {
41
+ # :availability_zones => "eu-west-1",
42
+ # :app_cookie_stickiness_policy => CfAppCookieStickinessPolicy.new("cookie-name","policy bla")})
43
+ #cf.add_elb(elb)
44
+ #puts elb.get_cf_properties()
45
+
46
+ ####### output parameters
47
+ output = CfOutput.new("VPC_ID", "Id of the VPC", vpc.generate_ref())
48
+ cf.add_output(output)
49
+
50
+
51
+ puts cf.generate
52
+
53
+ #puts "the reference for the VPC : #{vpc.generate_ref}"
@@ -0,0 +1,75 @@
1
+ require 'cf_factory/base/cf_base'
2
+ require 'cf_factory/base/cf_helper'
3
+
4
+ class CfAsGroup
5
+ include CfBase
6
+
7
+ def initialize(name, availability_zones, launch_config, load_balancers, max_size, min_size, options)
8
+ @name = name
9
+ @availability_zones = availability_zones
10
+ @launch_config = launch_config
11
+ @load_balancers = load_balancers
12
+ @max_size = max_size
13
+ @min_size = min_size
14
+
15
+ @cooldown = options[:cooldown]
16
+ @desired_capacity = options[:desired_capacity]
17
+ @health_check_grace_period = options[:health_check_grace_period]
18
+ @health_check_type = options[:health_check_type]
19
+ #TODO: NotificationConfiguration
20
+ @subnets = options[:subnets]
21
+ validate()
22
+ end
23
+
24
+ def set_tags(tag_list)
25
+ @tag_list = []
26
+ tag_list.each() {|tg|
27
+ tg2 = tg.clone
28
+ tg2.set_propagate_at_launch(true)
29
+ puts ">>>>>>>>>>>>>>>>>>>>> "+tg2.inspect
30
+ @tag_list << tg2
31
+ }
32
+ @tag_list
33
+ end
34
+
35
+ def validate
36
+ if @max_size < @min_size
37
+ raise Exception.new("max size (#{@max_size}) must be equal or larger min size (#{@min_size})")
38
+ end
39
+ if @health_check_type == "ELB" && @health_check_grace_period.nil?
40
+ raise Exception.new("HealthCheckGracePeriod must be specified for ElasticLoadBalancer based health checks.")
41
+ end
42
+ end
43
+
44
+ def get_cf_type
45
+ "AWS::AutoScaling::AutoScalingGroup"
46
+ end
47
+
48
+ def get_cf_attributes
49
+ {}
50
+ end
51
+
52
+ def get_cf_properties
53
+ result = {"AvailabilityZones" => @availability_zones,
54
+ "LaunchConfigurationName" => @launch_config.generate_ref,
55
+ "LoadBalancerNames" => CfHelper.generate_ref_array(@load_balancers),
56
+ "MaxSize" => @max_size,
57
+ "MinSize" => @min_size
58
+ }
59
+ result["Cooldown"] = @cooldown unless @cooldown.nil?
60
+ result["DesiredCapacity"] = @desired_capacity unless @desired_capacity.nil?
61
+ result["HealthCheckGracePeriod"] = @health_check_grace_period.to_i unless @health_check_grace_period.nil?
62
+ result["HealthCheckType"] = @health_check_type unless @health_check_type.nil?
63
+ result["VPCZoneIdentifier"] = CfHelper.generate_ref_array(@subnets) unless @subnets.nil?
64
+ result
65
+ end
66
+
67
+ def add_ingress_rule(ingress_rule)
68
+ @ingress_rules << ingress_rule
69
+ end
70
+
71
+ def add_egress_rule(egress_rule)
72
+ @egress_rules << egress_rule
73
+ end
74
+
75
+ end
@@ -0,0 +1,53 @@
1
+ require 'cf_factory/base/cf_base'
2
+ require 'cf_factory/base/cf_helper'
3
+
4
+ class CfAsLaunchConfig
5
+ include CfBase
6
+
7
+ def initialize(name, image_id, instance_type, options)
8
+ @name = name
9
+ @image_id = image_id
10
+ @instance_type = instance_type
11
+
12
+ @user_data = options[:user_data]
13
+ @key_name = options[:key_name]
14
+ @security_groups = options[:security_groups]
15
+ @spot_price = options[:spot_price]
16
+ #TODO: a couple of properties missing
17
+ validate()
18
+ end
19
+
20
+ def get_cf_type
21
+ "AWS::AutoScaling::LaunchConfiguration"
22
+ end
23
+
24
+ def get_cf_attributes
25
+ super
26
+ end
27
+
28
+ def get_cf_properties
29
+ result = {"ImageId" => @image_id,
30
+ "InstanceType" => @instance_type
31
+ }
32
+ result["UserData"] = CfHelper.base64(@user_data) unless @user_data.nil?
33
+ result["KeyName"] = @key_name unless @key_name.nil?
34
+ result["SecurityGroups"] = CfHelper.generate_ref_array(@security_groups) unless @security_groups.nil?
35
+ result["SpotPrice"] = @spot_price unless @spot_price.nil?
36
+ result
37
+ end
38
+
39
+ def add_ingress_rule(ingress_rule)
40
+ @ingress_rules << ingress_rule
41
+ end
42
+
43
+ def add_egress_rule(egress_rule)
44
+ @egress_rules << egress_rule
45
+ end
46
+
47
+ private
48
+
49
+ def validate
50
+ raise Exception.new("instance type #{@instance_type} is not supported") unless CfEc2Instance::SUPPORTED_TYPES.include?(@instance_type)
51
+ end
52
+
53
+ end
@@ -0,0 +1,33 @@
1
+ require 'cf_factory/base/cf_base'
2
+ require 'cf_factory/base/cf_helper'
3
+
4
+ class CfAsScalingPolicy
5
+ include CfBase
6
+
7
+ def initialize(name, auto_scaling_group, adjustment_type, scaling_adjustment, options = {})
8
+ @name = name
9
+ @auto_scaling_group = auto_scaling_group
10
+ @adjustment_type = adjustment_type
11
+ @scaling_adjustment = scaling_adjustment
12
+ @cooldown = options[:cooldown]
13
+ end
14
+
15
+ def get_cf_type
16
+ "AWS::AutoScaling::ScalingPolicy"
17
+ end
18
+
19
+ def get_cf_attributes
20
+ {}
21
+ end
22
+
23
+ def get_cf_properties
24
+ result = {
25
+ "AutoScalingGroupName" => @auto_scaling_group.generate_ref,
26
+ "AdjustmentType" => @adjustment_type,
27
+ "ScalingAdjustment" => @scaling_adjustment
28
+ }
29
+ result["Cooldown"] = @cooldown unless @cooldown.nil?
30
+ result
31
+ end
32
+
33
+ end
@@ -0,0 +1,97 @@
1
+ require 'cf_factory/base/cf_helper'
2
+
3
+ module CfBase
4
+ def get_name
5
+ @name
6
+ end
7
+
8
+ def get_cf_type
9
+ raise Exception.new("must be defined")
10
+ end
11
+
12
+ def get_deletion_policy
13
+ @deletion_policy
14
+ end
15
+
16
+ def get_cf_attributes
17
+ result = {}
18
+ result["Metadata"] = @meta_data.generate unless @meta_data.nil?
19
+ result
20
+ end
21
+
22
+ def get_cf_properties
23
+ raise Exception.new("must be defined")
24
+ end
25
+
26
+ def generate_ref
27
+ CfHelper.generate_ref(self.get_name)
28
+ end
29
+
30
+ def retrieve_attribute(attribute)
31
+ CfHelper.generate_att(@name, attribute)
32
+ end
33
+
34
+ def set_meta_data(meta_data)
35
+ @meta_data = meta_data
36
+ end
37
+
38
+ def set_tags(tag_list)
39
+ #should be overwritten by those resources that support tags
40
+ end
41
+
42
+ def hash_to_string(hash, indent=0)
43
+ output = ""
44
+ hash.keys.each() do |key|
45
+ value = hash[key]
46
+ output += " " * indent
47
+ case value.class.to_s
48
+ when "Hash"
49
+ output += " \"#{key}\" : \n{#{hash_to_string(value,indent+5)}},\n"
50
+ else
51
+ output += " \"#{key}\" : #{set_quotes(value)},\n"
52
+ end
53
+ end
54
+ output
55
+ output = output.chomp().chomp(",")
56
+
57
+ end
58
+
59
+ def generate
60
+ @result = ""
61
+ @result += " \"#{@name}\" : {\n"
62
+ unless self.get_cf_type() == nil
63
+ @result += " \"Type\" : \"#{self.get_cf_type()}\",\n"
64
+ end
65
+ unless self.get_deletion_policy() == nil
66
+ @result += " \"DeletionPolicy\" : \"#{self.get_deletion_policy()}\",\n"
67
+ end
68
+ attributes = self.get_cf_attributes
69
+ unless attributes.size == 0
70
+ @result += "#{hash_to_string(attributes)},\n"
71
+ end
72
+ #
73
+ properties = self.get_cf_properties
74
+ properties["Tags"] = CfHelper.generate_inner_array(@tag_list) unless @tag_list.nil?
75
+ unless properties.size == 0
76
+ @result += " \"Properties\" : {\n"
77
+ @result += hash_to_string(properties)
78
+ @result += "\n }"
79
+ end
80
+ @result = @result.chomp.chomp(",")
81
+ @result += "\n },\n"
82
+ end
83
+
84
+ # Sets leading and trailing quotes
85
+ def set_quotes(value)
86
+ if value.class.to_s == "String"
87
+ if value.delete(" ").start_with?("{") || value.delete(" ").start_with?("[")
88
+ value
89
+ else
90
+ "\"#{value}\""
91
+ end
92
+ else
93
+ value
94
+ end
95
+ end
96
+
97
+ end
@@ -0,0 +1,32 @@
1
+ require 'cf_factory/base/cf_inner'
2
+
3
+ class CfEc2Tag
4
+ include CfInner
5
+
6
+ def initialize(key, value, options = {})
7
+ @key = key
8
+ @value = value
9
+ @propagate_at_launch = options[:propagate_at_launch]
10
+ end
11
+
12
+ def set_propagate_at_launch(pal)
13
+ @propagate_at_launch = pal
14
+ end
15
+
16
+ def get_cf_attributes
17
+ result = {"Key" => @key,
18
+ "Value" => @value
19
+ }
20
+ result["PropagateAtLaunch"] = @propagate_at_launch unless @propagate_at_launch.nil?
21
+ result
22
+ end
23
+
24
+ def clone
25
+ options = {}
26
+ if @propagate_at_launch
27
+ options[:propagate_at_launch] = @propagate_at_launch
28
+ end
29
+ CfEc2Tag.new(@key,@value,options)
30
+ end
31
+
32
+ end
@@ -0,0 +1,18 @@
1
+ class CfGenerator
2
+ def initialize(indent)
3
+ @indent = indent
4
+ end
5
+
6
+ def self.add_line(indent, input, result)
7
+ result += "\n#{self.indent(indent, input)}"
8
+ end
9
+
10
+ def self.indent(indent, string)
11
+ result = ""
12
+ string.each_line() {|s|
13
+ result += "#{" "*indent}#{s}"
14
+ }
15
+ result
16
+ end
17
+
18
+ end
@@ -0,0 +1,91 @@
1
+ class CfHelper
2
+ def self.generate_ref(cf_object_ref)
3
+ "{ \"Ref\" : \"#{cf_object_ref}\" }"
4
+ end
5
+
6
+ def self.generate_att(resource_name, attribute_name)
7
+ "{ \"Fn::GetAtt\" : [ \"#{resource_name}\", \"#{attribute_name}\" ] }"
8
+ end
9
+
10
+ def self.generate_ref_array(cf_array)
11
+ result = "["
12
+ cf_array.each() {|cf|
13
+ result += "#{cf.generate_ref},"
14
+ }
15
+ result = result.chomp(",")
16
+ result += "]"
17
+ result
18
+ end
19
+
20
+ def self.generate_inner_array(cf_array)
21
+ result = "["
22
+ cf_array.each() {|cf|
23
+ result += "#{cf.generate()},"
24
+ }
25
+ result = result.chomp(",")
26
+ result += "]"
27
+ result
28
+ end
29
+
30
+ def self.generate_inner_list(cf_array)
31
+ result = ""
32
+ cf_array.each() {|cf|
33
+ result += "#{cf.generate},\n"
34
+ }
35
+ result = result.chomp("\n").chomp(",")
36
+ result
37
+ end
38
+
39
+ def self.base64(string)
40
+ base = "{ \"Fn::Base64\": \"#{string}\" }"
41
+ return clean(base)
42
+ end
43
+
44
+ def self.join(array)
45
+ "{ \"Fn::Join\" : [ \"\", #{print_array(array)} ]}"
46
+ end
47
+
48
+ def self.clean(string)
49
+ string.gsub(/\"{/,"{").gsub(/\"}/,"}").gsub(/}\"/,"}").gsub(/\"\[/,"[").gsub(/\"\]/,"]")#.gsub(/\\/,"") #TODO: the last gsub invalidated line-breaks
50
+ end
51
+
52
+ def self.availability_zones(string = "")
53
+ "{ \"Fn::GetAZs\" : \"#{string}\" }"
54
+ end
55
+
56
+ def self.ref_current_region()
57
+ '{ "Ref" : "AWS::Region" }'
58
+ end
59
+
60
+ def self.az_in_region(az_id = "a", region = "")
61
+ clean(join([ref_current_region(), az_id]))
62
+ end
63
+
64
+ def self.az_array_in_region(az_ids = ["b","c"], region = "")
65
+ result = "["
66
+ az_ids.each() {|az_id|
67
+ result += CfHelper.az_in_region(az_id)+", "
68
+ }
69
+ result = result.chomp(" ").chomp(",")
70
+ result += "]"
71
+ end
72
+
73
+ def self.print_array(array)
74
+ inner = ""
75
+ array.each() {|element|
76
+ if element == "\n"
77
+ inner += "\"\\n\" ,"
78
+ else
79
+ inner += "\"#{element}\" ,"
80
+ end
81
+ }
82
+ inner.chomp!(",")
83
+ result = "[ #{inner} ]"
84
+ #result = array.inspect
85
+ #puts "rsult before CLEAN = #{result}"
86
+ res = clean(result)
87
+ #puts "rsult after CLEAN = #{res}"
88
+ res
89
+ end
90
+
91
+ end
@@ -0,0 +1,55 @@
1
+ require 'cf_factory/base/cf_helper'
2
+
3
+ module CfInner
4
+ def get_cf_attributes
5
+ raise Exception.new("must be defined")
6
+ end
7
+
8
+ def additional_indent
9
+ 0
10
+ end
11
+
12
+ def generate_name()
13
+ indent = " "*additional_indent()
14
+ @result = "#{indent}"
15
+ @result += "#{indent}{\n"
16
+ attributes = self.get_cf_attributes
17
+ @result += "#{indent} \"#{@name}\" : {\n"
18
+ attributes.keys.each() {|key|
19
+ value = attributes[key]
20
+ @result += "#{indent} \"#{key}\" : #{set_quotes(value)},\n"
21
+ }
22
+ #
23
+ @result = @result.chomp.chomp(",")
24
+ @result += "\n#{indent} }"
25
+ @result += "\n#{indent} }"
26
+ end
27
+
28
+ def generate()
29
+ indent = " "*additional_indent()
30
+ @result = "#{indent}"
31
+ @result += "#{indent}{\n"
32
+ attributes = self.get_cf_attributes
33
+ attributes.keys.each() {|key|
34
+ value = attributes[key]
35
+ @result += "#{indent} \"#{key}\" : #{set_quotes(value)},\n"
36
+ }
37
+ #
38
+ @result = @result.chomp.chomp(",")
39
+ @result += "\n#{indent} }"
40
+ end
41
+
42
+ # Sets leading and trailing quotes
43
+ def set_quotes(value)
44
+ if value.class.to_s == "String"
45
+ if value.delete(" ").start_with?("{") || value.delete(" ").start_with?("[")
46
+ value
47
+ else
48
+ "\"#{value}\""
49
+ end
50
+ else
51
+ value
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,101 @@
1
+ class CfMain
2
+ def initialize(description, version = "2010-09-09")
3
+ @description = description
4
+ @version = version
5
+ @mappings = []
6
+ @parameters = []
7
+ @outputs = []
8
+ @resources = []
9
+ end
10
+
11
+ # Go through all resources and tag them with the specified array of tags.
12
+ def apply_tags_to_all_resources(tag_list)
13
+ @resources.each() {|resource|
14
+ resource.set_tags(tag_list)
15
+ }
16
+ end
17
+
18
+ def add_vpc(vpc)
19
+ @resources << vpc
20
+ end
21
+
22
+ def add_elb(elb)
23
+ @resources << elb
24
+ end
25
+
26
+ def add_mapping(mapping)
27
+ @mappings << mapping
28
+ end
29
+
30
+ def add_parameter(parameter)
31
+ @parameters << parameter
32
+ end
33
+
34
+ def add_output(parameter)
35
+ @outputs << parameter
36
+ end
37
+
38
+ def add_resource(resource)
39
+ @resources << resource
40
+ end
41
+
42
+ def generate()
43
+ @result = "{\n"
44
+ generate_version
45
+ generate_description
46
+ generate_parameters
47
+ generate_mappings unless @mappings.size == 0
48
+ generate_resources
49
+ generate_outputs
50
+ @result += "}\n"
51
+ @result
52
+ end
53
+
54
+ private
55
+
56
+ def generate_version
57
+ @result += " \"Description\" : \"#{@description}\",\n"
58
+ end
59
+
60
+ def generate_description
61
+ @result += " \"AWSTemplateFormatVersion\" : \"#{@version}\",\n"
62
+ end
63
+
64
+ def generate_parameters
65
+ @result += " \"Parameters\" : {\n"
66
+ @parameters.each() {|p|
67
+ @result += p.generate
68
+ }
69
+ @result = @result.chomp.chomp(",")
70
+ @result += "\n },\n"
71
+ end
72
+
73
+ def generate_mappings
74
+ @result += " \"Mappings\" : {\n"
75
+ @mappings.each() {|m|
76
+ @result += m.generate
77
+ }
78
+ @result = @result.chomp(",")
79
+ @result += "\n },\n"
80
+ end
81
+
82
+ def generate_resources
83
+ @result += " \"Resources\" : {\n"
84
+ @resources.each() do |resource|
85
+ @result += resource.generate
86
+ end
87
+ @result = @result.chomp.chomp(",")
88
+ @result += "\n },\n"
89
+ end
90
+
91
+
92
+ def generate_outputs
93
+ @result += " \"Outputs\" : {\n"
94
+ @outputs.each() {|o|
95
+ @result += o.generate
96
+ }
97
+ @result = @result.chomp.chomp(",")
98
+ @result += "\n }\n"
99
+ end
100
+
101
+ end
@@ -0,0 +1,26 @@
1
+ class CfMapping
2
+ def initialize(name, target, from_to_hash)
3
+ @name = name
4
+ @target = target
5
+ @from_to_hash = from_to_hash
6
+ end
7
+
8
+ def generate
9
+ @result = ""
10
+ @result += " \"#{@name}\" : {\n"
11
+ @from_to_hash.keys.each() {|key|
12
+ value = @from_to_hash[key]
13
+ @result += " \"#{key}\"\t : { \"#{@target}\" : \"#{value}\" },\n"
14
+ }
15
+ @result = @result.chomp.chomp(",")
16
+ @result += "\n },"
17
+ end
18
+
19
+ def generate_ref(key)
20
+ "{\"Fn::FindInMap\" : [ \"#{@name}\", #{CfHelper.generate_ref(key)}, \"#{@target}\" ]}"
21
+ end
22
+
23
+ def map_from_region()
24
+ "{\"Fn::FindInMap\" : [ \"#{@name}\", \"#{CfHelper.ref_current_region()}\", \"#{@target}\" ]}"
25
+ end
26
+ end
File without changes
@@ -0,0 +1,24 @@
1
+ require 'cf_factory/base/cf_base'
2
+
3
+ class CfOutput
4
+ include CfBase
5
+
6
+ def initialize(name, description, value)
7
+ @name = name
8
+ @description = description
9
+ @value = value
10
+ end
11
+
12
+ def get_cf_type
13
+ nil
14
+ end
15
+
16
+ def get_cf_attributes
17
+ {"Description" => @description, "Value" => @value}
18
+ end
19
+
20
+ def get_cf_properties
21
+ {}
22
+ end
23
+
24
+ end
@@ -0,0 +1,25 @@
1
+ require 'cf_factory/base/cf_base'
2
+
3
+ class CfParameter
4
+ include CfBase
5
+
6
+ def initialize(name, description, type, properties_hash = {})
7
+ @name = name
8
+ @description = description
9
+ @type = type
10
+ @properties_hash = properties_hash
11
+ end
12
+
13
+ def get_cf_type
14
+ @type
15
+ end
16
+
17
+ def get_cf_attributes
18
+ @properties_hash.merge({"Description" => @description})
19
+ end
20
+
21
+ def get_cf_properties
22
+ {}
23
+ end
24
+
25
+ end