Skip to content

Commit 3672760

Browse files
Merge branch 'master' into Overview
2 parents 264d42c + c6dae7c commit 3672760

File tree

38 files changed

+905
-295
lines changed

38 files changed

+905
-295
lines changed

.github/workflows/pr-comments.yml

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
name: PR Comments
22

33
on:
4-
pull_request:
4+
pull_request_target:
55
branches:
66
- master
77

88
permissions:
9-
contents: write
10-
checks: write
119
pull-requests: write
1210

1311
jobs:
@@ -67,7 +65,7 @@ jobs:
6765
remove-link-from-badge: true
6866
default-branch: master
6967

70-
ut-files-comment:
68+
python-ut-files-comment:
7169
runs-on: ubuntu-22.04
7270
steps:
7371
- name: Checkout code

apps/beeswax/src/beeswax/common.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def compute_check(x):
125125
# Pick the most probable compute object
126126
selected_compute = (cluster if compute_check(cluster)
127127
else compute if compute_check(compute)
128-
else connector if compute_check(connector) else None)
128+
else connector if compute_check(connector) else cluster)
129129

130130
# If found, we will attempt to reload it, first by id then by name
131131
if selected_compute:
@@ -134,8 +134,11 @@ def compute_check(x):
134134
if c:
135135
return c.to_dict()
136136

137-
if selected_compute.get('name'):
138-
c = Compute.objects.filter(name=selected_compute['name']).first()
137+
# Compute name is sometimes passed in the type and dialect fields.
138+
# So, we will attempt to load compute using name, type and dialect as name.
139+
compute_name = selected_compute.get('name', selected_compute.get('type', selected_compute.get('dialect')))
140+
if compute_name:
141+
c = Compute.objects.filter(name=compute_name).first()
139142
if c:
140143
return c.to_dict()
141144

apps/filebrowser/src/filebrowser/api.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def get_all_filesystems(request):
165165
user_home_dir = fs_home_dir_mapping[fs](request.user)
166166
config = _get_config(fs, request)
167167

168-
filesystems.append({'file_system': fs, 'user_home_directory': user_home_dir, 'config': config})
168+
filesystems.append({'name': fs, 'user_home_directory': user_home_dir, 'config': config})
169169

170170
return JsonResponse(filesystems, safe=False)
171171

apps/filebrowser/src/filebrowser/api_test.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -748,8 +748,8 @@ def test_get_all_filesystems_without_hdfs(self):
748748

749749
assert response.status_code == 200
750750
assert response_data == [
751-
{'file_system': 's3a', 'user_home_directory': 's3a://test-bucket/test-user-home-dir/', 'config': {}},
752-
{'file_system': 'ofs', 'user_home_directory': 'ofs://', 'config': {}},
751+
{'name': 's3a', 'user_home_directory': 's3a://test-bucket/test-user-home-dir/', 'config': {}},
752+
{'name': 'ofs', 'user_home_directory': 'ofs://', 'config': {}},
753753
]
754754

755755
def test_get_all_filesystems_success(self):
@@ -776,7 +776,7 @@ def test_get_all_filesystems_success(self):
776776
assert response.status_code == 200
777777
assert response_data == [
778778
{
779-
'file_system': 'hdfs',
779+
'name': 'hdfs',
780780
'user_home_directory': '/user/test-user',
781781
'config': {
782782
'is_trash_enabled': False,
@@ -787,8 +787,8 @@ def test_get_all_filesystems_success(self):
787787
'supergroup': 'test-supergroup',
788788
},
789789
},
790-
{'file_system': 's3a', 'user_home_directory': 's3a://test-bucket/test-user-home-dir/', 'config': {}},
791-
{'file_system': 'ofs', 'user_home_directory': 'ofs://', 'config': {}},
790+
{'name': 's3a', 'user_home_directory': 's3a://test-bucket/test-user-home-dir/', 'config': {}},
791+
{'name': 'ofs', 'user_home_directory': 'ofs://', 'config': {}},
792792
]
793793

794794

