cf_factory 0.0.3 → 0.0.4

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 (106) hide show
  1. data/bin/cf_factory +9 -0
  2. data/examples/base_vpc.rb +9 -9
  3. data/examples/cloudfront_private.rb +23 -0
  4. data/examples/cloudinit_script_for_one_instance.rb +25 -25
  5. data/examples/cloudinit_script_with_autoscaling.rb +31 -31
  6. data/examples/dynamodb_table.rb +24 -0
  7. data/examples/elastic_beanstalk_example.rb +23 -0
  8. data/examples/elb_with_cloudfront.rb +34 -35
  9. data/examples/instance_with_eip.rb +13 -11
  10. data/examples/instance_with_yum.rb +13 -11
  11. data/examples/just_an_instance.rb +8 -6
  12. data/examples/nat_mutual_monitoring.rb +69 -0
  13. data/examples/play_with_region_and_zones.rb +11 -9
  14. data/examples/ra_web_hosting.rb +46 -44
  15. data/examples/s3_with_cloudfront.rb +11 -12
  16. data/examples/test_vpc.rb +27 -19
  17. data/lib/cf_factory/as/cf_as_group.rb +2 -0
  18. data/lib/cf_factory/as/cf_as_launch_config.rb +2 -0
  19. data/lib/cf_factory/as/cf_as_scaling_policy.rb +2 -0
  20. data/lib/cf_factory/base/cf_base.rb +5 -0
  21. data/lib/cf_factory/base/cf_ec2_tag.rb +2 -0
  22. data/lib/cf_factory/base/cf_generator.rb +2 -0
  23. data/lib/cf_factory/base/cf_helper.rb +2 -0
  24. data/lib/cf_factory/base/cf_inner.rb +27 -8
  25. data/lib/cf_factory/base/cf_main.rb +3 -1
  26. data/lib/cf_factory/base/cf_mapping.rb +3 -1
  27. data/lib/cf_factory/base/cf_named_inner.rb +1 -0
  28. data/lib/cf_factory/base/cf_output.rb +2 -0
  29. data/lib/cf_factory/base/cf_parameter.rb +2 -0
  30. data/lib/cf_factory/base/cf_script_reader.rb +3 -1
  31. data/lib/cf_factory/cloudformation/cf_cloud_formation_init.rb +2 -0
  32. data/lib/cf_factory/cloudformation/cf_cloudformation_command.rb +2 -0
  33. data/lib/cf_factory/cloudformation/cf_cloudformation_commands.rb +2 -0
  34. data/lib/cf_factory/cloudformation/cf_cloudformation_config.rb +2 -0
  35. data/lib/cf_factory/cloudformation/cf_cloudformation_file.rb +2 -0
  36. data/lib/cf_factory/cloudformation/cf_cloudformation_files.rb +2 -0
  37. data/lib/cf_factory/cloudformation/cf_cloudformation_inner.rb +2 -0
  38. data/lib/cf_factory/cloudformation/cf_cloudformation_package.rb +2 -0
  39. data/lib/cf_factory/cloudformation/cf_cloudformation_packages.rb +2 -0
  40. data/lib/cf_factory/cloudformation/cf_cloudformation_sources.rb +2 -0
  41. data/lib/cf_factory/cloudformation/cf_init_script.rb +7 -0
  42. data/lib/cf_factory/cloudfront/cf_cache_behavior.rb +2 -0
  43. data/lib/cf_factory/cloudfront/cf_cache_behaviors.rb +3 -1
  44. data/lib/cf_factory/cloudfront/cf_cloudfront_distribution.rb +2 -0
  45. data/lib/cf_factory/cloudfront/cf_custom_origin_config.rb +3 -1
  46. data/lib/cf_factory/cloudfront/cf_default_cache_behavior.rb +3 -1
  47. data/lib/cf_factory/cloudfront/cf_distribution_config.rb +4 -2
  48. data/lib/cf_factory/cloudfront/cf_forwarded_values.rb +3 -1
  49. data/lib/cf_factory/cloudfront/cf_logging.rb +3 -1
  50. data/lib/cf_factory/cloudfront/cf_origin.rb +3 -1
  51. data/lib/cf_factory/cloudfront/cf_s3_origin_config.rb +3 -1
  52. data/lib/cf_factory/cloudwatch/cf_cloud_watch_alarm.rb +2 -0
  53. data/lib/cf_factory/dynamo/cf_dynamo_table.rb +45 -0
  54. data/lib/cf_factory/eb/cd_eb_solution_stack.rb +28 -0
  55. data/lib/cf_factory/eb/cf_eb_application.rb +41 -0
  56. data/lib/cf_factory/eb/cf_eb_application_version.rb +24 -0
  57. data/lib/cf_factory/eb/cf_eb_configuration_template.rb +36 -0
  58. data/lib/cf_factory/eb/cf_eb_environment.rb +56 -0
  59. data/lib/cf_factory/eb/cf_eb_option_setting.rb +19 -0
  60. data/lib/cf_factory/ec2/cf_ebs_volume.rb +2 -0
  61. data/lib/cf_factory/ec2/cf_ec2_instance.rb +5 -1
  62. data/lib/cf_factory/ec2/cf_ec2_security_group.rb +2 -0
  63. data/lib/cf_factory/ec2/cf_ec2_security_group_egress.rb +3 -1
  64. data/lib/cf_factory/ec2/cf_ec2_security_group_ingress.rb +3 -1
  65. data/lib/cf_factory/ec2/cf_eip.rb +2 -0
  66. data/lib/cf_factory/ec2/cf_eip_association.rb +3 -1
  67. data/lib/cf_factory/elb/cf_app_cookie_stickiness_policy.rb +3 -1
  68. data/lib/cf_factory/elb/cf_elb.rb +3 -1
  69. data/lib/cf_factory/elb/cf_health_check.rb +3 -1
  70. data/lib/cf_factory/elb/cf_lb_cookie_stickiness_policy.rb +3 -1
  71. data/lib/cf_factory/elb/cf_listener.rb +3 -1
  72. data/lib/cf_factory/help/fixes.rb +1 -0
  73. data/lib/cf_factory/help/ip_mask.rb +2 -0
  74. data/lib/cf_factory/help/template_validation.rb +3 -1
  75. data/lib/cf_factory/iam/cf_iam_access_key.rb +3 -1
  76. data/lib/cf_factory/iam/cf_iam_group.rb +3 -1
  77. data/lib/cf_factory/iam/cf_iam_instance_profile.rb +3 -1
  78. data/lib/cf_factory/iam/cf_iam_policy.rb +2 -0
  79. data/lib/cf_factory/iam/cf_iam_role.rb +3 -1
  80. data/lib/cf_factory/iam/cf_iam_statement.rb +2 -0
  81. data/lib/cf_factory/iam/cf_iam_user.rb +3 -1
  82. data/lib/cf_factory/iam/cf_policy_document.rb +3 -1
  83. data/lib/cf_factory/modules/base_vpc.rb +2 -0
  84. data/lib/cf_factory/rds/cf_rds_instance.rb +3 -1
  85. data/lib/cf_factory/rds/cf_rds_security_group.rb +3 -1
  86. data/lib/cf_factory/rds/cf_rds_security_group_ingress.rb +3 -1
  87. data/lib/cf_factory/rds/cf_rds_subnet_group.rb +3 -1
  88. data/lib/cf_factory/route53/cf_elb_alias_target.rb +2 -0
  89. data/lib/cf_factory/route53/cf_record_set.rb +2 -0
  90. data/lib/cf_factory/route53/cf_route53_record_set.rb +2 -0
  91. data/lib/cf_factory/route53/cf_route53_record_set_group.rb +2 -0
  92. data/lib/cf_factory/s3/cf_s3_bucket.rb +2 -0
  93. data/lib/cf_factory/s3/cf_web_site_config.rb +3 -1
  94. data/lib/cf_factory/sqs/cf_sqs_queue.rb +3 -1
  95. data/lib/cf_factory/vpc/cf_attach_gateway.rb +3 -1
  96. data/lib/cf_factory/vpc/cf_internet_gateway.rb +2 -0
  97. data/lib/cf_factory/vpc/cf_network_acl.rb +3 -1
  98. data/lib/cf_factory/vpc/cf_network_acl_association.rb +3 -1
  99. data/lib/cf_factory/vpc/cf_network_acl_entry.rb +2 -0
  100. data/lib/cf_factory/vpc/cf_route.rb +3 -1
  101. data/lib/cf_factory/vpc/cf_route_table.rb +3 -1
  102. data/lib/cf_factory/vpc/cf_route_table_association.rb +3 -1
  103. data/lib/cf_factory/vpc/cf_subnet.rb +3 -1
  104. data/lib/cf_factory/vpc/cf_vpc.rb +3 -1
  105. data/lib/cf_factory.rb +2 -93
  106. metadata +39 -4
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'cf_factory'
4
+
5
+ cf = CfFactory::CfMain.new("NAT Mutual Monitoring")
6
+ ####### input parameters
7
+ param_keyname = CfFactory::CfParameter.new("KeyName", "Name of the key", "String", {"Default" => "majung"})
8
+ cf.add_parameter(param_keyname)
9
+ param_vpc_cidr = CfFactory::CfParameter.new("VpcCidr", "CIDR of the VPC", "String", {"Default" => "10.0.0.0/16"})
10
+ cf.add_parameter(param_vpc_cidr)
11
+ param_nat_type = CfFactory::CfParameter.new("NatInstanceType", "Type/size of the NAT instances", "String", {"Default" => "m1.small", "AllowedValues" => CfFactory::CfEc2Instance::SUPPORTED_TYPES})
12
+ cf.add_parameter(param_nat_type)
13
+
14
+ ####### mappings
15
+ mapping = CfFactory::CfMapping.new("NatMapping","AMI", {"eu-west-1" => "ami-0b5b6c7f", "us-east-1" => "ami-f619c29f"})
16
+ cf.add_mapping(mapping)
17
+
18
+ ####### resources
19
+ #vpc
20
+ base_vpc = CfFactory::BaseVpc.new("BaseVpc","192.168.0.0/16",2,2,["eu-west-1a","eu-west-1b"],256)
21
+ base_vpc.add_to_template(cf)
22
+ vpc = base_vpc.vpc
23
+ public_sn1, public_sn2, private_sn1, private_sn2 = base_vpc.subnets
24
+
25
+ #iam
26
+ commands = ["ec2:DescribeInstances","ec2:DescribeRouteTables", "ec2:ReplaceRoute","ec2:StartInstances","ec2:StopInstances"]
27
+ statement = CfFactory::CfIamStatement.new("Allow",commands,"*")
28
+ role_policy = CfFactory::CfIamPolicy.new("MyRolePolicy", CfFactory::CfPolicyDocument.new([statement]))
29
+ nat_role = CfFactory::CfIamRole.new("NatRole", "/", {:policies => [role_policy]} )
30
+ cf.add_resource(nat_role)
31
+
32
+ #nats
33
+ script = CfFactory::CfHelper.join([
34
+ "#!/bin/bash -v\\n",
35
+ "yum update -y aws*\\n"
36
+ ]
37
+ )
38
+ nat1 = CfFactory::CfEc2Instance.new("Nat1",mapping.generate_ref("AWS::Region"),param_nat_type.generate_ref, {:keyname => param_keyname.generate_ref(), :subnet => private_sn1, :user_data => script})
39
+ cf.add_resource(nat1)
40
+ eip1 = CfFactory::CfEip.new("Eip1",nat1,true)
41
+ cf.add_resource(eip1)
42
+ nat2 = CfFactory::CfEc2Instance.new("Nat2",mapping.generate_ref("AWS::Region"),param_nat_type.generate_ref, {:keyname => param_keyname.generate_ref(), :subnet => private_sn2, :user_data => script})
43
+ cf.add_resource(nat2)
44
+ eip2 = CfFactory::CfEip.new("Eip2",nat2,true)
45
+ cf.add_resource(eip2)
46
+ nat_sg = CfFactory::CfEc2SecurityGroup.new("NatSecurityGroup","Rules for allowing access to HA Nodes",vpc)
47
+ cf.add_resource(nat_sg)
48
+ nat_sg.add_ingress_rule(CfFactory::CfEc2SecurityGroupIngress.new("tcp",22,22,"0.0.0.0/0",nil))
49
+ nat_sg.add_ingress_rule(CfFactory::CfEc2SecurityGroupIngress.new("-1",0,0,param_vpc_cidr.generate_ref(),nil))
50
+ nat_sg.add_egress_rule(CfFactory::CfEc2SecurityGroupEgress.new("-1",0,0,"0.0.0.0/0",nil))
51
+
52
+ ####### output parameters
53
+ out_vpc = CfFactory::CfOutput.new("BaseVpc", "Id of the VPC", vpc.generate_ref())
54
+ cf.add_output(out_vpc)
55
+ out_nat1 = CfFactory::CfOutput.new("OutNat1","EIP of NAT1",eip1.generate_ref())
56
+ cf.add_output(out_nat1)
57
+ out_nat2 = CfFactory::CfOutput.new("OutNat2","EIP of NAT2",eip2.generate_ref())
58
+ cf.add_output(out_nat2)
59
+
60
+ cf_json = cf.generate
61
+ puts cf_json
62
+
63
+ config_options = YAML.load_file("aws_config.yml")
64
+ #config_options["cloud_formation_endpoint"] = "cloudformation.us-east-1.amazonaws.com"
65
+
66
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
67
+ validator.validate()
68
+
69
+ #puts "the reference for the VPC : #{vpc.generate_ref}"
@@ -1,18 +1,20 @@
1
- require 'help/include_libraries'
1
+ #!/usr/bin/ruby
2
2
 
