コード例 #1
0
ファイル: test_db.py プロジェクト: pebble/flotilla
    def setUp(self):
        self.status = MagicMock(spec=Table)
        self.assignments = MagicMock(spec=Table)
        self.revisions = MagicMock(spec=Table)
        self.units = MagicMock(spec=Table)
        self.kms = MagicMock(spec=KMSConnection)

        self.instance_id = 'i-123456'
        self.service = 'mock-service'

        self.db = FlotillaAgentDynamo(self.instance_id, self.service,
                                      self.status, self.assignments,
                                      self.revisions, self.units, self.kms)

        self.assignments.batch_get.return_value = [{'assignment': ASSIGNED}]

        self.revision = {
            'units': [UNIT_1_HASH, UNIT_2_HASH, UNIT_3_HASH],
            'rev_hash': ASSIGNED,
            'label': 'test'
        }
        self.revisions.batch_get.return_value = [self.revision]
        self.units.batch_get.return_value = [
            {'name': '1', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_1_HASH},
            {'name': '2', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_2_HASH},
            {'name': '3', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_3_HASH}
        ]
コード例 #2
0
ファイル: test_db.py プロジェクト: thepwagner/flotilla
    def setUp(self):
        self.status = MagicMock(spec=Table)
        self.assignments = MagicMock(spec=Table)
        self.revisions = MagicMock(spec=Table)
        self.units = MagicMock(spec=Table)
        self.kms = MagicMock(spec=KMSConnection)

        self.instance_id = 'i-123456'
        self.service = 'mock-service'

        self.db = FlotillaAgentDynamo(self.instance_id, self.service,
                                      self.status, self.assignments,
                                      self.revisions, self.units, self.kms)

        self.assignments.batch_get.return_value = [{'assignment': ASSIGNED}]

        self.revision = {
            'units': [UNIT_1_HASH, UNIT_2_HASH, UNIT_3_HASH],
            'rev_hash': ASSIGNED,
            'label': 'test'
        }
        self.revisions.batch_get.return_value = [self.revision]
        self.units.batch_get.return_value = [{
            'name': '1',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_1_HASH
        }, {
            'name': '2',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_2_HASH
        }, {
            'name': '3',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_3_HASH
        }]
コード例 #3
0
ファイル: test_db.py プロジェクト: thepwagner/flotilla
class TestFlotillaAgentDynamo(unittest.TestCase):
    def setUp(self):
        self.status = MagicMock(spec=Table)
        self.assignments = MagicMock(spec=Table)
        self.revisions = MagicMock(spec=Table)
        self.units = MagicMock(spec=Table)
        self.kms = MagicMock(spec=KMSConnection)

        self.instance_id = 'i-123456'
        self.service = 'mock-service'

        self.db = FlotillaAgentDynamo(self.instance_id, self.service,
                                      self.status, self.assignments,
                                      self.revisions, self.units, self.kms)

        self.assignments.batch_get.return_value = [{'assignment': ASSIGNED}]

        self.revision = {
            'units': [UNIT_1_HASH, UNIT_2_HASH, UNIT_3_HASH],
            'rev_hash': ASSIGNED,
            'label': 'test'
        }
        self.revisions.batch_get.return_value = [self.revision]
        self.units.batch_get.return_value = [{
            'name': '1',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_1_HASH
        }, {
            'name': '2',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_2_HASH
        }, {
            'name': '3',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_3_HASH
        }]

    def test_store_status(self):
        self.db.store_status({})

        self.status.put_item.assert_called_with(data=ANY, overwrite=True)
        for other_table in [self.assignments, self.revisions, self.units]:
            other_table.put_item.assert_not_called()

    def test_get_assignments(self):
        assignment = self.db.get_assignments()

        self.assertEqual([ASSIGNED], assignment)

        self.assignments.batch_get.assert_called_with([{
            'instance_id':
            self.instance_id
        }, {
            'instance_id':
            'global_7'
        }])

    def test_get_assignments_global(self):
        self.assignments.batch_get.return_value = [{
            'assignment': ASSIGNED
        }, {
            'assignment': ASSIGNED[::-1]
        }]

        assignment = self.db.get_assignments()

        self.assertEqual(2, len(assignment))

    def test_get_units(self):
        units = self.db.get_units([ASSIGNED])
        self.assertEqual(3, len(units))

        self.revisions.batch_get.assert_called_with([{'rev_hash': ASSIGNED}])
        self.units.batch_get.assert_called_with([{
            'unit_hash': UNIT_3_HASH
        }, {
            'unit_hash': UNIT_1_HASH
        }, {
            'unit_hash': UNIT_2_HASH
        }])

    def test_get_units_hash_mismatch(self):
        self.units.batch_get.return_value = [{
            'name': '1',
            'unit_file': 'pwned',
            'environment': '',
            'unit_hash': UNIT_1_HASH
        }, {
            'name': '2',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_2_HASH
        }, {
            'name': '3',
            'unit_file': '',
            'environment': '',
            'unit_hash': UNIT_3_HASH
        }]

        units = self.db.get_units([ASSIGNED])

        self.assertEquals(3, len(units))

    def test_get_units_decrypt(self):
        self.revision['units'] = [
            '2e96c29527f87d9d6a1dbab735590a23132abea196a785f607ec52d1c1a4c730'
        ]
        self.units.batch_get.return_value = [{
            'name':
            '1',
            'unit_file':
            '',
            'unit_hash':
            '2e96c29527f87d9d6a1dbab735590a23132abea196a785f607ec52d1c1a4c730',
            'environment_key':
            'kms-ciphertext'.encode('base64'),
            'environment_iv':
            'MDAwMDAwMDAwMDAwMDAwMA==',
            'environment_data':
            'guZyiyEsGQ6e8HIOMRQsdeXMl+6k2ywTfZi+MojMrAg='
        }]
        self.kms.decrypt.return_value = {'Plaintext': '0000000000000000'}

        units = self.db.get_units([ASSIGNED])

        self.kms.decrypt.assert_called_with('kms-ciphertext')
        decrypted_env = units[0].environment
        self.assertEqual(len(decrypted_env), 2)
        self.assertEqual(decrypted_env['foo'], 'bar')
        self.assertEqual(decrypted_env['typesafe'], True)
