示例#1
0
文件: broker.py 项目: sputnik13/cue
class Broker(base.CueObject):
    dbapi = db_api.get_instance()

    fields = {
        'id': obj_utils.str_or_none,
        'name': obj_utils.str_or_none,
        'active': obj_utils.bool_or_none,
        'deleted': obj_utils.bool_or_none,
        'created_at': obj_utils.datetime_or_str_or_none,
        'updated_at': obj_utils.datetime_or_str_or_none,
        'deleted_at': obj_utils.datetime_or_str_or_none,
    }

    @staticmethod
    def _from_db_object(broker, db_broker):
        """Convert a database object to a universal broker object."""
        for field in broker.fields:
            broker[field] = db_broker[field]
        return broker

    def create_broker(self, context):
        """Creates a new broker.

        :param context: request context object
        """
        broker_values = self.as_dict()
        db_broker = self.dbapi.create_broker(context, broker_values)

        return self._from_db_object(self, db_broker)

    def delete_broker(self, context):
        """Deletes a Broker object for specified broker_id.

        :param context: request context object

        """
        self.dbapi.delete_broker(context, self.id)

    def update_broker(self, context):
        """Updates a Broker type/status for specified broker_id.

        :param context: request context object

        """
        broker_value = self.as_dict()
        self.dbapi.update_broker(context, self.id, broker_value)

    @classmethod
    def get_brokers(cls, context):
        """Returns a list of Broker objects.

        :param context: request context object
        :returns: a list of :class:'Broker' object

        """
        db_brokers = cls.dbapi.get_brokers(context)
        return [Broker._from_db_object(Broker(), obj) for obj in db_brokers]
示例#2
0
class Node(base.CueObject):

    dbapi = db_api.get_instance()

    fields = {
        'id': obj_utils.str_or_none,
        'cluster_id': obj_utils.str_or_none,
        'instance_id': obj_utils.str_or_none,
        'flavor': obj_utils.str_or_none,
        'management_ip': obj_utils.str_or_none,
        'status': obj_utils.str_or_none,
        'created_at': obj_utils.datetime_or_str_or_none,
        'updated_at': obj_utils.datetime_or_str_or_none,
        'deleted_at': obj_utils.datetime_or_str_or_none,
    }

    @staticmethod
    def _from_db_object(node, db_node):
        """Convert a database object to a universal node object."""
        for field in node.fields:
            node[field] = db_node[field]
        return node

    def update(self, context, node_id):
        """Updates a database node object.

        :param context: The request context
        :param node_id:
        """
        node_changes = self.obj_get_changes()

        self.dbapi.update_node(context, node_changes, node_id)

    @classmethod
    def get_nodes_by_cluster_id(cls, context, cluster_id):
        """Returns a list of Node objects for specified cluster.

        :param context: request context object
        :param cluster_id: UUID of the cluster
        :returns: a list of :class:'Node' object

        """
        db_nodes = cls.dbapi.get_nodes_in_cluster(context, cluster_id)

        return [Node._from_db_object(Node(), obj) for obj in db_nodes]

    @classmethod
    def get_node_by_id(cls, context, node_id):
        """Returns a Node specified by it's id.

        :param context: request context object
        :param node_id: UUID of a node

        """
        db_node = cls.dbapi.get_node_by_id(context, node_id)
        return Node._from_db_object(Node(), db_node)
示例#3
0
class Endpoint(base.CueObject):

    dbapi = db_api.get_instance()

    fields = {
        'id': obj_utils.str_or_none,
        'node_id': obj_utils.str_or_none,
        'uri': obj_utils.str_or_none,
        'type': obj_utils.str_or_none,
    }

    @staticmethod
    def _from_db_object(cluster, db_cluster):
        """Convert a database object to a universal endpoint object."""
        for field in cluster.fields:
            cluster[field] = db_cluster[field]
        return cluster

    def create(self, context):
        """Creates a new endpoint.

        :param context: The request context

        """
        endpoint_changes = self.obj_get_changes()

        db_endpoint = self.dbapi.create_endpoint(context, endpoint_changes)

        self._from_db_object(self, db_endpoint)

    @classmethod
    def update_by_node_id(cls, context, node_id, endpoint_changes):
        """Updates a database endpoint object.

        :param context: The request context
        :param node_id: The node id
        :param endpoint_changes: dictionary of endpoint changes
        """
        cls.dbapi.update_endpoints_by_node_id(context, endpoint_changes,
                                              node_id)

    @classmethod
    def get_endpoints_by_node_id(cls, context, node_id):
        """Returns a list of Endpoint objects for specified node.

        :param node_id: UUID of the node.
        :returns: a list of :class:'Endpoint' object.

        """
        db_endpoints = cls.dbapi.get_endpoints_in_node(context, node_id)

        return [
            Endpoint._from_db_object(Endpoint(), obj) for obj in db_endpoints
        ]
示例#4
0
class NodeObjectsTests(base.FunctionalTestCase):
    dbapi = db_api.get_instance()

    def validate_node_values(self, node_ref, node_cmp):
        """Validate Node Object fields."""
        self.assertEqual(node_ref.id if hasattr(node_ref, "id") else
                         node_ref["id"],
                         node_cmp.id if hasattr(node_cmp, "id") else
                         node_cmp["id"],
                         "Invalid node id value")
        self.assertEqual(node_ref.cluster_id if hasattr(node_ref, "cluster_id")
                         else node_ref["cluster_id"],
                         node_cmp.cluster_id if hasattr(node_cmp, "cluster_id")
                         else node_cmp["cluster_id"],
                         "Invalid cluster_id value")
        self.assertEqual(node_ref.instance_id if hasattr(node_ref,
                         "instance_id") else node_ref["instance_id"],
                         node_cmp.instance_id if hasattr(node_cmp,
                         "instance_id") else node_cmp["instance_id"],
                         "Invalid instance_id value")
        self.assertEqual(node_ref.flavor if hasattr(node_ref, "flavor") else
                         node_ref["flavor"],
                         node_cmp.flavor if hasattr(node_cmp, "flavor") else
                         node_cmp["flavor"],
                         "Invalid flavor value")
        self.assertEqual(node_ref.status if hasattr(node_ref, "status") else
                         node_ref["status"],
                         node_cmp.status if hasattr(node_cmp, "status") else
                         node_cmp["status"],
                         "Invalid status value")
        self.assertEqual(node_ref.management_ip if hasattr(
                         node_ref, "management_ip") else
                         node_ref["management_ip"],
                         node_cmp.management_ip if hasattr(
                         node_cmp, "management_ip") else
                         node_cmp["management_ip"],
                         "Invalid management ip value")

        self.assertTrue(test_utils.compare_dates(node_ref["created_at"],
                                                 node_cmp["created_at"]),
                        "Invalid created_at value")

        self.assertTrue(test_utils.compare_dates(node_ref["updated_at"],
                                                 node_cmp["updated_at"]),
                        "Invalid updated_at value")

        self.assertTrue(test_utils.compare_dates(node_ref["deleted_at"],
                                                 node_cmp["deleted_at"]),
                        "Invalid deleted_at value")

    def test_node_object_generation(self):
        """Test Node Object generation from a node dictionary object."""
        node_dict = func_utils.get_test_node_dict()
        node_object = objects.Node(**node_dict)
        self.validate_node_values(node_object, node_dict)

    def test_node_db_to_object_to_db(self):
        """Tests Node db object conversion to Node object and back

        to db object.
        """
        node_dict = func_utils.get_test_node_dict()
        db_node_object = models.Node()
        db_node_object.update(node_dict)
        object_node = objects.Node._from_db_object(objects.Node(),
                                                   db_node_object)
        self.validate_node_values(db_node_object, object_node)

        node_changes = object_node.obj_get_changes()
        db_node_object_2 = models.Endpoint()
        db_node_object_2.update(node_changes)
        self.validate_node_values(db_node_object, db_node_object_2)

    def test_update_node_size_one(self):
        """Tests update node from Node objects API."""
        new_cluster = func_utils.create_object_cluster(self.context, size=1,
                                                       flavor='flavor1')

        db_node = self.dbapi.get_nodes_in_cluster(self.context, new_cluster.id)
        new_node = objects.Node._from_db_object(objects.Node(), db_node[0])
        new_node.flavor = 'flavor2'
        new_node.update(self.context, new_node.id)
        updated_node = self.dbapi.get_nodes_in_cluster(self.context,
                                                       new_cluster.id)[0]
        self.assertEqual('flavor2', updated_node.flavor)

    def test_update_node_size_three(self):
        """Tests update three nodes from Node objects API."""
        new_cluster = func_utils.create_object_cluster(self.context, size=3,
                                                       flavor='flavor1')

        db_nodes = self.dbapi.get_nodes_in_cluster(self.context,
                                                   new_cluster.id)
        # check if cluster size is 3
        self.assertEqual(3, len(db_nodes))
        for current_node in db_nodes:
            current_node = objects.Node._from_db_object(objects.Node(),
                                                        current_node)
            current_node.flavor = 'flavor2'
            current_node.update(self.context, current_node.id)

        updated_nodes = self.dbapi.get_nodes_in_cluster(self.context,
                                                        new_cluster.id)
        for nodes in updated_nodes:
            self.assertEqual('flavor2', nodes.flavor)

    def test_get_nodes_by_cluster_id(self):
        """Tests get nodes by cluster id from Node objects API."""
        new_cluster = func_utils.create_object_cluster(self.context, size=2)

        db_nodes = self.dbapi.get_nodes_in_cluster(self.context,
                                                   new_cluster.id)
        node_list = objects.Node.get_nodes_by_cluster_id(self.context,
                                                              new_cluster.id)
        for db_node, node in zip(db_nodes, node_list):
            self.validate_node_values(db_node, node)

    def test_get_node_by_id(self):
        """Tests get nodes by node id from Nodes objects API."""
        new_cluster = func_utils.create_object_cluster(self.context)

        db_node = self.dbapi.get_nodes_in_cluster(self.context, new_cluster.id)
        obj_node = objects.Node._from_db_object(objects.Node(), db_node[0])
        node = objects.Node.get_node_by_id(self.context, obj_node.id)
        self.validate_node_values(obj_node, node)