3
- cf = CfMain.new("Playground")
3
+ require 'cf_factory'
4
+
5
+ cf = CfFactory::CfMain.new("Playground")
4
6
  ##########################
5
7
  ami = "ami-6d555119"
6
8
 
7
- az = CfHelper.az_in_region("a")
8
- instance = CfEc2Instance.new("MyInstance", ami, "t1.micro", {:availability_zone => az })
9
+ az = CfFactory::CfHelper.az_in_region("a")
10
+ instance = CfFactory::CfEc2Instance.new("MyInstance", ami, "t1.micro", {:availability_zone => az })
9
11
  cf.add_resource(instance)
10
12
 
11
- region_output = CfOutput.new("Region", "Region the stack was started", CfHelper.ref_current_region())
13
+ region_output = CfFactory::CfOutput.new("Region", "Region the stack was started", CfFactory::CfHelper.ref_current_region())
12
14
  cf.add_output(region_output)
13
- target_zone_output = CfOutput.new("TargetZone", "AZ where instance to be started", az)
15
+ target_zone_output = CfFactory::CfOutput.new("TargetZone", "AZ where instance to be started", az)
14
16
  cf.add_output(target_zone_output)
15
- actual_zone_output = CfOutput.new("ActualInstanceZone", "AZ of started instance", instance.retrieve_attribute("AvailabilityZone"))
17
+ actual_zone_output = CfFactory::CfOutput.new("ActualInstanceZone", "AZ of started instance", instance.retrieve_attribute("AvailabilityZone"))
16
18
  cf.add_output(actual_zone_output)
