Skip to content

Commit

Permalink
Merged origin/main into thiago/ET-752
Browse files Browse the repository at this point in the history
  • Loading branch information
thiagodallacqua-hpe committed Oct 8, 2024
2 parents 4909f9f + 9faa0cb commit 49f1ab8
Show file tree
Hide file tree
Showing 16 changed files with 328 additions and 48 deletions.
1 change: 0 additions & 1 deletion e2e_tests/tests/cluster/test_agent_disable.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ def test_disable_agent_experiment_resume() -> None:
assert len(slots) == 1
agent_id = slots[0]["agent_id"]

# Make the experiment preemptible.
exp_ref = noop.create_experiment(sess, [noop.Sleep(100)], config={"max_restarts": 0})
exp.wait_for_experiment_state(
sess,
Expand Down
6 changes: 4 additions & 2 deletions e2e_tests/tests/cluster/utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import copy
import datetime
import http.server
import subprocess
import sys
import threading
import time
from typing import Any, Dict, List, Optional, Tuple, Type
Expand Down Expand Up @@ -179,7 +179,9 @@ def wait_for_task_state(
return
time.sleep(1)

print(subprocess.check_output(["det", "-m", conf.make_master_url(), "task", "logs", task_id]))
print("== begin task logs ==", file=sys.stderr)
print(detproc.check_output(sess, ["det", "task", "logs", task_id]), file=sys.stderr)
print("== end task logs ==", file=sys.stderr)
pytest.fail(f"{task_type} expected {state} state got {gotten_state} instead after {ticks} secs")


Expand Down
2 changes: 2 additions & 0 deletions webui/react/src/components/ModelCreateModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ const ModelCreateModal = ({ onClose, workspaceId }: Props): JSX.Element => {
<Button
block
icon={<Icon decorative name="add" size="tiny" />}
test-id="add-metadata"
type="dashed"
onClick={() => add()}>
Add metadata
Expand Down Expand Up @@ -269,6 +270,7 @@ const ModelCreateModal = ({ onClose, workspaceId }: Props): JSX.Element => {
<Button
block
icon={<Icon decorative name="add" size="tiny" />}
test-id="add-tag"
type="dashed"
onClick={() => add()}>
Add tag
Expand Down
1 change: 1 addition & 0 deletions webui/react/src/components/ModelMoveModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ const ModelMoveModal = ({ model }: Props): JSX.Element => {
(option?.label?.toString() ?? '').toLowerCase().includes(input.toLowerCase())
}
filterSort={(a, b) => ((a?.label ?? '') < (b?.label ?? '') ? -1 : 1)}
id="workspace"
options={workspaces
.filter(
(ws) => ws.id !== model.workspaceId && canMoveModel({ destination: { id: ws.id } }),
Expand Down
9 changes: 7 additions & 2 deletions webui/react/src/components/ModelRegistry.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ const ModelRegistry: React.FC<Props> = ({ workspace }: Props) => {
filterIcon: tableSearchIcon,
isFiltered: (settings: Settings) => !!settings.name,
key: V1GetModelsRequestSortBy.NAME,
onCell: onRightClickableCell,
onCell: () => ({ ...onRightClickableCell(), 'data-testid': 'name' }),
render: modelNameRenderer,
sorter: true,
title: 'Name',
Expand Down Expand Up @@ -577,6 +577,7 @@ const ModelRegistry: React.FC<Props> = ({ workspace }: Props) => {
dataIndex: 'archived',
defaultWidth: DEFAULT_COLUMN_WIDTHS['archived'],
key: 'archived',
onCell: () => ({ ...onRightClickableCell(), 'data-testid': 'archived' }),
render: checkmarkRenderer,
title: 'Archived',
},
Expand All @@ -597,6 +598,7 @@ const ModelRegistry: React.FC<Props> = ({ workspace }: Props) => {
defaultWidth: DEFAULT_COLUMN_WIDTHS['action'],
fixed: 'right',
key: 'action',
onCell: () => ({ ...onRightClickableCell(), 'data-testid': 'actions' }),
render: actionRenderer,
title: '',
width: DEFAULT_COLUMN_WIDTHS['action'],
Expand Down Expand Up @@ -704,7 +706,9 @@ const ModelRegistry: React.FC<Props> = ({ workspace }: Props) => {
<FilterCounter activeFilterCount={filterCount} onReset={resetFilters} />
)}
{canCreateModels ? (
<Button onClick={showCreateModelModal}>New Model</Button>
<Button test-id="new-model-button" onClick={showCreateModelModal}>
New Model
</Button>
) : (
<Tooltip content="User lacks permission to create models" placement="leftBottom">
<div>
Expand All @@ -727,6 +731,7 @@ const ModelRegistry: React.FC<Props> = ({ workspace }: Props) => {
</>
}
icon="model"
testId="no-models-registered"
title="No Models Registered"
/>
) : (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Modal } from 'e2e/models/common/hew/Modal';
*/
export class AddUsersToGroupsModal extends Modal {
readonly groups = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="groups"]',
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { Select } from 'e2e/models/common/hew/Select';
*/
export class ChangeUserStatusModal extends Modal {
readonly status = new StatusSelect({
parent: this.body,
parent: this,
selector: '[data-testid="status"]',
});
}
Expand Down
14 changes: 7 additions & 7 deletions webui/react/src/e2e/models/components/CreateUserModal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,31 @@ import { Modal } from 'e2e/models/common/hew/Modal';
*/
export class CreateUserModal extends Modal {
readonly username = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="username"]',
});
readonly displayName = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="displayName"]',
});
readonly adminToggle = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="isAdmin"] button',
});
readonly remoteToggle = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="isRemote"] button',
});
readonly password = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="password"]',
});
readonly confirmPassword = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="confirmPassword"]',
});
readonly roleSelect = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="roles"]',
});
}
41 changes: 41 additions & 0 deletions webui/react/src/e2e/models/components/ModelCreateModal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { BaseComponent } from 'playwright-page-model-base/BaseComponent';

import { Modal } from 'e2e/models/common/hew/Modal';

/**
* Represents the ModelCreateModal component in src/components/ModelCreateModal.tsx
*/
export class ModelCreateModal extends Modal {
readonly name = new BaseComponent({
parent: this,
selector: '[id="modelName"]',
});
readonly description = new BaseComponent({
parent: this,
selector: '[id="modelDescription"]',
});
readonly addMoreDetails = new BaseComponent({
parent: this,
selector: '[class^="Link_base"]',
});
readonly addMetadatButton = new BaseComponent({
parent: this,
selector: '[test-id="add-metadata"]',
});
readonly addTagButton = new BaseComponent({
parent: this,
selector: '[test-id="add-tag"]',
});
readonly metadataKey = new BaseComponent({
parent: this,
selector: '[id="metadata_0_key"]',
});
readonly metadataValue = new BaseComponent({
parent: this,
selector: '[id="metadata_0_value"]',
});
readonly tag = new BaseComponent({
parent: this,
selector: '[id="tags_0"]',
});
}
90 changes: 88 additions & 2 deletions webui/react/src/e2e/models/components/ModelRegistry.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,92 @@
import { BaseComponent } from 'playwright-page-model-base/BaseComponent';
import { BaseReactFragment } from 'playwright-page-model-base/BaseReactFragment';

import { Modal } from 'e2e/models/common/ant/Modal';
import { Notification } from 'e2e/models/common/ant/Notification';
import { DropdownMenu } from 'e2e/models/common/hew/Dropdown';
import { Select } from 'e2e/models/common/hew/Select';
import { Toggle } from 'e2e/models/common/hew/Toggle';
import { ModelCreateModal } from 'e2e/models/components/ModelCreateModal';
import { HeadRow, InteractiveTable, Row } from 'e2e/models/components/Table/InteractiveTable';

class ModelHeadRow extends HeadRow {}
class ModelRow extends Row {
readonly actions = new ModelActionDropdown({
clickThisComponentToOpen: new BaseComponent({
parent: this,
selector: '[data-testid="actions"]',
}),
root: this.root,
});
readonly archived = new BaseComponent({
parent: this,
selector: '[data-testid="archived"]',
});
readonly name = new BaseComponent({
parent: this,
selector: '[data-testid="name"]',
});
readonly archivedIcon = new BaseComponent({
parent: this,
selector: '[aria-label="Checkmark"]',
});
}

/**
* Represents the ModelRegistry component in src/components/ModelRegistry.tsx
* Represents the ModelActionDropdown from src/components/ModelActionDropdown.tsx
*/
class ModelActionDropdown extends DropdownMenu {
readonly delete = this.menuItem('delete-model');
readonly switchArchived = this.menuItem('switch-archived');
readonly move = this.menuItem('move-model');
}

class ModelDeleteModal extends Modal {
readonly deleteButton = new BaseComponent({
parent: this,
selector: '.ant-btn-dangerous',
});
}

class ModelMoveModal extends Modal {
readonly workspaceSelect = new Select({
parent: this,
selector: 'input[id="workspace"]',
});
}

/* Represents the ModelRegistry component in src/components/ModelRegistry.tsx
*/
export class ModelRegistry extends BaseReactFragment {}
export class ModelRegistry extends BaseReactFragment {
readonly showArchived = new Toggle({
parent: this,
});
readonly newModelButton = new BaseComponent({
parent: this,
selector: '[test-id="new-model-button"]',
});
readonly modelCreateModal = new ModelCreateModal({
root: this.root,
});
readonly modelMoveModal = new ModelMoveModal({
root: this.root,
});
readonly table = new InteractiveTable({
parent: this,
tableArgs: {
attachment: '[data-testid="table"]',
headRowType: ModelHeadRow,
rowType: ModelRow,
},
});
readonly notification = new Notification({
parent: this.root,
});
readonly modelDeleteModal = new ModelDeleteModal({
root: this.root,
});
readonly noModelsMessage = new BaseComponent({
parent: this,
selector: '[data-testid="no-models-registered"]',
});
}
2 changes: 1 addition & 1 deletion webui/react/src/e2e/models/components/SetUserRolesModal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Modal } from 'e2e/models/common/hew/Modal';
*/
export class SetUserRolesModal extends Modal {
readonly roles = new BaseComponent({
parent: this.body,
parent: this,
selector: '[data-testid="roles"]',
});
}
18 changes: 9 additions & 9 deletions webui/react/src/e2e/models/components/WorkspaceCreateModal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,43 @@ import { Toggle } from 'e2e/models/common/hew/Toggle';
*/
export class WorkspaceCreateModal extends Modal {
readonly workspaceName = new BaseComponent({
parent: this.body,
parent: this,
selector: 'input[id="workspaceName"]',
});

readonly useAgentUser = new Toggle({
parent: this.body,
parent: this,
selector: '[data-testid="useAgentUser"]',
});
readonly agentUid = new BaseComponent({
parent: this.body,
parent: this,
selector: 'input[id="agentUid"]',
});
readonly agentUser = new BaseComponent({
parent: this.body,
parent: this,
selector: 'input[id="agentUser"]',
});

readonly useAgentGroup = new Toggle({
parent: this.body,
parent: this,
selector: '[data-testid="useAgentGroup"]',
});
readonly agentGid = new BaseComponent({
parent: this.body,
parent: this,
selector: 'input[id="agentGid"]',
});
readonly agentGroup = new BaseComponent({
parent: this.body,
parent: this,
selector: 'input[id="agentGroup"]',
});

readonly useCheckpointStorage = new Toggle({
parent: this.body,
parent: this,
selector: '[data-testid="useCheckpointStorage"]',
});
// We need more work on this to handle input well most likely since the code editor is complex
readonly checkpointCodeEditor = new BaseComponent({
parent: this.body,
parent: this,
selector: 'div.cm-editor',
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Modal } from 'e2e/models/common/hew/Modal';
*/
export class WorkspaceDeleteModal extends Modal {
readonly nameConfirmation = new BaseComponent({
parent: this.body,
parent: this,
selector: 'input[id="workspaceName"]',
});
}
Loading

0 comments on commit 49f1ab8

Please sign in to comment.