示例#5
0
文件: test_api.py 项目: sputnik13/cue
class ApiTests(base.FunctionalTestCase):

    dbapi = db_api.get_instance()

    def setUp(self):
        super(ApiTests, self).setUp()

        # Delete any default brokers and broker metadata
        brokers = self.dbapi.get_brokers(self.context)
        for broker in brokers:
            broker_metadata_list = self.dbapi.get_broker_metadata_by_broker_id(
                self.context, broker.id)
            for broker_metadata in broker_metadata_list:
                self.dbapi.delete_broker_metadata(self.context,
                                                  broker_metadata.id)
            self.dbapi.delete_broker(self.context, broker.id)

        # Add a default broker & metadata specific to this test class
        broker_values = {'name': 'fake broker', 'active': '1'}
        broker = self.dbapi.create_broker(self.context, broker_values)

        broker_metadata_values = {
            'key': 'IMAGE',
            'value': 'f7e8c49b-7d1e-472f-a78b-7c46a39c85be',
            'broker_id': broker.id
        }
        self.dbapi.create_broker_metadata(self.context, broker_metadata_values)

    def test_get_clusters(self):
        """Verifies get clusters DB API."""

    def test_create_clusters(self):
        """Verifies create cluster DB API."""
        cluster_values = {
            "project_id": UUID1,
            "name": "Rabbit Cluster",
            "network_id": UUID2,
            "flavor": "medium",
            "size": 5,
            "volume_size": 250,
        }

        db_cluster = self.dbapi.create_cluster(self.context, cluster_values)
        self.assertEqual(cluster_values["name"], db_cluster.name,
                         "invalid name value")
        self.assertEqual(cluster_values["network_id"], db_cluster.network_id,
                         "invalid network_id value")
        self.assertEqual(cluster_values["flavor"], db_cluster.flavor,
                         "invalid flavor value")
        self.assertEqual(cluster_values["size"], db_cluster.size,
                         "invalid size value")
        self.assertEqual(cluster_values["volume_size"], db_cluster.volume_size,
                         "invalid volume_size value")
        self.assertFalse(db_cluster.deleted, "invalid deleted value")

    def test_get_cluster_by_id(self):
        """Verifies create cluster DB API."""

    def test_get_nodes_in_cluster(self):
        """Verifies create cluster DB API."""
        cluster_values = {
            "project_id": UUID1,
            "name": "Rabbit Cluster",
            "network_id": UUID2,
            "flavor": "medium",
            "size": 5,
            "volume_size": 250,
        }

        db_cluster = self.dbapi.create_cluster(self.context, cluster_values)
        db_nodes = self.dbapi.get_nodes_in_cluster(self.context, db_cluster.id)

        for node in db_nodes:
            self.assertEqual(db_cluster.id, node.cluster_id,
                             "invalid flavor value")
            self.assertEqual(cluster_values["flavor"], node.flavor,
                             "invalid flavor value")
            self.assertFalse(node.deleted, "invalid deleted value")

    def test_get_endpoints_in_node(self):
        """Verifies create cluster DB API."""

    def test_update_cluster_deleting(self):
        """Verifies create cluster DB API."""

    def test_create_broker(self):
        """Verifies create broker DB API."""

        broker_values = {"name": "Test Broker Name", "active": 1}

        db_broker = self.dbapi.create_broker(self.context, broker_values)

        self.assertEqual(broker_values['name'], db_broker.name,
                         "invalid broker name value")
        self.assertEqual(broker_values['active'], db_broker.active,
                         "invalid broker active value")

    def test_get_default_broker(self):
        """Verifies get brokers DB API."""

        brokers = self.dbapi.get_brokers(self.context)
        self.assertIsNotNone(brokers,
                             "Should have found the default RabbitMQ broker.")
        self.assertIs(
            len(brokers), 1,
            "Should have found only 1 broker, instead found " +
            str(len(brokers)))
        self.assertEqual(
            brokers[0].name, "fake broker",
            "Should have found the default fake broker, "
            "instead found: " + str(brokers[0].name))

    def test_get_multiple_brokers(self):
        """Verifies get brokers DB API."""

        self.dbapi.create_broker(self.context, {
            "name": "Test Broker Name 1",
            "active": 1
        })
        self.dbapi.create_broker(self.context, {
            "name": "Test Broker Name 2",
            "active": 1
        })

        brokers = self.dbapi.get_brokers(self.context)
        self.assertIsNotNone(brokers,
                             "Should have found the default RabbitMQ broker.")
        self.assertIs(
            len(brokers), 3,
            "Should have found 3 brokers, instead found " + str(len(brokers)))

    def test_delete_broker(self):
        """Verifies delete broker DB API."""

        brokers = self.dbapi.get_brokers(self.context)
        self.assertIs(
            len(brokers), 1,
            "Should have found only 1 broker, instead found " +
            str(len(brokers)))
        broker_id = brokers[0].id

        self.dbapi.delete_broker(self.context, broker_id)
        brokers = self.dbapi.get_brokers(self.context)
        self.assertIs(
            len(brokers), 0, "Should have found 0 brokers after deleting the "
            "default broker. Instead found " + str(len(brokers)))

        broker_query = sqlalchemy_api.model_query(
            self.context, models.Broker,
            read_deleted=True).filter_by(id=broker_id)

        broker = broker_query.one()

        self.assertEqual(broker_id, broker.id,
                         "Query should have returned the same broker.")
        self.assertTrue(broker.deleted, "Broker deleted flag should be true.")

    def test_update_broker(self):
        """Verifies update broker DB API."""

        brokers = self.dbapi.get_brokers(self.context)
        self.assertIs(
            len(brokers), 1,
            "Should have found only 1 broker, instead found " +
            str(len(brokers)))
        broker_id = brokers[0].id

        self.assertEqual(
            brokers[0].name, "fake broker",
            "Should have found the default fake broker.  "
            "Instead found: " + brokers[0].name)

        broker_values = {"name": "Test Broker Name", "active": 1}

        self.dbapi.update_broker(self.context, broker_id, broker_values)

        brokers = self.dbapi.get_brokers(self.context)
        self.assertIs(
            len(brokers), 1,
            "Should have found only 1 broker, instead found " +
            str(len(brokers)))

        self.assertEqual(
            brokers[0].name, "Test Broker Name",
            "Should have found the default rabbitmq broker.  "
            "Instead found: " + brokers[0].name)

    def test_create_broker_metadata(self):
        """Verifies create broker metadata DB API."""

        broker_values = {"name": "Test Broker Name", "active": 1}

        db_broker = self.dbapi.create_broker(self.context, broker_values)
        broker_metadata_values = {
            "broker_id": db_broker.id,
            "key": "IMAGE",
            "value": "test_image"
        }
        db_broker = self.dbapi.create_broker_metadata(self.context,
                                                      broker_metadata_values)

        self.assertEqual(broker_metadata_values['broker_id'],
                         db_broker.broker_id, "invalid broker_metadata ID")
        self.assertEqual(broker_metadata_values['key'], db_broker.key,
                         "invalid broker key")
        self.assertEqual(broker_metadata_values['value'], db_broker.value,
                         "invalid broker value")

    def test_create_broker_metadata_missing_broker(self):
        """Testing create metadata with broker ID that should not exist."""
        broker_metadata_values = {
            "broker_id": UUID1,
            "key": "IMAGE",
            "value": "test_image"
        }
        try:
            self.assertRaises(exception.NotFound,
                              self.dbapi.create_broker_metadata, self.context,
                              broker_metadata_values)
        except Exception as err:
            self.assertIsNotNone(
                None, "Unhandled exception from "
                "create_broker_metadata with UUI that isn't "
                "in the broker table: " + str(err))

        # Testing with non-UUID formatted ID
        broker_metadata_values['broker_id'] = "Not a UUID"
        try:
            self.assertRaises(exception.Invalid,
                              self.dbapi.create_broker_metadata, self.context,
                              broker_metadata_values)
        except Exception as err:
            self.assertIsNotNone(
                None, "Unhandled exception from "
                "create_broker_metadata with invalid UUID: " + str(err))

    def test_get_broker_metadata_by_broker_id(self):
        """Verifies get broker metadata by broker id DB API."""

        brokers = self.dbapi.get_brokers(self.context)
        self.assertIs(
            len(brokers), 1,
            "Should have found only 1 broker, instead found " +
            str(len(brokers)))
        broker_id = brokers[0].id
        broker_metadata = self.dbapi.get_broker_metadata_by_broker_id(
            self.context, broker_id)

        self.assertIs(len(broker_metadata), 1,
                      "Should have found the default rabbitmq broker ID.")

        # TODO(team) May want to have all cue.db.sqlalchemy.api.Connection
        # TODO(team) functions that take a broker_id assert it is of type UUID
        self.assertRaises(oslo_exception.DBError,
                          self.dbapi.get_broker_metadata_by_broker_id,
                          self.context, "Bad ID")

    def test_delete_broker_metadata(self):
        """Verifies delete broker metadata DB API."""

        brokers = self.dbapi.get_brokers(self.context)
        self.assertIs(
            len(brokers), 1,
            "Should have found only 1 broker, instead found " +
            str(len(brokers)))
        broker_id = brokers[0].id
        broker_metadata = self.dbapi.get_broker_metadata_by_broker_id(
            self.context, broker_id)

        broker_metadata_id = broker_metadata[0].id

        self.dbapi.delete_broker_metadata(self.context, broker_metadata_id)

        broker_metadata = self.dbapi.get_broker_metadata_by_broker_id(
            self.context, broker_id)

        self.assertIs(0, len(broker_metadata), "Broker metadata should be "
                      "empty after the delete.")

        broker_metadata_query = sqlalchemy_api.model_query(
            self.context, models.BrokerMetadata,
            read_deleted=True).filter_by(id=broker_metadata_id)

        broker_metadata = broker_metadata_query.one()

        self.assertEqual(
            broker_metadata_id, broker_metadata.id,
            "Query should have returned the same broker " + "metadata.")
        self.assertTrue(broker_metadata.deleted,
                        "Broker metadata deleted flag should be true.")

    def test_get_image_id_by_broker_name(self):

        default_metadata_id = "f7e8c49b-7d1e-472f-a78b-7c46a39c85be"
        image_id = self.dbapi.get_image_id_by_broker_name(
            self.context, 'fake broker')

        self.assertEqual(
            default_metadata_id, image_id,
            "Should have found the image ID of the default rabbitmq"
            " broker.")

    def test_get_image_id_by_broker_name_with_missing_broker(self):
        self.assertRaises(exception.NotFound,
                          self.dbapi.get_image_id_by_broker_name, self.context,
                          "fake mq")