17
19
 
18
20
  ##########################
@@ -20,7 +22,7 @@ cf_json = cf.generate
20
22
  puts cf_json
21
23
 
22
24
  config_options = YAML.load_file("aws_config.yml")
23
- validator = TemplateValidation.new(cf_json, config_options)
25
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
24
26
  validator.validate()
25
- validator.apply()
27
+
26
28
 
@@ -1,7 +1,9 @@
1
- require 'help/include_libraries'
1
+ #!/usr/bin/ruby
2
+
3
+ require 'cf_factory'
2
4
 
3
5
  # CloudFormation template for Atraveo. 2-Tiered web-application with load-balancing.
4
- cf = CfMain.new("Reference Architecture Web-Hosting")
6
+ cf = CfFactory::CfMain.new("Reference Architecture Web-Hosting")
5
7
 
6
8
  ####### input parameters
7
9
  hosted_zone_id = "ZSSFB90C439AA"
@@ -11,17 +13,17 @@ hosted_zone_name = "dezidr.com"
11
13
  #ami_id = "ami-e96bdf80" #eu-west NAT instance
12
14
  ami_id = "ami-e96bdf80" #us-east web-server returning something
13
15
 
14
- param_hosted_zone = CfParameter.new("HostedZoneId", "Needs an existing hosted zone in Route53 to be configured", "String", {"Default" => hosted_zone_id})
16
+ param_hosted_zone = CfFactory::CfParameter.new("HostedZoneId", "Needs an existing hosted zone in Route53 to be configured", "String", {"Default" => hosted_zone_id})
15
17
  cf.add_parameter(param_hosted_zone)
