예제 #1
0
 def test_template_delta_includes_removal_of_subdomains(self):
     context = self._base_context('dummy2')
     context['subdomains'] = []
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_minus['Resources'].keys()), ['CnameDNS1'])
     self.assertEqual(list(delta_minus['Outputs'].keys()), [])
 def test_template_delta_does_not_include_cloudfront_if_there_are_no_modifications(
         self):
     context = self._base_context('project-with-cloudfront-minimal')
     (delta_plus, delta_minus) = cfngen.template_delta(
         'project-with-cloudfront-minimal', context)
     self.assertEqual(delta_plus['Resources'].keys(), [])
     self.assertEqual(delta_plus['Outputs'].keys(), [])
 def test_template_delta_does_not_normally_include_ec2(self):
     "we do not want to mess with running VMs"
     context = self._base_context()
     context['ec2']['cluster_size'] = 2
     (delta_plus, delta_minus) = cfngen.template_delta('dummy1', context)
     self.assertEqual(delta_plus['Resources'].keys(), [])
     self.assertEqual(delta_plus['Outputs'].keys(), [])
 def test_template_delta_includes_ec2_instance_type(self):
     "we accept to reboot VMs if an instance type change is requested"
     context = self._base_context()
     context['ec2']['type'] = 't2.xlarge'
     (delta_plus, delta_minus) = cfngen.template_delta('dummy1', context)
     self.assertEqual(delta_plus['Resources'].keys(), ['EC2Instance1'])
     self.assertEqual(delta_plus['Outputs'].keys(), [])
예제 #5
0
 def test_template_delta_does_not_include_cloudfront_if_there_are_no_modifications(
         self):
     context = self._base_context('project-with-cloudfront-minimal')
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
예제 #6
0
파일: cfn.py 프로젝트: stephenwf/builder
def update_template(stackname):
    """Limited update of the Cloudformation template.

    Resources can be added, but existing ones are immutable.

    Moreover, we never add anything related to EC2 instances as they are
    not supported anyway (they will come up as part of the template
    but without any software being on it)

    Moreover, EC2 instances must be running while this is executed or their
    resources like PublicIP will be inaccessible"""

    core_lifecycle.start(stackname)

    (pname, _) = core.parse_stackname(stackname)
    current_template = bootstrap.current_template(stackname)
    cfngen.write_template(stackname, json.dumps(current_template))

    more_context = cfngen.choose_config(stackname)
    delta = cfngen.template_delta(pname, **more_context)
    LOG.info("%s", pformat(delta))
    utils.confirm('Confirming changes to the stack template?')

    new_template = cfngen.merge_delta(stackname, delta)
    bootstrap.update_template(stackname, new_template)

    update(stackname)
 def test_template_delta_does_not_include_ec2_immutable_properties_like_image(
         self):
     "we don't want random reboot or recreations of instances"
     context = self._base_context()
     context['ec2']['ami'] = 'ami-1234567'
     (delta_plus, delta_minus) = cfngen.template_delta('dummy1', context)
     self.assertEqual(delta_plus['Resources'].keys(), [])
     self.assertEqual(delta_plus['Outputs'].keys(), [])
 def test_template_delta_includes_ec2_security_group(self):
     "it's useful to open and close ports"
     context = self._base_context()
     context['project']['aws']['ports'] = [110]
     (delta_plus, delta_minus) = cfngen.template_delta('dummy1', context)
     self.assertEqual(delta_plus['Resources'].keys(),
                      ['StackSecurityGroup'])
     self.assertEqual(delta_plus['Outputs'].keys(), [])
예제 #9
0
 def test_template_delta_does_not_normally_include_ec2(self):
     "we do not want to mess with running VMs"
     context = self._base_context()
     context['ec2']['cluster_size'] = 2
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
예제 #10
0
 def test_empty_template_delta(self):
     context = self._base_context()
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(delta_plus, {
         'Outputs': {},
         'Resources': {},
         'Parameters': {}
     })
