Example #1
0
 def _example_collection(self):
     collection = cloud_models.Collection()
     webappsg = cloud_models.SecurityGroup(name='webapp')
     collection.nodes.add(cloud_models.Node(name='webapp',
                                            image='trusty',
                                            flavor='n1-standard-2',
                                            disk=37,
                                            networks=[],
                                            security_groups=set([webappsg]),
                                            private=mock.sentinel.webapp1priv))
     collection.nodes.add(cloud_models.Node(name='webapp2',
                                            image='trusty',
                                            flavor='n1-standard-2',
                                            disk=37,
                                            networks=[],
                                            security_groups=set([webappsg]),
                                            script='#!/bin/bash\necho hello\n',
                                            private=mock.sentinel.webapp2priv))
     collection.security_groups.add(webappsg)
     collection.security_group_rules.add(cloud_models.SecurityGroupRule(security_group=webappsg,
                                                                        source_ip='0.0.0.0/0',
                                                                        from_port=443,
                                                                        to_port=443,
                                                                        protocol='tcp'))
     collection.security_group_rules.add(cloud_models.SecurityGroupRule(security_group=webappsg,
                                                                        source_ip='212.10.10.10/32',
                                                                        from_port=8000,
                                                                        to_port=8080,
                                                                        protocol='tcp'))
     return collection
Example #2
0
    def test_detect_resources(self):
        node1 = models.Node(name='node1',
                            flavor='n1-standard-4',
                            image='ubuntu1404-12345678',
                            networks=[],
                            disk=20)

        node2 = models.Node(name='node2',
                            flavor='n1-standard-4',
                            image='ubuntu1404-12345678',
                            networks=[],
                            disk=20)

        node1.security_group_names = set(['webapp', 'ssh'])
        node2.security_group_names = set(['webapp'])

        sg_webapp = models.SecurityGroup(name='webapp')
        sg_ssh = models.SecurityGroup(name='ssh')

        sgr_https = models.SecurityGroupRule(security_group=sg_webapp,
                                             source_ip='0.0.0.0/0',
                                             from_port=443,
                                             to_port=443,
                                             protocol='tcp')

        sgr_ssh = models.SecurityGroupRule(security_group=sg_ssh,
                                           source_ip='0.0.0.0/0',
                                           from_port=22,
                                           to_port=22,
                                           protocol='tcp')

        class TestDriver(base.CloudDriver):
            def detect_nodes(self):
                return set([node1, node2])

            def detect_firewalls(self):
                return (set([sg_webapp, sg_ssh]), set([sgr_https, sgr_ssh]))

        cloud_driver = TestDriver()
        collection = cloud_driver.detect_resources()

        self.assertIn(node1, collection.nodes)
        self.assertIn(node2, collection.nodes)

        self.assertIn(sg_webapp, collection.nodes['node1'].security_groups)
        self.assertIn(sg_ssh, collection.nodes['node1'].security_groups)

        self.assertIn(sg_webapp, collection.nodes['node2'].security_groups)

        self.assertIn(sg_webapp, collection.security_groups)
        self.assertIn(sg_ssh, collection.security_groups)

        self.assertIn(sgr_https, collection.security_group_rules)
        self.assertIn(sgr_ssh, collection.security_group_rules)
    def test_with_urls(self, log):
        collection = loader.load(
            self._get_full_path_for_test_data('with_urls.yaml'),
            substitutions={'domain': 'example.com'})

        self.assertIn(
            cloud_models.URLConfStatic(hostname='example.com',
                                       path='/',
                                       local_path='www'), collection.urls)
        self.assertIn(
            cloud_models.URLConfBackend(hostname='example.com',
                                        path='/api',
                                        destination='webapp/api'),
            collection.urls)

        self.assertIn(
            cloud_models.Node(name='webapp',
                              flavor='webapp',
                              image='trusty',
                              disk=10,
                              networks=[]), collection.nodes)

        self.assertEqual(len(collection.nodes), 1)
        self.assertEqual(len(collection.urls), 2)
        log.check(('aasemble.deployment.loader', 'DEBUG',
                   'Loaded static URL ${domain}/ from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded backend URL ${domain}/api from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded node webapp from stack'))