desktop/core/base_requirements.txt

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,28 @@ avro-python3==1.8.2
55
Babel==2.9.1
66
celery[redis]==5.4.0
77
cffi==1.15.0
8-
channels==3.0.3
9-
channels-redis==3.2.0
8+
channels==4.0.0
9+
channels-redis==4.0.0
1010
configobj==5.0.9
1111
cx-Oracle==8.3.0
1212
django-auth-ldap==4.3.0
13-
Django==3.2.25
13+
Django==4.1.13
1414
daphne==3.0.2
1515
django-redis==5.4.0
1616
django-celery-beat==2.6.0
1717
django-celery-results==2.5.1
18-
django-cors-headers==3.7.0
18+
django-cors-headers==3.13.0
1919
django-crequest==2018.5.11
2020
django-debug-panel==0.8.3
21-
django-debug-toolbar==1.11.1
22-
django-extensions==3.1.3
21+
django-debug-toolbar==3.6.0
22+
django-extensions==3.2.1
2323
django-ipware==3.0.2
2424
django_opentracing==1.1.0
2525
django_prometheus==1.0.15
2626
django-webpack-loader==1.0.0
2727
djangomako==1.3.2
28-
djangorestframework-simplejwt==5.2.0
29-
djangorestframework==3.12.2
28+
djangorestframework-simplejwt==5.2.1
29+
djangorestframework==3.14.0
3030
future==0.18.3
3131
gcs-oauth2-boto-plugin==3.0
3232
greenlet==3.1.1

desktop/core/ext-py3/django-babel/.travis.yml

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ env:
1717
- TOX_ENV=py35-django30
1818
- TOX_ENV=py35-django31
1919
- TOX_ENV=py35-django32
20+
- TOX_ENV=py38-django41
2021
matrix:
2122
include:
2223
- env: TOX_ENV=py36-django18
@@ -35,6 +36,8 @@ matrix:
3536
python: "3.6"
3637
- env: TOX_ENV=py36-django32
3738
python: "3.6"
39+
- env: TOX_ENV=py38-django41
40+
python: "3.8"
3841
- env: TOX_ENV=py36-djangomaster
3942
python: "3.6"
4043
install: pip install tox

desktop/core/ext-py3/django-babel/setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def read(*parts):
2424
url='https://github.com/python-babel/django-babel/',
2525
packages=find_packages(exclude=('tests',)),
2626
install_requires=[
27-
'django>=1.8,<3.3',
27+
'django>=1.8,<4.2',
2828
'babel>=1.3',
2929
],
3030
classifiers=[

desktop/core/ext-py3/django-babel/tox.ini

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tox]
22
envlist = py{27,34,35,36}-django{18,111},
3-
py{35,36,37}-django{20,21,22,30,31,32},
3+
py{35,36,37,38}-django{20,21,22,30,31,32,41},
44
py{36,37}-django{master},
55
lint, docs
66

@@ -19,6 +19,7 @@ deps =
1919
django30: Django>=3.0,<3.1
2020
django31: Django>=3.1,<3.2
2121
django32: Django>=3.2,<3.3
22+
django41: Django>=4.1,<4.2
2223
djangomaster: https://github.com/django/django/archive/master.tar.gz#egg=Django
2324
commands = py.test {posargs}
2425

desktop/core/src/desktop/api2.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
from metadata.conf import has_catalog
9494
from notebook.connectors.base import Notebook, get_interpreter
9595
from notebook.management.commands import notebook_setup
96-
from oozie.management.commands import oozie_setup
9796
from pig.management.commands import pig_setup
9897
from search.management.commands import search_setup
9998
from useradmin.models import Group, User
@@ -1450,6 +1449,9 @@ def _setup_pig_examples(request):
14501449

14511450

14521451
def _setup_oozie_examples(request):
1452+
# Import dynamically to avoid oozie INSTALLED_APPS error
1453+
from oozie.management.commands import oozie_setup
1454+
14531455
oozie_setup.Command().handle()
14541456

14551457

desktop/core/src/desktop/conf.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -2649,7 +2649,6 @@ def config_validator(user):
26492649
from desktop.lib import i18n
26502650
from desktop.models import Document, Document2 # Avoid cyclic loop
26512651
from desktop.settings import DOCUMENT2_MAX_ENTRIES # Avoid cyclic loop
2652-
from oozie.models import Job
26532652