예제 #11
0
 def test_template_delta_does_not_include_ec2_immutable_properties_like_image(
         self):
     "we don't want random reboot or recreations of instances"
     context = self._base_context()
     context['ec2']['ami'] = 'ami-1234567'
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
예제 #12
0
 def test_template_delta_includes_ec2_instance_type(self):
     "we accept to reboot VMs if an instance type change is requested"
     context = self._base_context()
     context['ec2']['type'] = 't2.xlarge'
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_edit['Resources'].keys()),
                      ['EC2Instance1'])
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
예제 #13
0
 def test_template_delta_includes_ec2_security_group(self):
     "it's useful to open and close ports"
     context = self._base_context()
     context['ec2']['ports'] = [110]
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_edit['Resources'].keys()),
                      ['StackSecurityGroup'])
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
 def test_template_delta_includes_elb_security_group(self):
     "for consistency with EC2 security groups"
     context = self._base_context('project-with-cluster')
     context['elb']['protocol'] = 'https'
     context['elb']['certificate'] = 'DUMMY_CERTIFICATE'
     (delta_plus,
      delta_minus) = cfngen.template_delta('project-with-cluster', context)
     self.assertEqual(delta_plus['Resources'].keys(),
                      ['ElasticLoadBalancer', 'ELBSecurityGroup'])
     self.assertEqual(delta_plus['Outputs'].keys(), [])
 def test_template_delta_includes_parts_of_rds(self):
     "we want to update RDS instances in place to avoid data loss"
     context = self._base_context('dummy2')
     context['project']['aws']['rds']['multi-az'] = True
     (delta_plus, delta_minus) = cfngen.template_delta(
         'project-with-cloudfront-minimal', context)
     self.assertEqual(delta_plus['Resources'].keys(), ['AttachedDB'])
     self.assertEqual(
         delta_plus['Resources']['AttachedDB']['Properties']['MultiAZ'],
         'true')
     self.assertEqual(delta_plus['Outputs'].keys(), [])
예제 #16
0
 def test_template_delta_includes_parts_of_rds(self):
     "we want to update RDS instances in place to avoid data loss"
     context = self._base_context('dummy2')
     context['rds']['multi-az'] = True
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_edit['Resources'].keys()), ['AttachedDB'])
     self.assertEqual(
         delta_edit['Resources']['AttachedDB']['Properties']['MultiAZ'],
         'true')
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
 def test_template_delta_includes_parts_of_cloudfront(self):
     "we want to update CDNs in place given how long it takes to recreate them"
     context = self._base_context('project-with-cloudfront-minimal')
     context['cloudfront']['subdomains'] = ["custom-subdomain.example.org"]
     (delta_plus, delta_minus) = cfngen.template_delta(
         'project-with-cloudfront-minimal', context)
     self.assertEqual(delta_plus['Resources'].keys(),
                      ['CloudFrontCDN', 'CloudFrontCDNDNS1'])
     self.assertEqual(
         delta_plus['Resources']['CloudFrontCDNDNS1']['Properties']['Name'],
         'custom-subdomain.example.org.')
     self.assertEqual(delta_plus['Outputs'].keys(), [])
 def test_template_delta_includes_parts_of_elb(self):
     "we want to update ELBs in place given how long it takes to recreate them"
     context = self._base_context('project-with-cluster')
     context['elb']['healthcheck']['protocol'] = 'tcp'
     (delta_plus,
      delta_minus) = cfngen.template_delta('project-with-cluster', context)
     self.assertEqual(delta_plus['Resources'].keys(),
                      ['ElasticLoadBalancer'])
     self.assertEqual(
         delta_plus['Resources']['ElasticLoadBalancer']['Properties']
         ['HealthCheck']['Target'], 'TCP:80')
     self.assertEqual(delta_plus['Outputs'].keys(), [])
예제 #19
0
 def test_template_delta_doesnt_unnecessarily_update_rds(self):
     "we don't want to update RDS instances more than necessary, since it takes time and may cause reboots or replacements"
     context = self._base_context('dummy2')
     updated_context = self._base_context('dummy2',
                                          in_memory=False,
                                          existing_context=context)
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(updated_context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_minus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
     self.assertEqual(list(delta_minus['Outputs'].keys()), [])
 def test_template_delta_includes_new_external_volumes(self):
     "we want to add additional volumes to projects that are getting their main volume filled"
     context = self._base_context()
     context['ext'] = {
         'size': 10,
         'device': '/dev/sdh',
     }
     (delta_plus, delta_minus) = cfngen.template_delta('dummy1', context)
     self.assertEqual(delta_plus['Resources'].keys(),
                      ['MountPoint1', 'ExtraStorage1'])
     self.assertEqual(
         delta_plus['Resources']['ExtraStorage1']['Properties']['Size'],
         '10')
     self.assertEqual(
         delta_plus['Resources']['MountPoint1']['Properties']['Device'],
         '/dev/sdh')
     self.assertEqual(delta_plus['Outputs'].keys(), [])
 def test_template_delta_includes_cloudfront(self):
     "we can add CDNs (that takes an hour or more) without downtime"
     context = self._base_context()
     context['full_hostname'] = "test--dummy1.example.org"
     context['cloudfront'] = {
         "subdomains": ["test--cdn-dummy1.example.org"],
         "subdomains-without-dns": [],
         "origins": {},
         "compress": True,
         "cookies": [],
         "certificate_id": "AAAA...",
         "headers": [],
         "errors": None,
         "default-ttl": 300,
     }
     (delta_plus, delta_minus) = cfngen.template_delta('dummy1', context)
     self.assertEqual(delta_plus['Resources'].keys(),
                      ['CloudFrontCDN', 'CloudFrontCDNDNS1', 'ExtDNS'])
     self.assertEqual(delta_plus['Outputs'].keys(), ['DomainName'])
예제 #22
0
 def test_template_delta_includes_cloudfront(self):
     "we can add CDNs (that takes an hour or more) without downtime"
     context = self._base_context()
     stackname, environment_name = core.parse_stackname(
         context['stackname'])
     context['full_hostname'] = "test--dummy1.example.org"
     context['cloudfront'] = {
         "subdomains": ["test--cdn-dummy1.example.org"],
         "subdomains-without-dns": [],
         "origins": {},
         "compress": True,
         "cookies": [],
         "certificate_id": "AAAA...",
         "headers": [],
         "errors": None,
         "default-ttl": 300,
         "logging": False,
     }
     (delta_plus, delta_edit, delta_minus, cloudformation_delta,
      new_terraform_template_file) = cfngen.template_delta(context)
     self.assertCountEqual(list(delta_plus['Resources'].keys()),
                           ['CloudFrontCDN', 'CloudFrontCDNDNS1', 'ExtDNS'])
     self.assertEqual(list(delta_plus['Outputs'].keys()), ['DomainName'])
 def test_template_delta_includes_parts_of_rds(self):
     "we want to update RDS instances in place to avoid data loss"
     context = self._base_context('dummy2')
     context['rds']['multi-az'] = True
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_edit['Resources'].keys()), ['AttachedDB'])
     self.assertEqual(delta_edit['Resources']['AttachedDB']['Properties']['MultiAZ'], 'true')
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
 def test_template_delta_does_not_normally_include_ec2(self):
     "we do not want to mess with running VMs"
     context = self._base_context()
     context['ec2']['cluster_size'] = 2
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
 def test_empty_template_delta(self):
     context = self._base_context()
     (delta_plus, delta_minus) = cfngen.template_delta('dummy1', context)
     self.assertEqual(delta_plus, {'Outputs': {}, 'Resources': {}})
 def test_template_delta_doesnt_unnecessarily_update_rds(self):
     "we don't want to update RDS instances more than necessary, since it takes time and may cause reboots or replacements"
     context = self._base_context('dummy2')
     updated_context = self._base_context('dummy2', in_memory=False, existing_context=context)
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(updated_context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_minus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
     self.assertEqual(list(delta_minus['Outputs'].keys()), [])
 def test_template_delta_includes_parts_of_cloudfront(self):
     "we want to update CDNs in place given how long it takes to recreate them"
     context = self._base_context('project-with-cloudfront-minimal')
     context['cloudfront']['subdomains'] = [
         "custom-subdomain.example.org"
     ]
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertCountEqual(list(delta_edit['Resources'].keys()), ['CloudFrontCDN', 'CloudFrontCDNDNS1'])
     self.assertEqual(delta_edit['Resources']['CloudFrontCDNDNS1']['Properties']['Name'], 'custom-subdomain.example.org.')
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
 def test_template_delta_includes_removal_of_subdomains(self):
     context = self._base_context('dummy2')
     context['subdomains'] = []
     (delta_plus, delta_minus) = cfngen.template_delta('dummy2', context)
     self.assertEqual(delta_minus['Resources'].keys(), ['CnameDNS1'])
     self.assertEqual(delta_minus['Outputs'].keys(), [])
 def test_template_delta_includes_elb_security_group(self):
     "for consistency with EC2 security groups"
     context = self._base_context('project-with-cluster')
     context['elb']['protocol'] = 'https'
     context['elb']['certificate'] = 'DUMMY_CERTIFICATE'
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertCountEqual(list(delta_edit['Resources'].keys()), ['ElasticLoadBalancer', 'ELBSecurityGroup'])
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
 def test_template_delta_includes_parts_of_elb(self):
     "we want to update ELBs in place given how long it takes to recreate them"
     context = self._base_context('project-with-cluster')
     context['elb']['healthcheck']['protocol'] = 'tcp'
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_edit['Resources'].keys()), ['ElasticLoadBalancer'])
     self.assertEqual(delta_edit['Resources']['ElasticLoadBalancer']['Properties']['HealthCheck']['Target'], 'TCP:80')
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
 def test_template_delta_includes_new_external_volumes(self):
     "we want to add additional volumes to projects that are getting their main volume filled"
     context = self._base_context()
     context['ext'] = {
         'size': 10,
         'device': '/dev/sdh',
     }
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertCountEqual(list(delta_plus['Resources'].keys()), ['MountPoint1', 'ExtraStorage1'])
     self.assertEqual(delta_plus['Resources']['ExtraStorage1']['Properties']['Size'], '10')
     self.assertEqual(delta_plus['Resources']['MountPoint1']['Properties']['Device'], '/dev/sdh')
     self.assertCountEqual(list(delta_plus['Outputs'].keys()), [])
 def test_template_delta_includes_removal_of_subdomains(self):
     context = self._base_context('dummy2')
     context['subdomains'] = []
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_minus['Resources'].keys()), ['CnameDNS1'])
     self.assertEqual(list(delta_minus['Outputs'].keys()), [])
 def test_template_delta_includes_ec2_security_group(self):
     "it's useful to open and close ports"
     context = self._base_context()
     context['ec2']['ports'] = [110]
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_edit['Resources'].keys()), ['StackSecurityGroup'])
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
 def test_template_delta_does_not_include_ec2_immutable_properties_like_image(self):
     "we don't want random reboot or recreations of instances"
     context = self._base_context()
     context['ec2']['ami'] = 'ami-1234567'
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
 def test_template_delta_does_not_include_cloudfront_if_there_are_no_modifications(self):
     context = self._base_context('project-with-cloudfront-minimal')
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_plus['Resources'].keys()), [])
     self.assertEqual(list(delta_plus['Outputs'].keys()), [])
 def test_empty_template_delta(self):
     context = self._base_context()
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(delta_plus, {'Outputs': {}, 'Resources': {}, 'Parameters': {}})
 def test_template_delta_includes_ec2_instance_type(self):
     "we accept to reboot VMs if an instance type change is requested"
     context = self._base_context()
     context['ec2']['type'] = 't2.xlarge'
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertEqual(list(delta_edit['Resources'].keys()), ['EC2Instance1'])
     self.assertEqual(list(delta_edit['Outputs'].keys()), [])
