コード例 #1
0
ファイル: test_exports.py プロジェクト: ometra/reclass
 def test_same_list_if_expr_invquery_different_flags(self):
     inventory = {
         'node1': NodeInventory({'a': 1}, True),
         'node2': NodeInventory({'a': 2}, True),
         'node3': NodeInventory({'a': 2}, False)
     }
     parameters = Parameters(
         {
             'alpha': '$[ if exports:a == 2 ]',
             'beta': '$[ +AllEnvs if exports:a == 2]'
         }, SETTINGS, '')
     result = {'alpha': ['node2'], 'beta': ['node2', 'node3']}
     parameters.interpolate(inventory)
     self.assertEqual(parameters.as_dict(), result)
コード例 #2
0
 def test_exports_with_refs(self):
     inventory = self._make_inventory({
         'node1': {
             'a': 1,
             'b': 2
         },
         'node2': {
             'a': 3,
             'b': 4
         }
     })
     node3_exports = Exports({'a': '${a}', 'b': '${b}'}, SETTINGS, '')
     node3_parameters = Parameters({
         'name': 'node3',
         'a': '${c}',
         'b': 5
     }, SETTINGS, '')
     node3_parameters.merge({'c': 3})
     node3_entity = Entity(SETTINGS,
                           classes=None,
                           applications=None,
                           parameters=node3_parameters,
                           exports=node3_exports)
     node3_entity.interpolate_exports()
     inventory['node3'] = NodeInventory(node3_entity.exports.as_dict(),
                                        True)
     result = {
         'node1': NodeInventory({
             'a': 1,
             'b': 2
         }, True),
         'node2': NodeInventory({
             'a': 3,
             'b': 4
         }, True),
         'node3': NodeInventory({
             'a': 3,
             'b': 5
         }, True)
     }
     self.assertDictEqual(inventory, result)
コード例 #3
0
ファイル: core.py プロジェクト: ometra/reclass
    def _get_inventory(self, all_envs, environment, queries):
        '''
            Returns a dictionary of NodeInventory objects, one per matching node. Exports
            which are required for the given queries (or all exports if the queries is None)
            are rendered, remaining exports are left unrendered.

            Args:
              all_envs - if True match export values from nodes in any environment
                         else if False match only for nodes in the same environment as the
                         environment parameter
              environment - node environment to match against if all_envs is False
              queries - list of inventory queries to determine required export values
                        or if None match all exports defined by a node
        '''
        inventory = {}
        for nodename in self._storage.enumerate_nodes():
            try:
                node_base = self._storage.get_node(nodename, self._settings)
                if node_base.environment is None:
                    node_base.environment = self._settings.default_environment
            except yaml.scanner.ScannerError as e:
                if self._settings.inventory_ignore_failed_node:
                    continue
                raise

            if all_envs or node_base.environment == environment:
                try:
                    node = self._node_entity(nodename)
                except ClassNotFound as e:
                    raise InvQueryClassNotFound(e)
                except ClassNameResolveError as e:
                    raise InvQueryClassNameResolveError(e)
                if queries is None:
                    # This only happens if reclass is called with the --inventory option
                    try:
                        node.interpolate_exports()
                    except InterpolationError as e:
                        e.nodename = nodename
                else:
                    node.initialise_interpolation()
                    for p, q in queries:
                        try:
                            node.interpolate_single_export(q)
                        except InterpolationError as e:
                            e.nodename = nodename
                            raise InvQueryError(q.contents,
                                                e,
                                                context=p,
                                                uri=q.uri)
                inventory[nodename] = NodeInventory(
                    node.exports.as_dict(),
                    node_base.environment == environment)
        return inventory
コード例 #4
0
 def test_exports_failed_render_ignore(self):
     node1_exports = Exports({'a': '${a}'}, SETTINGS, '')
     node1_parameters = Parameters(
         {
             'name': 'node1',
             'a': 1,
             'exp': '$[ +IgnoreErrors exports:a ]'
         }, SETTINGS, '')
     node1_entity = Entity(SETTINGS,
                           classes=None,
                           applications=None,
                           parameters=node1_parameters,
                           exports=node1_exports)
     node2_exports = Exports({'a': '${b}'}, SETTINGS, '')
     node2_parameters = Parameters({'name': 'node1', 'a': 2}, SETTINGS, '')
     node2_entity = Entity(SETTINGS,
                           classes=None,
                           applications=None,
                           parameters=node2_parameters,
                           exports=node2_exports)
     node1_entity.initialise_interpolation()
     node2_entity.initialise_interpolation()
     queries = node1_entity.parameters.get_inv_queries()
     for p, q in queries:
         node1_entity.interpolate_single_export(q)
         node2_entity.interpolate_single_export(q)
     res_inv = {
         'node1': NodeInventory({'a': 1}, True),
         'node2': NodeInventory({}, True)
     }
     res_params = {'name': 'node1', 'a': 1, 'exp': {'node1': 1}}
     inventory = self._make_inventory({
         'node1':
         node1_entity.exports.as_dict(),
         'node2':
         node2_entity.exports.as_dict()
     })
     node1_entity.interpolate(inventory)
     self.assertDictEqual(node1_parameters.as_dict(), res_params)
     self.assertDictEqual(inventory, res_inv)