16
- param_app_server_ami = CfParameter.new("AppServerAmi", "AMI of App-Server", "String", {"Default" => ami_id})
18
+ param_app_server_ami = CfFactory::CfParameter.new("AppServerAmi", "AMI of App-Server", "String", {"Default" => ami_id})
17
19
  cf.add_parameter(param_app_server_ami)
18
- param_app_server_key = CfParameter.new("AppServerKey", "Key used to start App-Server", "String")
20
+ param_app_server_key = CfFactory::CfParameter.new("AppServerKey", "Key used to start App-Server", "String")
19
21
  cf.add_parameter(param_app_server_key)
20
- param_app_port = CfParameter.new("AppPort", "Port of the Web/App-Servers", "Number", {"Default" => "8080"})
22
+ param_app_port = CfFactory::CfParameter.new("AppPort", "Port of the Web/App-Servers", "Number", {"Default" => "8080"})
21
23
  cf.add_parameter(param_app_port)
22
- param_db_user = CfParameter.new("MasterUserName", "Name of the master user name of the DB", "String", {"Default" => "masteruser"})
24
+ param_db_user = CfFactory::CfParameter.new("MasterUserName", "Name of the master user name of the DB", "String", {"Default" => "masteruser"})
23
25
  cf.add_parameter(param_db_user)
24
- param_db_pw = CfParameter.new("MasterPassword", "Password of the master user of the DB", "String")
26
+ param_db_pw = CfFactory::CfParameter.new("MasterPassword", "Password of the master user of the DB", "String")
25
27
  cf.add_parameter(param_db_pw)
26
28
 
27
29
  zone = "us-east"
@@ -31,12 +33,12 @@ zone = "us-east"
31
33
  ####### resources
32
34
 
33
35
  #ebs test
34
- ebs = CfEbsVolume.create_normal("MyEbs",CfHelper.az_in_region(az_id = "b"), 5)
36
+ ebs = CfFactory::CfEbsVolume.create_normal("MyEbs",CfFactory::CfHelper.az_in_region(az_id = "b"), 5)
35
37
  cf.add_resource(ebs)
36
38
 
37
- s3_bucket = CfS3Bucket.new("MyS3Bucket")
39
+ s3_bucket = CfFactory::CfS3Bucket.new("MyS3Bucket")
38
40
  cf.add_resource(s3_bucket)
39
- s3_log_bucket = CfS3Bucket.new("MyS3LogBucket")
41
+ s3_log_bucket = CfFactory::CfS3Bucket.new("MyS3LogBucket")
40
42
  s3_log_bucket.set_deletion_policy("Delete")
41
43
  cf.add_resource(s3_log_bucket)
42
44
 
@@ -50,23 +52,23 @@ cf.add_resource(s3_log_bucket)
50
52
  #elb
51
53
  #health_check_string = "HTTP:#{param_app_port.generate_ref()}/index.html"
52
54
  health_check_string = "HTTP:80/index.html"