コード例 #4
0
ファイル: test_db.py プロジェクト: pebble/flotilla
class TestFlotillaAgentDynamo(unittest.TestCase):
    def setUp(self):
        self.status = MagicMock(spec=Table)
        self.assignments = MagicMock(spec=Table)
        self.revisions = MagicMock(spec=Table)
        self.units = MagicMock(spec=Table)
        self.kms = MagicMock(spec=KMSConnection)

        self.instance_id = 'i-123456'
        self.service = 'mock-service'

        self.db = FlotillaAgentDynamo(self.instance_id, self.service,
                                      self.status, self.assignments,
                                      self.revisions, self.units, self.kms)

        self.assignments.batch_get.return_value = [{'assignment': ASSIGNED}]

        self.revision = {
            'units': [UNIT_1_HASH, UNIT_2_HASH, UNIT_3_HASH],
            'rev_hash': ASSIGNED,
            'label': 'test'
        }
        self.revisions.batch_get.return_value = [self.revision]
        self.units.batch_get.return_value = [
            {'name': '1', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_1_HASH},
            {'name': '2', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_2_HASH},
            {'name': '3', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_3_HASH}
        ]

    def test_store_status(self):
        self.db.store_status({})

        self.status.put_item.assert_called_with(data=ANY, overwrite=True)
        for other_table in [self.assignments, self.revisions, self.units]:
            other_table.put_item.assert_not_called()

    def test_get_assignments(self):
        assignment = self.db.get_assignments()

        self.assertEqual([ASSIGNED], assignment)

        self.assignments.batch_get.assert_called_with([
            {'instance_id': self.instance_id},
            {'instance_id': 'global_7'}

        ])

    def test_get_assignments_global(self):
        self.assignments.batch_get.return_value = [
            {'assignment': ASSIGNED},
            {'assignment': ASSIGNED[::-1]}
        ]

        assignment = self.db.get_assignments()

        self.assertEqual(2, len(assignment))

    def test_get_units(self):
        units = self.db.get_units([ASSIGNED])
        self.assertEqual(3, len(units))

        self.revisions.batch_get.assert_called_with([{'rev_hash': ASSIGNED}])
        self.units.batch_get.assert_called_with([
            {'unit_hash': UNIT_3_HASH},
            {'unit_hash': UNIT_1_HASH},
            {'unit_hash': UNIT_2_HASH}
        ])

    def test_get_units_hash_mismatch(self):
        self.units.batch_get.return_value = [
            {'name': '1', 'unit_file': 'pwned', 'environment': '',
             'unit_hash': UNIT_1_HASH},
            {'name': '2', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_2_HASH},
            {'name': '3', 'unit_file': '', 'environment': '',
             'unit_hash': UNIT_3_HASH}
        ]

        units = self.db.get_units([ASSIGNED])

        self.assertEquals(3, len(units))

    def test_get_units_decrypt(self):
        self.revision['units'] = [
            '2e96c29527f87d9d6a1dbab735590a23132abea196a785f607ec52d1c1a4c730']
        self.units.batch_get.return_value = [{
            'name': '1',
            'unit_file': '',
            'unit_hash': '2e96c29527f87d9d6a1dbab735590a23132abea196a785f607ec52d1c1a4c730',
            'environment_key': 'kms-ciphertext'.encode('base64'),
            'environment_iv': 'MDAwMDAwMDAwMDAwMDAwMA==',
            'environment_data': 'guZyiyEsGQ6e8HIOMRQsdeXMl+6k2ywTfZi+MojMrAg='
        }]
        self.kms.decrypt.return_value = {
            'Plaintext': '0000000000000000'
        }

        units = self.db.get_units([ASSIGNED])

        self.kms.decrypt.assert_called_with('kms-ciphertext')
        decrypted_env = units[0].environment
        self.assertEqual(len(decrypted_env), 2)
        self.assertEqual(decrypted_env['foo'], 'bar')
        self.assertEqual(decrypted_env['typesafe'], True)