Example #4
0
    def test_create_node(self, _add_namespace_info, _add_script_info, _add_key_pair_info, _block_device_mappings, _get_image, _get_size, connection):
        node = cloud_models.Node(name='web1',
                                 image='ami-1234567',
                                 flavor='t2.small',
                                 networks=[],
                                 disk=27)

        def _add_key_pair_info_side_effect(kwargs):
            kwargs['added_key_pair_info'] = True

        def _add_script_info_side_effect(node, kwargs):
            kwargs['added_script_info'] = True

        def _add_namespace_info_side_effect(kwargs):
            kwargs['added_namespace_info'] = True

        _add_key_pair_info.side_effect = _add_key_pair_info_side_effect
        _add_script_info.side_effect = _add_script_info_side_effect
        _add_namespace_info.side_effect = _add_namespace_info_side_effect

        self.cloud_driver.create_node(node)

        _get_image.assert_called_with('ami-1234567')
        _get_size.assert_called_with('t2.small')

        connection.create_node.assert_called_with(name='web1',
                                                  image=_get_image.return_value,
                                                  size=_get_size.return_value,
                                                  ex_security_groups=[],
                                                  ex_blockdevicemappings=[_block_device_mappings.return_value],
                                                  added_key_pair_info=True,
                                                  added_script_info=True,
                                                  added_namespace_info=True)
    def test_create_node(self, _add_script_info, _add_key_pair_info,
                         _get_location, _get_image, _get_size, connection):
        node = cloud_models.Node(name='web1',
                                 image='127237412',
                                 flavor='512mb',
                                 networks=[],
                                 disk=27)

        def _add_key_pair_info_side_effect(kwargs):
            kwargs['added_key_pair_info'] = True

        def _add_script_info_side_effect(node, kwargs):
            kwargs['added_script_info'] = True

        _add_key_pair_info.side_effect = _add_key_pair_info_side_effect
        _add_script_info.side_effect = _add_script_info_side_effect

        self.cloud_driver.create_node(node)

        _get_image.assert_called_with('127237412')
        _get_size.assert_called_with('512mb')

        connection.create_node.assert_called_with(
            name='web1',
            image=_get_image.return_value,
            size=_get_size.return_value,
            location=_get_location.return_value,
            added_key_pair_info=True,
            added_script_info=True)
    def test_with_script(self, interpolate, log):
        collection = loader.load(
            self._get_full_path_for_test_data('with_script.yaml'))
        sg = cloud_models.SecurityGroup(name='webapp')

        script = '#!/bin/sh\nadduser --system web\napt-get install python-virtualenv\netc. etc. etc.\n'

        self.assertIn(
            cloud_models.Node(name='webapp1',
                              flavor='webapp',
                              image='trusty',
                              disk=10,
                              networks=[],
                              security_groups=set([sg]),
                              script=interpolate.return_value),
            collection.nodes)
        self.assertIn(
            cloud_models.Node(name='webapp2',
                              flavor='webapp',
                              image='trusty',
                              disk=10,
                              networks=[],
                              security_groups=set([sg]),
                              script=interpolate.return_value),
            collection.nodes)

        interpolate.assert_called_with(script, None)
        self.assertIn(sg, collection.security_groups)
        self.assertIn(
            cloud_models.SecurityGroupRule(security_group=sg,
                                           source_ip='0.0.0.0/0',
                                           from_port=443,
                                           to_port=443,
                                           protocol='tcp'),
            collection.security_group_rules)
        self.assertEqual(len(collection.nodes), 2)
        self.assertEqual(len(collection.security_groups), 1)
        self.assertEqual(len(collection.security_group_rules), 1)
        log.check(('aasemble.deployment.loader', 'DEBUG',
                   'Loaded node webapp1 from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded node webapp2 from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded security group webapp from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded security group rule from stack: tcp: 443-443'))
Example #7
0
 def test_block_device_mappings(self):
     node = cloud_models.Node(name='webapp',
                              image='trusty',
                              flavor='n1-standard-2',
                              disk=37,
                              networks=[],
                              script='foobar')
     self.assertEqual(self.cloud_driver._block_device_mappings(node), {'DeviceName': '/dev/sda1', 'Ebs.VolumeSize': 37})
 def _aasemble_node_from_provider_node(self, ec2node):
     node = cloud_models.Node(name=ec2node.name,
                              flavor=ec2node.size,
                              image=ec2node.image,
                              disk=self.volume_size_map[ec2node.extra['block_device_mapping'][0]['ebs']['volume_id']],
                              networks=[],
                              private=ec2node)
     node.security_group_names = set((v['group_name'] for v in ec2node.extra['groups']))
     return node
Example #9
0
 def test_delete_node(self, connection):
     webapp = cloud_models.Node(name='webapp',
                                image='trusty',
                                flavor='n1-standard-2',
                                disk=37,
                                networks=[],
                                security_groups=set(),
                                private=mock.sentinel.webapppriv)
     self.cloud_driver.delete_node(webapp)
     connection.destroy_node.assert_called_with(mock.sentinel.webapppriv)
    def test_add_script_info_no_script(self):
        node = cloud_models.Node(name='webapp',
                                 image='trusty',
                                 flavor='n1-standard-2',
                                 disk=37,
                                 networks=[])

        kwargs = {}
        self.cloud_driver._add_script_info(node, kwargs)
        self.assertEqual(kwargs, {})
Example #11
0
 def _aasemble_node_from_provider_node(self, donode):
     node = cloud_models.Node(name=donode.name,
                              flavor=donode.extra['size_slug'],
                              image=donode.extra['image']['id'],
                              disk=self.get_size(
                                  donode.extra['size_slug']).disk,
                              networks=[],
                              private=donode)
     node.security_group_names = set()
     return node
Example #12
0
 def _aasemble_node_from_provider_node(self, gcenode):
     node = cloud_models.Node(
         name=gcenode.name,
         flavor=gcenode.size,
         image=gcenode.image,
         disk=self.volume_size_map[gcenode.extra['disks'][0]['source']],
         networks=[],
         private=gcenode)
     node.security_group_names = set(gcenode.extra['tags'])
     return node
    def test_add_script_info(self):
        node = cloud_models.Node(name='webapp',
                                 image='trusty',
                                 flavor='n1-standard-2',
                                 disk=37,
                                 networks=[],
                                 script='foobar')

        kwargs = {}
        self.cloud_driver._add_script_info(node, kwargs)
        self.assertEqual(kwargs, {'ex_user_data': 'foobar'})
Example #14
0
    def _test_get_namespace(self, extra, expected_rv):
        class AWSNode(object):
            def __init__(self, extra):
                if extra is not None:
                    self.extra = extra

        node = cloud_models.Node(name='webapp',
                                 image='trusty',
                                 flavor='n1-standard-2',
                                 disk=37,
                                 networks=[])
        node.private = AWSNode(extra)
        self.assertEqual(self.cloud_driver.get_namespace(node), expected_rv)
    def test_with_security_groups(self, log):
        collection = loader.load(
            self._get_full_path_for_test_data('with_security_groups.yaml'))
        sg = cloud_models.SecurityGroup(name='webapp')

        self.assertIn(
            cloud_models.Node(name='webapp1',
                              flavor='webapp',
                              image='trusty',
                              disk=10,
                              networks=[],
                              security_groups=set([sg])), collection.nodes)
        self.assertIn(
            cloud_models.Node(name='webapp2',
                              flavor='webapp',
                              image='trusty',
                              disk=10,
                              networks=[],
                              security_groups=set([sg])), collection.nodes)

        self.assertIn(sg, collection.security_groups)
        self.assertIn(
            cloud_models.SecurityGroupRule(security_group=sg,
                                           source_ip='0.0.0.0/0',
                                           from_port=443,
                                           to_port=443,
                                           protocol='tcp'),
            collection.security_group_rules)
        self.assertEqual(len(collection.nodes), 2)
        self.assertEqual(len(collection.security_groups), 1)
        self.assertEqual(len(collection.security_group_rules), 1)
        log.check(('aasemble.deployment.loader', 'DEBUG',
                   'Loaded node webapp1 from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded node webapp2 from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded security group webapp from stack'),
                  ('aasemble.deployment.loader', 'DEBUG',
                   'Loaded security group rule from stack: tcp: 443-443'))
 def test_plurality(self, log):
     collection = loader.load(
         self._get_full_path_for_test_data('plurality.yaml'))
     self.assertIn(
         cloud_models.Node(name='webapp1',
                           flavor='webapp',
                           image='trusty',
                           disk=10,
                           networks=[]), collection.nodes)
     self.assertIn(
         cloud_models.Node(name='webapp2',
                           flavor='webapp',
                           image='trusty',
                           disk=10,
                           networks=[]), collection.nodes)
     self.assertEqual(len(collection.nodes), 2)
     self.assertEqual(len(collection.security_groups), 0)
     self.assertEqual(len(collection.security_group_rules), 0)
     log.check(('aasemble.deployment.loader', 'DEBUG',
                'Loaded node webapp1 from stack'),
               ('aasemble.deployment.loader', 'DEBUG',
                'Loaded node webapp2 from stack'))
 def test_as_dict(self):
     node = models.Node(name='nodename',
                        image='someimage',
                        flavor='someflavor',
                        disk=27,
                        networks=[])
     self.assertEquals(
         node.as_dict(), {
             'disk': 27,
             'flavor': 'someflavor',
             'image': 'someimage',
             'name': 'nodename',
             'public_ips': [],
             'script': None,
             'security_groups': []
         })