53
- elb = CfElb.new("MyLoadBalancer", {
54
- :health_check => CfHealthCheck.new("3","60", health_check_string,"10","2"),
55
- :listeners => [CfListener.new(param_app_port.generate_ref(),"http","80","http")],
55
+ elb = CfFactory::CfElb.new("MyLoadBalancer", {
56
+ :health_check => CfFactory::CfHealthCheck.new("3","60", health_check_string,"10","2"),
57
+ :listeners => [CfFactory::CfListener.new(param_app_port.generate_ref(),"http","80","http")],
56
58
  #:security_groups => [elb_sec_group], #only for VPC based ELBs
57
- :availability_zones => CfHelper.availability_zones()
59
+ :availability_zones => CfFactory::CfHelper.availability_zones()
58
60
  }
59
61
  )
60
62
  cf.add_resource(elb)
61
63
 
62
- app_sec_group = CfEc2SecurityGroup.new("AppSecurityGroup", "Security Group for web and app")
63
- app_sec_group.add_ingress_rule(CfEc2SecurityGroupIngress.new("tcp", 22, 22, "0.0.0.0/0"))
64
- ir1 = CfEc2SecurityGroupIngress.new("tcp", param_app_port.generate_ref(), param_app_port.generate_ref(), "0.0.0.0/0")
64
+ app_sec_group = CfFactory::CfEc2SecurityGroup.new("AppSecurityGroup", "Security Group for web and app")
65
+ app_sec_group.add_ingress_rule(CfFactory::CfEc2SecurityGroupIngress.new("tcp", 22, 22, "0.0.0.0/0"))
66
+ ir1 = CfFactory::CfEc2SecurityGroupIngress.new("tcp", param_app_port.generate_ref(), param_app_port.generate_ref(), "0.0.0.0/0")
65
67
  app_sec_group.add_ingress_rule(ir1)
66
68
  cf.add_resource(app_sec_group)
67
69
 
68
- rds_sec_group = CfRdsSecurityGroup.new("RdsSecurityGroup","Security Group for RDS")
69
- ir = CfRdsSecurityGroupIngress.new(nil,app_sec_group)
70
+ rds_sec_group = CfFactory::CfRdsSecurityGroup.new("RdsSecurityGroup","Security Group for RDS")
71
+ ir = CfFactory::CfRdsSecurityGroupIngress.new(nil,app_sec_group)
70
72
  ir.set_use_sg_id(false)
71
73
  rds_sec_group.add_rule(ir)
72
74
  cf.add_resource(rds_sec_group)
@@ -74,29 +76,29 @@ cf.add_resource(rds_sec_group)
74
76
  #rds
75
77
  rds_endpoint= "rdsendpoint"
76
78
  options = {:multi_az => true, :security_groups => [rds_sec_group]}
77
- rds_instance = CfRdsInstance.new("MyDatabase",5,"MySql","db.t1.micro",param_db_user.generate_ref(), param_db_pw.generate_ref, options)
79
+ rds_instance = CfFactory::CfRdsInstance.new("MyDatabase",5,"MySql","db.t1.micro",param_db_user.generate_ref(), param_db_pw.generate_ref, options)
78
80
  cf.add_resource(rds_instance)
79
81
  rds_endpoint = rds_instance.retrieve_attribute("Endpoint.Address")
80
82
 
81
83
  #iam-role to be able to read meta-data
82
- statement = CfIamStatement.new("Allow","cloudformation:DescribeStackResource","*")
83
- role_policy = CfIamPolicy.new("MyRolePolicy", CfPolicyDocument.new([statement]))
84
- iam_role = CfIamRole.new("ReadMetaData","/",{:policies => [role_policy]})
84
+ statement = CfFactory::CfIamStatement.new("Allow","cloudformation:DescribeStackResource","*")
85
+ role_policy = CfFactory::CfIamPolicy.new("MyRolePolicy", CfFactory::CfPolicyDocument.new([statement]))
86
+ iam_role = CfFactory::CfIamRole.new("ReadMetaData","/",{:policies => [role_policy]})
85
87
  cf.add_resource(iam_role)
86
88
 
87
89
  #auto-scaling group
88
- launch_config = CfAsLaunchConfig.new("AppServerLaunchConfig", ami_id, "t1.micro", {:security_groups => [app_sec_group], :user_data => rds_endpoint})
90
+ launch_config = CfFactory::CfAsLaunchConfig.new("AppServerLaunchConfig", ami_id, "t1.micro", {:security_groups => [app_sec_group], :user_data => rds_endpoint})
89
91
  cf.add_resource(launch_config)
90
- availability_zones = CfHelper.az_array_in_region(["b","c"])
91
- as_group = CfAsGroup.new("AppServerFleet",availability_zones, launch_config, [elb], 4 ,2 ,{:desired_capacity => 2})
92
+ availability_zones = CfFactory::CfHelper.az_array_in_region(["b","c"])
93
+ as_group = CfFactory::CfAsGroup.new("AppServerFleet",availability_zones, launch_config, [elb], 4 ,2 ,{:desired_capacity => 2})
92
94
  cf.add_resource(as_group)
93
- as_up_scaling_policy = CfAsScalingPolicy.new("MyUpscalePolicy",as_group,"ChangeInCapacity","1",{:cooldown => 300})
95
+ as_up_scaling_policy = CfFactory::CfAsScalingPolicy.new("MyUpscalePolicy",as_group,"ChangeInCapacity","1",{:cooldown => 300})
94
96
  cf.add_resource(as_up_scaling_policy)
95
- as_down_scaling_policy = CfAsScalingPolicy.new("MyDownscalePolicy",as_group,"ChangeInCapacity","-1",{:cooldown => 300})
97
+ as_down_scaling_policy = CfFactory::CfAsScalingPolicy.new("MyDownscalePolicy",as_group,"ChangeInCapacity","-1",{:cooldown => 300})
96
98
  cf.add_resource(as_down_scaling_policy)
97
- as_up_alarm = CfCloudWatchAlarm.new("MyUpAlarm",CfCloudWatchAlarm::GREATER_THAN_OR_EQUAL_TO_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
99
+ as_up_alarm = CfFactory::CfCloudWatchAlarm.new("MyUpAlarm",CfFactory::CfCloudWatchAlarm::GREATER_THAN_OR_EQUAL_TO_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
98
100
  "60","Average","80", {:alarm_actions => [as_up_scaling_policy]})
99
- as_down_alarm = CfCloudWatchAlarm.new("MyDownAlarm",CfCloudWatchAlarm::LESS_THAN_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
101
+ as_down_alarm = CfFactory::CfCloudWatchAlarm.new("MyDownAlarm",CfFactory::CfCloudWatchAlarm::LESS_THAN_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
100
102
  "60","Average","30", {:alarm_actions => [as_down_scaling_policy]})
101
103
  cf.add_resource(as_up_alarm)
102
104
  cf.add_resource(as_down_alarm)
@@ -104,33 +106,33 @@ cf.add_resource(as_down_alarm)
104
106
  #cloudfront
105
107
  # distribution with multiple origins, one for S3, one for the ELB
106
108
  #define origins
107
- elb_origin = CfOrigin.create_elb_origin(elb)
108
- s3_origin = CfOrigin.create_s3_origin(s3_bucket)
109
+ elb_origin = CfFactory::CfOrigin.create_elb_origin(elb)
110
+ s3_origin = CfFactory::CfOrigin.create_s3_origin(s3_bucket)
109
111
  origins = [elb_origin, s3_origin]
110
112
  #define cache behaviors for origins
111
- default_cache_behavior = CfDefaultCacheBehavior.create_basic(elb_origin.id)
113
+ default_cache_behavior = CfFactory::CfDefaultCacheBehavior.create_basic(elb_origin.id)
112
114
  cache_behaviors = [
113
- CfCacheBehavior.create_basic(s3_origin.id, "/static/*", :min_ttl => 24*60*60),
114
- CfCacheBehavior.create_basic(s3_origin.id, "*.jpg", :min_ttl => 24*60*60)
115
+ CfFactory::CfCacheBehavior.create_basic(s3_origin.id, "/static/*", :min_ttl => 24*60*60),
116
+ CfFactory::CfCacheBehavior.create_basic(s3_origin.id, "*.jpg", :min_ttl => 24*60*60)
115
117
  ]
116
118
  #tie everything together
117
119
  cname_endpoint = "cached-elb-#{(Random.new.rand*100000).to_i}.dezidr.com"
118
- logging = CfLogging.new(s3_log_bucket,"log-") #activate logging
119
- cf_distribution = CfCloudfrontDistribution.create_multi_origin_distribution("MyDistribution", origins,
120
+ logging = CfFactory::CfLogging.new(s3_log_bucket,"log-") #activate logging
121
+ cf_distribution = CfFactory::CfCloudfrontDistribution.create_multi_origin_distribution("MyDistribution", origins,
120
122
  default_cache_behavior, cache_behaviors, {:logging => logging, :aliases => [cname_endpoint]})
121
123
  cf.add_resource(cf_distribution)
122
124
 
123
125
  #route53
124
126
  cloudfront_dns = cf_distribution.retrieve_attribute("DomainName")
125
- cname = CfRoute53RecordSet.new("CnameRecord", "#{cname_endpoint}", "CNAME", {:ttl => 1, :resource_records => [cloudfront_dns], :hosted_zone_id => hosted_zone_id})
127
+ cname = CfFactory::CfRoute53RecordSet.new("CnameRecord", "#{cname_endpoint}", "CNAME", {:ttl => 1, :resource_records => [cloudfront_dns], :hosted_zone_id => hosted_zone_id})
126
128
  cf.add_resource(cname)
127
- elb_alias = CfRoute53RecordSet.new("ElbAliasRecord","elb-#{(Random.new.rand*100000).to_i}.#{hosted_zone_name}","A", {:alias_target => CfElbAliasTarget.new(elb), :hosted_zone_id => hosted_zone_id})
129
+ elb_alias = CfFactory::CfRoute53RecordSet.new("ElbAliasRecord","elb-#{(Random.new.rand*100000).to_i}.#{hosted_zone_name}","A", {:alias_target => CfFactory::CfElbAliasTarget.new(elb), :hosted_zone_id => hosted_zone_id})
128
130
  cf.add_resource(elb_alias)
129
131
 
130
132
  ####### output parameters
131
- elb_output = CfOutput.new("ElbEndpoint","Endpoint of the ELB",elb.retrieve_attribute("DNSName"))
133
+ elb_output = CfFactory::CfOutput.new("ElbEndpoint","Endpoint of the ELB",elb.retrieve_attribute("DNSName"))
132
134
  cf.add_output(elb_output)
133
- cloudfront_domain = CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cf_distribution.retrieve_attribute("DomainName"))
135
+ cloudfront_domain = CfFactory::CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cf_distribution.retrieve_attribute("DomainName"))
134
136
  cf.add_output(cloudfront_domain)
135
137
 
136
138
  cf_json = cf.generate
@@ -139,8 +141,8 @@ puts cf_json
139
141
  config_options = YAML.load_file("aws_config.yml")
140
142
  config_options["cloud_formation_endpoint"] = "cloudformation.us-east-1.amazonaws.com"
141
143
  puts config_options.inspect
142
- validator = TemplateValidation.new(cf_json, config_options)
144
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
143
145
  validator.validate()
144
146
  #validator.apply({"AppServerAmi" => ami_id, "AppServerKey" => "majung", "AppPort" => "80", "MasterUserName" => "iamauser", "MasterPassword" => "abcd1234"})
145
147
 
146
- #puts "the reference for the VPC : #{vpc.generate_ref}"
148
+ #puts "the reference for the VPC : #{vpc.generate_ref}"
@@ -1,7 +1,9 @@
1
- require 'help/include_libraries'
1
+ #!/usr/bin/ruby
2
+
3
+ require 'cf_factory'
2
4
 
3
5
  # CloudFormation template for Atraveo. 2-Tiered web-application with load-balancing.
4
- cf = CfMain.new("S3 Bucket with CloudFront distribution")
6
+ cf = CfFactory::CfMain.new("S3 Bucket with CloudFront distribution")
5
7
 
6
8
  ####### input parameters
7
9
 
@@ -9,28 +11,25 @@ cf = CfMain.new("S3 Bucket with CloudFront distribution")
9
11
 
10
12
  ####### resources
11
13
 
12
- s3_bucket = CfS3Bucket.new("OriginBucket")
14
+ s3_bucket = CfFactory::CfS3Bucket.new("OriginBucket")
13
15
  cf.add_resource(s3_bucket)
14
- s3_log_bucket = CfS3Bucket.new("LogBucket")
16
+ s3_log_bucket = CfFactory::CfS3Bucket.new("LogBucket")
15
17
 
16
18
  #cloudfront
17
- logging = CfLogging.new(s3_bucket,"MyDistribution")
19
+ logging = CfFactory::CfLogging.new(s3_bucket,"MyDistribution")
18
20
  options = {:logging => logging}
19
- cloudfront_distribution = CfCloudfrontDistribution.create_s3_distribution("MyS3Distribution",s3_bucket)
21
+ cloudfront_distribution = CfFactory::CfCloudfrontDistribution.create_s3_distribution("MyS3Distribution",s3_bucket)
20
22
  cf.add_resource(cloudfront_distribution)
21
23
 
22
24
  ####### output parameters
23
- s3_domain = CfOutput.new("S3Domain","Domain name of S3 bucket",s3_bucket.retrieve_attribute("DomainName"))
25
+ s3_domain = CfFactory::CfOutput.new("S3Domain","Domain name of S3 bucket",s3_bucket.retrieve_attribute("DomainName"))
24
26
  cf.add_output(s3_domain)
25
- cloudfront_domain = CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cloudfront_distribution.retrieve_attribute("DomainName"))
27
+ cloudfront_domain = CfFactory::CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cloudfront_distribution.retrieve_attribute("DomainName"))
26
28
  cf.add_output(cloudfront_domain)
27
29
 
28
30
  cf_json = cf.generate
29
31
  puts cf_json
30
32
 
31
33
  config_options = YAML.load_file("aws_config.yml")
32
- validator = TemplateValidation.new(cf_json, config_options)
34
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
33
35
  validator.validate()
34
- validator.apply()
35
-
36
- #puts "the reference for the VPC : #{vpc.generate_ref}"
data/examples/test_vpc.rb CHANGED
@@ -1,40 +1,42 @@
1
- require 'help/include_libraries'
1
+ #!/usr/bin/ruby
2
2
 
3
- cf = CfMain.new("Bla bla bla")
3
+ require 'cf_factory'
4
+
5
+ cf = CfFactory::CfMain.new("Bla bla bla")
4
6
  ####### input parameters
5
- parameter = CfParameter.new("KeyName", "Name of the key", "String", {"Default" => "majung"})
7
+ parameter = CfFactory::CfParameter.new("KeyName", "Name of the key", "String", {"Default" => "majung"})
6
8
  cf.add_parameter(parameter)
7
- parameter2 = CfParameter.new("SecurityGroup", "Name of the security group", "String", {"Default" => "Blubber"})
9
+ parameter2 = CfFactory::CfParameter.new("SecurityGroup", "Name of the security group", "String", {"Default" => "Blubber"})
8
10
  cf.add_parameter(parameter2)
9
11
 
10
12
  ####### mappings
11
- mapping = CfMapping.new("Default","AMI",{"us-east-1" => "ami-c6699baf", "us-west-2" => "ami-52ff7262"})
13
+ mapping = CfFactory::CfMapping.new("Default","AMI",{"us-east-1" => "ami-c6699baf", "us-west-2" => "ami-52ff7262"})
12
14
  cf.add_mapping(mapping)
13
15
 
14
16
  ####### resources
15
17
  #vpc
16
- vpc = CfVpc.new("10.10.0.0/16")
18
+ vpc = CfFactory::CfVpc.new("10.10.0.0/16")
17
19
  cf.add_vpc(vpc)
18
- igw = CfInternetGateway.new("MyInternetGateway", vpc)
20
+ igw = CfFactory::CfInternetGateway.new("MyInternetGateway", vpc)
19
21
  vpc.add_internet_gateway(igw)
20
- route_table = CfRouteTable.new("MyRouteTable")
22
+ route_table = CfFactory::CfRouteTable.new("MyRouteTable")
21
23
  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
+ route1 = CfFactory::CfRoute.new("MyRoute1", "88.44.22.11/32", igw)
25
+ route2 = CfFactory::CfRoute.new("MyRoute2", "188.144.122.111/32", igw)
24
26
  route_table.add_route(route1)
25
27
  route_table.add_route(route2)
26
28
 
27
- network_acl = CfNetworkAcl.new("MyAcl1")
29
+ network_acl = CfFactory::CfNetworkAcl.new("MyAcl1")
28
30
  vpc.add_network_acl(network_acl)
29
- network_acl_entry = CfNetworkAclEntry.new("Acl1", "110", "6", "ALLOW", false, "0.0.0.0/0", 80, 80)
31
+ network_acl_entry = CfFactory::CfNetworkAclEntry.new("Acl1", "110", "6", "ALLOW", false, "0.0.0.0/0", 80, 80)
30
32
  network_acl.add_network_acl_entry(network_acl_entry)
31
33
 
32
- subnet1 = CfSubnet.new("WebTier1", "10.10.0.0/24", "eu-west-1a", route_table, network_acl)
34
+ subnet1 = CfFactory::CfSubnet.new("WebTier1", "10.10.0.0/24", "eu-west-1a", route_table, network_acl)
33
35
  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)