class BrokerMetadata(base.CueObject):
    dbapi = db_api.get_instance()

    fields = {
        'id': obj_utils.str_or_none,
        'broker_id': obj_utils.str_or_none,
        'key': obj_utils.str_or_none,
        'value': obj_utils.str_or_none,
        'deleted': obj_utils.bool_or_none,
        'created_at': obj_utils.datetime_or_str_or_none,
        'updated_at': obj_utils.datetime_or_str_or_none,
        'deleted_at': obj_utils.datetime_or_str_or_none,
    }

    @staticmethod
    def _from_db_object(broker_metadata, db_broker_metadata):
        """Convert a database object to a universal brokerMetadata object."""
        for field in BrokerMetadata.fields:
            broker_metadata[field] = db_broker_metadata[field]
        return broker_metadata

    def create_broker_metadata(self, context):
        """Creates a new broker metadata.

       :param context: request context object

       """
        metadata_values = self.as_dict()
        db_broker = self.dbapi.create_broker_metadata(context, metadata_values)

        self._from_db_object(self, db_broker)

    def delete_broker_metadata(self, context):
        """Deletes a BrokerMetadata object for specified broker_id.

        :param context: request context object

        """
        self.dbapi.delete_broker_metadata(context, self.id)

    @classmethod
    def get_broker_metadata_by_broker_id(cls, context, broker_id):
        """Returns a list of BrokerMetadata objects for specified broker_id.

        :param context: request context object
        :param broker_id: broker id
        :returns: a list of :class:'BrokerMetadata' object

        """
        db_broker_metadata = cls.dbapi.get_broker_metadata_by_broker_id(
            context, broker_id)

        return [BrokerMetadata._from_db_object(BrokerMetadata(), obj)
                for obj in db_broker_metadata]

    @classmethod
    def get_image_id_by_broker_name(cls, context, broker_name):
        """Returns a image_id for the broker

        :param context: request context object
        :param: broker name

        """
        image_id = cls.dbapi.get_image_id_by_broker_name(context, broker_name)

        return image_id
class BrokerObjectsTests(base.FunctionalTestCase):
    dbapi = db_api.get_instance()

    def create_object_broker(self, **kw):
        """Create a broker object."""
        test_broker_dict = func_utils.get_test_broker_dict(**kw)
        new_broker = objects.Broker(**test_broker_dict)
        self.validate_broker_values(test_broker_dict, new_broker)
        new_broker.create_broker(self.context)
        # retrieve created broker
        broker_query = sqlalchemy_api.model_query(
            self.context, models.Broker).filter_by(id=test_broker_dict['id'])
        db_broker = broker_query.one()
        broker_obj = objects.Broker._from_db_object(objects.Broker(),
                                                    db_broker)
        return broker_obj

    def validate_broker_values(self, broker_ref, broker_cmp):
        """Validate Broker Object fields."""
        self.assertEqual(
            broker_ref.id if hasattr(broker_ref, "id") else broker_ref["id"],
            broker_cmp.id if hasattr(broker_cmp, "id") else broker_cmp["id"],
            "Invalid broker id value")
        self.assertEqual(
            broker_ref.name if hasattr(
                broker_ref, "name") else broker_ref["name"], broker_cmp.name
            if hasattr(broker_cmp, "name") else broker_cmp["name"],
            "Invalid name value")
        self.assertEqual(
            broker_ref.active if hasattr(broker_ref, "active") else
            broker_ref["active"], broker_cmp.active if hasattr(
                broker_cmp, "active") else broker_cmp["active"],
            "Invalid active status")
        self.assertTrue(
            test_utils.compare_dates(broker_ref["created_at"],
                                     broker_cmp["created_at"]),
            "Invalid created_at value")

        self.assertTrue(
            test_utils.compare_dates(broker_ref["updated_at"],
                                     broker_cmp["updated_at"]),
            "Invalid updated_at value")

        self.assertTrue(
            test_utils.compare_dates(broker_ref["deleted_at"],
                                     broker_cmp["deleted_at"]),
            "Invalid deleted_at value")

    def test_broker_object_generation(self):
        """Test Broker Object generation from a broker dictionary object."""
        broker_dict = func_utils.get_test_broker_dict()
        broker_object = objects.Broker(**broker_dict)
        self.validate_broker_values(broker_dict, broker_object)

    def test_broker_db_to_object_to_db(self):
        """Tests Broker db object conversion to Broker object and back

        to db object.
        """
        broker_dict = func_utils.get_test_broker_dict()
        db_broker_object = models.Broker()
        db_broker_object.update(broker_dict)
        object_broker = objects.Broker._from_db_object(objects.Broker(),
                                                       db_broker_object)
        self.validate_broker_values(db_broker_object, object_broker)

        broker_changes = object_broker.obj_get_changes()
        db_broker_object_2 = models.Broker()
        db_broker_object_2.update(broker_changes)
        self.validate_broker_values(db_broker_object, db_broker_object_2)

    def test_create_broker(self):
        """Tests create broker from Broker objects API."""
        test_broker_dict = func_utils.get_test_broker_dict()
        new_broker = objects.Broker(**test_broker_dict)
        self.validate_broker_values(new_broker, test_broker_dict)
        retrieved_broker = new_broker.create_broker(self.context)

        self.validate_broker_values(new_broker, retrieved_broker)

    def test_update_broker(self):
        """Tests update broker from Broker objects API."""
        new_broker = self.create_object_broker()
        new_broker.name = 'rabbit1.0'
        new_broker.active = False
        new_broker.update_broker(self.context)

        # retrieve updated broker
        broker_query = sqlalchemy_api.model_query(
            self.context, models.Broker).filter_by(id=new_broker.id)
        updated_broker = broker_query.one()

        self.assertEqual('rabbit1.0', updated_broker.name)
        self.assertFalse(updated_broker.active)

    def test_get_brokers(self):
        """Tests getting all brokers from Broker objects API."""
        # delete existing default broker
        existing_broker = objects.Broker.get_brokers(self.context)
        existing_broker[0].delete_broker(self.context)

        # create new brokers
        new_broker_1 = self.create_object_broker(
            id='0e8e643e-eeb9-11e4-90ec-1681e6b88ec1', name='rabbit1.0')
        new_broker_2 = self.create_object_broker(
            id='ea1c6010-eeb8-11e4-90ec-1681e6b88ec1', name='rabbit2.0')

        broker_list = objects.Broker.get_brokers(self.context)

        # check for the list length
        self.assertEqual(2, len(broker_list), "Invalid number of brokers "
                         "returned")
        for broker in broker_list:
            if broker.id == new_broker_1.id:
                self.validate_broker_values(new_broker_1, broker)
            else:
                self.validate_broker_values(new_broker_2, broker)

    def test_delete_broker(self):
        """Tests delete from Broker objects API."""
        new_broker = self.create_object_broker()
        new_broker.delete_broker(self.context)

        # try to retrieve deleted broker
        broker_query = sqlalchemy_api.model_query(
            self.context, models.Broker).filter_by(id=new_broker.id)

        self.assertRaises(sql_exception.NoResultFound, broker_query.one)
