Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CCR] Show remote cluster validation in CCR forms, and add edit follower index #28778

Merged

Conversation

sebelga
Copy link
Contributor

@sebelga sebelga commented Jan 15, 2019

This PR adds the remote cluster validation inside the auto-follow pattern form and the follower index form. It also adds edit follower index functionality via adding an action in the context menu of the table list.

For now, ES does not provide an API to read the advanced settings of a follower index, but they are working on one and we'll be able to populate the fields with the values.

Remote cluster validation

The different use cases to tests are:

- Delete all remote clusters
- Create an auto-follow pattern ---> error and invite user to add a cluster
- Create a follower index --->  error and invite user to add a cluster

- Create a remote cluster, but put a wrong host (disconnected)
- Create an auto-follow pattern ---> error
- Create a follower index ---> error

- Create a remote cluster (connected)
- Create an auto-follow pattern with that cluster
- Delete the remote cluster
- Edit the previous auto-follow pattern ---> error

- Same as above with follower index

- Create a remote cluster (connected)
- Create an auto-follow pattern with that cluster
- Edit the remote cluster with wrong host (disconnected)
- Edit the previous auto-follow pattern ---> error

- Same as above with follower index.

screen shot 2019-01-15 at 20 08 54

screen shot 2019-01-15 at 20 08 09

screen shot 2019-01-15 at 20 08 25

Edit follower index


screen shot 2019-01-14 at 15 09 54

screen shot 2019-01-14 at 15 10 06

screen shot 2019-01-14 at 15 13 14

@elasticmachine
Copy link
Contributor

💔 Build Failed

@cjcenizal cjcenizal added Feature:CCR and Remote Clusters Team:Kibana Management Dev Tools, Index Management, Upgrade Assistant, ILM, Ingest Node Pipelines, and more labels Jan 16, 2019
@elasticmachine
Copy link
Contributor

Pinging @elastic/es-ui

Copy link
Contributor

@cjcenizal cjcenizal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Functionally this looks great! Tested locally and it works as expected. My comments consist of UX improvements and some code organization suggestions. I also found a couple places where text needs to be localized.

const autoFollowPattern = isNew
? getEmptyAutoFollowPattern(this.props.remoteClusters)
? getEmptyAutoFollowPattern(this.props.remoteClusters, queryParams.cluster)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might make sense to call getRemoteClusterName here and pass in the remote cluster instead of these two arguments, since that's really what getEmptyAutoFollowPattern is concerned with.

const getEmptyAutoFollowPattern = (remoteCluster) => ({
  name: '',
  remoteCluster,
  leaderIndexPatterns: [],
  followIndexPatternPrefix: '',
  followIndexPatternSuffix: '',
});

/* ... */

const remoteCluster = getRemoteClusterName(this.props.remoteClusters, queryParams.cluster);
const autoFollowPattern = isNew
  ? getEmptyAutoFollowPattern(remoteCluster)
  : {
    ...this.props.autoFollowPattern,
  };

return clusters.length ? clusters[0] : {};
};

const getRemoteClusterName = (remoteClusters, selected) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a dupe from auto_follow_pattern_form.js. Can we dedupe this by extracting it into a service? Possibly along with getFirstConnectedCluster?

const followerIndex = isNew
? getEmptyFollowerIndex(this.props.remoteClusters)
? getEmptyFollowerIndex(this.props.remoteClusters, queryParams.cluster)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same suggestion here, about calling getRemoteClusterName and passing the cluster in here instead of making getEmptyFollowerIndex call it.