36
+ subnet2 = CfFactory::CfSubnet.new("AppTier1", "10.10.1.0/24", "eu-west-1a", route_table, network_acl)
37
37
  vpc.add_subnet(subnet2)
38
+ subnet3 = CfFactory::CfSubnet.new("DbTier1", "10.10.2.0/24", "eu-west-1a", route_table, network_acl)
39
+ vpc.add_subnet(subnet3)
38
40
 
39
41
  #elb
40
42
  #elb = CfElb.new("MyElb", {
@@ -44,10 +46,16 @@ vpc.add_subnet(subnet2)
44
46
  #puts elb.get_cf_properties()
45
47
 
46
48
  ####### output parameters
47
- output = CfOutput.new("VPC_ID", "Id of the VPC", vpc.generate_ref())
49
+ output = CfFactory::CfOutput.new("VpcId", "Id of the VPC", vpc.generate_ref())
48
50
  cf.add_output(output)
49
51
 
50
52
 
51
- puts cf.generate
53
+ cf_json = cf.generate
54
+ puts cf_json
55
+
56
+ config_options = YAML.load_file("aws_config.yml")
57
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
58
+ validator.validate()
59
+
52
60
 
53
- #puts "the reference for the VPC : #{vpc.generate_ref}"
61
+ #puts "the reference for the VPC : #{vpc.generate_ref}"
@@ -1,6 +1,7 @@
1
1
  require 'cf_factory/base/cf_base'
