Exemple #1
0
    def get_attributes(cls, instance, all_plugins_versions=False):
        """Get attributes for current Cluster instance.

        :param instance: Cluster instance
        :param all_plugins_versions: Get attributes of all versions of plugins
        :returns: dict
        """
        try:
            attrs = db().query(models.Attributes).filter(
                models.Attributes.cluster_id == instance.id
            ).one()
        except MultipleResultsFound:
            raise errors.InvalidData(
                u"Multiple rows with attributes were found for cluster '{0}'"
                .format(instance.name)
            )
        except NoResultFound:
            raise errors.InvalidData(
                u"No attributes were found for cluster '{0}'"
                .format(instance.name)
            )
        attrs = dict(attrs)

        # Merge plugins attributes into editable ones
        plugin_attrs = PluginManager.get_plugins_attributes(
            instance, all_versions=all_plugins_versions)
        plugin_attrs = traverse(plugin_attrs, AttributesGenerator, {
            'cluster': instance,
            'settings': settings,
        })
        attrs['editable'].update(plugin_attrs)

        return attrs
Exemple #2
0
    def get_attributes(cls, instance, all_plugins_versions=False):
        """Get attributes for current Cluster instance.

        :param instance: Cluster instance
        :param all_plugins_versions: Get attributes of all versions of plugins
        :returns: dict
        """
        try:
            attrs = db().query(models.Attributes).filter(
                models.Attributes.cluster_id == instance.id
            ).one()
        except MultipleResultsFound:
            raise errors.InvalidData(
                u"Multiple rows with attributes were found for cluster '{0}'"
                .format(instance.name)
            )
        except NoResultFound:
            raise errors.InvalidData(
                u"No attributes were found for cluster '{0}'"
                .format(instance.name)
            )
        attrs = dict(attrs)

        # Merge plugins attributes into editable ones
        plugin_attrs = PluginManager.get_plugins_attributes(
            instance, all_versions=all_plugins_versions)
        plugin_attrs = traverse(plugin_attrs, AttributesGenerator, {
            'cluster': instance,
            'settings': settings,
        })
        attrs['editable'].update(plugin_attrs)

        return attrs
Exemple #3
0
    def test_get_plugins_attributes_when_cluster_is_not_locked(self):
        self.env.create(api=False)
        cluster = self.env.clusters[-1]
        plugin_a1 = self.env.create_plugin(name='plugin_a',
                                           version='1.0.1',
                                           cluster=cluster,
                                           enabled=False)
        plugin_a2 = self.env.create_plugin(name='plugin_a',
                                           version='1.0.2',
                                           is_hotpluggable=True,
                                           cluster=cluster,
                                           enabled=True)
        plugin_b = self.env.create_plugin(name='plugin_b',
                                          title='plugin_a_title',
                                          cluster=cluster)
        self.assertFalse(plugin_a1.is_hotpluggable)
        self.assertTrue(plugin_a2.is_hotpluggable)
        self.assertFalse(plugin_b.is_hotpluggable)
        self.assertFalse(cluster.is_locked)
        attributes = PluginManager.get_plugins_attributes(cluster, True, True)
        self.assertItemsEqual(['plugin_a', 'plugin_b'], attributes)
        self.assertTrue(attributes['plugin_a']['metadata']['always_editable'])
        self.assertItemsEqual([{
            'data':
            str(plugin_a1.id),
            'description':
            '',
            'label':
            plugin_a1.version,
            'restrictions': [{
                'action': 'disable',
                'condition': 'cluster:is_locked'
            }],
        }, {
            'data': str(plugin_a2.id),
            'description': '',
            'label': plugin_a2.version
        }], attributes['plugin_a']['plugin_versions']['values'])
        self.assertEqual(str(plugin_a1.id),
                         attributes['plugin_a']['plugin_versions']['value'])
        self.assertNotIn('always_editable', attributes['plugin_b']['metadata'])
        self.assertItemsEqual([
            {
                'restrictions': [{
                    'action': 'disable',
                    'condition': 'cluster:is_locked'
                }],
                'data':
                str(plugin_b.id),
                'description':
                '',
                'label':
                plugin_b.version,
            },
        ], attributes['plugin_b']['plugin_versions']['values'])

        self.assertEqual(str(plugin_b.id),
                         attributes['plugin_b']['plugin_versions']['value'])
Exemple #4
0
    def get_default_editable_attributes(cls, instance):
        """Get editable attributes from release metadata

        :param instance: Cluster instance
        :returns: Dict object
        """
        editable = instance.release.attributes_metadata.get("editable")
        # Add default attributes of connected plugins
        plugin_attrs = PluginManager.get_plugins_attributes(
            instance, all_versions=True, default=True)
        editable = dict(plugin_attrs, **editable)
        editable = traverse(editable, AttributesGenerator, {
            'cluster': instance,
            'settings': settings,
        })

        return editable