示例#8
0
class ClusterObjectsTests(base.FunctionalTestCase):
    dbapi = db_api.get_instance()

    def validate_cluster_deleted_fields(self, cluster_ref, cluster_cmp):
        """Validate Cluster Object deleted and deleted_at fields."""
        self.assertEqual(cluster_ref.deleted, cluster_cmp.deleted,
                         "Invalid cluster deleted value")
        self.assertTrue(
            test_utils.compare_dates(
                cluster_ref.deleted_at if hasattr(
                    cluster_ref, "deleted_at") else cluster_ref["deleted_at"],
                cluster_cmp.deleted_at if hasattr(
                    cluster_cmp, "deleted_at") else cluster_cmp["deleted_at"]),
            "Invalid cluster deleted_at value")

    def test_cluster_object_generation(self):
        """Test Cluster Object generation from a cluster dictionary object."""
        cluster_dict = func_utils.get_test_cluster()
        cluster_object = objects.Cluster(**cluster_dict)
        test_utils.validate_cluster_values(self, cluster_dict, cluster_object)

    def test_cluster_api_to_object_to_api(self):
        """Tests Cluster api object conversion to Cluster object and back

        to api object.
        """
        # create cluster api object
        api_cluster = func_utils.create_api_test_cluster_all().as_dict()
        # adjust network_id from list to single value
        api_cluster['network_id'] = api_cluster['network_id'][0]
        # create cue cluster object from api cluster object
        object_cluster = objects.Cluster(**api_cluster).as_dict()
        # verify fields match
        test_utils.validate_cluster_values(self, api_cluster, object_cluster)

        # adjust network_id from single value back to list
        object_cluster['network_id'] = [object_cluster['network_id']]
        # create cluster api object from cue cluster object
        api_cluster_2 = cluster.Cluster(**object_cluster).as_dict()
        # verify fields match to initial api cluster object
        test_utils.validate_cluster_values(self, api_cluster, api_cluster_2)

    def test_cluster_db_to_object_to_db(self):
        """Tests Cluster db object conversion to Cluster object and back

        to db object.
        """
        db_cluster_object = func_utils.create_db_test_cluster_model_object(
            self.context, deleted_at=timeutils.utcnow(), deleted=True)
        object_cluster = objects.Cluster._from_db_object(
            objects.Cluster(), db_cluster_object)

        test_utils.validate_cluster_values(self, db_cluster_object,
                                           object_cluster)
        self.validate_cluster_deleted_fields(db_cluster_object, object_cluster)

        cluster_changes = object_cluster.obj_get_changes()
        db_cluster_object_2 = models.Cluster()
        db_cluster_object_2.update(cluster_changes)
        test_utils.validate_cluster_values(self, db_cluster_object,
                                           db_cluster_object_2)
        self.validate_cluster_deleted_fields(db_cluster_object,
                                             db_cluster_object_2)

    def test_create_cluster_size_one(self):
        """Tests create cluster from Cluster objects API."""
        test_cluster_dict = func_utils.get_test_cluster(size=1)
        new_cluster = objects.Cluster(**test_cluster_dict)
        test_utils.validate_cluster_values(self, test_cluster_dict,
                                           new_cluster)
        new_cluster.create(self.context)
        db_cluster = self.dbapi.get_cluster_by_id(self.context, new_cluster.id)
        test_utils.validate_cluster_values(self, new_cluster, db_cluster)
        cluster_node = self.dbapi.get_nodes_in_cluster(self.context,
                                                       db_cluster.id)

        # check if cluster size is one before accessing the node
        self.assertEqual(1, len(cluster_node))
        self.assertEqual(db_cluster.id, cluster_node[0].cluster_id)
        self.assertEqual(db_cluster.flavor, cluster_node[0].flavor)
        self.assertEqual(db_cluster.status, cluster_node[0].status)

    def test_create_cluster_size_three(self):
        """Tests create cluster of size three from Cluster objects API."""
        test_cluster_dict = func_utils.get_test_cluster(size=3)
        new_cluster = objects.Cluster(**test_cluster_dict)
        test_utils.validate_cluster_values(self, test_cluster_dict,
                                           new_cluster)
        new_cluster.create(self.context)
        db_cluster = self.dbapi.get_cluster_by_id(self.context, new_cluster.id)
        test_utils.validate_cluster_values(self, new_cluster, db_cluster)

        cluster_nodes = self.dbapi.get_nodes_in_cluster(
            self.context, db_cluster.id)
        for nodes in cluster_nodes:
            self.assertEqual(db_cluster.id, nodes.cluster_id)
            self.assertEqual(db_cluster.flavor, nodes.flavor)
            self.assertEqual(db_cluster.status, nodes.status)

    def test_update_cluster(self):
        """Tests update cluster from Cluster objects API."""
        new_cluster = func_utils.create_object_cluster(self.context,
                                                       name='test_cluster',
                                                       flavor='flavor1')
        new_cluster.flavor = 'flavor2'
        new_cluster.name = 'test_cluster1'
        new_cluster.update(self.context, new_cluster.id)

        updated_cluster = self.dbapi.get_cluster_by_id(self.context,
                                                       new_cluster.id)
        # check update fields
        self.assertEqual('flavor2', updated_cluster.flavor)
        self.assertEqual('test_cluster1', updated_cluster.name)
        # check unchanged fields fields
        self.assertEqual(new_cluster.id, updated_cluster.id)
        self.assertEqual(new_cluster.network_id, updated_cluster.network_id)
        self.assertEqual(new_cluster.status, updated_cluster.status)
        self.assertEqual(new_cluster.size, updated_cluster.size)

    def test_get_cluster_list_size_one(self):
        """Tests list Cluster of size one from Cluster objects API."""
        new_cluster = func_utils.create_object_cluster(self.context)
        cluster_list = objects.Cluster.get_clusters(self.context)
        test_utils.validate_cluster_values(self, cluster_list[0], new_cluster)

    def test_get_cluster_list_size_three(self):
        """Tests list Clusters of size three from Cluster objects API."""
        cluster_list = list()
        for list_size in range(3):
            new_cluster = func_utils.create_object_cluster(self.context,
                                                           id=str(
                                                               uuid.uuid4()))
            cluster_list.append(new_cluster)

        returned_cluster_list = objects.Cluster.get_clusters(self.context)

        for returned_clusterobj, clusterobj in zip(returned_cluster_list,
                                                   cluster_list):
            test_utils.validate_cluster_values(self, returned_clusterobj,
                                               clusterobj)

    def test_get_cluster_by_id(self):
        """Tests get Cluster by id from Cluster objects API."""
        new_cluster = func_utils.create_object_cluster(self.context)
        test_cluster = objects.Cluster.get_cluster_by_id(
            self.context, new_cluster.id)
        test_utils.validate_cluster_values(self, new_cluster, test_cluster)

    def test_get_nonexistent_cluster(self):
        """Tests get cluster from Cluster objects API for nonexistent cluster.

        """
        func_utils.create_object_cluster(self.context)
        nonexistent_cluster_id = '17efe8ae-e93c-11e4-b02c-1681e6b88ec1'
        self.assertRaises(exception.NotFound,
                          objects.Cluster.get_cluster_by_id, self.context,
                          nonexistent_cluster_id)

    def test_update_cluster_deleting(self):
        """Tests delete from Cluster objects API."""
        new_cluster = func_utils.create_object_cluster(self.context)
        objects.Cluster.update_cluster_deleting(self.context, new_cluster.id)
        deleted_cluster = self.dbapi.get_cluster_by_id(self.context,
                                                       new_cluster.id)

        self.assertEqual('DELETING', deleted_cluster.status)

    def test_update_cluster_deleting_invalid_id(self):
        """Tests delete from Cluster objects API with invalid cluster id."""
        func_utils.create_object_cluster(self.context)
        invalid_cluster_id = '17efe8ae-e93c-11e4-b02c-1681e6b88ec1'
        self.assertRaises(exception.NotFound,
                          objects.Cluster.update_cluster_deleting,
                          self.context, invalid_cluster_id)

    def test_get_cluster_by_id_forbidden(self):
        """Tests get Cluster by id with invalid tenant."""
        api_cluster = func_utils.create_object_cluster(self.context)
        tenant_b = self.get_context(tenant='b')

        with mock.patch.object(objects.Cluster.dbapi,
                               'get_cluster_by_id',
                               return_value=api_cluster):
            with testtools.ExpectedException(exception.NotAuthorized):
                cluster.get_complete_cluster(tenant_b, api_cluster.id)

    def test_update_cluster_deleting_forbidden(self):
        """Tests delete from Cluster objects API with invalid tenant."""
        api_cluster = func_utils.create_object_cluster(self.context)
        tenant_b = self.get_context(tenant='b')

        with mock.patch.object(objects.Cluster.dbapi,
                               'get_cluster_by_id',
                               return_value=api_cluster):
            with testtools.ExpectedException(exception.NotAuthorized):
                cluster.delete_complete_cluster(tenant_b, api_cluster.id)
示例#9
0
 def before(self, state):
     state.request.dbapi = dbapi.get_instance()
示例#10
0
    def test_create_cluster_model(self):
        """Verifies a new cluster record is created in DB."""

        cluster_values = {
            "id": UUID1,
            "network_id": UUID3,
            "project_id": self.context.project_id,
            "name": "Cluster test",
            "status": models.Status.BUILDING,
            "flavor": "medium",
            "size": 3,
            "volume_size": 250,
            "deleted": False,
            "created_at": timeutils.utcnow(),
            "updated_at": timeutils.utcnow(),
            "deleted_at": timeutils.utcnow(),
            "error_detail": "My cluster's error(s) detail",
            "group_id": UUID4,
        }

        cluster = models.Cluster()
        cluster.update(cluster_values)

        self.assertEqual(cluster_values["id"], cluster.id, "Invalid ID value")
        self.assertEqual(cluster_values["project_id"], cluster.project_id,
                         "Invalid project_id value")
        self.assertEqual(cluster_values["network_id"], cluster.network_id,
                         "Invalid network_id value")
        self.assertEqual(cluster_values["name"], cluster.name, "Invalid name"
                         "value")
        self.assertEqual(cluster_values["status"], cluster.status, "Invalid "
                         "status"
                         "value")
        self.assertEqual(cluster_values["flavor"], cluster.flavor,
                         "Invalid flavor value")
        self.assertEqual(cluster_values["size"], cluster.size,
                         "Invalid size value")
        self.assertEqual(cluster_values["volume_size"], cluster.volume_size,
                         "Invalid volume_size value")
        self.assertEqual(cluster_values["deleted"], cluster.deleted,
                         "Invalid deleted value")
        self.assertEqual(cluster_values["created_at"], cluster.created_at,
                         "Invalid created_at value")
        self.assertEqual(cluster_values["updated_at"], cluster.updated_at,
                         "Invalid updated_at value")
        self.assertEqual(cluster_values["deleted_at"], cluster.deleted_at,
                         "Invalid deleted_at value")
        self.assertEqual(cluster_values["error_detail"], cluster.error_detail,
                         "Invalid error_detail value")
        self.assertEqual(cluster_values["group_id"], cluster.group_id,
                         "Invalid group_id value")

        db_session = sql_api.get_session()
        cluster.save(db_session)

        dbapi = db_api.get_instance()
        cluster_db = dbapi.get_cluster_by_id(self.context,
                                             cluster_values["id"])

        self.assertEqual(cluster_values["id"], cluster_db.id, "Invalid ID "
                         "value")
        self.assertEqual(cluster_values["project_id"], cluster_db.project_id,
                         "Invalid project_id value")
        self.assertEqual(cluster_values["network_id"], cluster_db.network_id,
                         "Invalid network_id value")
        self.assertEqual(cluster_values["name"], cluster_db.name, "Invalid "
                         "name value")
        self.assertEqual(cluster_values["status"], cluster_db.status,
                         "Invalid status value")
        self.assertEqual(cluster_values["flavor"], cluster_db.flavor,
                         "Invalid flavor value")
        self.assertEqual(cluster_values["size"], cluster_db.size,
                         "Invalid size value")
        self.assertEqual(cluster_values["volume_size"], cluster_db.volume_size,
                         "Invalid volume_size value")
        self.assertEqual(cluster_values["deleted"], cluster_db.deleted,
                         "Invalid deleted value")
        self.assertEqual(cluster_values["created_at"], cluster_db.created_at,
                         "Invalid created_at value")
        self.assertEqual(cluster_values["updated_at"], cluster_db.updated_at,
                         "Invalid updated_at value")
        self.assertEqual(cluster_values["deleted_at"], cluster_db.deleted_at,
                         "Invalid deleted_at value")
        self.assertEqual(cluster_values["error_detail"],
                         cluster_db.error_detail, "Invalid error_detail value")
        self.assertEqual(cluster_values["group_id"], cluster_db.group_id,
                         "Invalid group_id value")
示例#11
0
    def test_create_endpoint_model(self):
        """Verifies a new cluster record is created in DB."""

        dbapi = db_api.get_instance()
        cluster_values = {
            "network_id": UUID3,
            "project_id": UUID2,
            "name": "Cluster test",
            "flavor": "medium",
            "size": 3,
            "volume_size": 250,
        }
        db_cluster = dbapi.create_cluster(self.context, cluster_values)

        node_values = {
            "cluster_id": db_cluster.id,
            "flavor": "Large",
            "status": models.Status.BUILDING,
        }

        node = models.Node()
        node.update(node_values)
        db_session = sql_api.get_session()
        node.save(db_session)

        endpoint_values = {
            "id": UUID1,
            "node_id": node.id,
            "uri": "amqp://10.20.30.40:10000",
            "type": "AMQP",
            "deleted": False,
        }

        endpoint = models.Endpoint()
        endpoint.update(endpoint_values)

        self.assertEqual(endpoint_values["id"], endpoint.id, "Invalid ID "
                         "value")
        self.assertEqual(endpoint_values["node_id"], endpoint.node_id,
                         "Invalid node_id value")
        self.assertEqual(endpoint_values["uri"], endpoint.uri, "Invalid uri"
                         "value")
        self.assertEqual(endpoint_values["type"], endpoint.type, "Invalid "
                         "type"
                         "value")
        self.assertEqual(endpoint_values["deleted"], endpoint.deleted,
                         "Invalid deleted value")

        endpoint.save(db_session)
        endpoint_db = dbapi.get_endpoint_by_id(self.context,
                                               endpoint_values["id"])

        self.assertEqual(endpoint_values["id"], endpoint_db.id, "Invalid ID "
                         "value")
        self.assertEqual(endpoint_values["node_id"], endpoint_db.node_id,
                         "Invalid node_id value")
        self.assertEqual(endpoint_values["uri"], endpoint_db.uri, "Invalid uri"
                         "value")
        self.assertEqual(endpoint_values["type"], endpoint_db.type, "Invalid "
                         "type"
                         "value")
        self.assertEqual(endpoint_values["deleted"], endpoint_db.deleted,
                         "Invalid deleted value")
示例#12
0
    def test_create_node_model(self):
        """Verifies a new cluster record is created in DB."""

        dbapi = db_api.get_instance()
        cluster_values = {
            "network_id": UUID3,
            "project_id": UUID2,
            "name": "Cluster test",
            "flavor": "medium",
            "size": 3,
            "volume_size": 250,
        }
        db_cluster = dbapi.create_cluster(self.context, cluster_values)

        node_values = {
            "id": UUID1,
            "cluster_id": db_cluster.id,
            "instance_id": "NovaInstanceId",
            "flavor": "Large",
            "status": models.Status.BUILDING,
            "deleted": False,
            "created_at": timeutils.utcnow(),
            "updated_at": timeutils.utcnow(),
            "deleted_at": timeutils.utcnow(),
        }

        node = models.Node()
        node.update(node_values)

        self.assertEqual(node_values["id"], node.id, "Invalid ID value")
        self.assertEqual(node_values["cluster_id"], node.cluster_id,
                         "Invalid cluster_id value")
        self.assertEqual(node_values["instance_id"], node.instance_id,
                         "Invalid instance_id value")
        self.assertEqual(node_values["status"], node.status, "Invalid status "
                         "value")
        self.assertEqual(node_values["flavor"], node.flavor, "Invalid flavor "
                         "value")
        self.assertEqual(node_values["deleted"], node.deleted,
                         "Invalid deleted value")
        self.assertEqual(node_values["created_at"], node.created_at,
                         "Invalid created_at value")
        self.assertEqual(node_values["updated_at"], node.updated_at,
                         "Invalid updated_at value")
        self.assertEqual(node_values["deleted_at"], node.deleted_at,
                         "Invalid deleted_at value")

        db_session = sql_api.get_session()
        node.save(db_session)

        node_db = dbapi.get_node_by_id(self.context, node_values["id"])

        self.assertEqual(node_values["id"], node_db.id, "Invalid ID value")
        self.assertEqual(node_values["cluster_id"], node_db.cluster_id,
                         "Invalid cluster_id value")
        self.assertEqual(node_values["instance_id"], node_db.instance_id,
                         "Invalid instance_id value")
        self.assertEqual(node_values["status"], node_db.status, "Invalid "
                         "status value")
        self.assertEqual(node_values["flavor"], node_db.flavor, "Invalid "
                         "flavor value")
        self.assertEqual(node_values["deleted"], node_db.deleted,
                         "Invalid deleted value")
        self.assertEqual(node_values["created_at"], node_db.created_at,
                         "Invalid created_at value")
        self.assertEqual(node_values["updated_at"], node_db.updated_at,
                         "Invalid updated_at value")
        self.assertEqual(node_values["deleted_at"], node_db.deleted_at,
                         "Invalid deleted_at value")
示例#13
0
class BrokerObjectsTests(base.FunctionalTestCase):
    dbapi = db_api.get_instance()

    def create_object_broker_metadata(self, broker_id, **kw):
        """Create broker_metadata object for the given broker."""
        test_metadata_dict = func_utils.get_test_broker_metadata_dict(
            broker_id=broker_id, **kw)
        new_broker_metadata = objects.BrokerMetadata(**test_metadata_dict)
        self.validate_broker_metadata_values(new_broker_metadata,
                                             test_metadata_dict)
        new_broker_metadata.create_broker_metadata(self.context)
        return new_broker_metadata

    def validate_broker_metadata_values(self, metadata_ref, metadata_cmp):
        """Validate Broker_Metadata Object fields."""
        self.assertEqual(
            metadata_ref.id if hasattr(
                metadata_ref, "id") else metadata_ref["id"], metadata_cmp.id
            if hasattr(metadata_cmp, "id") else metadata_cmp["id"],
            "Invalid broker id value")
        self.assertEqual(
            metadata_ref.broker_id if hasattr(metadata_ref, "broker_id") else
            metadata_ref["broker_id"], metadata_cmp.broker_id if hasattr(
                metadata_cmp, "broker_id") else metadata_cmp["broker_id"],
            "Invalid broker_id value")
        self.assertEqual(
            metadata_ref.key if hasattr(
                metadata_ref, "key") else metadata_ref["key"], metadata_cmp.key
            if hasattr(metadata_cmp, "key") else metadata_cmp["key"],
            "Invalid key value")
        self.assertEqual(
            metadata_ref.value if hasattr(metadata_ref, "value") else
            metadata_ref["value"], metadata_cmp.value if hasattr(
                metadata_cmp, "value") else metadata_cmp["value"],
            "Invalid value")
        self.assertTrue(
            test_utils.compare_dates(metadata_ref["created_at"],
                                     metadata_cmp["created_at"]),
            "Invalid created_at value")

        self.assertTrue(
            test_utils.compare_dates(metadata_ref["updated_at"],
                                     metadata_cmp["updated_at"]),
            "Invalid updated_at value")

        self.assertTrue(
            test_utils.compare_dates(metadata_ref["deleted_at"],
                                     metadata_cmp["deleted_at"]),
            "Invalid deleted_at value")

    def test_broker_metadata_object_generation(self):
        """Test BrokerMetadata Object generation from a metadata dictionary."""
        metadata_dict = func_utils.get_test_broker_metadata_dict()
        metadata_object = objects.BrokerMetadata(**metadata_dict)
        self.validate_broker_metadata_values(metadata_dict, metadata_object)

    def test_broker_metadata_db_to_object_to_db(self):
        """Tests BrokerMetadata db object conversion to BrokerMetadata object

        and back to db object.
        """
        metadata_dict = func_utils.get_test_broker_metadata_dict()
        db_metadata_object = models.BrokerMetadata()
        db_metadata_object.update(metadata_dict)
        object_metadata = objects.BrokerMetadata._from_db_object(
            objects.BrokerMetadata(), db_metadata_object)
        self.validate_broker_metadata_values(db_metadata_object,
                                             object_metadata)

        metadata_changes = object_metadata.obj_get_changes()
        db_metadata_object_2 = models.BrokerMetadata()
        db_metadata_object_2.update(metadata_changes)
        self.validate_broker_metadata_values(db_metadata_object,
                                             db_metadata_object_2)

    def test_create_broker_metadata(self):
        """Tests create broker_metadata from BrokerMetadata objects API."""
        new_broker = objects.Broker(**func_utils.get_test_broker_dict())
        new_broker.create_broker(self.context)
        test_metadata_dict = func_utils.get_test_broker_metadata_dict()
        new_broker_metadata = objects.BrokerMetadata(**test_metadata_dict)
        self.validate_broker_metadata_values(new_broker_metadata,
                                             test_metadata_dict)
        new_broker_metadata.create_broker_metadata(self.context)
        returned_broker_metadata = self.dbapi.get_broker_metadata_by_broker_id(
            self.context, new_broker.id)

        self.validate_broker_metadata_values(new_broker_metadata,
                                             returned_broker_metadata[0])

    def test_create_broker_metadata_for_nonexistent_broker(self):
        """Tests create broker_metadata for a nonexistent broker from

        BrokerMetadata objects API.
        """
        test_metadata_dict = func_utils.get_test_broker_metadata_dict(
            broker_id=str(uuid.uuid4()))
        new_broker_metadata = objects.BrokerMetadata(**test_metadata_dict)
        self.validate_broker_metadata_values(new_broker_metadata,
                                             test_metadata_dict)

        self.assertRaises(exception.NotFound,
                          new_broker_metadata.create_broker_metadata,
                          self.context)

    def test_get_broker_metadata_by_broker_id(self):
        """Tests get broker_metadata by broker_id from BrokerMetadata objects

         API.
         """
        new_broker = objects.Broker(**func_utils.get_test_broker_dict())
        new_broker.create_broker(self.context)
        broker_metadata_1 = self.create_object_broker_metadata(
            broker_id=new_broker.id)
        broker_metadata_2 = self.create_object_broker_metadata(
            broker_id=new_broker.id,
            id='a2dcf598-ef5d-11e4-90ec-1681e6b88ec1',
            key='SEC_GROUP',
            value='test')

        metadata_list = (
            objects.BrokerMetadata.get_broker_metadata_by_broker_id(
                self.context, new_broker.id))
        # check for the list length
        self.assertEqual(2, len(metadata_list), "Invalid number of "
                         "broker_metadata returned")
        for metadata in metadata_list:
            if metadata.id == broker_metadata_1.id:
                self.validate_broker_metadata_values(broker_metadata_1,
                                                     metadata)
            else:
                self.validate_broker_metadata_values(broker_metadata_2,
                                                     metadata)

    def test_get_broker_metadata_by_invalid_broker_id(self):
        """Tests get broker_metadata from BrokerMetadata objects API with

        invalid broker id.
        """
        new_broker = objects.Broker(**func_utils.get_test_broker_dict())
        new_broker.create_broker(self.context)
        self.create_object_broker_metadata(broker_id=new_broker.id)
        invalid_broker_id = '17efe8ae-e93c-11e4-b02c-1681e6b88ec1'
        metadata = objects.BrokerMetadata.get_broker_metadata_by_broker_id(
            self.context, invalid_broker_id)

        self.assertListEqual([], metadata)

    def test_get_image_id_by_broker_name(self):
        """Tests get broker image_id by broker_name from BrokerMetadata objects

        API.
        """

        new_broker = objects.Broker(**func_utils.get_test_broker_dict())
        new_broker.create_broker(self.context)
        test_metadata_dict = func_utils.get_test_broker_metadata_dict()
        new_broker_metadata = objects.BrokerMetadata(**test_metadata_dict)
        self.validate_broker_metadata_values(new_broker_metadata,
                                             test_metadata_dict)
        new_broker_metadata.create_broker_metadata(self.context)

        image_id = objects.BrokerMetadata.get_image_id_by_broker_name(
            self.context, new_broker.name)

        self.assertEqual(image_id, new_broker_metadata.value)

    def test_get_image_id_by_nonexistent_broker_name(self):
        """Tests get broker image_id by nonexistent broker_name from

        BrokerMetadata objects API.
        """
        new_broker = objects.Broker(**func_utils.get_test_broker_dict())
        new_broker.create_broker(self.context)
        self.create_object_broker_metadata(broker_id=new_broker.id)
        invalid_broker_name = "kafka"
        self.assertRaises(exception.NotFound,
                          objects.BrokerMetadata.get_image_id_by_broker_name,
                          self.context, invalid_broker_name)

    def test_delete_broker_metadata(self):
        """Tests delete broker_metadata from BrokerMetadata objects API."""
        new_broker = objects.Broker(**func_utils.get_test_broker_dict())
        new_broker.create_broker(self.context)
        new_broker_metadata = self.create_object_broker_metadata(
            broker_id=new_broker.id)
        new_broker_metadata.delete_broker_metadata(self.context)
        metadata_returned = self.dbapi.get_broker_metadata_by_broker_id(
            self.context, new_broker_metadata.broker_id)

        self.assertListEqual([], metadata_returned)