2
2
  require 'cf_factory/base/cf_helper'
3
3
 
4
+ module CfFactory
4
5
  class CfAsGroup
5
6
  include CfBase
6
7
 
@@ -73,3 +74,4 @@ class CfAsGroup
73
74
  end
74
75
 
75
76
  end
77
+ end
@@ -1,6 +1,7 @@
1
1
  require 'cf_factory/base/cf_base'
2
2
  require 'cf_factory/base/cf_helper'
3
3
 
4
+ module CfFactory
4
5
  class CfAsLaunchConfig
5
6
  include CfBase
6
7
 
@@ -51,3 +52,4 @@ class CfAsLaunchConfig
51
52
  end
52
53
 
53
54
  end
55
+ end
@@ -1,6 +1,7 @@
1
1
  require 'cf_factory/base/cf_base'
2
2
  require 'cf_factory/base/cf_helper'
3
3
 
4
+ module CfFactory
4
5
  class CfAsScalingPolicy
5
6
  include CfBase
6
7
 
@@ -31,3 +32,4 @@ class CfAsScalingPolicy
31
32
  end
32
33
 
33
34
  end
35
+ end
@@ -1,5 +1,6 @@
1
1
  require 'cf_factory/base/cf_helper'
2
2
 
3
+ module CfFactory
3
4
  module CfBase
