예제 #1
0
    def test_create_and_update_multiple_hosts_with_account_mismatch(self):
        """
        Attempt to create multiple hosts, one host has the wrong account number.
        Verify this causes an error response to be returned.
        """
        facts = None

        host1 = HostWrapper(test_data(display_name="host1", facts=facts))
        host1.ip_addresses = ["10.0.0.1"]
        host1.rhel_machine_id = generate_uuid()

        host2 = HostWrapper(test_data(display_name="host2", facts=facts))
        # Set the account number to the wrong account for this request
        host2.account = "222222"
        host2.ip_addresses = ["10.0.0.2"]
        host2.rhel_machine_id = generate_uuid()

        host_list = [host1.data(), host2.data()]

        # Create the host
        created_host = self.post(HOST_URL, host_list, 207)

        self.assertEqual(len(host_list), len(created_host["data"]))

        self.assertEqual(created_host["errors"], 1)

        self.assertEqual(created_host["data"][0]["status"], 201)
        self.assertEqual(created_host["data"][1]["status"], 400)
예제 #2
0
    def test_create_host_update_with_same_insights_id_and_different_canonical_facts(
            self):
        original_insights_id = str(uuid.uuid4())

        host_data = HostWrapper(test_data(facts=None))
        host_data.insights_id = original_insights_id
        host_data.rhel_machine_id = str(uuid.uuid4())
        host_data.subscription_manager_id = "123456"
        host_data.satellite_id = "123456"
        host_data.bios_uuid = "123456"
        host_data.fqdn = "original_fqdn"
        host_data.mac_addresses = ["aa:bb:cc:dd:ee:ff"]
        host_data.external_id = "abcdef"

        # Create the host
        response = self.post(HOST_URL, [host_data.data()], 207)

        self._verify_host_status(response, 0, 201)

        created_host = self._pluck_host_from_response(response, 0)

        original_id = created_host["id"]

        self._validate_host(created_host, host_data, expected_id=original_id)

        # Change the canonical facts except for the insights_id
        host_data.rhel_machine_id = str(uuid.uuid4())
        host_data.ip_addresses = [
            "192.168.1.44",
            "10.0.0.2",
        ]
        host_data.subscription_manager_id = "654321"
        host_data.satellite_id = "654321"
        host_data.bios_uuid = "654321"
        host_data.fqdn = "expected_fqdn"
        host_data.mac_addresses = ["ff:ee:dd:cc:bb:aa"]
        host_data.external_id = "fedcba"
        host_data.facts = [{
            "namespace": "ns1",
            "facts": {
                "newkey": "newvalue"
            }
        }]

        # Update the host
        response = self.post(HOST_URL, [host_data.data()], 207)

        self._verify_host_status(response, 0, 200)

        updated_host = self._pluck_host_from_response(response, 0)

        # Verify that the id did not change on the update
        self.assertEqual(updated_host["id"], original_id)

        # Retrieve the host using the id that we first received
        data = self.get("%s/%s" % (HOST_URL, original_id), 200)

        self._validate_host(data["results"][0],
                            host_data,
                            expected_id=original_id)
예제 #3
0
    def test_create_and_update_multiple_hosts_with_different_accounts(self):
        with test.support.EnvironmentVarGuard() as env:
            env.set("INVENTORY_SHARED_SECRET", SHARED_SECRET)

            facts = None

            host1 = HostWrapper(test_data(display_name="host1", facts=facts))
            host1.account = "111111"
            host1.ip_addresses = ["10.0.0.1"]
            host1.rhel_machine_id = str(uuid.uuid4())

            host2 = HostWrapper(test_data(display_name="host2", facts=facts))
            host2.account = "222222"
            host2.ip_addresses = ["10.0.0.2"]
            host2.rhel_machine_id = str(uuid.uuid4())

            host_list = [host1.data(), host2.data()]

            # Create the host
            response = self.post(HOST_URL, host_list, 207)

            self.assertEqual(len(host_list), len(response["data"]))
            self.assertEqual(response["total"], len(response["data"]))

            self.assertEqual(response["errors"], 0)

            for host in response["data"]:
                self.assertEqual(host["status"], 201)

            host_list[0]["id"] = response["data"][0]["host"]["id"]
            host_list[0]["bios_uuid"] = str(uuid.uuid4())
            host_list[0]["display_name"] = "fred"

            host_list[1]["id"] = response["data"][1]["host"]["id"]
            host_list[1]["bios_uuid"] = str(uuid.uuid4())
            host_list[1]["display_name"] = "barney"

            # Update the host
            updated_host = self.post(HOST_URL, host_list, 207)

            self.assertEqual(updated_host["errors"], 0)

            i = 0
            for host in updated_host["data"]:
                self.assertEqual(host["status"], 200)

                expected_host = HostWrapper(host_list[i])

                self._validate_host(host["host"],
                                    expected_host,
                                    expected_id=expected_host.id)

                i += 1