26542653
res = []
26552654

@@ -2678,10 +2677,14 @@ def config_validator(user):
26782677
res.append(('SavedQuery_CLEANUP_WARNING', str(_('Saved Query has more than %d entries: %d, '
26792678
'please run "hue desktop_document_cleanup --cm-managed" to remove old entries' % (DOCUMENT2_MAX_ENTRIES, sq_count)))))
26802679

2681-
job_count = Job.objects.count()
2682-
if job_count > DOCUMENT2_MAX_ENTRIES:
2683-
res.append(('OOZIEJOB_CLEANUP_WARNING', str(_('Oozie Job has more than %d entries: %d, '
2684-
'please run "hue desktop_document_cleanup --cm-managed" to remove old entries' % (DOCUMENT2_MAX_ENTRIES, job_count)))))
2680+
# Check if oozie is enabled and present in INSTALLED_APPS
2681+
from desktop.settings import INSTALLED_APPS # Avoid circular import
2682+
if 'oozie' in INSTALLED_APPS:
2683+
from oozie.models import Job
2684+
job_count = Job.objects.count()
2685+
if job_count > DOCUMENT2_MAX_ENTRIES:
2686+
res.append(('OOZIEJOB_CLEANUP_WARNING', str(_('Oozie Job has more than %d entries: %d, '
2687+
'please run "hue desktop_document_cleanup --cm-managed" to remove old entries' % (DOCUMENT2_MAX_ENTRIES, job_count)))))
26852688

26862689
if not get_secret_key():
26872690
res.append((SECRET_KEY, str(_("Secret key should be configured as a random string. All sessions will be lost on restart"))))

desktop/core/src/desktop/js/apps/admin/ServerLogs/ServerLogsTab.scss

+9-4
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,16 @@
3232
background-color: $fluidx-white;
3333
margin: 0;
3434
padding: 2px;
35-
}
36-
}
35+
white-space: nowrap;
36+
font-family: 'Roboto Mono', monospace;
37+
font-size: 12px;
3738

38-
.server_wrap {
39-
white-space: nowrap;
39+
&--wrap {
40+
word-break: break-all;
41+
word-wrap: break-word;
42+
white-space: pre-wrap;
43+
}
44+
}
4045
}
4146

4247
.server__no-logs-found {

desktop/core/src/desktop/js/apps/admin/ServerLogs/ServerLogsTab.test.tsx

+6-5
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ import useLoadData from '../../../utils/hooks/useLoadData/useLoadData';
2424

2525
const mockData = jest.fn().mockReturnValue({
2626
logs: ['Log entry 1', 'Log entry 2'],
27-
hue_hostname: 'test-hostname'
27+
hueHostname: 'test-hostname'
2828
});
2929

3030
const emptyMockData = jest.fn().mockReturnValue({
3131
logs: [],
32-
hue_hostname: 'test-hostname'
32+
hueHostname: 'test-hostname'
3333
});
3434

3535
jest.mock('../../../utils/hooks/useLoadData/useLoadData');
@@ -94,10 +94,11 @@ describe('ServerLogs Component', () => {
9494

9595
render(<ServerLogs />);
9696

97-
expect(screen.getByText('Log entry 1')).toHaveClass('server_wrap');
97+
expect(screen.getByLabelText('Wrap logs')).toBeChecked();
98+
expect(screen.getByText('Log entry 1')).toHaveClass('server__log-line--wrap');
9899

99100
fireEvent.click(screen.getByLabelText('Wrap logs'));
100-
101-
expect(screen.getByText('Log entry 1')).not.toHaveClass('server_wrap');
101+
expect(screen.getByLabelText('Wrap logs')).not.toBeChecked();
102+
expect(screen.getByText('Log entry 1')).not.toHaveClass('server__log-line--wrap');
102103
});
103104
});

desktop/core/src/desktop/js/apps/admin/ServerLogs/ServerLogsTab.tsx

+25-32
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,25 @@
1515
// limitations under the License.
1616

1717
import React, { useState } from 'react';
18-
import { Spin, Alert } from 'antd';
18+
import { Alert } from 'antd';
1919
import ServerLogsHeader from './ServerLogsHeader';
2020
import { i18nReact } from '../../../utils/i18nReact';
2121
import useLoadData from '../../../utils/hooks/useLoadData/useLoadData';
22+
import LoadingErrorWrapper from '../../../reactComponents/LoadingErrorWrapper/LoadingErrorWrapper';
2223
import HighlightText from '../Components/HighlightText';
2324
import { SERVER_LOGS_API_URL } from '../Components/utils';
2425
import './ServerLogsTab.scss';
2526

2627
interface ServerLogsData {
2728
logs: string[];
28-
hue_hostname: string;
29+
hueHostname: string;
2930
}
3031

3132
const ServerLogs: React.FC = (): JSX.Element => {
3233
const [filter, setFilter] = useState<string>('');
3334
const [wrapLogs, setWrapLogs] = useState(true);
3435
const { t } = i18nReact.useTranslation();
35-
const {
36-
data: logsData,
37-
loading,
38-
error
39-
} = useLoadData<ServerLogsData>(SERVER_LOGS_API_URL, {
36+
const { data, loading, error } = useLoadData<ServerLogsData>(SERVER_LOGS_API_URL, {
4037
params: {
4138
reverse: true
4239
}
@@ -54,35 +51,31 @@ const ServerLogs: React.FC = (): JSX.Element => {
5451
);
5552
}
5653

54+
const isEmptyLogs = !data?.logs || !data?.logs?.some(log => log.length);
55+
5756
return (
5857
<div className="hue-server-logs-component">
59-
<Spin spinning={loading}>
60-
{!loading && (
61-
<>
62-
<ServerLogsHeader
63-
onFilterChange={setFilter}
64-
onWrapLogsChange={setWrapLogs}
65-
hostName={logsData?.hue_hostname ?? ''}
66-
/>
67-
{logsData && (logsData.logs.length === 0 || logsData.logs[0] === '') && (
68-
<pre className="server__no-logs-found">No logs found!</pre>
69-
)}
70-
71-
{logsData && logsData.logs.length > 0 && logsData.logs[0] !== '' && (
72-
<div className="server__display-logs">
73-
{logsData.logs.map((line, index) => (
74-
<div
75-
className={`server__log-line ${wrapLogs ? 'server_wrap' : ''}`}
76-
key={'logs_' + index}
77-
>
78-
<HighlightText text={line} searchValue={filter} />
79-
</div>
80-
))}
58+
<LoadingErrorWrapper loading={loading} errors={[]}>
59+
<ServerLogsHeader
60+
onFilterChange={setFilter}
61+
onWrapLogsChange={setWrapLogs}
62+
hostName={data?.hueHostname ?? ''}
63+
/>
64+
{isEmptyLogs ? (
65+
<pre className="server__no-logs-found">No logs found!</pre>
66+
) : (
67+
<div className="server__display-logs">
68+
{data.logs.map((line, index) => (
69+
<div
70+
className={`server__log-line ${wrapLogs ? 'server__log-line--wrap' : ''}`}
71+
key={'logs_' + index}
72+
>
73+
<HighlightText text={line} searchValue={filter} />
8174
</div>
82-
)}
83-
</>
75+
))}
76+
</div>
8477
)}
85-
</Spin>
78+
</LoadingErrorWrapper>
8679
</div>
8780
);
8881
};

desktop/core/src/desktop/js/apps/storageBrowser/StorageBrowserPage.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ const StorageBrowserPage = (): JSX.Element => {
5555
<Tabs
5656
className="hue-storage-browser__tab"
5757
destroyInactiveTabPane
58-
defaultActiveKey={urlFileSystem ?? data?.[0]?.file_system}
59-
items={data?.map(fs => ({
60-
label: fs.file_system.toUpperCase(),
61-
key: fs.file_system,
62-
children: <StorageBrowserTab fileSystem={fs} />
58+
defaultActiveKey={urlFileSystem ?? data?.[0]?.name}
59+
items={data?.map(fileSystem => ({
60+
label: fileSystem.name.toUpperCase(),
61+
key: fileSystem.name,
62+
children: <StorageBrowserTab fileSystem={fileSystem} />
6363
}))}
6464
/>
6565
</LoadingErrorWrapper>

0 commit comments

Comments
 (0)