Example #18
0
    def _test_get_namespace(self, metadata, expected_rv):
        class GCENode(mock.MagicMock):
            pass

        node = cloud_models.Node(name='webapp',
                                 image='trusty',
                                 flavor='n1-standard-2',
                                 disk=37,
                                 networks=[])
        node.private = GCENode()
        node.private.extra = {}

        if metadata:
            node.private.extra['metadata'] = metadata

        self.assertEqual(self.cloud_driver.get_namespace(node), expected_rv)
    def test_format_collection(self):
        collection = cloud_models.Collection()

        class GCENode(object):
            def __init__(self, ip):
                self.public_ips = [ip]

        collection.nodes.add(
            cloud_models.Node(name='testnode',
                              flavor='n1-standard-1',
                              image='someimage',
                              networks=[],
                              disk=10,
                              private=GCENode('10.0.0.1')))
        self.assertEquals(
            aasemble.deployment.cli.format_collection(collection),
            "Nodes:\n  testnode: 10.0.0.1\n")
Example #20
0
    def test_disk_struct(self, _resolve_image_name, apply_mappings, _get_disk_type, connection):
        node = cloud_models.Node(name='webapp',
                                 image='trusty',
                                 flavor='n1-standard-2',
                                 disk=37,
                                 networks=[])

        apply_mappings.return_value = 'mappedtrusty'
        _get_disk_type.return_value = 'http://disktypelink'
        _resolve_image_name.return_value = 'http://mappedtrusty'
        self.assertEqual(self.cloud_driver._disk_struct(node), [{'boot': True,
                                                                 'autoDelete': True,
                                                                 'initializeParams': {
                                                                     'sourceImage': 'http://mappedtrusty',
                                                                     'diskType': 'http://disktypelink',
                                                                     'diskSizeGb': 37}}])
        _resolve_image_name.assert_called_with('mappedtrusty')
        apply_mappings.assert_called_with('images', 'trusty')
def build_nodes(data, substitutions=None):
    collection = set()
    for name in data.get('nodes', {}):
        node_info = data['nodes'][name]
        if 'count' in node_info:
            names = ['%s%d' % (name, idx) for idx in range(1, node_info['count'] + 1)]
        else:
            names = [name]

        for name in names:
            LOG.debug('Loaded node %s from stack' % name)
            node = cloud_models.Node(name=name,
                                     flavor=node_info['flavor'],
                                     image=node_info['image'],
                                     disk=node_info['disk'],
                                     networks=node_info.get('networks', []),
                                     script=interpolate(node_info.get('script', None), substitutions))
            node.security_group_names = node_info.get('security_groups', [])
            collection.add(node)
    return collection
