|
14 | 14 | import org.elasticsearch.action.ActionRequestBuilder;
|
15 | 15 | import org.elasticsearch.action.DocWriteRequest;
|
16 | 16 | import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest;
|
| 17 | +import org.elasticsearch.action.admin.indices.alias.Alias; |
17 | 18 | import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
|
18 | 19 | import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions;
|
19 | 20 | import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
|
20 | 21 | import org.elasticsearch.action.admin.indices.alias.get.GetAliasesResponse;
|
| 22 | +import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; |
21 | 23 | import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
|
22 | 24 | import org.elasticsearch.action.admin.indices.get.GetIndexResponse;
|
23 | 25 | import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse;
|
|
58 | 60 | import org.elasticsearch.index.mapper.MapperParsingException;
|
59 | 61 | import org.elasticsearch.index.query.TermQueryBuilder;
|
60 | 62 | import org.elasticsearch.indices.InvalidAliasNameException;
|
| 63 | +import org.elasticsearch.indices.InvalidIndexNameException; |
61 | 64 | import org.elasticsearch.plugins.Plugin;
|
62 | 65 | import org.elasticsearch.rest.RestStatus;
|
63 | 66 | import org.elasticsearch.search.SearchHit;
|
@@ -1531,6 +1534,174 @@ public void testSegmentsSortedOnTimestampDesc() throws Exception {
|
1531 | 1534 | assertTrue(timestamp2 > timestamp3);
|
1532 | 1535 | }
|
1533 | 1536 |
|
| 1537 | + public void testCreateDataStreamWithSameNameAsIndexAlias() throws Exception { |
| 1538 | + CreateIndexRequest createIndexRequest = new CreateIndexRequest("my-index").alias(new Alias("my-alias")); |
| 1539 | + assertAcked(client().admin().indices().create(createIndexRequest).actionGet()); |
| 1540 | + |
| 1541 | + // Important detail: create template with data stream template after the index has been created |
| 1542 | + DataStreamIT.putComposableIndexTemplate("my-template", List.of("my-*")); |
| 1543 | + |
| 1544 | + var request = new CreateDataStreamAction.Request("my-alias"); |
| 1545 | + var e = expectThrows(IllegalStateException.class, () -> client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1546 | + assertThat(e.getMessage(), containsString("[my-alias (alias of [")); |
| 1547 | + assertThat(e.getMessage(), containsString("]) conflicts with data stream")); |
| 1548 | + } |
| 1549 | + |
| 1550 | + public void testCreateDataStreamWithSameNameAsIndex() throws Exception { |
| 1551 | + CreateIndexRequest createIndexRequest = new CreateIndexRequest("my-index").alias(new Alias("my-alias")); |
| 1552 | + assertAcked(client().admin().indices().create(createIndexRequest).actionGet()); |
| 1553 | + |
| 1554 | + // Important detail: create template with data stream template after the index has been created |
| 1555 | + DataStreamIT.putComposableIndexTemplate("my-template", List.of("my-*")); |
| 1556 | + |
| 1557 | + var request = new CreateDataStreamAction.Request("my-index"); |
| 1558 | + var e = expectThrows(IllegalStateException.class, () -> client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1559 | + assertThat(e.getMessage(), containsString("data stream [my-index] conflicts with index")); |
| 1560 | + } |
| 1561 | + |
| 1562 | + public void testCreateDataStreamWithSameNameAsDataStreamAlias() throws Exception { |
| 1563 | + { |
| 1564 | + DataStreamIT.putComposableIndexTemplate("my-template", List.of("my-*")); |
| 1565 | + var request = new CreateDataStreamAction.Request("my-ds"); |
| 1566 | + assertAcked(client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1567 | + var aliasesAddRequest = new IndicesAliasesRequest(); |
| 1568 | + aliasesAddRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index("my-ds").aliases("my-alias")); |
| 1569 | + assertAcked(client().admin().indices().aliases(aliasesAddRequest).actionGet()); |
| 1570 | + |
| 1571 | + var request2 = new CreateDataStreamAction.Request("my-alias"); |
| 1572 | + var e = expectThrows( |
| 1573 | + IllegalStateException.class, |
| 1574 | + () -> client().execute(CreateDataStreamAction.INSTANCE, request2).actionGet() |
| 1575 | + ); |
| 1576 | + assertThat(e.getMessage(), containsString("data stream alias and data stream have the same name (my-alias)")); |
| 1577 | + } |
| 1578 | + { |
| 1579 | + assertAcked(client().execute(DeleteDataStreamAction.INSTANCE, new DeleteDataStreamAction.Request("*")).actionGet()); |
| 1580 | + DataStreamIT.putComposableIndexTemplate( |
| 1581 | + "my-template", |
| 1582 | + null, |
| 1583 | + List.of("my-*"), |
| 1584 | + null, |
| 1585 | + null, |
| 1586 | + Map.of("my-alias", AliasMetadata.builder("my-alias").build()) |
| 1587 | + ); |
| 1588 | + var request = new CreateDataStreamAction.Request("my-ds"); |
| 1589 | + assertAcked(client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1590 | + |
| 1591 | + var request2 = new CreateDataStreamAction.Request("my-alias"); |
| 1592 | + var e = expectThrows( |
| 1593 | + IllegalStateException.class, |
| 1594 | + () -> client().execute(CreateDataStreamAction.INSTANCE, request2).actionGet() |
| 1595 | + ); |
| 1596 | + assertThat(e.getMessage(), containsString("data stream alias and data stream have the same name (my-alias)")); |
| 1597 | + } |
| 1598 | + } |
| 1599 | + |
| 1600 | + public void testCreateDataStreamAliasWithSameNameAsIndexAlias() throws Exception { |
| 1601 | + { |
| 1602 | + DataStreamIT.putComposableIndexTemplate("my-template", List.of("logs-*")); |
| 1603 | + CreateIndexRequest createIndexRequest = new CreateIndexRequest("es-logs").alias(new Alias("logs")); |
| 1604 | + assertAcked(client().admin().indices().create(createIndexRequest).actionGet()); |
| 1605 | + |
| 1606 | + var request = new CreateDataStreamAction.Request("logs-es"); |
| 1607 | + assertAcked(client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1608 | + IndicesAliasesRequest aliasesAddRequest = new IndicesAliasesRequest(); |
| 1609 | + aliasesAddRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index("logs-es").aliases("logs")); |
| 1610 | + var e = expectThrows(IllegalStateException.class, () -> client().admin().indices().aliases(aliasesAddRequest).actionGet()); |
| 1611 | + assertThat(e.getMessage(), containsString("data stream alias and indices alias have the same name (logs)")); |
| 1612 | + } |
| 1613 | + { |
| 1614 | + assertAcked(client().execute(DeleteDataStreamAction.INSTANCE, new DeleteDataStreamAction.Request("*")).actionGet()); |
| 1615 | + DataStreamIT.putComposableIndexTemplate( |
| 1616 | + "my-template", |
| 1617 | + null, |
| 1618 | + List.of("logs-*"), |
| 1619 | + null, |
| 1620 | + null, |
| 1621 | + Map.of("logs", AliasMetadata.builder("logs").build()) |
| 1622 | + ); |
| 1623 | + |
| 1624 | + var request = new CreateDataStreamAction.Request("logs-es"); |
| 1625 | + var e = expectThrows(IllegalStateException.class, () -> client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1626 | + assertThat(e.getMessage(), containsString("data stream alias and indices alias have the same name (logs)")); |
| 1627 | + } |
| 1628 | + } |
| 1629 | + |
| 1630 | + public void testCreateDataStreamAliasWithSameNameAsIndex() throws Exception { |
| 1631 | + DataStreamIT.putComposableIndexTemplate("my-template", List.of("logs-*")); |
| 1632 | + |
| 1633 | + CreateIndexRequest createIndexRequest = new CreateIndexRequest("logs"); |
| 1634 | + assertAcked(client().admin().indices().create(createIndexRequest).actionGet()); |
| 1635 | + |
| 1636 | + { |
| 1637 | + var request = new CreateDataStreamAction.Request("logs-es"); |
| 1638 | + assertAcked(client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1639 | + IndicesAliasesRequest aliasesAddRequest = new IndicesAliasesRequest(); |
| 1640 | + aliasesAddRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index("logs-es").aliases("logs")); |
| 1641 | + var e = expectThrows(InvalidAliasNameException.class, () -> client().admin().indices().aliases(aliasesAddRequest).actionGet()); |
| 1642 | + assertThat( |
| 1643 | + e.getMessage(), |
| 1644 | + equalTo("Invalid alias name [logs]: an index or data stream exists with the same name as the alias") |
| 1645 | + ); |
| 1646 | + } |
| 1647 | + { |
| 1648 | + assertAcked(client().execute(DeleteDataStreamAction.INSTANCE, new DeleteDataStreamAction.Request("*")).actionGet()); |
| 1649 | + var e = expectThrows( |
| 1650 | + IllegalArgumentException.class, |
| 1651 | + () -> DataStreamIT.putComposableIndexTemplate( |
| 1652 | + "my-template", |
| 1653 | + null, |
| 1654 | + List.of("logs-*"), |
| 1655 | + null, |
| 1656 | + null, |
| 1657 | + Map.of("logs", AliasMetadata.builder("logs").build()) |
| 1658 | + ) |
| 1659 | + ); |
| 1660 | + assertThat( |
| 1661 | + e.getCause().getMessage(), |
| 1662 | + equalTo("Invalid alias name [logs]: an index or data stream exists with the same name as the alias") |
| 1663 | + ); |
| 1664 | + } |
| 1665 | + } |
| 1666 | + |
| 1667 | + public void testCreateIndexWithSameNameAsDataStreamAlias() throws Exception { |
| 1668 | + DataStreamIT.putComposableIndexTemplate("my-template", List.of("logs-*")); |
| 1669 | + |
| 1670 | + var request = new CreateDataStreamAction.Request("logs-es"); |
| 1671 | + assertAcked(client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1672 | + IndicesAliasesRequest aliasesAddRequest = new IndicesAliasesRequest(); |
| 1673 | + aliasesAddRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index("logs-es").aliases("logs")); |
| 1674 | + assertAcked(client().admin().indices().aliases(aliasesAddRequest).actionGet()); |
| 1675 | + |
| 1676 | + CreateIndexRequest createIndexRequest = new CreateIndexRequest("logs"); |
| 1677 | + var e = expectThrows(InvalidIndexNameException.class, () -> client().admin().indices().create(createIndexRequest).actionGet()); |
| 1678 | + assertThat(e.getMessage(), equalTo("Invalid index name [logs], already exists as alias")); |
| 1679 | + } |
| 1680 | + |
| 1681 | + public void testCreateIndexAliasWithSameNameAsDataStreamAlias() throws Exception { |
| 1682 | + DataStreamIT.putComposableIndexTemplate("my-template", List.of("logs-*")); |
| 1683 | + |
| 1684 | + var request = new CreateDataStreamAction.Request("logs-es"); |
| 1685 | + assertAcked(client().execute(CreateDataStreamAction.INSTANCE, request).actionGet()); |
| 1686 | + IndicesAliasesRequest aliasesAddRequest = new IndicesAliasesRequest(); |
| 1687 | + aliasesAddRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index("logs-es").aliases("logs")); |
| 1688 | + assertAcked(client().admin().indices().aliases(aliasesAddRequest).actionGet()); |
| 1689 | + |
| 1690 | + { |
| 1691 | + CreateIndexRequest createIndexRequest = new CreateIndexRequest("my-index").alias(new Alias("logs")); |
| 1692 | + var e = expectThrows(IllegalStateException.class, () -> client().admin().indices().create(createIndexRequest).actionGet()); |
| 1693 | + assertThat(e.getMessage(), containsString("data stream alias and indices alias have the same name (logs)")); |
| 1694 | + } |
| 1695 | + { |
| 1696 | + CreateIndexRequest createIndexRequest = new CreateIndexRequest("my-index"); |
| 1697 | + assertAcked(client().admin().indices().create(createIndexRequest).actionGet()); |
| 1698 | + IndicesAliasesRequest addAliasRequest = new IndicesAliasesRequest(); |
| 1699 | + addAliasRequest.addAliasAction(new AliasActions(AliasActions.Type.ADD).index("my-index").aliases("logs")); |
| 1700 | + var e = expectThrows(IllegalStateException.class, () -> client().admin().indices().aliases(addAliasRequest).actionGet()); |
| 1701 | + assertThat(e.getMessage(), containsString("data stream alias and indices alias have the same name (logs)")); |
| 1702 | + } |
| 1703 | + } |
| 1704 | + |
1534 | 1705 | private static void verifyResolvability(String dataStream, ActionRequestBuilder<?, ?> requestBuilder, boolean fail) {
|
1535 | 1706 | verifyResolvability(dataStream, requestBuilder, fail, 0);
|
1536 | 1707 | }
|
@@ -1723,12 +1894,23 @@ static void putComposableIndexTemplate(
|
1723 | 1894 | List<String> patterns,
|
1724 | 1895 | @Nullable Settings settings,
|
1725 | 1896 | @Nullable Map<String, Object> metadata
|
| 1897 | + ) throws IOException { |
| 1898 | + putComposableIndexTemplate(id, mappings, patterns, settings, metadata, null); |
| 1899 | + } |
| 1900 | + |
| 1901 | + static void putComposableIndexTemplate( |
| 1902 | + String id, |
| 1903 | + @Nullable String mappings, |
| 1904 | + List<String> patterns, |
| 1905 | + @Nullable Settings settings, |
| 1906 | + @Nullable Map<String, Object> metadata, |
| 1907 | + @Nullable Map<String, AliasMetadata> aliases |
1726 | 1908 | ) throws IOException {
|
1727 | 1909 | PutComposableIndexTemplateAction.Request request = new PutComposableIndexTemplateAction.Request(id);
|
1728 | 1910 | request.indexTemplate(
|
1729 | 1911 | new ComposableIndexTemplate(
|
1730 | 1912 | patterns,
|
1731 |
| - new Template(settings, mappings == null ? null : new CompressedXContent(mappings), null), |
| 1913 | + new Template(settings, mappings == null ? null : new CompressedXContent(mappings), aliases), |
1732 | 1914 | null,
|
1733 | 1915 | null,
|
1734 | 1916 | null,
|
|
0 commit comments