Exemple #5
0
    def get_default_editable_attributes(cls, instance):
        """Get editable attributes from release metadata

        :param instance: Cluster instance
        :returns: Dict object
        """
        editable = instance.release.attributes_metadata.get("editable")
        # Add default attributes of connected plugins
        plugin_attrs = PluginManager.get_plugins_attributes(
            instance, all_versions=True, default=True)
        editable = dict(plugin_attrs, **editable)
        editable = traverse(editable, AttributesGenerator, {
            'cluster': instance,
            'settings': settings,
        })

        return editable
    def test_get_plugins_attributes_when_cluster_is_not_locked(self):
        cluster = self.env.create(api=False)
        plugin_a1 = self.env.create_plugin(
            name='plugin_a', version='1.0.1',
            cluster=cluster, enabled=False
        )
        plugin_a2 = self.env.create_plugin(
            name='plugin_a', version='1.0.2', is_hotpluggable=True,
            cluster=cluster, enabled=True
        )
        plugin_b = self.env.create_plugin(
            name='plugin_b', title='plugin_a_title', cluster=cluster,
            attributes_metadata={
                'attributes': {
                    'metadata': {
                        'restrictions': [
                            {
                                "condition": "test_condition",
                                "action": "hide"
                            }
                        ]
                    }
                }
            }
        )
        self.assertFalse(plugin_a1.is_hotpluggable)
        self.assertTrue(plugin_a2.is_hotpluggable)
        self.assertFalse(plugin_b.is_hotpluggable)
        self.assertFalse(cluster.is_locked)
        attributes = PluginManager.get_plugins_attributes(
            cluster, all_versions=True, default=True
        )

        pl_a1 = attributes['plugin_a']['metadata']['versions'][0]
        pl_a2 = attributes['plugin_a']['metadata']['versions'][1]
        pl_b = attributes['plugin_b']['metadata']['versions'][0]

        self.assertItemsEqual(['plugin_a', 'plugin_b'], attributes)

        self.assertItemsEqual(
            {
                'plugin_id': plugin_a1.id,
                'plugin_version': plugin_a1.version,
                'hot_pluggable': False,
                'contains_legacy_tasks': False
            }, pl_a1['metadata']
        )
        self.assertItemsEqual(
            {
                'plugin_id': plugin_a2.id,
                'plugin_version': plugin_a2.version,
                'hot_pluggable': True,
                'contains_legacy_tasks': False
            },
            pl_a2['metadata']
        )
        self.assertItemsEqual(
            {
                'plugin_id': plugin_b.id,
                'plugin_version': plugin_b.version,
                'hot_pluggable': False,
                'contains_legacy_tasks': False,
                'restrictions': [
                    {
                        "condition": "cluster:net_provider != 'neutron'",
                        "action": "hide"
                    }
                ]
            }, pl_b['metadata']
        )
        self.assertEqual(
            plugin_a1.id,
            attributes['plugin_a']['metadata']['chosen_id']
        )
        self.assertEqual(
            plugin_b.id,
            attributes['plugin_b']['metadata']['chosen_id']
        )
    def test_get_plugins_attributes_when_cluster_is_not_locked(self):
        cluster = self.env.create(api=False)
        plugin_a1 = self.env.create_plugin(
            name='plugin_a', version='1.0.1',
            cluster=cluster, enabled=False
        )
        plugin_a2 = self.env.create_plugin(
            name='plugin_a', version='1.0.2', is_hotpluggable=True,
            cluster=cluster, enabled=True
        )
        plugin_b = self.env.create_plugin(
            name='plugin_b', title='plugin_a_title', cluster=cluster,
            attributes_metadata={
                'attributes': {
                    'metadata': {
                        'restrictions': [
                            {
                                "condition": "test_condition",
                                "action": "hide"
                            }
                        ]
                    }
                }
            }
        )
        self.assertFalse(plugin_a1.is_hotpluggable)
        self.assertTrue(plugin_a2.is_hotpluggable)
        self.assertFalse(plugin_b.is_hotpluggable)
        self.assertFalse(cluster.is_locked)
        attributes = PluginManager.get_plugins_attributes(
            cluster, all_versions=True, default=True
        )

        pl_a1 = attributes['plugin_a']['metadata']['versions'][0]
        pl_a2 = attributes['plugin_a']['metadata']['versions'][1]
        pl_b = attributes['plugin_b']['metadata']['versions'][0]

        self.assertItemsEqual(['plugin_a', 'plugin_b'], attributes)

        self.assertItemsEqual(
            {
                'plugin_id': plugin_a1.id,
                'plugin_version': plugin_a1.version,
                'hot_pluggable': False,
                'contains_legacy_tasks': False
            }, pl_a1['metadata']
        )
        self.assertItemsEqual(
            {
                'plugin_id': plugin_a2.id,
                'plugin_version': plugin_a2.version,
                'hot_pluggable': True,
                'contains_legacy_tasks': False
            },
            pl_a2['metadata']
        )
        self.assertItemsEqual(
            {
                'plugin_id': plugin_b.id,
                'plugin_version': plugin_b.version,
                'hot_pluggable': False,
                'contains_legacy_tasks': False,
                'restrictions': [
                    {
                        "condition": "cluster:net_provider != 'neutron'",
                        "action": "hide"
                    }
                ]
            }, pl_b['metadata']
        )
        self.assertEqual(
            plugin_a1.id,
            attributes['plugin_a']['metadata']['chosen_id']
        )
        self.assertEqual(
            plugin_b.id,
            attributes['plugin_b']['metadata']['chosen_id']
        )
    def test_get_plugins_attributes_when_cluster_is_not_locked(self):
        self.env.create(api=False)
        cluster = self.env.clusters[-1]
        plugin_a1 = self.env.create_plugin(
            name='plugin_a', version='1.0.1',
            cluster=cluster, enabled=False
        )
        plugin_a2 = self.env.create_plugin(
            name='plugin_a', version='1.0.2', is_hotpluggable=True,
            cluster=cluster, enabled=True
        )
        plugin_b = self.env.create_plugin(
            name='plugin_b', title='plugin_a_title', cluster=cluster
        )
        self.assertFalse(plugin_a1.is_hotpluggable)
        self.assertTrue(plugin_a2.is_hotpluggable)
        self.assertFalse(plugin_b.is_hotpluggable)
        self.assertFalse(cluster.is_locked)
        attributes = PluginManager.get_plugins_attributes(
            cluster, True, True
        )
        self.assertItemsEqual(
            ['plugin_a', 'plugin_b'], attributes
        )
        self.assertTrue(
            attributes['plugin_a']['metadata']['always_editable']
        )
        self.assertItemsEqual(
            [
                {
                    'data': str(plugin_a1.id),
                    'description': '',
                    'label': plugin_a1.version,
                    'restrictions': [
                        {
                            'action': 'disable',
                            'condition': 'cluster:is_locked'
                        }
                    ],
                },
                {
                    'data': str(plugin_a2.id),
                    'description': '',
                    'label': plugin_a2.version
                }
            ],
            attributes['plugin_a']['plugin_versions']['values']
        )
        self.assertEqual(
            str(plugin_a1.id),
            attributes['plugin_a']['plugin_versions']['value']
        )
        self.assertNotIn(
            'always_editable', attributes['plugin_b']['metadata']
        )
        self.assertItemsEqual(
            [
                {
                    'restrictions': [
                        {
                            'action': 'disable',
                            'condition': 'cluster:is_locked'
                        }
                    ],
                    'data': str(plugin_b.id),
                    'description': '',
                    'label': plugin_b.version,
                },
            ],
            attributes['plugin_b']['plugin_versions']['values']
        )

        self.assertEqual(
            str(plugin_b.id),
            attributes['plugin_b']['plugin_versions']['value']
        )
    def test_get_plugins_attributes_when_cluster_is_locked(self):
        self.env.create(api=False)
        cluster = self.env.clusters[-1]
        plugin_a1 = self.env.create_plugin(
            name='plugin_a', version='1.0.1',
            cluster=cluster, enabled=False
        )
        plugin_a2 = self.env.create_plugin(
            name='plugin_a', version='1.0.2', is_hotpluggable=True,
            cluster=cluster, enabled=False
        )
        plugin_b = self.env.create_plugin(
            name='plugin_b', title='plugin_a_title', cluster=cluster,
            attributes_metadata={
                'metadata': {
                    'restrictions': [
                        {
                            "condition": "cluster:net_provider != 'neutron'",
                            "action": "hide"
                        }
                    ]
                }
            }
        )
        cluster.status = consts.CLUSTER_STATUSES.operational
        self.db.flush()
        self.assertTrue(cluster.is_locked)
        attributes = PluginManager.get_plugins_attributes(
            cluster, all_versions=True, default=True
        )

        pl_a1 = attributes['plugin_a']['metadata']['versions'][0]
        pl_a2 = attributes['plugin_a']['metadata']['versions'][1]
        pl_b = attributes['plugin_b']['metadata']['versions'][0]

        self.assertItemsEqual(['plugin_a', 'plugin_b'], attributes)
        self.assertItemsEqual(
            {
                'plugin_id': plugin_a1.id,
                'plugin_version': plugin_a1.version,
                'always_editable': False
            }, pl_a1['metadata']
        )
        self.assertItemsEqual(
            {
                'plugin_id': plugin_a2.id,
                'plugin_version': plugin_a2.version,
                'always_editable': True
            },
            pl_a2['metadata']
        )
        self.assertItemsEqual(
            {
                'plugin_id': plugin_b.id,
                'plugin_version': plugin_b.version,
                'always_editable': False,
                'restrictions': [
                    {
                        "condition": "cluster:net_provider != 'neutron'",
                        "action": "hide"
                    }
                ]
            }, pl_b['metadata']
        )
        self.assertEqual(
            plugin_a1.id,
            attributes['plugin_a']['metadata']['chosen_id']
        )
        self.assertEqual(
            plugin_b.id,
            attributes['plugin_b']['metadata']['chosen_id']
        )