예제 #4
0
    def test_create_host_with_non_nullable_fields_as_none(self):
        non_nullable_field_names = (
            "display_name",
            "account",
            "insights_id",
            "rhel_machine_id",
            "subscription_manager_id",
            "satellite_id",
            "fqdn",
            "bios_uuid",
            "ip_addresses",
            "mac_addresses",
            "external_id",
            "ansible_host",
            "stale_timestamp",
            "reporter",
        )

        host_data = HostWrapper(test_data(facts=None))

        # Have at least one good canonical fact set
        host_data.insights_id = generate_uuid()
        host_data.rhel_machine_id = generate_uuid()

        host_dict = host_data.data()

        for field_name in non_nullable_field_names:
            with self.subTest(field_as_None=field_name):
                invalid_host_dict = copy.deepcopy(host_dict)

                invalid_host_dict[field_name] = None

                response_data = self.post(HOST_URL, [invalid_host_dict], 400)

                self.verify_error_response(response_data, expected_title="Bad Request")
예제 #5
0
    def test_create_and_update(self):
        facts = None

        host_data = HostWrapper(test_data(facts=facts))

        # Create the host
        response = self.post(HOST_URL, [host_data.data()], 207)

        self._verify_host_status(response, 0, 201)

        created_host = self._pluck_host_from_response(response, 0)

        original_id = created_host["id"]

        self._validate_host(created_host, host_data, expected_id=original_id)

        created_time = dateutil.parser.parse(created_host["created"])
        current_timestamp = now()
        self.assertGreater(current_timestamp, created_time)
        self.assertLess(current_timestamp - timedelta(minutes=15), created_time)

        host_data.facts = copy.deepcopy(FACTS)

        # Replace facts under the first namespace
        host_data.facts[0]["facts"] = {"newkey1": "newvalue1"}

        # Add a new set of facts under a new namespace
        host_data.facts.append({"namespace": "ns2", "facts": {"key2": "value2"}})

        # Add a new canonical fact
        host_data.rhel_machine_id = generate_uuid()
        host_data.ip_addresses = ["10.10.0.1", "10.0.0.2", "fe80::d46b:2807:f258:c319"]
        host_data.mac_addresses = ["c2:00:d0:c8:61:01"]
        host_data.external_id = "i-05d2313e6b9a42b16"
        host_data.insights_id = generate_uuid()

        # Update the host with the new data
        response = self.post(HOST_URL, [host_data.data()], 207)

        self._verify_host_status(response, 0, 200)

        updated_host = self._pluck_host_from_response(response, 0)

        # Make sure the id from the update post matches the id from the create
        self.assertEqual(updated_host["id"], original_id)

        # Verify the timestamp has been modified
        self.assertIsNotNone(updated_host["updated"])
        modified_time = dateutil.parser.parse(updated_host["updated"])
        self.assertGreater(modified_time, created_time)

        host_lookup_results = self.get(f"{HOST_URL}/{original_id}", 200)

        # sanity check
        # host_lookup_results["results"][0]["facts"][0]["facts"]["key2"] = "blah"
        # host_lookup_results["results"][0]["insights_id"] = "1.2.3.4"
        self._validate_host(host_lookup_results["results"][0], host_data, expected_id=original_id)