4
5
  def get_name
5
6
  @name
@@ -47,6 +48,8 @@ module CfBase
47
48
  case value.class.to_s
48
49
  when "Hash"
49
50
  output += " \"#{key}\" : \n{#{hash_to_string(value,indent+5)}},\n"
51
+ when "EmbeddedProperty"
52
+ output += " \"#{key}\" : \n{#{hash_to_string(value.generate,indent+5)},\n"
50
53
  else
51
54
  output += " \"#{key}\" : #{set_quotes(value)},\n"
52
55
  end
@@ -95,3 +98,5 @@ module CfBase
95
98
  end
96
99
 
97
100
  end
101
+
102
+ end
@@ -1,5 +1,6 @@
1
1
  require 'cf_factory/base/cf_inner'
2
2
 
3
+ module CfFactory
3
4
  class CfEc2Tag
4
5
  include CfInner
5
6
 
@@ -30,3 +31,4 @@ class CfEc2Tag
30
31
  end
31
32
 
32
33
  end
34
+ end
@@ -1,3 +1,4 @@
1
+ module CfFactory
1
2
  class CfGenerator
2
3
  def initialize(indent)
3
4
  @indent = indent
@@ -16,3 +17,4 @@ class CfGenerator
16
17
  end
17
18
 
18
19
  end
20
+ end
@@ -1,3 +1,4 @@
1
+ module CfFactory
1
2
  class CfHelper
2
3
  def self.generate_ref(cf_object_ref)
3
4
  "{ \"Ref\" : \"#{cf_object_ref}\" }"
@@ -89,3 +90,4 @@ class CfHelper
89
90
  end
90
91
 
91
92
  end
93
+ end
@@ -17,9 +17,13 @@ module CfInner
17
17
  @result += "#{indent} \"#{@name}\" : {\n"
18
18
  attributes.keys.each() {|key|
19
19
  value = attributes[key]
20
- @result += "#{indent} \"#{key}\" : #{set_quotes(value)},\n"
20
+ if (not (value.class.to_s == "String")) and value.method_defined? :get_cf_attributes
21
+ @result += "#{indent} \"#{key}\" : #{value.get_cf_attributes},\n}"
22
+ else
23
+ @result += "#{indent} \"#{key}\" : #{set_quotes(value)},\n"
24
+ end
21
25
  }
22
- #
26
+
23
27
  @result = @result.chomp.chomp(",")
24
28
  @result += "\n#{indent} }"
25
29
  @result += "\n#{indent} }"
@@ -30,14 +34,28 @@ module CfInner
30
34
  @result = "#{indent}"
31
35
  @result += "#{indent}{\n"
32
36
  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(",")
37
+ @result += hash_to_string(attributes)
38
+
39
39
  @result += "\n#{indent} }"
40
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
+
41
59
 
42
60
  # Sets leading and trailing quotes
43
61
  def set_quotes(value)
@@ -53,3 +71,4 @@ module CfInner
53
71
  end
54
72
 
55
73
  end
74
+
@@ -1,3 +1,4 @@
1
+ module CfFactory
1
2
  class CfMain
2
3
  def initialize(description, version = "2010-09-09")
3
4
  @description = description
@@ -98,4 +99,5 @@ class CfMain
98
99
  @result += "\n }\n"
99
100
  end
100
101
 
101
- end
102
+ end
103
+ end
@@ -1,3 +1,4 @@
1
+ module CfFactory
1
2
  class CfMapping
2
3
  def initialize(name, target, from_to_hash)
3
4
  @name = name
@@ -23,4 +24,5 @@ class CfMapping
23
24
  def map_from_region()
24
25
  "{\"Fn::FindInMap\" : [ \"#{@name}\", \"#{CfHelper.ref_current_region()}\", \"#{@target}\" ]}"
25
26
  end
26
- end
27
+ end
28
+ end
@@ -0,0 +1 @@
1
+
@@ -1,5 +1,6 @@
1
1
  require 'cf_factory/base/cf_base'
2
2
 
3
+ module CfFactory
3
4
  class CfOutput
4
5
  include CfBase
5
6
 
@@ -22,3 +23,4 @@ class CfOutput
22
23
  end
23
24
 
24
25
  end
26
+ end
@@ -1,5 +1,6 @@
1
1
  require 'cf_factory/base/cf_base'
2
2
 
3
+ module CfFactory
3
4
  class CfParameter
4
5
  include CfBase
5
6
 
@@ -23,3 +24,4 @@ class CfParameter
23
24
  end
24
25
 
25
26
  end
27
+ end
@@ -1,4 +1,5 @@
1
1
  # Reads a file, integrates the specified arguments, and generates indented output taken specified parameters into account
2
+ module CfFactory
2
3
  class CfScriptReader
3
4
  def initialize(file_to_read, indentation = 0)
4
5
  @file = file_to_read
@@ -29,4 +30,5 @@ class CfScriptReader
29
30
  private
30
31
 
31
32
 
32
- end
33
+ end
34
+ end
@@ -1,6 +1,7 @@
1
1
  require 'cf_factory/base/cf_base'
2
2
  require 'cf_factory/base/cf_inner'
3
3
 
4
+ module CfFactory
4
5
  class CfCloudFormationInit
5
6
  include CfInner
6
7
 
@@ -23,3 +24,4 @@ class CfCloudFormationInit
23
24
  end
24
25
 
25
26
  end
27
+ end