diff --git a/.evergreen/start-atlas-cloud-cluster.sh b/.evergreen/start-atlas-cloud-cluster.sh index 541fd7a4df1..5c38b3d1f14 100644 --- a/.evergreen/start-atlas-cloud-cluster.sh +++ b/.evergreen/start-atlas-cloud-cluster.sh @@ -19,6 +19,9 @@ DELETE_AFTER="$(date -u -Iseconds -d '+2 hours' 2>/dev/null || date -u -Iseconds # # - Setup a new org and project. Save the org id and project id for later. # +# - Add test payment details within the organization (Billing) to be able to +# create clusters. +# # - Create a new API key (Access Manager > Project Access > Create Application > # API Key) for the project you created and save the public and private keys. # @@ -101,10 +104,11 @@ export COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DBUSER_USERNAME="$ATLAS_TEST_DB_USERNAME" export COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DBUSER_PASSWORD="$ATLAS_TEST_DB_PASSWORD" echo "Creating Atlas deployment \`$ATLAS_CLUSTER_NAME\` to test against..." -atlascli clusters create $ATLAS_CLUSTER_NAME \ +(atlascli clusters create $ATLAS_CLUSTER_NAME \ --provider AWS \ --region US_EAST_1 \ - --tier M10 + --tier M10 \ + --type GEOSHARDED || true) # can error if custom name was provided, will fail on next step if it's not expected failure echo "Waiting for the deployment to be provisioned..." atlascli clusters watch $ATLAS_CLUSTER_NAME diff --git a/packages/compass-e2e-tests/helpers/commands/click-confirmation-action.ts b/packages/compass-e2e-tests/helpers/commands/click-confirmation-action.ts new file mode 100644 index 00000000000..9524c4ef5a3 --- /dev/null +++ b/packages/compass-e2e-tests/helpers/commands/click-confirmation-action.ts @@ -0,0 +1,28 @@ +import type { CompassBrowser } from '../compass-browser'; +import * as Selectors from '../selectors'; + +export async function clickConfirmationAction( + browser: CompassBrowser, + actionButtonSelector: string, + confirmationText?: string, + screenshot?: string +) { + await browser.clickVisible(actionButtonSelector); + + const confirmationModal = await browser.$(Selectors.ConfirmationModal); + await confirmationModal.waitForDisplayed(); + + if (confirmationText) { + await browser.setValueVisible( + Selectors.ConfirmationModalInput, + confirmationText + ); + } + + if (screenshot) { + await browser.screenshot(screenshot); + } + + await browser.clickVisible(Selectors.confirmationModalConfirmButton()); + await confirmationModal.waitForDisplayed({ reverse: true }); +} diff --git a/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts b/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts index 8ca6d89c0c3..1b2bb502ccc 100644 --- a/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts +++ b/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts @@ -2,6 +2,14 @@ import type { CompassBrowser } from '../compass-browser'; import * as Selectors from '../selectors'; import type { WorkspaceTabSelectorOptions } from '../selectors'; +type CollectionWorkspaceSubTab = + | 'Documents' + | 'Aggregations' + | 'Schema' + | 'Indexes' + | 'Validation' + | 'GlobalWrites'; + async function navigateToCollection( browser: CompassBrowser, connectionName: string, @@ -50,12 +58,8 @@ export async function navigateToCollectionTab( connectionName: string, dbName: string, collectionName: string, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' = 'Documents', + tabName: CollectionWorkspaceSubTab = 'Documents', + closeExistingTabs = true ): Promise { await navigateToCollection( @@ -83,12 +87,7 @@ export async function navigateToCollectionTab( export async function navigateWithinCurrentCollectionTabs( browser: CompassBrowser, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' = 'Documents' + tabName: CollectionWorkspaceSubTab = 'Documents' ): Promise { const tab = browser.$(Selectors.collectionSubTab(tabName)); const selectedTab = browser.$(Selectors.collectionSubTab(tabName, true)); @@ -108,13 +107,7 @@ async function waitUntilActiveCollectionTab( connectionName: string, dbName: string, collectionName: string, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' - | null = null + tabName: CollectionWorkspaceSubTab | null = null ) { const options: WorkspaceTabSelectorOptions = { type: 'Collection', @@ -132,12 +125,7 @@ async function waitUntilActiveCollectionTab( export async function waitUntilActiveCollectionSubTab( browser: CompassBrowser, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' = 'Documents' + tabName: CollectionWorkspaceSubTab = 'Documents' ) { await browser.$(Selectors.collectionSubTab(tabName, true)).waitForDisplayed(); } diff --git a/packages/compass-e2e-tests/helpers/commands/hide-index.ts b/packages/compass-e2e-tests/helpers/commands/hide-index.ts index ed1d0e5b6c6..d082ab91a98 100644 --- a/packages/compass-e2e-tests/helpers/commands/hide-index.ts +++ b/packages/compass-e2e-tests/helpers/commands/hide-index.ts @@ -11,21 +11,11 @@ export async function hideIndex( await indexComponent.waitForDisplayed(); await browser.hover(indexComponentSelector); - await browser.clickVisible( - `${indexComponentSelector} ${Selectors.HideIndexButton}` + await browser.clickConfirmationAction( + `${indexComponentSelector} ${Selectors.HideIndexButton}`, + undefined, + screenshotName ); - - const hideModal = await browser.$(Selectors.ConfirmationModal); - await hideModal.waitForDisplayed(); - - if (screenshotName) { - await browser.screenshot(screenshotName); - } - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - - await hideModal.waitForDisplayed({ reverse: true }); - const hiddenBadge = await browser.$(Selectors.HiddenIndexBadge(indexName)); await hiddenBadge.waitForDisplayed(); } diff --git a/packages/compass-e2e-tests/helpers/commands/index.ts b/packages/compass-e2e-tests/helpers/commands/index.ts index 2ad04e81f01..080501905f9 100644 --- a/packages/compass-e2e-tests/helpers/commands/index.ts +++ b/packages/compass-e2e-tests/helpers/commands/index.ts @@ -64,3 +64,4 @@ export * from './hide-visible-toasts'; export * from './sidebar-collection'; export * from './read-first-document-content'; export * from './read-stage-operators'; +export * from './click-confirmation-action'; diff --git a/packages/compass-e2e-tests/helpers/commands/unhide-index.ts b/packages/compass-e2e-tests/helpers/commands/unhide-index.ts index 305ce3cea96..4d7e3905b7f 100644 --- a/packages/compass-e2e-tests/helpers/commands/unhide-index.ts +++ b/packages/compass-e2e-tests/helpers/commands/unhide-index.ts @@ -11,21 +11,12 @@ export async function unhideIndex( await indexComponent.waitForDisplayed(); await browser.hover(indexComponentSelector); - await browser.clickVisible( - `${indexComponentSelector} ${Selectors.UnhideIndexButton}` + await browser.clickConfirmationAction( + `${indexComponentSelector} ${Selectors.UnhideIndexButton}`, + undefined, + screenshotName ); - const unhideModal = await browser.$(Selectors.ConfirmationModal); - await unhideModal.waitForDisplayed(); - - if (screenshotName) { - await browser.screenshot(screenshotName); - } - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - - await unhideModal.waitForDisplayed({ reverse: true }); - const hiddenBadge = await browser.$(Selectors.HiddenIndexBadge(indexName)); await hiddenBadge.waitForDisplayed({ reverse: true }); } diff --git a/packages/compass-e2e-tests/helpers/insert-data.ts b/packages/compass-e2e-tests/helpers/insert-data.ts index ab0fa1894b8..aa17255aad5 100644 --- a/packages/compass-e2e-tests/helpers/insert-data.ts +++ b/packages/compass-e2e-tests/helpers/insert-data.ts @@ -168,13 +168,15 @@ export async function createNumbersStringCollection( ); } -export async function createGeospatialCollection(): Promise { +export async function createGeospatialCollection( + name = 'geospatial' +): Promise { await Promise.all( test_dbs.map(async (db) => { const lon = () => Math.random() * 360 - 180; const lat = () => Math.random() * 180 - 90; - await db.collection('geospatial').insertMany( + await db.collection(name).insertMany( [...Array(1000).keys()].map(() => ({ location: { type: 'Point', coordinates: [lon(), lat()] }, })) diff --git a/packages/compass-e2e-tests/helpers/selectors.ts b/packages/compass-e2e-tests/helpers/selectors.ts index 0d4532ea4c1..e137f94b4e3 100644 --- a/packages/compass-e2e-tests/helpers/selectors.ts +++ b/packages/compass-e2e-tests/helpers/selectors.ts @@ -1400,3 +1400,23 @@ export const ProxyCustomButton = // Close tab confirmation export const ConfirmTabCloseModal = '[data-testid="confirm-tab-close"]'; + +export const GlobalWrites = { + tabStatus: (status: string) => + `[data-testid="globalwrites-content"] > [data-status="${status.toLowerCase()}"]`, + + ShardKeyFormSecondKeyInputCombobox: + '[data-testid="second-shard-key"] [role="combobox"] input', + ShardKeyFormAdvancedOptionsToggle: + '[data-testid="advanced-shard-key-configuration"]', + shardKeyFormIndexType: (type: 'UNIQUE' | 'HASHED') => + `[data-testid="${type.toLowerCase()}-index"]`, + ShardKeyFormSubmitButton: '[data-testid="shard-collection-button"]', + + CancelShardingButton: '[data-testid="cancel-sharding-btn"]', + UnmanageNamespaceButton: '[data-testid="unmanage-collection-button"]', + ManageNamespaceButton: '[data-testid="manage-collection-button"]', + + SampleFindingDocuments: '[data-testid="sample-finding-documents"]', + SampleInsertingDocuments: '[data-testid="sample-inserting-documents"]', +}; diff --git a/packages/compass-e2e-tests/helpers/test-runner-context.ts b/packages/compass-e2e-tests/helpers/test-runner-context.ts index e9ed908a4e4..2c73d855471 100644 --- a/packages/compass-e2e-tests/helpers/test-runner-context.ts +++ b/packages/compass-e2e-tests/helpers/test-runner-context.ts @@ -39,7 +39,7 @@ function buildCommonArgs(yargs: Argv) { .option('webdriver-waitfor-timeout', { type: 'number', description: 'Set a custom default webdriver waitFor timeout', - default: 120_000, // webdriver default is 3000ms + default: 1000 * 60 * 2, // 2min, webdriver default is 3s }) .option('webdriver-waitfor-interval', { type: 'number', diff --git a/packages/compass-e2e-tests/tests/atlas-cloud/global-writes.test.ts b/packages/compass-e2e-tests/tests/atlas-cloud/global-writes.test.ts new file mode 100644 index 00000000000..a45d5758761 --- /dev/null +++ b/packages/compass-e2e-tests/tests/atlas-cloud/global-writes.test.ts @@ -0,0 +1,174 @@ +import { expect } from 'chai'; +import type { Compass } from '../../helpers/compass'; +import { + cleanup, + init, + screenshotIfFailed, + Selectors, +} from '../../helpers/compass'; +import type { CompassBrowser } from '../../helpers/compass-browser'; +import { createGeospatialCollection } from '../../helpers/insert-data'; +import { + DEFAULT_CONNECTION_NAMES, + isTestingAtlasCloudSandbox, +} from '../../helpers/test-runner-context'; + +type GeoShardingFormData = { + secondShardKey: string; + keyType?: 'UNIQUE' | 'HASHED'; +}; + +type GeoShardingStatus = + | 'UNSHARDED' + | 'SHARDING' + | 'SHARD_KEY_CORRECT' + | 'INCOMPLETE_SHARDING_SETUP'; + +const WEBDRIVER_TIMEOUT = 1000 * 60 * 10; +const MOCHA_TIMEOUT = WEBDRIVER_TIMEOUT * 1.2; + +async function createGeoShardKey( + browser: CompassBrowser, + formData: GeoShardingFormData +) { + await browser.setComboBoxValue( + Selectors.GlobalWrites.ShardKeyFormSecondKeyInputCombobox, + formData.secondShardKey + ); + + if (formData.keyType) { + await browser.clickVisible( + Selectors.GlobalWrites.ShardKeyFormAdvancedOptionsToggle + ); + await browser.clickParent( + Selectors.GlobalWrites.shardKeyFormIndexType(formData.keyType) + ); + } + await browser.clickVisible(Selectors.GlobalWrites.ShardKeyFormSubmitButton); +} + +async function waitForGlobalWritesStatus( + browser: CompassBrowser, + nextStatus: GeoShardingStatus +) { + await browser.waitUntil( + async () => { + return await browser + .$(Selectors.GlobalWrites.tabStatus(nextStatus)) + .isDisplayed(); + }, + { + timeout: WEBDRIVER_TIMEOUT, + // Sharding is slow process, no need to check too often, just makes the + // logs hard to read + interval: 2_000, + } + ); +} + +describe('Global writes', function () { + // Sharding a collection takes a bit longer + this.timeout(MOCHA_TIMEOUT); + + let compass: Compass; + let browser: CompassBrowser; + + before(function () { + if (!isTestingAtlasCloudSandbox()) { + this.skip(); + } + }); + + beforeEach(async function () { + compass = await init(this.test?.fullTitle()); + browser = compass.browser; + await browser.setupDefaultConnections(); + }); + + afterEach(async function () { + await screenshotIfFailed(compass, this.currentTest); + await cleanup(compass); + }); + + it('should be able to shard an unsharded namespace and also unmanage it', async function () { + const collName = `global-writes-geospatial-${Date.now()}`; + + await createGeospatialCollection(collName); + await browser.connectToDefaults(); + await browser.navigateToCollectionTab( + DEFAULT_CONNECTION_NAMES[0], + 'test', + collName, + 'GlobalWrites' + ); + + // Initial state is loading + await waitForGlobalWritesStatus(browser, 'UNSHARDED'); + + await createGeoShardKey(browser, { + secondShardKey: 'country', + keyType: 'HASHED', + }); + + // Wait for the shard key to be correct. + await waitForGlobalWritesStatus(browser, 'SHARD_KEY_CORRECT'); + + // Expectations to see the shard key in the UI + const findingDocumentsText = await browser + .$(Selectors.GlobalWrites.SampleFindingDocuments) + .getText(); + + const insertedDocumentsText = await browser + .$(Selectors.GlobalWrites.SampleInsertingDocuments) + .getText(); + + expect(findingDocumentsText).to.include('country'); + expect(insertedDocumentsText).to.include('country'); + + // Unmanage the namespace + await browser.clickVisible(Selectors.GlobalWrites.UnmanageNamespaceButton); + + // It transitions to the unmanaging state + await waitForGlobalWritesStatus(browser, 'INCOMPLETE_SHARDING_SETUP'); + + // This time there should be a button to manage the namespace again, but not the form + await browser + .$(Selectors.GlobalWrites.ManageNamespaceButton) + .waitForDisplayed(); + await browser + .$(Selectors.GlobalWrites.ShardKeyFormSecondKeyInputCombobox) + .waitForDisplayed({ reverse: true }); + }); + + it('should be able to shard an unsharded namespace and cancel the operation', async function () { + const collName = `global-writes-geospatial-${Date.now()}`; + + await createGeospatialCollection(collName); + await browser.connectToDefaults(); + await browser.navigateToCollectionTab( + DEFAULT_CONNECTION_NAMES[0], + 'test', + collName, + 'GlobalWrites' + ); + + // Initial state is loading + await waitForGlobalWritesStatus(browser, 'UNSHARDED'); + + await createGeoShardKey(browser, { + secondShardKey: 'country', + keyType: 'UNIQUE', + }); + + // Wait for the shard key to be correct. + await waitForGlobalWritesStatus(browser, 'SHARDING'); + + // Cancel the sharding operation. + await browser.clickConfirmationAction( + Selectors.GlobalWrites.CancelShardingButton + ); + + // After its cancelled, it should transition back to the unsharded state + await waitForGlobalWritesStatus(browser, 'UNSHARDED'); + }); +}); diff --git a/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts b/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts index f09b7afcd85..e3189ba7135 100644 --- a/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts +++ b/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts @@ -30,15 +30,12 @@ describe('Rolling indexes', function () { afterEach(async function () { await screenshotIfFailed(compass, this.currentTest); - }); - - after(async function () { await cleanup(compass); }); it('should be able to create, list, and delete rolling indexes', async function () { // Building rolling indexes is a slow process - const extendedRollingIndexesTimeout = 1000 * 60 * 20; + const extendedRollingIndexesTimeout = 1000 * 60 * 10; this.timeout(extendedRollingIndexesTimeout * 1.2); @@ -77,7 +74,12 @@ describe('Rolling indexes', function () { await browser .$(Selectors.indexComponent(indexName)) .$('[data-testid="index-ready"]') - .waitForDisplayed({ timeout: extendedRollingIndexesTimeout }); + .waitForDisplayed({ + timeout: extendedRollingIndexesTimeout, + // Building a rolling index is a slow process, no need to check too + // often + interval: 2_000, + }); // Now that it's ready, delete it (it will also check that it's eventually // removed from the list) diff --git a/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts b/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts index 2dd52fbe505..f4db128dfd3 100644 --- a/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts +++ b/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts @@ -1011,13 +1011,7 @@ describe('Collection aggregations tab', function () { it('shows confirmation modal when create new pipeline is clicked and aggregation is modified', async function () { await browser.selectStageOperator(0, '$match'); - - await browser.clickVisible(Selectors.CreateNewPipelineButton); - const modalElement = await browser.$(Selectors.ConfirmationModal); - await modalElement.waitForDisplayed(); - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await modalElement.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction(Selectors.CreateNewPipelineButton); }); describe('aggregation builder in text mode', function () { @@ -1258,14 +1252,9 @@ describe('Collection aggregations tab', function () { ); await browser.hover(Selectors.AggregationSavedPipelineCard(name)); - await browser.clickVisible( + await browser.clickConfirmationAction( Selectors.AggregationSavedPipelineCardOpenButton(name) ); - - const confirmOpenModal = await browser.$(Selectors.ConfirmationModal); - await confirmOpenModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await confirmOpenModal.waitForDisplayed({ reverse: true }); }); it('deletes an aggregation', async function () { @@ -1278,14 +1267,9 @@ describe('Collection aggregations tab', function () { ); await browser.hover(Selectors.AggregationSavedPipelineCard(name)); - await browser.clickVisible( + await browser.clickConfirmationAction( Selectors.AggregationSavedPipelineCardDeleteButton(name) ); - - const confirmDeleteModal = await browser.$(Selectors.ConfirmationModal); - await confirmDeleteModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await confirmDeleteModal.waitForDisplayed({ reverse: true }); }); }); diff --git a/packages/compass-e2e-tests/tests/connection-form.test.ts b/packages/compass-e2e-tests/tests/connection-form.test.ts index 111c074f761..98a53f17563 100644 --- a/packages/compass-e2e-tests/tests/connection-form.test.ts +++ b/packages/compass-e2e-tests/tests/connection-form.test.ts @@ -670,14 +670,7 @@ describe('Connection form', function () { // toggle the edit connection string toggle twice await browser.clickVisible(Selectors.EditConnectionStringToggle); expect(await toggle.getAttribute('aria-checked')).to.equal('false'); - await browser.clickVisible(Selectors.EditConnectionStringToggle); - - const confirmModal = await browser.$(Selectors.ConfirmationModal); - await confirmModal.waitForDisplayed(); - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - - await confirmModal.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction(Selectors.EditConnectionStringToggle); // the toggle should now be on expect(await toggle.getAttribute('aria-checked')).to.equal('true'); diff --git a/packages/compass-e2e-tests/tests/my-queries-tab.test.ts b/packages/compass-e2e-tests/tests/my-queries-tab.test.ts index 58d833dfdf1..2b57d35e2c1 100644 --- a/packages/compass-e2e-tests/tests/my-queries-tab.test.ts +++ b/packages/compass-e2e-tests/tests/my-queries-tab.test.ts @@ -301,11 +301,9 @@ describe('My Queries tab', function () { await openMenuForQueryItem(browser, newFavoriteQueryName); // delete it - await browser.clickVisible(Selectors.SavedItemMenuItemDelete); - const deleteModal = await browser.$(Selectors.ConfirmationModal); - await deleteModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await renameModal.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction( + Selectors.SavedItemMenuItemDelete + ); }); it('opens a saved aggregation', async function () { diff --git a/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts b/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts index c20ebc3476f..69197382d29 100644 --- a/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts +++ b/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts @@ -87,10 +87,7 @@ describe('protectConnectionStrings', function () { ); // Enter edit connection string mode - await browser.clickVisible(Selectors.EditConnectionStringToggle); - const confirmModal = await browser.$(Selectors.ConfirmationModal); - await confirmModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); + await browser.clickConfirmationAction(Selectors.EditConnectionStringToggle); expect( await browser.getConnectFormConnectionString(), diff --git a/packages/compass-e2e-tests/tests/search-indexes.test.ts b/packages/compass-e2e-tests/tests/search-indexes.test.ts index dbe41df9ada..264ecbc40ec 100644 --- a/packages/compass-e2e-tests/tests/search-indexes.test.ts +++ b/packages/compass-e2e-tests/tests/search-indexes.test.ts @@ -108,15 +108,11 @@ async function dropSearchIndex(browser: CompassBrowser, indexName: string) { await indexRow.waitForDisplayed(); await browser.hover(indexRowSelector); - await browser.clickVisible(Selectors.searchIndexDropButton(indexName)); - const modal = await browser.$(Selectors.ConfirmationModal); - await modal.waitForDisplayed(); - - await browser.setValueVisible(Selectors.ConfirmationModalInput, indexName); - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await modal.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction( + Selectors.searchIndexDropButton(indexName), + indexName + ); await indexRow.waitForExist({ reverse: true, diff --git a/packages/compass-global-writes/src/components/create-shard-key-form.tsx b/packages/compass-global-writes/src/components/create-shard-key-form.tsx index 19c801e7b1d..34fe299ad69 100644 --- a/packages/compass-global-writes/src/components/create-shard-key-form.tsx +++ b/packages/compass-global-writes/src/components/create-shard-key-form.tsx @@ -190,6 +190,7 @@ export function CreateShardKeyForm({ @@ -255,6 +257,7 @@ export function CreateShardKeyForm({ diff --git a/packages/compass-global-writes/src/components/index.tsx b/packages/compass-global-writes/src/components/index.tsx index d7331022a17..6f4f3f55778 100644 --- a/packages/compass-global-writes/src/components/index.tsx +++ b/packages/compass-global-writes/src/components/index.tsx @@ -101,14 +101,14 @@ function ShardingStateView({ export function GlobalWrites({ shardingStatus }: GlobalWritesProps) { if (shardingStatus === ShardingStatuses.NOT_READY) { return ( -
+
); } return ( - +