Skip to content

Commit 51e070c

Browse files
committed
Adds support for CRUD operations on VolumeGroupSnapshot
This commit adds support for CRUD operations on VolumeGroupSnapshotClass, VolumeGroupSnapshotContent Signed-off-by: vbadrina <[email protected]>
1 parent 2689ddf commit 51e070c

File tree

14 files changed

+1363
-143
lines changed

14 files changed

+1363
-143
lines changed

frontend/packages/console-app/console-extensions.json

Lines changed: 508 additions & 139 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import * as React from 'react';
2+
import { useTranslation } from 'react-i18next';
3+
import { ResourceEventStream } from '@console/internal/components/events';
4+
import { DetailsPage, DetailsPageProps } from '@console/internal/components/factory';
5+
import {
6+
SectionHeading,
7+
ResourceSummary,
8+
navFactory,
9+
Kebab,
10+
} from '@console/internal/components/utils';
11+
import { VolumeGroupSnapshotClassKind } from '@console/internal/module/k8s';
12+
13+
const { editYaml, events } = navFactory;
14+
15+
const Details: React.FC<DetailsProps> = ({ obj }) => {
16+
const { t } = useTranslation();
17+
return (
18+
<div className="co-m-pane__body">
19+
<SectionHeading text={t('console-app~VolumeGroupSnapshotClass details')} />
20+
<div className="row">
21+
<div className="col-md-6 col-xs-12">
22+
<ResourceSummary resource={obj}>
23+
<dt>{t('console-app~Driver')}</dt>
24+
<dd>{obj?.driver}</dd>
25+
<dt>{t('console-app~Deletion policy')}</dt>
26+
<dd>{obj?.deletionPolicy}</dd>
27+
</ResourceSummary>
28+
</div>
29+
</div>
30+
</div>
31+
);
32+
};
33+
34+
const VolumeGroupSnapshotClassDetailsPage: React.FC<DetailsPageProps> = (props) => {
35+
const pages = [
36+
{
37+
href: '',
38+
// t('console-app~Details')
39+
nameKey: 'console-app~Details',
40+
component: Details,
41+
},
42+
editYaml(),
43+
events(ResourceEventStream),
44+
];
45+
return <DetailsPage {...props} menuActions={Kebab.factory.common} pages={pages} />;
46+
};
47+
48+
type DetailsProps = {
49+
obj: VolumeGroupSnapshotClassKind;
50+
};
51+
52+
export default VolumeGroupSnapshotClassDetailsPage;
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import * as React from 'react';
2+
import { sortable } from '@patternfly/react-table';
3+
import * as classNames from 'classnames';
4+
import { useTranslation } from 'react-i18next';
5+
import {
6+
ListPageBody,
7+
useListPageFilter,
8+
ListPageCreate,
9+
ListPageFilter,
10+
ListPageHeader,
11+
VirtualizedTable,
12+
TableColumn,
13+
RowProps,
14+
} from '@console/dynamic-plugin-sdk/src/lib-core';
15+
import { TableData } from '@console/internal/components/factory';
16+
import { useActiveColumns } from '@console/internal/components/factory/Table/active-columns-hook';
17+
import { Kebab, ResourceKebab, ResourceLink } from '@console/internal/components/utils';
18+
import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';
19+
import { VolumeGroupSnapshotClassModel } from '@console/internal/models';
20+
import {
21+
referenceForModel,
22+
VolumeGroupSnapshotClassKind,
23+
Selector,
24+
} from '@console/internal/module/k8s';
25+
import { getAnnotations } from '@console/shared';
26+
27+
const tableColumnInfo = [
28+
{ id: 'name' },
29+
{ className: classNames('pf-m-hidden', 'pf-m-visible-on-md'), id: 'driver' },
30+
{ className: classNames('pf-m-hidden', 'pf-m-visible-on-md'), id: 'deletionPolicy' },
31+
{ className: Kebab.columnClass, id: '' },
32+
];
33+
34+
const defaultSnapshotClassAnnotation: string = 'snapshot.storage.kubernetes.io/is-default-class';
35+
export const isDefaultSnapshotClass = (VolumeGroupSnapshotClass: VolumeGroupSnapshotClassKind) =>
36+
getAnnotations(VolumeGroupSnapshotClass, { defaultSnapshotClassAnnotation: 'false' })[
37+
defaultSnapshotClassAnnotation
38+
] === 'true';
39+
40+
const Row: React.FC<RowProps<VolumeGroupSnapshotClassKind>> = ({ obj }) => {
41+
const { name } = obj?.metadata || {};
42+
const { deletionPolicy, driver } = obj || {};
43+
44+
return (
45+
<>
46+
<TableData {...tableColumnInfo[0]}>
47+
<ResourceLink name={name} kind={referenceForModel(VolumeGroupSnapshotClassModel)}>
48+
{isDefaultSnapshotClass(obj) && (
49+
<span className="small text-muted co-resource-item__help-text">&ndash; Default</span>
50+
)}
51+
</ResourceLink>
52+
</TableData>
53+
<TableData {...tableColumnInfo[1]}>{driver}</TableData>
54+
<TableData {...tableColumnInfo[2]}>{deletionPolicy}</TableData>
55+
<TableData {...tableColumnInfo[3]}>
56+
<ResourceKebab
57+
kind={referenceForModel(VolumeGroupSnapshotClassModel)}
58+
resource={obj}
59+
actions={Kebab.factory.common}
60+
/>
61+
</TableData>
62+
</>
63+
);
64+
};
65+
66+
const VolumeGroupSnapshotClassTable: React.FC<VolumeGroupSnapshotClassTableProps> = (props) => {
67+
const { t } = useTranslation();
68+
const getTableColumns = (): TableColumn<VolumeGroupSnapshotClassKind>[] => [
69+
{
70+
title: t('console-app~Name'),
71+
sort: 'metadata.name',
72+
transforms: [sortable],
73+
id: tableColumnInfo[0].id,
74+
},
75+
{
76+
title: t('console-app~Driver'),
77+
sort: 'driver',
78+
transforms: [sortable],
79+
props: { className: tableColumnInfo[1].className },
80+
id: tableColumnInfo[1].id,
81+
},
82+
{
83+
title: t('console-app~Deletion policy'),
84+
sort: 'deletionPolicy',
85+
transforms: [sortable],
86+
props: { className: tableColumnInfo[2].className },
87+
id: tableColumnInfo[2].id,
88+
},
89+
{
90+
title: '',
91+
props: { className: tableColumnInfo[3].className },
92+
id: tableColumnInfo[3].id,
93+
},
94+
];
95+
const [columns] = useActiveColumns({ columns: getTableColumns() });
96+
97+
return (
98+
<VirtualizedTable<VolumeGroupSnapshotClassKind>
99+
{...props}
100+
aria-label={t('console-app~VolumeGroupSnapshotClasses')}
101+
label={t('console-app~VolumeGroupSnapshotClasses')}
102+
columns={columns}
103+
Row={Row}
104+
/>
105+
);
106+
};
107+
108+
const VolumeGroupSnapshotClassPage: React.FC<VolumeGroupSnapshotClassPageProps> = ({
109+
canCreate = true,
110+
showTitle = true,
111+
namespace,
112+
selector,
113+
}) => {
114+
const { t } = useTranslation();
115+
const [resources, loaded, loadError] = useK8sWatchResource<VolumeGroupSnapshotClassKind[]>({
116+
groupVersionKind: {
117+
group: VolumeGroupSnapshotClassModel.apiGroup,
118+
kind: VolumeGroupSnapshotClassModel.kind,
119+
version: VolumeGroupSnapshotClassModel.apiVersion,
120+
},
121+
isList: true,
122+
namespaced: true,
123+
namespace,
124+
selector,
125+
});
126+
const [data, filteredData, onFilterChange] = useListPageFilter(resources);
127+
const resourceKind = referenceForModel(VolumeGroupSnapshotClassModel);
128+
129+
return (
130+
<>
131+
<ListPageHeader
132+
title={showTitle ? t(VolumeGroupSnapshotClassModel.labelPluralKey) : undefined}
133+
>
134+
{canCreate && (
135+
<ListPageCreate groupVersionKind={resourceKind}>
136+
{t('console-app~Create VolumeGroupSnapshotClass')}
137+
</ListPageCreate>
138+
)}
139+
</ListPageHeader>
140+
<ListPageBody>
141+
<ListPageFilter data={data} loaded={loaded} onFilterChange={onFilterChange} />
142+
<VolumeGroupSnapshotClassTable
143+
unfilteredData={resources}
144+
data={filteredData}
145+
loaded={loaded}
146+
loadError={loadError}
147+
/>
148+
</ListPageBody>
149+
</>
150+
);
151+
};
152+
153+
type VolumeGroupSnapshotClassPageProps = {
154+
namespace?: string;
155+
canCreate?: boolean;
156+
showTitle?: boolean;
157+
selector?: Selector;
158+
};
159+
160+
type VolumeGroupSnapshotClassTableProps = {
161+
data: VolumeGroupSnapshotClassKind[];
162+
unfilteredData: VolumeGroupSnapshotClassKind[];
163+
loaded: boolean;
164+
loadError: any;
165+
};
166+
export default VolumeGroupSnapshotClassPage;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import * as React from 'react';
2+
import { useTranslation } from 'react-i18next';
3+
import { ResourceEventStream } from '@console/internal/components/events';
4+
import { DetailsPage, DetailsPageProps } from '@console/internal/components/factory';
5+
import {
6+
SectionHeading,
7+
ResourceSummary,
8+
ResourceLink,
9+
navFactory,
10+
Kebab,
11+
} from '@console/internal/components/utils';
12+
import { VolumeGroupSnapshotClassModel, VolumeGroupSnapshotModel } from '@console/internal/models';
13+
import { referenceForModel, VolumeGroupSnapshotContentKind } from '@console/internal/module/k8s';
14+
import { Status } from '@console/shared';
15+
import { volumeSnapshotStatus } from '../../status';
16+
17+
const { editYaml, events } = navFactory;
18+
19+
const Details: React.FC<DetailsProps> = ({ obj }) => {
20+
const { t } = useTranslation();
21+
const { deletionPolicy, driver } = obj?.spec;
22+
const { volumeHandles, groupSnapshotHandles } = obj?.spec?.source || {};
23+
const { name: snapshotName, namespace: snapshotNamespace } =
24+
obj?.spec?.volumeGroupSnapshotRef || {};
25+
26+
return (
27+
<div className="co-m-pane__body">
28+
<SectionHeading text={t('console-app~VolumeGroupSnapshotContent details')} />
29+
<div className="row">
30+
<div className="col-md-6 col-xs-12">
31+
<ResourceSummary resource={obj}>
32+
<dt>{t('console-app~Status')}</dt>
33+
<dd>
34+
<Status status={volumeSnapshotStatus(obj)} />
35+
</dd>
36+
</ResourceSummary>
37+
</div>
38+
<div className="col-md-6">
39+
<dl className="co-m-pane__details">
40+
<dt>{t('console-app~VolumeGroupSnapshot')}</dt>
41+
<dd>
42+
<ResourceLink
43+
kind={referenceForModel(VolumeGroupSnapshotModel)}
44+
name={snapshotName}
45+
namespace={snapshotNamespace}
46+
/>
47+
</dd>
48+
<dt>{t('console-app~VolumeGroupSnapshotClass')}</dt>
49+
<dd>
50+
<ResourceLink
51+
kind={referenceForModel(VolumeGroupSnapshotClassModel)}
52+
name={obj?.spec?.volumeGroupSnapshotClassName}
53+
/>
54+
</dd>
55+
<dt>{t('console-app~Deletion policy')}</dt>
56+
<dd>{deletionPolicy}</dd>
57+
<dt>{t('console-app~Driver')}</dt>
58+
<dd>{driver}</dd>
59+
{volumeHandles && (
60+
<>
61+
<dt>{t('console-app~Volume handle')}</dt>
62+
{volumeHandles.map((handle) => (
63+
<dd>{handle}</dd>
64+
))}
65+
</>
66+
)}
67+
{groupSnapshotHandles && (
68+
<>
69+
<dt>{t('console-app~GroupSnapshot handle')}</dt>
70+
<dd>{groupSnapshotHandles.volumeGroupSnapshotHandle}</dd>
71+
</>
72+
)}
73+
</dl>
74+
</div>
75+
</div>
76+
</div>
77+
);
78+
};
79+
80+
const VolumeGroupSnapshotContentDetailsPage: React.FC<DetailsPageProps> = (props) => {
81+
const pages = [
82+
{
83+
href: '',
84+
// t('console-app~Details')
85+
nameKey: 'console-app~Details',
86+
component: Details,
87+
},
88+
editYaml(),
89+
events(ResourceEventStream),
90+
];
91+
return (
92+
<DetailsPage
93+
{...props}
94+
getResourceStatus={volumeSnapshotStatus}
95+
menuActions={Kebab.factory.common}
96+
pages={pages}
97+
/>
98+
);
99+
};
100+
101+
type DetailsProps = {
102+
obj: VolumeGroupSnapshotContentKind;
103+
};
104+
105+
export default VolumeGroupSnapshotContentDetailsPage;

0 commit comments

Comments
 (0)