コード例 #5
0
 def test_exports_with_nested_references(self):
     inventory = self._make_inventory({
         'node1': {
             'alpha': {
                 'a': 1,
                 'b': 2
             }
         },
         'node2': {
             'alpha': {
                 'a': 3,
                 'b': 4
             }
         }
     })
     node3_exports = Exports({'alpha': '${alpha}'}, SETTINGS, '')
     node3_parameters = Parameters(
         {
             'name': 'node3',
             'alpha': {
                 'a': '${one}',
                 'b': '${two}'
             },
             'beta': '$[ exports:alpha ]',
             'one': '111',
             'two': '${three}',
             'three': '123'
         }, SETTINGS, '')
     node3_entity = Entity(SETTINGS,
                           classes=None,
                           applications=None,
                           parameters=node3_parameters,
                           exports=node3_exports)
     res_params = {
         'name': 'node3',
         'alpha': {
             'a': '111',
             'b': '123'
         },
         'beta': {
             'node1': {
                 'a': 1,
                 'b': 2
             },
             'node2': {
                 'a': 3,
                 'b': 4
             },
             'node3': {
                 'a': '111',
                 'b': '123'
             }
         },
         'one': '111',
         'two': '123',
         'three': '123'
     }
     res_inv = {
         'node1': NodeInventory({'alpha': {
             'a': 1,
             'b': 2
         }}, True),
         'node2': NodeInventory({'alpha': {
             'a': 3,
             'b': 4
         }}, True),
         'node3': NodeInventory({'alpha': {
             'a': '111',
             'b': '123'
         }}, True)
     }
     node3_entity.interpolate_exports()
     inventory['node3'] = NodeInventory(node3_entity.exports.as_dict(),
                                        True)
     node3_entity.interpolate(inventory)
     self.assertDictEqual(node3_parameters.as_dict(), res_params)
     self.assertDictEqual(inventory, res_inv)
コード例 #6
0
 def test_exports_with_ancestor_references(self):
     inventory = self._make_inventory({
         'node1': {
             'alpha': {
                 'beta': {
                     'a': 1,
                     'b': 2
                 }
             }
         },
         'node2': {
             'alpha': {
                 'beta': {
                     'a': 3,
                     'b': 4
                 }
             }
         }
     })
     node3_exports = Exports({'alpha': '${alpha}'}, SETTINGS, '')
     node3_parameters = Parameters(
         {
             'name': 'node3',
             'alpha': {
                 'beta': {
                     'a': 5,
                     'b': 6
                 }
             },
             'exp': '$[ exports:alpha:beta ]'
         }, SETTINGS, '')
     node3_entity = Entity(SETTINGS,
                           classes=None,
                           applications=None,
                           parameters=node3_parameters,
                           exports=node3_exports)
     res_params = {
         'name': 'node3',
         'exp': {
             'node1': {
                 'a': 1,
                 'b': 2
             },
             'node2': {
                 'a': 3,
                 'b': 4
             },
             'node3': {
                 'a': 5,
                 'b': 6
             }
         },
         'alpha': {
             'beta': {
                 'a': 5,
                 'b': 6
             }
         }
     }
     res_inv = {
         'node1': NodeInventory({'alpha': {
             'beta': {
                 'a': 1,
                 'b': 2
             }
         }}, True),
         'node2': NodeInventory({'alpha': {
             'beta': {
                 'a': 3,
                 'b': 4
             }
         }}, True),
         'node3': NodeInventory({'alpha': {
             'beta': {
                 'a': 5,
                 'b': 6
             }
         }}, True)
     }
     node3_entity.initialise_interpolation()
     queries = node3_entity.parameters.get_inv_queries()
     for p, q in queries:
         node3_entity.interpolate_single_export(q)
     inventory['node3'] = NodeInventory(node3_entity.exports.as_dict(),
                                        True)
     node3_entity.interpolate(inventory)
     self.assertDictEqual(node3_parameters.as_dict(), res_params)
     self.assertDictEqual(inventory, res_inv)
コード例 #7
0
 def test_reference_to_an_export(self):
     inventory = self._make_inventory({
         'node1': {
             'a': 1,
             'b': 2
         },
         'node2': {
             'a': 3,
             'b': 4
         }
     })
     node3_exports = Exports({'a': '${a}', 'b': '${b}'}, SETTINGS, '')
     node3_parameters = Parameters(
         {
             'name': 'node3',
             'ref': '${exp}',
             'a': '${c}',
             'b': 5
         }, SETTINGS, '')
     node3_parameters.merge({'c': 3, 'exp': '$[ exports:a ]'})
     node3_entity = Entity(SETTINGS,
                           classes=None,
                           applications=None,
                           parameters=node3_parameters,
                           exports=node3_exports)
     node3_entity.interpolate_exports()
     inventory['node3'] = NodeInventory(node3_entity.exports.as_dict(),
                                        True)
     node3_entity.interpolate(inventory)
     res_inv = {
         'node1': NodeInventory({
             'a': 1,
             'b': 2
         }, True),
         'node2': NodeInventory({
             'a': 3,
             'b': 4
         }, True),
         'node3': NodeInventory({
             'a': 3,
             'b': 5
         }, True)
     }
     res_params = {
         'a': 3,
         'c': 3,
         'b': 5,
         'name': 'node3',
         'exp': {
             'node1': 1,
             'node3': 3,
             'node2': 3
         },
         'ref': {
             'node1': 1,
             'node3': 3,
             'node2': 3
         }
     }
     self.assertDictEqual(node3_parameters.as_dict(), res_params)
     self.assertDictEqual(inventory, res_inv)
コード例 #8
0
 def _make_inventory(self, nodes):
     return {
         name: NodeInventory(node, True)
         for name, node in iteritems(nodes)
     }