const { remoteClusters, selected, currentUrl } = this.props;
const remoteClustersOptions = remoteClusters.map(({ name, isConnected }) => ({
value: name,
inputDisplay: isConnected ? name : `${name} (not connected)`,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to be localized.


return remoteCluster && remoteCluster.isConnected
? { error: null }
: { error: { message: 'Invalid remote cluster' } };
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this needs to be localized.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually it does not as it is never shown on the screen 😊

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the message necessary then?

: {};
const { remoteClusters, currentUrl } = this.props;

const errorMessages = {
Copy link
Contributor

@cjcenizal cjcenizal Jan 16, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can simplify this by binding name to a local variable here, instead of requiring the consumer to provide it. This will also make it clearer where name is coming from. This idea can also be applied to similar logic inatuo_follow_pattern_form.js.

const renderRemoteClusterField = () => {
  const { remoteClusters, currentUrl } = this.props;

  const selectedRemoteCluster = followerIndex.remoteCluster ? followerIndex.remoteCluster : null;

  const errorMessages = {
    noClusterFound: (
      <FormattedMessage
        id="xpack.crossClusterReplication.followerIndexForm.emptyRemoteClustersCallOutDescription"
        defaultMessage="Follower indices replicate indices on remote clusters. You must add a remote cluster."
      />
    ),
    remoteClusterNotConnectedNotEditable: (
      <FormattedMessage
        id="xpack.crossClusterReplication.followerIndexForm.currentRemoteClusterNotConnectedCallOutDescription"
        defaultMessage="The remote cluster '{name}' is not connected.
        You need to connect it before editing the follower index."
        values={{ name: selectedRemoteCluster }}
      />
    ),
    remoteClusterDoesNotExist: (
      <FormattedMessage
        id="xpack.crossClusterReplication.followerIndexForm.currentRemoteClusterNotFoundCallOutDescription"
        defaultMessage="The remote cluster '{name}' was not found. It might have been removed.
        In order to edit the follower index, you need to add a remote cluster with the same name."
        values={{ name: selectedRemoteCluster }}
      />
    ),
  };

  return (
    <EuiDescribedFormGroup
      title={(
        <EuiTitle size="s">
          <h4>
            <FormattedMessage
              id="xpack.crossClusterReplication.followerIndexForm.sectionRemoteClusterTitle"
              defaultMessage="Remote cluster"
            />
          </h4>
        </EuiTitle>
      )}
      description={(
        <FormattedMessage
          id="xpack.crossClusterReplication.followerIndexForm.sectionRemoteClusterDescription"
          defaultMessage="The remote cluster to replicate your leader index from."
        />
      )}
      fullWidth
    >
      <RemoteClustersFormField
        selected={selectedRemoteCluster}
        remoteClusters={remoteClusters || []}
        currentUrl={currentUrl}
        isEditable={isNew}
        areErrorsVisible={areErrorsVisible}
        onChange={this.onClusterChange}
        onError={(error) => this.onFieldsErrorChange({ remoteCluster: error })}
        errorMessages={errorMessages}
      />
    </EuiDescribedFormGroup>
  );
};

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

after pulling out name into the callout titles instead of description, this is no longer needed 😄

@@ -247,14 +257,26 @@ export const FollowerIndexForm = injectI18n(
* Remote Cluster
*/
const renderRemoteClusterField = () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really relevant to this PR, but I do find this pattern of declaring local renderSomething() functions unusual. Everywhere else I've seen them defined as component instance methods.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It helps by grouping functions by behavior. Instead of heaving loads of functions declared at the component level. I like to toggle all first level methods when I open a component I never worked on and see the moving parts. If renderForm() needs 5 functions to make it easier to reason about, I don't really need that information when I first open a component file.


if (isEditable) {
/* Create */
if (hasClusters && !isSelectedRemoteClusterConnected) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could define hasClusters on this line since this variable is only used by this branch.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is my code style 😊 I read better in if statements what if being compared. Even if that means declaring a variable for a 1-time use.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

++ definitely! My suggestion was just to move the variable inside of the first condition, because when it's outside of the condition it misleadingly appears like the condition depends upon it.

{ !isEditable && this.renderNotEditable() }
{ isEditable && hasClusters && this.renderDropdown() }
<EuiSpacer size="s" />
{ this.renderErrorMessage() }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can improve the UI by rendering the error as part of the dropdown. In the screenshot below I've made these changes:

  1. Put the callout below the dropdown, but above the "Add" button. I think this hierarchy makes sense because the callout pertains to the selected remote cluster, but not to the button.
  2. Simplified the callout copy and moved some body text into the title.
  3. Changed the callout button to "Edit remote cluster". I think it makes more sense to prompt the user to edit the selected remote cluster than to view all remote clusters in this case.
  4. Change the "Add" button text to "Add new remote cluster", to make it clearer that you're adding a new remote cluster, and not somehow adding the one selected in the dropdown.
  5. Make the button flush left to align it with the dropdown and callout, and added an icon.

image

>
<FormattedMessage
id="xpack.crossClusterReplication.forms.viewRemoteClusterButtonLabel"
defaultMessage="View remote clusters"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of prompting the user to view the remote clusters, wouldn't it make more sense to prompt them to add a new one? I think we could also simplify the copy by moving some of the body text into the title.

image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the user does not understand why suddenly the cluster does not exist anymore. This is why I thought to leave him the choice to view his clusters.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha -- but how would the user use the list of existing clusters to figure out why a cluster no longer exists?

@sebelga sebelga requested a review from a team as a code owner January 18, 2019 00:04
@jen-huang
Copy link
Contributor

@cjcenizal I've addressed most of your feedback!

The remote cluster error callout is now displayed between dropdown and Add cluster link. For clusters that are not in a connected state, a link to Edit cluster is provided:
image

Previously, unconnected clusters were not available to select in the dropdown (unless it happens to be the first one in the dropdown). With this change, I think it is safe to allow the user to select them since it gives them a convenient link to edit the cluster. The edit cluster form was also adjusted to accept a redirect value, mimicking the existing behavior of the add cluster form. Both form's Cancel option now takes redirect into account as well.

The issue reported #28874 is now fixed as well, since the new edit cluster flow exposed it pretty badly. I also did some misc. cleanup - unused code, making forms equal width, etc.

@jen-huang jen-huang force-pushed the feature/ccr_allow_no_cluster_forms branch from 3ebf1db to e3c20a5 Compare January 18, 2019 20:55
Copy link
Contributor

@snide snide left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked over the sass releated bits. LGTM

@jen-huang
Copy link
Contributor

@cjcenizal This is ready for another pass with the edit functionality! For editing, advanced settings will always be shown and there is no toggle button:

image

I have also addressed most of your feedback from #28600.

Copy link
Contributor

@cjcenizal cjcenizal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a couple lingering console.log calls, had a couple other comments, and I did find one UX issue which we could address separately if you want.

When the remote cluster doesn't exist, it's really tricky to spot the error field because only the label is read. What do you think of rendering the select, but in a disabled state, with either no option selected or a placeholder option that says "No remote cluster selected"?

image

};

export const getRemoteClusterName = (remoteClusters, selected) => {
console.log(remoteClusters, selected);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leftover console.log.

: {
...getEmptyFollowerIndex(),
...this.props.followerIndex,
};
console.log(isNew, remoteClusterName, followerIndex);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another leftover.

@@ -0,0 +1,144 @@
/*
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I deleted this file in the advanced settings PR, so it shouldn't be needed any more.

@@ -6,3 +6,4 @@

export { API_STATUS } from './api';
export { SECTIONS } from './sections';
export { followerIndexFormSchema } from './form_schemas';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should also not be needed.

});
render() {
const { saveAutoFollowPattern, apiStatus, apiError, autoFollowPattern, intl, match: { url: currentUrl } } = this.props;
console.log(apiStatus, apiError);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another leftover.

}

static getDerivedStateFromProps({ followerIndexId }, { lastFollowerIndexId }) {
if (lastFollowerIndexId !== followerIndexId) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's this used for? If you user updates the URL to be a different ID? If so, could we add a comment to explain the intention?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe this is to fetch follower index data if we don't already have it in the store, i.e. during a page reload on the edit screen. I've updated the comment here and also in the equivalent method of auto follow pattern edit

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes this is when we directly access the page without going first through the list of followers

/* Pause or resume follower index */
{
render: ({ name, shards }) => {
const isPaused = !shards || !shards.length;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this status is something we should calculate during deserialization? That way our logic for defining the index status lives in one place.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this will be removed once the new list api is integrated! (that will give us a separate status field natively)

@elasticmachine

This comment has been minimized.

@jen-huang
Copy link
Contributor

Thanks for the re-review @cjcenizal! I like the suggestion of having a disabled select for no remote clusters. It also simplifies the rendering logic. Updated UI:

image

@elasticmachine

This comment has been minimized.

@elasticmachine

This comment has been minimized.

@elasticmachine
Copy link
Contributor

💔 Build Failed

@jen-huang
Copy link
Contributor

@cjcenizal I implemented the changes we discussed. I had to change EuiSuperSelect to EuiSelect in order to present the red underline. EuiSuperSelect doesn't appear to know about isInvalid 😦

Note that the disabled state for editing remote cluster also doesn't have red underline styling, but I changed the callouts in those case to red as well to represent a fatal state.

No remote clusters:

image

image

Editable unconnected cluster:

image

image

Not found cluster:

image

image

Uneditable unconnected cluster:

image

image

@cjcenizal
Copy link
Contributor

👏 Nice!!!! That looks so good. Great work identifying all of the various states this crazy field can get into... I can't believe there are so many. I filed an EUI issue for the missing isInvalid state on the super select (elastic/eui#1460).

Copy link
Contributor

@cjcenizal cjcenizal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👌

@elasticmachine
Copy link
Contributor

💔 Build Failed

@elasticmachine
Copy link
Contributor

💚 Build Succeeded

@elasticmachine
Copy link
Contributor

💔 Build Failed

@jen-huang
Copy link
Contributor

retest

@elasticmachine
Copy link
Contributor

💚 Build Succeeded

@jen-huang jen-huang merged commit 4175a3b into elastic:feature/ccr Jan 22, 2019
@sebelga sebelga deleted the feature/ccr_allow_no_cluster_forms branch January 24, 2019 09:54
jen-huang added a commit to jen-huang/kibana that referenced this pull request Feb 5, 2019
* [CCR] Refactor redux for Auto-follow pattern detail panel (elastic#27491)

* [CCR] Refactor redux for Auto-follow pattern detail panel

* [CCR] Small refactor

* [CCR] Change to present tense

* [CCR] Display auto-follow pattern name even if it does not exist

* [CCR] Use href to edit auto-follow pattern + remove middelware to update "pattern" query params

* [CCR] Fix navigation back bug + set 2 ids for detail and edit an auto-follow pattern

* [CCR] Replace api middleware with redux-thunk action

* [CCR] Show detail footer close button even when cluster is not valid

* [CCR] Add endpoints for fetching and creating follower indices (elastic#27646)

* Add GET /follower_indices endpoint with deserialization logic and tests.

* Add POST /follower_indices endpoint with serialization logic and tests.

* [CCR]  Add unit tests for RemoteClusterForm, RemoteClusterList, and RemoteClusterTable (elastic#27647)

* Use componentDidUpdate instead of getDerivedStateFromProps.

* Add unit tests for RemoteClusterForm, RemoteClusterList, and RemoteClusterTable.

* Add jest mock for eui `makeId()` utility and get deterministic aria IDs for snapshots

* Update snapshot for Remote Cluster list test

* [CCR] Follower indices table and detail panel (elastic#27804)

* Store for follower indices

* Initial work for follower indices table and detail panel

* Fix load auto-follow stats load as middleware was removed

* [CCR] Create follower index UI form (elastic#27864)

* Initial setup Follower Index form

* Working form without client validation

* Add client side validation for follower index

* Add client validation to check if index already exist

* Improve error message when leader index does not exist

* Remove update method for follower index

* Clear api error on field change

* Fix i18n error

* Update snapshots

* [CCR] Add pause, resume, and unfollow actions for follower indices (elastic#28305)

* Add pause and resume follower index routes

* Add unfollow route

* Add api methods for new routes

* Adjust routes to have bulk capabilities, add corresponding actions

* Refresh list after pausing/resuming, remove items after unfollowing

* First pass at UI for pause and unfollow (and resume, but that is not visible due to ES stats response)

* Handle additional conditions needed for unfollowing leader index, add placeholder code to deduce paused status

* PR feedback

* [CCR] Advanced settings UI for follower indices (elastic#28267)

* Add client side validation of advanced settings form
* Move form entry row to separate component
* Add server side serialization for advanced settings
* Ignore advanced settings input when that section is hidden.
  - Cache and restore input when the section is shown again.

* [CCR] Show remote cluster validation in CCR forms, and add edit follower index (elastic#28778)

* [CCR] Advanced settings component

* Remove preview active on toggle settings

* Add client side validation of advanced settings form

* Move form entry row to separate component

* Add title to panel

* Add i18n translation of advanced settings

* Update Follower index form with toggle for advanced settings

* Add server side serialisation for advanced settings

* Make code review changes

* Fix test: mock constant dependency

* Add section to edit follower index

* Show confirm modal before updating follower index

* Add edit icon in table + update server endpoint to pause / resume

* [CCR] Show remote cluster validation in follower index form & auto-follow pattern form

* PR feedback, cleanup form sizes, add redirect to edit remote cluster

* Fix routing, remove unused code, adjust auto follow pattern edit loading error page

* Adjust error messages and make remote cluster not found edit page the same

* Fix functionality as result of merge

* Fix validation, reorder actions, fix tests, and address feedback

* PR feedback and fix validation pt 2

* Adjust remote cluster validation

* Fix i18n

* Fix api error not showing on add follower form

* [CCR]  Integrate new follower index info ES API (elastic#29153)

* Integrate new follower index info ES API

* Collate data from follower stats and info apis when retrieving all followers and single follower
* Add follower settings info to detail panel
* Add paused/active UI state
* Surface follower default settings to UI

* Adjust tests

* Address PR feedback

* Update snapshots

* [CCR] Surface license errors in-app and refine permissions error UI. (elastic#29228)

* Fix camelcasing bug in XPackInfo.
* Silently swallow API error when checking for index name availability.
* Fix typo in followerIndexForm fatal error.
* Add permissions check before allowing user to access the app.

* Refine wording of CCR permission denied page, to specify cluster privileges. (elastic#29533)

* [CCR] Improve form error handling and general UX (elastic#29419)

* Remove unnecessary eslint disable-line

* [CCR] Implement Advanced Settings design feedback (elastic#29543)

* Use EuiSwitch to toggle advanced settings in Create Follower Index form.
* Move 'optional' from each Advanced Setting field to the section heading.
* Change Advanced Settings switch label and description to emphasize that you can customize them or use the defaults.
* Prepopulate Advanced Settings fields with default values.
* When editing a follower index, check if advanced settings have been edited and open them if so.
* Add 'Reset to default' button below advanced settings fields if their values are different than the default.
* Remove 'Default' copy from Advanced Settings descriptions.
* Simplify toggleAdvancedSettings function, add comments, and fix React console error.

* [CCR] Follower index list fixes from design feedback (elastic#29484)

* Delete remote cluster settings before updating

* Fix detail panel z-index

* Remove default descriptor from follower index detail panel setting values

* Follower index confirm action copy adjustments

* Change z-index styling to use EUI vars

* [CCR] Improve remote clusters test coverage (elastic#29487)

* Add Jest test for RemoteClusterForm validation state.
* Extract validation functions out of RemoteClusterForm and add unit tests.
  - Return null instead of undefined from validators.
* Add unit tests for different types of remote clusters in RemoteClusterTable.
* Add unit test for RemoteClusterList empty prompt.
* Add tests verifying behavior for row link, row delete button, and detail panel delete button.
  - Use getRouterLinkProps to assign onClick and href to edit buttons in row and detail panel.

* [CCR] Adjust spacing around descriptions in list views, link to transport port docs, etc (elastic#29789)

* Adjust spacing around description around descriptions in list views so that it's even on top and bottom.
* Add link to transport port docs from Remote Cluster form.
* Move 'View in Index Management' link from the detail panel body into the footer.

* Re-order follower index form sections: remote cluster, leader index, follower index. (elastic#29885)

* Fix deep-linking to follower index after creating/updating it. (elastic#29865)

* [CCR] Copy edits (elastic#29676)

* Use 'Resume/pause data replication' in context menu and row actions.
* Update copy of 'Update' confirm modal for a paused follower index.
* Update copy of 'Update' confirm modal for an active follower index.
* Update copy of 'Pause data replication' confirm modal.
* Update copy of 'Resume data replication' confirm modal.
* Update copy for permissions check.
* Update copy of table empty state.
* Update copy around tables.
* Update form copy.
* Update copy for RemoteClustersFormField callouts.
* Convert 'data replication' -> 'replication'.
* Update copy for Unfollow confirm modal.
* Update copy for form API error and Auto-follow Patterns table.
* Update form save button labels to be 'Create' and 'Update'.
* Move API errors to bottom of form, into same position as sync validation errors. Remove spacer from SectionError implementation.

* [CCR] Open index after unfollowing leader (elastic#29887)

* Open index after unfollowing leader, fix some variable names

* Fix typo

* Add comment

* [CCR] IE and Screen reader accesibility (elastic#29731)

* Fix api endpoit for auto-follow stats

* Prevent letter wrapping in IE for the Remote cluster "connection" table column

* Move inline style to CSS class to fix IE flex bug

* [CCR] Add callout to paused follower index detail panel (elastic#30013)

* Add callout to paused follower index detail panel

* Update copy

* Skip call to ccr stats api if follower index is paused (elastic#30027)

* [CCR] Add integration tests for follower indices (elastic#30064)

* [CCR] Add integration tests for follower indices

* Import advanced settings value from app constants
jen-huang added a commit that referenced this pull request Feb 5, 2019
* [CCR] Refactor redux for Auto-follow pattern detail panel (#27491)

* [CCR] Refactor redux for Auto-follow pattern detail panel

* [CCR] Small refactor

* [CCR] Change to present tense

* [CCR] Display auto-follow pattern name even if it does not exist

* [CCR] Use href to edit auto-follow pattern + remove middelware to update "pattern" query params

* [CCR] Fix navigation back bug + set 2 ids for detail and edit an auto-follow pattern

* [CCR] Replace api middleware with redux-thunk action

* [CCR] Show detail footer close button even when cluster is not valid

* [CCR] Add endpoints for fetching and creating follower indices (#27646)

* Add GET /follower_indices endpoint with deserialization logic and tests.

* Add POST /follower_indices endpoint with serialization logic and tests.

* [CCR]  Add unit tests for RemoteClusterForm, RemoteClusterList, and RemoteClusterTable (#27647)

* Use componentDidUpdate instead of getDerivedStateFromProps.

* Add unit tests for RemoteClusterForm, RemoteClusterList, and RemoteClusterTable.

* Add jest mock for eui `makeId()` utility and get deterministic aria IDs for snapshots

* Update snapshot for Remote Cluster list test

* [CCR] Follower indices table and detail panel (#27804)

* Store for follower indices

* Initial work for follower indices table and detail panel

* Fix load auto-follow stats load as middleware was removed

* [CCR] Create follower index UI form (#27864)

* Initial setup Follower Index form

* Working form without client validation

* Add client side validation for follower index

* Add client validation to check if index already exist

* Improve error message when leader index does not exist

* Remove update method for follower index

* Clear api error on field change

* Fix i18n error

* Update snapshots

* [CCR] Add pause, resume, and unfollow actions for follower indices (#28305)

* Add pause and resume follower index routes

* Add unfollow route

* Add api methods for new routes

* Adjust routes to have bulk capabilities, add corresponding actions

* Refresh list after pausing/resuming, remove items after unfollowing

* First pass at UI for pause and unfollow (and resume, but that is not visible due to ES stats response)

* Handle additional conditions needed for unfollowing leader index, add placeholder code to deduce paused status

* PR feedback

* [CCR] Advanced settings UI for follower indices (#28267)

* Add client side validation of advanced settings form
* Move form entry row to separate component
* Add server side serialization for advanced settings
* Ignore advanced settings input when that section is hidden.
  - Cache and restore input when the section is shown again.

* [CCR] Show remote cluster validation in CCR forms, and add edit follower index (#28778)

* [CCR] Advanced settings component

* Remove preview active on toggle settings

* Add client side validation of advanced settings form

* Move form entry row to separate component

* Add title to panel

* Add i18n translation of advanced settings

* Update Follower index form with toggle for advanced settings

* Add server side serialisation for advanced settings

* Make code review changes

* Fix test: mock constant dependency

* Add section to edit follower index

* Show confirm modal before updating follower index

* Add edit icon in table + update server endpoint to pause / resume

* [CCR] Show remote cluster validation in follower index form & auto-follow pattern form

* PR feedback, cleanup form sizes, add redirect to edit remote cluster

* Fix routing, remove unused code, adjust auto follow pattern edit loading error page

* Adjust error messages and make remote cluster not found edit page the same

* Fix functionality as result of merge

* Fix validation, reorder actions, fix tests, and address feedback

* PR feedback and fix validation pt 2

* Adjust remote cluster validation

* Fix i18n

* Fix api error not showing on add follower form

* [CCR]  Integrate new follower index info ES API (#29153)

* Integrate new follower index info ES API

* Collate data from follower stats and info apis when retrieving all followers and single follower
* Add follower settings info to detail panel
* Add paused/active UI state
* Surface follower default settings to UI

* Adjust tests

* Address PR feedback

* Update snapshots

* [CCR] Surface license errors in-app and refine permissions error UI. (#29228)

* Fix camelcasing bug in XPackInfo.
* Silently swallow API error when checking for index name availability.
* Fix typo in followerIndexForm fatal error.
* Add permissions check before allowing user to access the app.

* Refine wording of CCR permission denied page, to specify cluster privileges. (#29533)

* [CCR] Improve form error handling and general UX (#29419)

* Remove unnecessary eslint disable-line

* [CCR] Implement Advanced Settings design feedback (#29543)

* Use EuiSwitch to toggle advanced settings in Create Follower Index form.
* Move 'optional' from each Advanced Setting field to the section heading.
* Change Advanced Settings switch label and description to emphasize that you can customize them or use the defaults.
* Prepopulate Advanced Settings fields with default values.
* When editing a follower index, check if advanced settings have been edited and open them if so.
* Add 'Reset to default' button below advanced settings fields if their values are different than the default.
* Remove 'Default' copy from Advanced Settings descriptions.
* Simplify toggleAdvancedSettings function, add comments, and fix React console error.

* [CCR] Follower index list fixes from design feedback (#29484)

* Delete remote cluster settings before updating

* Fix detail panel z-index

* Remove default descriptor from follower index detail panel setting values

* Follower index confirm action copy adjustments

* Change z-index styling to use EUI vars

* [CCR] Improve remote clusters test coverage (#29487)

* Add Jest test for RemoteClusterForm validation state.
* Extract validation functions out of RemoteClusterForm and add unit tests.
  - Return null instead of undefined from validators.
* Add unit tests for different types of remote clusters in RemoteClusterTable.
* Add unit test for RemoteClusterList empty prompt.
* Add tests verifying behavior for row link, row delete button, and detail panel delete button.
  - Use getRouterLinkProps to assign onClick and href to edit buttons in row and detail panel.

* [CCR] Adjust spacing around descriptions in list views, link to transport port docs, etc (#29789)

* Adjust spacing around description around descriptions in list views so that it's even on top and bottom.
* Add link to transport port docs from Remote Cluster form.
* Move 'View in Index Management' link from the detail panel body into the footer.

* Re-order follower index form sections: remote cluster, leader index, follower index. (#29885)

* Fix deep-linking to follower index after creating/updating it. (#29865)

* [CCR] Copy edits (#29676)

* Use 'Resume/pause data replication' in context menu and row actions.
* Update copy of 'Update' confirm modal for a paused follower index.
* Update copy of 'Update' confirm modal for an active follower index.
* Update copy of 'Pause data replication' confirm modal.
* Update copy of 'Resume data replication' confirm modal.
* Update copy for permissions check.
* Update copy of table empty state.
* Update copy around tables.
* Update form copy.
* Update copy for RemoteClustersFormField callouts.
* Convert 'data replication' -> 'replication'.
* Update copy for Unfollow confirm modal.
* Update copy for form API error and Auto-follow Patterns table.
* Update form save button labels to be 'Create' and 'Update'.
* Move API errors to bottom of form, into same position as sync validation errors. Remove spacer from SectionError implementation.

* [CCR] Open index after unfollowing leader (#29887)

* Open index after unfollowing leader, fix some variable names

* Fix typo

* Add comment

* [CCR] IE and Screen reader accesibility (#29731)

* Fix api endpoit for auto-follow stats

* Prevent letter wrapping in IE for the Remote cluster "connection" table column

* Move inline style to CSS class to fix IE flex bug

* [CCR] Add callout to paused follower index detail panel (#30013)

* Add callout to paused follower index detail panel

* Update copy

* Skip call to ccr stats api if follower index is paused (#30027)

* [CCR] Add integration tests for follower indices (#30064)

* [CCR] Add integration tests for follower indices

* Import advanced settings value from app constants
jen-huang added a commit that referenced this pull request Feb 6, 2019
* [CCR] Follower index CRUD (#27936)

* [CCR] Refactor redux for Auto-follow pattern detail panel (#27491)

* [CCR] Refactor redux for Auto-follow pattern detail panel

* [CCR] Small refactor

* [CCR] Change to present tense

* [CCR] Display auto-follow pattern name even if it does not exist

* [CCR] Use href to edit auto-follow pattern + remove middelware to update "pattern" query params

* [CCR] Fix navigation back bug + set 2 ids for detail and edit an auto-follow pattern

* [CCR] Replace api middleware with redux-thunk action

* [CCR] Show detail footer close button even when cluster is not valid

* [CCR] Add endpoints for fetching and creating follower indices (#27646)

* Add GET /follower_indices endpoint with deserialization logic and tests.

* Add POST /follower_indices endpoint with serialization logic and tests.

* [CCR]  Add unit tests for RemoteClusterForm, RemoteClusterList, and RemoteClusterTable (#27647)

* Use componentDidUpdate instead of getDerivedStateFromProps.

* Add unit tests for RemoteClusterForm, RemoteClusterList, and RemoteClusterTable.

* Add jest mock for eui `makeId()` utility and get deterministic aria IDs for snapshots

* Update snapshot for Remote Cluster list test

* [CCR] Follower indices table and detail panel (#27804)

* Store for follower indices

* Initial work for follower indices table and detail panel

* Fix load auto-follow stats load as middleware was removed

* [CCR] Create follower index UI form (#27864)

* Initial setup Follower Index form

* Working form without client validation

* Add client side validation for follower index

* Add client validation to check if index already exist

* Improve error message when leader index does not exist

* Remove update method for follower index

* Clear api error on field change

* Fix i18n error

* Update snapshots

* [CCR] Add pause, resume, and unfollow actions for follower indices (#28305)

* Add pause and resume follower index routes

* Add unfollow route

* Add api methods for new routes

* Adjust routes to have bulk capabilities, add corresponding actions

* Refresh list after pausing/resuming, remove items after unfollowing

* First pass at UI for pause and unfollow (and resume, but that is not visible due to ES stats response)

* Handle additional conditions needed for unfollowing leader index, add placeholder code to deduce paused status

* PR feedback

* [CCR] Advanced settings UI for follower indices (#28267)

* Add client side validation of advanced settings form
* Move form entry row to separate component
* Add server side serialization for advanced settings
* Ignore advanced settings input when that section is hidden.
  - Cache and restore input when the section is shown again.

* [CCR] Show remote cluster validation in CCR forms, and add edit follower index (#28778)

* [CCR] Advanced settings component

* Remove preview active on toggle settings

* Add client side validation of advanced settings form

* Move form entry row to separate component

* Add title to panel

* Add i18n translation of advanced settings

* Update Follower index form with toggle for advanced settings

* Add server side serialisation for advanced settings

* Make code review changes

* Fix test: mock constant dependency

* Add section to edit follower index

* Show confirm modal before updating follower index

* Add edit icon in table + update server endpoint to pause / resume

* [CCR] Show remote cluster validation in follower index form & auto-follow pattern form

* PR feedback, cleanup form sizes, add redirect to edit remote cluster

* Fix routing, remove unused code, adjust auto follow pattern edit loading error page

* Adjust error messages and make remote cluster not found edit page the same

* Fix functionality as result of merge

* Fix validation, reorder actions, fix tests, and address feedback

* PR feedback and fix validation pt 2

* Adjust remote cluster validation

* Fix i18n

* Fix api error not showing on add follower form

* [CCR]  Integrate new follower index info ES API (#29153)

* Integrate new follower index info ES API

* Collate data from follower stats and info apis when retrieving all followers and single follower
* Add follower settings info to detail panel
* Add paused/active UI state
* Surface follower default settings to UI

* Adjust tests

* Address PR feedback

* Update snapshots

* [CCR] Surface license errors in-app and refine permissions error UI. (#29228)

* Fix camelcasing bug in XPackInfo.
* Silently swallow API error when checking for index name availability.
* Fix typo in followerIndexForm fatal error.
* Add permissions check before allowing user to access the app.

* Refine wording of CCR permission denied page, to specify cluster privileges. (#29533)

* [CCR] Improve form error handling and general UX (#29419)

* Remove unnecessary eslint disable-line

* [CCR] Implement Advanced Settings design feedback (#29543)

* Use EuiSwitch to toggle advanced settings in Create Follower Index form.
* Move 'optional' from each Advanced Setting field to the section heading.
* Change Advanced Settings switch label and description to emphasize that you can customize them or use the defaults.
* Prepopulate Advanced Settings fields with default values.
* When editing a follower index, check if advanced settings have been edited and open them if so.
* Add 'Reset to default' button below advanced settings fields if their values are different than the default.
* Remove 'Default' copy from Advanced Settings descriptions.
* Simplify toggleAdvancedSettings function, add comments, and fix React console error.

* [CCR] Follower index list fixes from design feedback (#29484)

* Delete remote cluster settings before updating

* Fix detail panel z-index

* Remove default descriptor from follower index detail panel setting values

* Follower index confirm action copy adjustments

* Change z-index styling to use EUI vars

* [CCR] Improve remote clusters test coverage (#29487)

* Add Jest test for RemoteClusterForm validation state.
* Extract validation functions out of RemoteClusterForm and add unit tests.
  - Return null instead of undefined from validators.
* Add unit tests for different types of remote clusters in RemoteClusterTable.
* Add unit test for RemoteClusterList empty prompt.
* Add tests verifying behavior for row link, row delete button, and detail panel delete button.
  - Use getRouterLinkProps to assign onClick and href to edit buttons in row and detail panel.

* [CCR] Adjust spacing around descriptions in list views, link to transport port docs, etc (#29789)

* Adjust spacing around description around descriptions in list views so that it's even on top and bottom.
* Add link to transport port docs from Remote Cluster form.
* Move 'View in Index Management' link from the detail panel body into the footer.

* Re-order follower index form sections: remote cluster, leader index, follower index. (#29885)

* Fix deep-linking to follower index after creating/updating it. (#29865)

* [CCR] Copy edits (#29676)

* Use 'Resume/pause data replication' in context menu and row actions.
* Update copy of 'Update' confirm modal for a paused follower index.
* Update copy of 'Update' confirm modal for an active follower index.
* Update copy of 'Pause data replication' confirm modal.
* Update copy of 'Resume data replication' confirm modal.
* Update copy for permissions check.
* Update copy of table empty state.
* Update copy around tables.
* Update form copy.
* Update copy for RemoteClustersFormField callouts.
* Convert 'data replication' -> 'replication'.
* Update copy for Unfollow confirm modal.
* Update copy for form API error and Auto-follow Patterns table.
* Update form save button labels to be 'Create' and 'Update'.
* Move API errors to bottom of form, into same position as sync validation errors. Remove spacer from SectionError implementation.

* [CCR] Open index after unfollowing leader (#29887)

* Open index after unfollowing leader, fix some variable names

* Fix typo

* Add comment

* [CCR] IE and Screen reader accesibility (#29731)

* Fix api endpoit for auto-follow stats

* Prevent letter wrapping in IE for the Remote cluster "connection" table column

* Move inline style to CSS class to fix IE flex bug

* [CCR] Add callout to paused follower index detail panel (#30013)

* Add callout to paused follower index detail panel

* Update copy

* Skip call to ccr stats api if follower index is paused (#30027)

* [CCR] Add integration tests for follower indices (#30064)

* [CCR] Add integration tests for follower indices

* Import advanced settings value from app constants

* Disable flaky follower indices API integration tests.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature:CCR and Remote Clusters Team:Kibana Management Dev Tools, Index Management, Upgrade Assistant, ILM, Ingest Node Pipelines, and more
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants