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

Observability AI Assistant Tests Deployment Agnostic #205194

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
dad637d
Add ObservabilityAIAssistantApi Client deployment agnostic
arturoliduena Dec 27, 2024
1c77894
Migrating existing conversations.spec.ts test to to deployment-agnost…
arturoliduena Dec 27, 2024
0d9f182
Add CODEOWNERS entry for deployment-agnostic AI Assistant API tests
arturoliduena Dec 27, 2024
57c0ab9
remove duplicated conversations.spec.ts tests between stateful and se…
arturoliduena Dec 27, 2024
0eb1222
Migrating existing connectors.spec.ts test to deployment-agnostic test
arturoliduena Dec 27, 2024
cc9781f
Migrating existing chat.spec.ts test to deployment-agnostic test
arturoliduena Jan 3, 2025
0d2acba
Add unauthorized user role handling and migrate conversations tests t…
arturoliduena Jan 4, 2025
47d906b
Add unauthorized user role handling and migrate connectors tests to d…
arturoliduena Jan 4, 2025
dce28fe
Add security role checks for AI assistant chat API and remove legacy …
arturoliduena Jan 4, 2025
f4d5975
Add complete.spec.ts to AI assistant API integration deployment diagn…
arturoliduena Jan 5, 2025
6514edf
Migrating existing alerts.spec.ts test to deployment-agnostic test
arturoliduena Jan 5, 2025
cd3ecf1
Add skipMKI tag to alerts function deployment-agnostic test
arturoliduena Jan 5, 2025
c105e67
Migrating existing elasticsearch.spec.ts test to deployment-agnostic …
arturoliduena Jan 5, 2025
3a0f3dc
Add skipMKI tag to elasticsearch.spec.ts function deployment-agnostic…
arturoliduena Jan 5, 2025
6026828
Migrating existing public_complete.spec.ts test to deployment-agnosti…
arturoliduena Jan 5, 2025
c672e60
Refactor ai_assistant tests to use viewer role instead of unauthorize…
arturoliduena Jan 7, 2025
1a11519
Migrating existing knowledge_base tests to deployment-agnostic
arturoliduena Jan 8, 2025
459165b
Migrating existing knowledge_base_user_instructions tests to deployme…
arturoliduena Jan 9, 2025
008da3c
Updated skipMKI to failsOnMKI to make it clear that tests are skipped…
arturoliduena Jan 9, 2025
c70aca7
Remove duplicated helper functions and clean up test files
arturoliduena Jan 9, 2025
0009746
[CI] Auto-commit changed files from 'node scripts/lint_ts_projects --…
kibanamachine Jan 9, 2025
5906748
Refactor knowledge_base_user_instructions tests to use interceptPromi…
arturoliduena Jan 10, 2025
d6b0484
delete publicApi from ObservabilityAIAssistantApiProvider
arturoliduena Jan 10, 2025
d2028d2
Update x-pack/test/api_integration/deployment_agnostic/apis/observabi…
arturoliduena Jan 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -1260,7 +1260,7 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql
/x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant
/x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai-assistant
/x-pack/test/functional/es_archives/observability/ai_assistant @elastic/obs-ai-assistant

/x-pack/test/api_integration/deployment_agnostic/apis/observability/ai_assistant @elastic/obs-ai-assistant
Copy link
Member

Choose a reason for hiding this comment

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

Doesn't look related to your change but Github complains about errors in this file

image

Copy link
Member

Choose a reason for hiding this comment

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

It's valid on main which is odd

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.

Thanks for pointing that out, @sorenlouv. I checked, and the file is now valid in this branch as well. It might have been a temporary issue or something resolved during recent changes(I did a rebase recently).

# Infra Obs
## This plugin mostly contains the codebase for the infra services, but also includes some code for the Logs UI app.
## To keep @elastic/obs-ux-logs-team as codeowner of the plugin manifest without requiring a review for all the other code changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,16 @@
import expect from '@kbn/expect';
import { MessageRole, type Message } from '@kbn/observability-ai-assistant-plugin/common';
import { PassThrough } from 'stream';
import { createLlmProxy, LlmProxy } from '../../common/create_llm_proxy';
import { FtrProviderContext } from '../../common/ftr_provider_context';
import { createProxyActionConnector, deleteActionConnector } from '../../common/action_connectors';
import { ForbiddenApiError } from '../../common/config';

export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
import {
LlmProxy,
createLlmProxy,
} from '../../../../../../observability_ai_assistant_api_integration/common/create_llm_proxy';
import { SupertestWithRoleScope } from '../../../../services/role_scoped_supertest';
import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context';

export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) {
const log = getService('log');
const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient');

const CHAT_API_URL = `/internal/observability_ai_assistant/chat`;
const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantApi');

const messages: Message[] = [
{
Expand All @@ -37,37 +36,50 @@ export default function ApiTest({ getService }: FtrProviderContext) {
},
];

describe('/internal/observability_ai_assistant/chat', () => {
describe('/internal/observability_ai_assistant/chat', function () {
// Fails on MKI: https://github.com/elastic/kibana/issues/205581
this.tags(['failsOnMKI']);
let proxy: LlmProxy;

let connectorId: string;

before(async () => {
proxy = await createLlmProxy(log);
connectorId = await createProxyActionConnector({ supertest, log, port: proxy.getPort() });
connectorId = await observabilityAIAssistantAPIClient.createProxyActionConnector({
port: proxy.getPort(),
});
});

after(async () => {
proxy.close();
await deleteActionConnector({ supertest, connectorId, log });
await observabilityAIAssistantAPIClient.deleteActionConnector({
actionId: connectorId,
});
});

it("returns a 4xx if the connector doesn't exist", async () => {
await supertest
.post(CHAT_API_URL)
.set('kbn-xsrf', 'foo')
.send({
name: 'my_api_call',
messages,
connectorId: 'does not exist',
functions: [],
scopes: ['all'],
})
.expect(404);
const { status } = await observabilityAIAssistantAPIClient.editor({
endpoint: 'POST /internal/observability_ai_assistant/chat',
params: {
body: {
name: 'my_api_call',
messages,
connectorId: 'does not exist',
functions: [],
scopes: ['all'],
},
},
});
expect(status).to.be(404);
});

it('returns a streaming response from the server', async () => {
const NUM_RESPONSES = 5;
const roleScopedSupertest = getService('roleScopedSupertest');
const supertestEditorWithCookieCredentials: SupertestWithRoleScope =
await roleScopedSupertest.getSupertestWithRoleScope('editor', {
useCookieHeader: true,
withInternalHeaders: true,
});

await Promise.race([
new Promise((resolve, reject) => {
Expand All @@ -81,9 +93,8 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const receivedChunks: Array<Record<string, any>> = [];

const passThrough = new PassThrough();
supertest
.post(CHAT_API_URL)
.set('kbn-xsrf', 'foo')
supertestEditorWithCookieCredentials
.post('/internal/observability_ai_assistant/chat')
.on('error', reject)
.send({
name: 'my_api_call',
Expand Down Expand Up @@ -136,26 +147,21 @@ export default function ApiTest({ getService }: FtrProviderContext) {
}),
]);
});

describe('security roles and access privileges', () => {
it('should deny access for users without the ai_assistant privilege', async () => {
try {
await observabilityAIAssistantAPIClient.unauthorizedUser({
endpoint: `POST ${CHAT_API_URL}`,
params: {
body: {
name: 'my_api_call',
messages,
connectorId,
functions: [],
scopes: ['all'],
},
const { status } = await observabilityAIAssistantAPIClient.viewer({
endpoint: 'POST /internal/observability_ai_assistant/chat',
params: {
body: {
name: 'my_api_call',
messages,
connectorId,
functions: [],
scopes: ['all'],
},
});
throw new ForbiddenApiError('Expected unauthorizedUser() to throw a 403 Forbidden error');
} catch (e) {
expect(e.status).to.be(403);
}
},
});
expect(status).to.be(403);
});
});
});
Expand Down
Loading
Loading