diff --git a/changes/1590-observers-can-run-query b/changes/1590-observers-can-run-query new file mode 100644 index 0000000000..8d6bb30d68 --- /dev/null +++ b/changes/1590-observers-can-run-query @@ -0,0 +1 @@ +* Fix API call to add query_id so backend can validate observer_can_run when an observer attempts to run as a live query diff --git a/frontend/fleet/entities/queries.js b/frontend/fleet/entities/queries.js index d9236e8594..488dbe68ba 100644 --- a/frontend/fleet/entities/queries.js +++ b/frontend/fleet/entities/queries.js @@ -33,13 +33,13 @@ export default (client) => { .authenticatedGet(client._endpoint(QUERIES)) .then((response) => response.queries); }, - run: ({ query, selected }) => { + run: ({ query, selected, query_id }) => { const { RUN_QUERY } = endpoints; return client .authenticatedPost( client._endpoint(RUN_QUERY), - JSON.stringify({ query, selected }) + JSON.stringify({ query, selected, query_id }) ) .then((response) => { const { campaign } = response; diff --git a/frontend/pages/queries/QueryPage/QueryPage.jsx b/frontend/pages/queries/QueryPage/QueryPage.jsx index cc498151fb..dcd7219534 100644 --- a/frontend/pages/queries/QueryPage/QueryPage.jsx +++ b/frontend/pages/queries/QueryPage/QueryPage.jsx @@ -63,6 +63,7 @@ export class QueryPage extends Component { pathname: PropTypes.string, }), query: queryInterface, + queryId: PropTypes.number, selectedHosts: PropTypes.arrayOf(hostInterface), selectedOsqueryTable: osqueryTableInterface, selectedTargets: PropTypes.arrayOf(targetInterface), @@ -257,6 +258,7 @@ export class QueryPage extends Component { onRunQuery = debounce(() => { const { queryText, targetsCount } = this.state; const { query } = this.props.query; + const query_id = parseInt(this.props.queryId, 10) || null; const sql = queryText || query; const { dispatch, selectedTargets } = this.props; const { error } = validateQuery(sql); @@ -291,7 +293,7 @@ export class QueryPage extends Component { destroyCampaign(); Fleet.queries - .run({ query: sql, selected }) + .run({ query: sql, selected, query_id }) .then((campaignResponse) => { return Fleet.websockets.queries .run(campaignResponse.id) @@ -329,18 +331,12 @@ export class QueryPage extends Component { }); }) .catch((campaignError) => { - if (campaignError === "resource already created") { - dispatch( - renderFlash( - "error", - "A campaign with the provided query text has already been created" - ) - ); + console.log(campaignError); + // TODO Revisit after taking a deeper look at error handling related to the Fleet.entities + // and flash_messages components in light of issues with those in other instances, + // especially as it concerns async errors. - return false; - } - - dispatch(renderFlash("error", campaignError)); + dispatch(push("/500")); return false; }); @@ -867,6 +863,7 @@ const mapStateToProps = (state, ownProps) => { errors, loadingQueries, query, + queryId, selectedOsqueryTable, selectedHosts, selectedTargets,