예제 #6
0
    def test_create_and_update(self):
        facts = None
        tags = []

        host_data = HostWrapper(test_data(facts=facts, tags=tags))

        # Create the host
        created_host = self.post(HOST_URL, host_data.data(), 201)

        original_id = created_host["id"]

        self._validate_host(created_host, host_data, expected_id=original_id)
        created_time = dateutil.parser.parse(created_host["created"])
        self.assertGreater(datetime.now(timezone.utc), created_time)

        host_data.facts = copy.deepcopy(FACTS)

        # Replace facts under the first namespace
        host_data.facts[0]["facts"] = {"newkey1": "newvalue1"}

        # Add a new set of facts under a new namespace
        host_data.facts.append({
            "namespace": "ns2",
            "facts": {
                "key2": "value2"
            }
        })

        # Add a new canonical fact
        host_data.rhel_machine_id = "1234-56-789"
        host_data.ip_addresses = ["10.10.0.1", "10.0.0.2"]
        host_data.mac_addresses = ["c2:00:d0:c8:61:01"]
        host_data.insights_id = "0987-65-4321"

        # Update the host with the new data
        updated_host = self.post(HOST_URL, host_data.data(), 200)

        # Make sure the id from the update post matches the id from the create
        self.assertEqual(updated_host["id"], original_id)

        # Verify the timestamp has been modified
        self.assertIsNotNone(updated_host["updated"])
        modified_time = dateutil.parser.parse(updated_host["updated"])
        self.assertGreater(modified_time, created_time)

        host_lookup_results = self.get("%s/%s" % (HOST_URL, original_id), 200)

        # sanity check
        # host_lookup_results["results"][0]["facts"][0]["facts"]["key2"] = "blah"
        # host_lookup_results["results"][0]["insights_id"] = "1.2.3.4"
        self._validate_host(host_lookup_results["results"][0],
                            host_data,
                            expected_id=original_id)
예제 #7
0
    def create_hosts(self):
        hosts_to_create = [
            (
                "host1",
                generate_uuid(),
                "host1.domain.test",
                [
                    {
                        "namespace": "NS1",
                        "key": "key1",
                        "value": "val1"
                    },
                    {
                        "namespace": "NS1",
                        "key": "key2",
                        "value": "val1"
                    },
                    {
                        "namespace": "SPECIAL",
                        "key": "tag",
                        "value": "ToFind"
                    },
                    {
                        "namespace": "no",
                        "key": "key",
                        "value": None
                    },
                ],
            ),
            (
                "host2",
                generate_uuid(),
                "host1.domain.test",
                [
                    {
                        "namespace": "NS1",
                        "key": "key1",
                        "value": "val1"
                    },
                    {
                        "namespace": "NS2",
                        "key": "key2",
                        "value": "val2"
                    },
                    {
                        "namespace": "NS3",
                        "key": "key3",
                        "value": "val3"
                    },
                ],
            ),  # the same fqdn is intentional
            (
                "host3",
                generate_uuid(),
                "host2.domain.test",
                [
                    {
                        "namespace": "NS2",
                        "key": "key2",
                        "value": "val2"
                    },
                    {
                        "namespace": "NS3",
                        "key": "key3",
                        "value": "val3"
                    },
                    {
                        "namespace": "NS1",
                        "key": "key3",
                        "value": "val3"
                    },
                    {
                        "namespace": None,
                        "key": "key4",
                        "value": "val4"
                    },
                    {
                        "namespace": None,
                        "key": "key5",
                        "value": None
                    },
                ],
            ),
        ]

        if hasattr(self, "hosts_to_create"):
            self.hosts_to_create = hosts_to_create + self.hosts_to_create
        else:
            self.hosts_to_create = hosts_to_create

        host_list = []

        mock_event_producer = MockEventProducer()

        for host in self.hosts_to_create:
            host_wrapper = HostWrapper()
            host_wrapper.account = ACCOUNT
            host_wrapper.display_name = host[0]
            host_wrapper.insights_id = generate_uuid()
            host_wrapper.rhel_machine_id = generate_uuid()
            host_wrapper.subscription_manager_id = generate_uuid()
            host_wrapper.satellite_id = generate_uuid()
            host_wrapper.bios_uuid = generate_uuid()
            host_wrapper.ip_addresses = ["10.0.0.2"]
            host_wrapper.fqdn = host[2]
            host_wrapper.mac_addresses = ["aa:bb:cc:dd:ee:ff"]
            host_wrapper.external_id = generate_uuid()
            host_wrapper.facts = [{
                "namespace": "ns1",
                "facts": {
                    "key1": "value1"
                }
            }]
            host_wrapper.tags = host[3]
            host_wrapper.stale_timestamp = now().isoformat()
            host_wrapper.reporter = "test"
            message = {"operation": "add_host", "data": host_wrapper.data()}

            with self.app.app_context():
                handle_message(json.dumps(message), mock_event_producer)

            response_data = json.loads(mock_event_producer.event)

            # add facts object since it's not returned by message
            host_data = {
                **response_data["host"], "facts": message["data"]["facts"]
            }
            host_list.append(HostWrapper(host_data))

        return host_list