예제 #38
0
 def test_empty_template_delta(self):
     template = cfngen.quick_render('dummy1')
     cfngen.write_template('dummy1--test', template)
     delta = cfngen.template_delta('dummy1', stackname='dummy1--test')
     self.assertEqual(delta, {'Outputs': {}, 'Resources': {}})
 def test_template_delta_includes_cloudfront(self):
     "we can add CDNs (that takes an hour or more) without downtime"
     context = self._base_context()
     stackname, environment_name = core.parse_stackname(context['stackname'])
     context['full_hostname'] = "test--dummy1.example.org"
     context['cloudfront'] = {
         "subdomains": [
             "test--cdn-dummy1.example.org"
         ],
         "subdomains-without-dns": [],
         "origins": {},
         "compress": True,
         "cookies": [],
         "certificate_id": "AAAA...",
         "headers": [],
         "errors": None,
         "default-ttl": 300,
         "logging": False,
     }
     (delta_plus, delta_edit, delta_minus, cloudformation_delta, new_terraform_template_file) = cfngen.template_delta(context)
     self.assertCountEqual(list(delta_plus['Resources'].keys()), ['CloudFrontCDN', 'CloudFrontCDNDNS1', 'ExtDNS'])
     self.assertEqual(list(delta_plus['Outputs'].keys()), ['DomainName'])