Example #22
0
 def setUp(self):
     self.sg1 = cloud_models.SecurityGroup(name='sg1')
     self.sgr1 = cloud_models.SecurityGroupRule(security_group=self.sg1,
                                                from_port=443,
                                                to_port=443,
                                                source_ip='0.0.0.0/0',
                                                protocol='tcp')
     self.sgr2 = cloud_models.SecurityGroupRule(security_group=self.sg1,
                                                from_port=80,
                                                to_port=80,
                                                source_ip='0.0.0.0/0',
                                                protocol='tcp')
     self.node1 = cloud_models.Node(name='node1',
                                    image='image',
                                    flavor='image',
                                    networks=[],
                                    disk=10,
                                    security_groups=set([self.sg1]))
     self.current = cloud_models.Collection()
     self.desired = cloud_models.Collection()
    def test_connect(self):
        c = models.Collection()

        n = models.Node(name='node1',
                        flavor='flavor',
                        image='image',
                        networks=[],
                        disk=10)
        n.security_group_names = ['securitygroup1', 'securitygroup2']
        sg1 = NamedItem('securitygroup1')
        sg2 = NamedItem('securitygroup2')
        sg3 = NamedItem('securitygroup3')

        c.nodes.add(n)
        c.security_groups.add(sg1)
        c.security_groups.add(sg2)
        c.security_groups.add(sg3)

        c.connect()

        self.assertIn(sg1, n.security_groups)
        self.assertIn(sg2, n.security_groups)
    def test_cluster_data(self):
        collection = cloud_models.Collection()

        lb = cloud_models.Node(name='lb',
                               image='trusty',
                               flavor='512mb',
                               disk=27,
                               networks=[])
        web1 = cloud_models.Node(name='web1',
                                 image='trusty',
                                 flavor='512mb',
                                 disk=27,
                                 networks=[])
        web2 = cloud_models.Node(name='web2',
                                 image='trusty',
                                 flavor='512mb',
                                 disk=27,
                                 networks=[])
        db = cloud_models.Node(name='db',
                               image='trusty',
                               flavor='512mb',
                               disk=27,
                               networks=[])

        frontend_sg = cloud_models.SecurityGroup(name='frontend')
        frontend_http_sgr = cloud_models.SecurityGroupRule(
            security_group=frontend_sg,
            source_ip='0.0.0.0/0',
            from_port=80,
            to_port=80,
            protocol='tcp')
        frontend_https_sgr = cloud_models.SecurityGroupRule(
            security_group=frontend_sg,
            source_ip='0.0.0.0/0',
            from_port=443,
            to_port=443,
            protocol='tcp')
        lb.security_groups.add(frontend_sg)

        backend_sg = cloud_models.SecurityGroup(name='backend')
        backend_http_sgr = cloud_models.SecurityGroupRule(
            security_group=backend_sg,
            source_group='frontend',
            from_port=80,
            to_port=80,
            protocol='tcp')
        web1.security_groups.add(backend_sg)
        web2.security_groups.add(backend_sg)

        db_sg = cloud_models.SecurityGroup(name='mysql')
        mysql_sgr = cloud_models.SecurityGroupRule(security_group=db_sg,
                                                   source_group='backend',
                                                   from_port=3306,
                                                   to_port=3306,
                                                   protocol='tcp')
        db.security_groups.add(db_sg)

        collection.nodes.add(lb)
        collection.nodes.add(web1)
        collection.nodes.add(web2)
        collection.nodes.add(db)
        collection.nodes.add(db)
        collection.security_groups.add(frontend_sg)
        collection.security_groups.add(backend_sg)
        collection.security_groups.add(db_sg)
        collection.security_group_rules.add(frontend_http_sgr)
        collection.security_group_rules.add(frontend_https_sgr)
        collection.security_group_rules.add(backend_http_sgr)
        collection.security_group_rules.add(mysql_sgr)

        collection.urls.append(
            cloud_models.URLConfStatic(hostname='example.com',
                                       path='/foo/bar',
                                       local_path='/data'))
        collection.urls.append(
            cloud_models.URLConfBackend(hostname='example.com',
                                        path='/foo/bar',
                                        destination='somebackend/somepath'))
        self.maxDiff = None
        self.assertEqual(
            self.cloud_driver.cluster_data(collection), {
                'containers': [{
                    'host_network': True,
                    'image': 'aasemble/fwmanager',
                    'name': 'fwmanager',
                    'nodes': '.*',
                    'privileged': True
                }],
                'tasks': [],
                'proxyconf': {
                    'backends': ['somebackend'],
                    'domains': {
                        'example.com': {
                            '/foo/bar': {
                                'destination': 'somebackend/somepath',
                                'type': 'backend'
                            }
                        }
                    }
                },
                'fwconf': {
                    'security_groups': {
                        'backend': {
                            'nodes': ['web1', 'web2'],
                            'rules': [{
                                'from_port': 80,
                                'protocol': 'tcp',
                                'source_group': 'frontend',
                                'to_port': 80
                            }]
                        },
                        'frontend': {
                            'nodes': ['lb'],
                            'rules': [{
                                'from_port': 443,
                                'protocol': 'tcp',
                                'source_ip': '0.0.0.0/0',
                                'to_port': 443
                            }, {
                                'from_port': 80,
                                'protocol': 'tcp',
                                'source_ip': '0.0.0.0/0',
                                'to_port': 80
                            }]
                        },
                        'mysql': {
                            'nodes': ['db'],
                            'rules': [{
                                'from_port': 3306,
                                'protocol': 'tcp',
                                'source_group': 'backend',
                                'to_port': 3306
                            }]
                        }
                    }
                }
            })