示例#14
0
文件: cluster.py 项目: sputnik13/cue
class Cluster(base.CueObject):
    dbapi = db_api.get_instance()

    fields = {
        'id': obj_utils.str_or_none,
        'network_id': obj_utils.str_or_none,
        'project_id': obj_utils.str_or_none,
        'name': obj_utils.str_or_none,
        'status': obj_utils.str_or_none,
        'flavor': obj_utils.str_or_none,
        'size': obj_utils.int_or_none,
        'volume_size': obj_utils.int_or_none,
        'deleted': obj_utils.bool_or_none,
        'created_at': obj_utils.datetime_or_str_or_none,
        'updated_at': obj_utils.datetime_or_str_or_none,
        'deleted_at': obj_utils.datetime_or_str_or_none,
        'error_detail': obj_utils.str_or_none,
        'group_id': obj_utils.str_or_none,
    }

    @staticmethod
    def _from_db_object(cluster, db_cluster):
        """Convert a database object to a universal cluster object."""
        for field in cluster.fields:
            cluster[field] = db_cluster[field]
        return cluster

    def create(self, context):
        """Creates a new cluster.

        :param context: The request context

        """
        self['project_id'] = context.project_id
        cluster_changes = self.obj_get_changes()

        db_cluster = self.dbapi.create_cluster(context, cluster_changes)

        self._from_db_object(self, db_cluster)

    def update(self, context, cluster_id, *args, **kwargs):
        """Updates a database cluster object.

        :param context: The request context
        :param cluster_id:
        """
        cluster_changes = self.obj_get_changes()

        self.dbapi.update_cluster(context, cluster_changes,
                                  cluster_id, *args, **kwargs)

    @classmethod
    def get_clusters(cls, context, *args, **kwargs):
        """Returns a list of Cluster objects for project_id.

        :param context: The request context.
        :returns: a list of :class:'Cluster' object.

        """
        db_clusters = cls.dbapi.get_clusters(context, *args, **kwargs)
        return [Cluster._from_db_object(Cluster(), obj) for obj in db_clusters]

    @classmethod
    def get_cluster_by_id(cls, context, cluster_id):
        """Returns a Cluster objects for specified cluster_id.

        :param context: The request context
        :param cluster_id: the cluster_id to retrieve
        :returns: a :class:'Cluster' object

        """
        db_cluster = cls.dbapi.get_cluster_by_id(context, cluster_id)
        return Cluster._from_db_object(Cluster(), db_cluster)

    @classmethod
    def update_cluster_deleting(cls, context, cluster_id):
        """Marks specified cluster to indicate deletion.

        :param context: The request context
        :param cluster_id: UUID of a cluster

        """
        cls.dbapi.update_cluster_deleting(context, cluster_id)
示例#15
0
class EndpointObjectsTests(base.FunctionalTestCase):
    dbapi = db_api.get_instance()

    def create_object_endpoint(self, node_id, **kw):
        """Create an endpoint object for the given node."""
        endpoint_dict = func_utils.get_test_endpoint_dict(node_id=node_id,
                                                          **kw)
        api_endpoint = objects.Endpoint(**endpoint_dict)
        self.validate_endpoint_values(endpoint_dict, api_endpoint)
        api_endpoint.create(self.context)

        new_endpoint = self.dbapi.get_endpoints_in_node(
            self.context, api_endpoint.node_id)
        return new_endpoint[0]

    def validate_endpoint_values(self, endpoint_ref, endpoint_cmp):
        """Validate Endpoint Object fields."""
        if not (isinstance(endpoint_ref, cluster.EndPoint)
                or isinstance(endpoint_cmp, cluster.EndPoint)):
            self.assertEqual(
                endpoint_ref.id if hasattr(endpoint_ref, "id") else
                endpoint_ref["id"], endpoint_cmp.id if hasattr(
                    endpoint_cmp, "id") else endpoint_cmp["id"],
                "Invalid endpoint id value")
            self.assertEqual(
                endpoint_ref.node_id if hasattr(endpoint_ref, "node_id") else
                endpoint_ref["node_id"], endpoint_cmp.node_id if hasattr(
                    endpoint_cmp, "node_id") else endpoint_cmp["node_id"],
                "Invalid endpoint node_id value")
        self.assertEqual(
            endpoint_ref.uri if hasattr(
                endpoint_ref, "uri") else endpoint_ref["uri"], endpoint_cmp.uri
            if hasattr(endpoint_cmp, "uri") else endpoint_cmp["uri"],
            "Invalid endpoint uri value")
        self.assertEqual(
            endpoint_ref.type if hasattr(endpoint_ref, "type") else
            endpoint_ref["type"], endpoint_cmp.type if hasattr(
                endpoint_cmp, "type") else endpoint_cmp["type"],
            "Invalid endpoint type value")

    def test_endpoint_object_generation(self):
        """Test Endpoint Object generation from a cluster dictionary object."""
        endpoint_dict = func_utils.get_test_endpoint_dict()
        endpoint_object = objects.Endpoint(**endpoint_dict)
        self.validate_endpoint_values(endpoint_dict, endpoint_object)

    def test_endpoint_api_to_object_to_api(self):
        """Tests Endpoint api object conversion to Endpoint object and back

        to api object.
        """
        endpoint_dict = func_utils.get_test_endpoint_dict()
        api_endpoint = cluster.EndPoint(**endpoint_dict)
        object_endpoint = objects.Endpoint(**endpoint_dict)
        self.validate_endpoint_values(api_endpoint, object_endpoint)
        api_endpoint_2 = cluster.EndPoint(**object_endpoint.as_dict())
        self.validate_endpoint_values(api_endpoint, api_endpoint_2)

    def test_endpoint_db_to_object_to_db(self):
        """Tests Endpoint db object conversion to Endpoint object and back

        to db object.
        """
        endpoint_dict = func_utils.get_test_endpoint_dict()
        db_endpoint_object = models.Endpoint()
        db_endpoint_object.update(endpoint_dict)
        object_endpoint = objects.Endpoint._from_db_object(
            objects.Endpoint(), db_endpoint_object)
        self.validate_endpoint_values(db_endpoint_object, object_endpoint)

        endpoint_changes = object_endpoint.obj_get_changes()
        db_endpoint_object_2 = models.Endpoint()
        db_endpoint_object_2.update(endpoint_changes)
        self.validate_endpoint_values(db_endpoint_object, db_endpoint_object_2)

    def test_create_endpoint(self):
        """Tests create endpoint from Endpoint objects API."""
        new_cluster = func_utils.create_object_cluster(self.context)
        cluster_nodes = self.dbapi.get_nodes_in_cluster(
            self.context, new_cluster.id)
        endpoint_dict = func_utils.get_test_endpoint_dict(
            node_id=cluster_nodes[0].id)
        endpoint = objects.Endpoint(**endpoint_dict)
        self.validate_endpoint_values(endpoint_dict, endpoint)
        endpoint.create(self.context)
        new_endpoint = self.dbapi.get_endpoints_in_node(
            self.context, endpoint.node_id)
        self.validate_endpoint_values(endpoint, new_endpoint[0])

    def test_create_endpoint_for_nonexistent_node(self):
        """Tests create endpoint for a nonexistent node from Endpoint

        objects API.
        """
        api_endpoint_dict = func_utils.get_test_endpoint_dict()
        api_endpoint = objects.Endpoint(**api_endpoint_dict)
        self.validate_endpoint_values(api_endpoint_dict, api_endpoint)
        self.assertRaises(oslo_exception.DBReferenceError, api_endpoint.create,
                          self.context)

    def test_update_endpoint_by_node_id(self):
        """Tests update endpoint by node id from Endpoint objects API."""
        new_cluster = func_utils.create_object_cluster(self.context, size=1)
        cluster_node = self.dbapi.get_nodes_in_cluster(self.context,
                                                       new_cluster.id)
        cluster_node_id = cluster_node[0].id
        new_endpoint = self.create_object_endpoint(cluster_node_id,
                                                   uri='10.0.0.1:5672',
                                                   type='AMQP')
        endpoint_values = {'uri': '10.0.0.2:5672', 'type': 'XMPP'}
        objects.Endpoint.update_by_node_id(self.context, new_endpoint.node_id,
                                           endpoint_values)
        endpoints = self.dbapi.get_endpoints_in_node(self.context,
                                                     new_endpoint.node_id)
        for endpoint in endpoints:
            self.assertEqual('XMPP', endpoint.type)
            self.assertEqual('10.0.0.2:5672', endpoint.uri)

    def test_get_endpoints_by_node_id(self):
        """Tests  get endpoint by node id from Endpoint objects API."""
        new_cluster = func_utils.create_object_cluster(self.context, size=1)
        cluster_node = self.dbapi.get_nodes_in_cluster(self.context,
                                                       new_cluster.id)
        node_id = cluster_node[0].id
        new_endpoint = self.create_object_endpoint(node_id)
        endpoint_list = objects.Endpoint.get_endpoints_by_node_id(
            self.context, new_endpoint.node_id)
        for endpoint in endpoint_list:
            self.validate_endpoint_values(endpoint, new_endpoint)
