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)
def create_hosts(self): hosts_to_create = [ ("host1", "12345", "host1.domain.test"), ("host2", "54321", "host1.domain.test"), # the same fqdn is intentional ("host3", "56789", "host2.domain.test"), ] host_list = [] for host in hosts_to_create: host_wrapper = HostWrapper() host_wrapper.account = ACCOUNT host_wrapper.tags = copy.deepcopy(TAGS) host_wrapper.display_name = host[0] host_wrapper.insights_id = host[1] host_wrapper.fqdn = host[2] host_wrapper.facts = [{ "namespace": "ns1", "facts": { "key1": "value1" } }] response_data = self.post(HOST_URL, host_wrapper.data(), 201) host_list.append(HostWrapper(response_data)) return host_list
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")
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)
def setUp(self): super().setUp() host_wrapper = HostWrapper() host_wrapper.account = ACCOUNT host_wrapper.display_name = "host1" # Same as self.added_hosts[0] host_wrapper.insights_id = generate_uuid() host_wrapper.stale_timestamp = now().isoformat() host_wrapper.reporter = "test" response_data = self.post(HOST_URL, [host_wrapper.data()], 207) self.added_hosts.append(HostWrapper(response_data["data"][0]["host"]))
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)
def test_create_host_with_valid_mac_address(self): valid_mac_arrays = [["blah"], ["11:22:33:44:55:66", "blah"]] for mac_array in valid_mac_arrays: with self.subTest(mac_array=mac_array): host_data = HostWrapper(test_data(facts=None)) host_data.insights_id = generate_uuid() host_data.mac_addresses = mac_array response_data = self.post(HOST_URL, [host_data.data()], 207) error_host = response_data["data"][0] self.assertEqual(error_host["status"], 201)
def _build_test_host_list(self): host_with_display_name_as_none = HostWrapper(test_data(facts=None)) host_with_display_name_as_none.insights_id = str(uuid.uuid4()) # Explicitly set the display name to None host_with_display_name_as_none.display_name = None host_without_display_name = HostWrapper(test_data(facts=None)) host_without_display_name.insights_id = str(uuid.uuid4()) # Remove the display name del host_without_display_name.display_name host_display_name_empty_str = HostWrapper(test_data(facts=None)) host_display_name_empty_str.insights_id = str(uuid.uuid4()) # Explicitly set the display name to an empty string host_display_name_empty_str.display_name = "" test_host_list = [ ("no display_name", host_without_display_name), ("display_name is None", host_with_display_name_as_none), ("display_name is empty string", host_display_name_empty_str), ] return test_host_list
def test_create_host_with_invalid_mac_address(self): invalid_mac_arrays = [[], [""], ["11:22:33:44:55:66", "a" * 256]] for mac_array in invalid_mac_arrays: with self.subTest(mac_array=mac_array): host_data = HostWrapper(test_data(facts=None)) host_data.insights_id = generate_uuid() host_data.mac_addresses = mac_array response_data = self.post(HOST_URL, [host_data.data()], 207) error_host = response_data["data"][0] self.assertEqual(error_host["status"], 400) self.verify_error_response(error_host, expected_title="Bad Request")
def create_hosts(self): hosts_to_create = [("host1", "12345"), ("host2", "54321")] host_list = [] for host in hosts_to_create: host_wrapper = HostWrapper() host_wrapper.account = ACCOUNT host_wrapper.tags = TAGS host_wrapper.display_name = host[0] host_wrapper.insights_id = host[1] host_wrapper.facts = [{ "namespace": "ns1", "facts": { "key1": "value1" } }] response_data = self.post(HOST_URL, host_wrapper.data(), 201) host_list.append(HostWrapper(response_data)) return host_list
def test_create_host_without_display_name_and_no_fqdn(self): """ This test should verify that the display_name is set to the id when neither the display name or fqdn is set. """ test_host_list = self._build_test_host_list() host_fqdn_is_empty_str = HostWrapper(test_data(facts=None)) host_fqdn_is_empty_str.insights_id = str(uuid.uuid4()) host_fqdn_is_empty_str.display_name = "" host_fqdn_is_empty_str.fqdn = "" test_host_list.append(("fqdn and display_name are empty strings", host_fqdn_is_empty_str)) for (test_name, host_data) in test_host_list: with self.subTest(test_name=test_name): # 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"] host_lookup_results = self.get( "%s/%s" % (HOST_URL, original_id), 200) # Explicitly set the display_name to the be id...this is expected here host_data.display_name = created_host["id"] self._validate_host(host_lookup_results["results"][0], host_data, expected_id=original_id)
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