示例#16
0
class CheckClusterStatusTests(base.FunctionalTestCase):
    additional_fixtures = [
        nova.NovaClient, neutron.NeutronClient, urllib2_fixture.Urllib2Fixture
    ]
    dbapi = db_api.get_instance()

    def setUp(self):

        super(CheckClusterStatusTests, self).setUp()

        flavor_name = "m1.tiny"
        network_name = "private"
        management_network_name = "cue_management_net"

        self.nova_client = client.nova_client()
        self.neutron_client = client.neutron_client()
        self.port = '5672'

        self.new_vm_name = str(uuid.uuid4())
        self.new_vm_list = []

        image_list = self.nova_client.images.list()
        for image in image_list:
            if (image.name.startswith("cirros")) and (
                    image.name.endswith("kernel")):
                break
        self.valid_image = image

        self.valid_flavor = self.nova_client.flavors.find(name=flavor_name)

        network_list = self.neutron_client.list_networks(name=network_name)
        self.valid_network = network_list['networks'][0]

        network_list = self.neutron_client.list_networks(
            name=management_network_name)
        self.management_network = network_list['networks'][0]

        # Todo(Dan) If testing becomes asynchronous, then there is no guarantee
        # that these urllib return results will come in the proper order.  Will
        # have to update the urllib2 fixture to respond appropriately for the
        # url passed in.
        urllib2_fixture.Urllib2ResultDetails.set_urllib2_result(
            ['{"status": "ok"}', '[{"name": "/"}]'])

    def test_check_cluster_status_active(self):
        flow_store_create = {
            "tenant_id": str(self.valid_network['tenant_id']),
            "image": self.valid_image.id,
            "flavor": self.valid_flavor.id,
            "port": self.port,
            "context": self.context.to_dict(),
            "erlang_cookie": str(uuid.uuid4()),
            "default_rabbit_user": '******',
            "default_rabbit_pass": str(uuid.uuid4()),
        }
        flow_store_check = {
            "context": self.context.to_dict(),
            "default_rabbit_user": "******",
            "default_rabbit_pass": "******"
        }

        cluster_values = {
            "project_id": self.context.tenant_id,
            "name": "RabbitCluster",
            "network_id": str(uuid.uuid4()),
            "flavor": "1",
            "size": 2,
        }

        new_cluster = objects.Cluster(**cluster_values)
        new_cluster.create(self.context)

        nodes = objects.Node.get_nodes_by_cluster_id(self.context,
                                                     new_cluster.id)
        node_ids = []
        for node in nodes:
            node_ids.append(str(node.id))

        flow_create = create_cluster(new_cluster.id, node_ids,
                                     self.valid_network['id'],
                                     self.management_network['id'])
        engines.run(flow_create, store=flow_store_create)

        cluster_before = objects.Cluster.get_cluster_by_id(
            self.context, new_cluster.id)
        self.assertEqual(models.Status.ACTIVE, cluster_before.status,
                         "Invalid status for cluster")

        urllib2_fixture.Urllib2ResultDetails.set_urllib2_result([
            '{"status": "ok"}',
            '[{"name": "/"}]',
            '{"status": "not-ok"}',
            '[{"name": "/"}]',
        ])
        flow_check_status = check_cluster_status(str(new_cluster.id), node_ids)
        result = engines.run(flow_check_status, store=flow_store_check)

        cluster_after = objects.Cluster.get_cluster_by_id(
            self.context, new_cluster.id)
        self.assertEqual(models.Status.ACTIVE, cluster_after.status,
                         "Invalid status for cluster")

        nodes_after = objects.Node.get_nodes_by_cluster_id(
            self.context, new_cluster.id)

        for i, node in enumerate(nodes_after):
            self.assertEqual(result["node_values_%d" % i]["status"],
                             node.status, "Invalid status for node %d" % i)

    def test_check_cluster_status_down(self):
        flow_store_create = {
            "tenant_id": str(self.valid_network['tenant_id']),
            "image": self.valid_image.id,
            "flavor": self.valid_flavor.id,
            "port": self.port,
            "context": self.context.to_dict(),
            "erlang_cookie": str(uuid.uuid4()),
            "default_rabbit_user": '******',
            "default_rabbit_pass": str(uuid.uuid4()),
        }
        flow_store_check = {
            "context": self.context.to_dict(),
            "default_rabbit_user": "******",
            "default_rabbit_pass": "******"
        }

        cluster_values = {
            "project_id": self.context.tenant_id,
            "name": "RabbitCluster",
            "network_id": str(uuid.uuid4()),
            "flavor": "1",
            "size": 2,
        }

        new_cluster = objects.Cluster(**cluster_values)
        new_cluster.create(self.context)

        nodes = objects.Node.get_nodes_by_cluster_id(self.context,
                                                     new_cluster.id)
        node_ids = []
        for node in nodes:
            node_ids.append(str(node.id))

        flow_create = create_cluster(new_cluster.id, node_ids,
                                     self.valid_network['id'],
                                     self.management_network['id'])
        engines.run(flow_create, store=flow_store_create)

        cluster_before = objects.Cluster.get_cluster_by_id(
            self.context, new_cluster.id)
        self.assertEqual(models.Status.ACTIVE, cluster_before.status,
                         "Invalid status for cluster")

        # mock cluster status returned by each node in cluster
        urllib2_fixture.Urllib2ResultDetails.set_urllib2_result([
            '{"status": "not-ok"}',
            '[{"name": "/"}]',
            '{"status": "not-ok"}',
            '[{"name": "/"}]',
        ])
        flow_check_status = check_cluster_status(str(new_cluster.id), node_ids)
        result = engines.run(flow_check_status, store=flow_store_check)

        cluster_after = objects.Cluster.get_cluster_by_id(
            self.context, new_cluster.id)
        self.assertEqual(models.Status.DOWN, cluster_after.status,
                         "Invalid status for cluster")

        nodes_after = objects.Node.get_nodes_by_cluster_id(
            self.context, new_cluster.id)
        for i, node in enumerate(nodes_after):
            self.assertEqual(models.Status.DOWN,
                             result["node_values_%d" % i]["status"])
            self.assertEqual(models.Status.DOWN, node.status,
                             "Invalid status for node %d" % i)

    def test_check_cluster_status_size_one(self):
        flow_store_create = {
            "tenant_id": str(self.valid_network['tenant_id']),
            "image": self.valid_image.id,
            "flavor": self.valid_flavor.id,
            "port": self.port,
            "context": self.context.to_dict(),
            "erlang_cookie": str(uuid.uuid4()),
            "default_rabbit_user": '******',
            "default_rabbit_pass": str(uuid.uuid4()),
        }
        flow_store_check = {
            "context": self.context.to_dict(),
            "default_rabbit_user": "******",
            "default_rabbit_pass": "******"
        }

        cluster_values = {
            "project_id": self.context.tenant_id,
            "name": "RabbitCluster",
            "network_id": str(uuid.uuid4()),
            "flavor": "1",
            "size": 1,
        }

        new_cluster = objects.Cluster(**cluster_values)
        new_cluster.create(self.context)

        nodes = objects.Node.get_nodes_by_cluster_id(self.context,
                                                     new_cluster.id)
        node_ids = []
        for node in nodes:
            node_ids.append(str(node.id))

        flow_create = create_cluster(new_cluster.id, node_ids,
                                     self.valid_network['id'],
                                     self.management_network['id'])
        engines.run(flow_create, store=flow_store_create)

        cluster_before = objects.Cluster.get_cluster_by_id(
            self.context, new_cluster.id)
        self.assertEqual(models.Status.ACTIVE, cluster_before.status,
                         "Invalid status for cluster")

        # mock cluster status returned by each node in cluster
        urllib2_fixture.Urllib2ResultDetails.set_urllib2_result([
            '{"status": "ok"}',
            '[{"name": "/"}]',
        ])
        flow_check_status = check_cluster_status(str(new_cluster.id), node_ids)
        result = engines.run(flow_check_status, store=flow_store_check)

        cluster_after = objects.Cluster.get_cluster_by_id(
            self.context, new_cluster.id)
        self.assertEqual(models.Status.ACTIVE, cluster_after.status,
                         "Invalid status for cluster")

        nodes_after = objects.Node.get_nodes_by_cluster_id(
            self.context, new_cluster.id)
        self.assertEqual(models.Status.ACTIVE,
                         result["node_values_0"]["status"])
        self.assertEqual(models.Status.ACTIVE, nodes_after[0].status,
                         "Invalid status for node")

    def tearDown(self):
        for vm_id in self.new_vm_list:
            self.nova_client.servers.delete(vm_id)
        super(CheckClusterStatusTests, self).tearDown()