mirror of
https://github.com/harvester/harvester-ui-extension.git
synced 2026-10-06 22:26:05 +08:00
Compare commits
62
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18be022a9f | ||
|
|
56b4b46b5a | ||
|
|
db398ecad3 | ||
|
|
d175e3b11a | ||
|
|
905db4b12c | ||
|
|
fc31b4bb9d | ||
|
|
db29a7c31b | ||
|
|
2b3541164d | ||
|
|
ea5e9aa1f4 | ||
|
|
18a5608e72 | ||
|
|
18599fc94c | ||
|
|
e155d46483 | ||
|
|
795e5d178f | ||
|
|
2e03ac3cf7 | ||
|
|
76605fdc07 | ||
|
|
c289b001db | ||
|
|
e8d63da1eb | ||
|
|
4a456ac07d | ||
|
|
57dfddd593 | ||
|
|
66eac96575 | ||
|
|
182d92d80b | ||
|
|
1b362f570b | ||
|
|
cf798048f8 | ||
|
|
93c8399935 | ||
|
|
b72f523ddf | ||
|
|
e5ffb08df3 | ||
|
|
98a6322c11 | ||
|
|
be7e4bd80b | ||
|
|
ed2bc3100b | ||
|
|
b6ffb3e9f1 | ||
|
|
3d8a6bba7e | ||
|
|
be9311dc0c | ||
|
|
e294f4c00f | ||
|
|
a9fa928912 | ||
|
|
ef2b4d1589 | ||
|
|
a73e9f0ac1 | ||
|
|
11b3bf4c1f | ||
|
|
b775ce5f50 | ||
|
|
193d4536e3 | ||
|
|
9ca9fdb521 | ||
|
|
bcabefe9f3 | ||
|
|
c541f81dc3 | ||
|
|
4486f71c8f | ||
|
|
060105ead3 | ||
|
|
3ea73978ee | ||
|
|
f4e363396d | ||
|
|
fa16e24983 | ||
|
|
ce63ee6a19 | ||
|
|
ee28697161 | ||
|
|
85a06feb91 | ||
|
|
17dd46cee9 | ||
|
|
0ef4ff65cc | ||
|
|
cebb302730 | ||
|
|
f12717a8f4 | ||
|
|
03f54643fd | ||
|
|
7fb6d44208 | ||
|
|
dc683a50a4 | ||
|
|
be421054d8 | ||
|
|
fcef0391bb | ||
|
|
1d89aafeab | ||
|
|
7386a2deb6 | ||
|
|
26f5ebc8e2 |
@@ -14,3 +14,4 @@ dist-pkg
|
|||||||
pkg/harvester/index.ts
|
pkg/harvester/index.ts
|
||||||
pkg/harvester/store/*
|
pkg/harvester/store/*
|
||||||
scripts/pkgfile.js
|
scripts/pkgfile.js
|
||||||
|
tmp
|
||||||
|
|||||||
@@ -4,4 +4,3 @@ numberOfReviewers: 0
|
|||||||
reviewers:
|
reviewers:
|
||||||
- a110605
|
- a110605
|
||||||
- houhoucoop
|
- houhoucoop
|
||||||
- NickChungSUSE
|
|
||||||
+7
-26
@@ -1,33 +1,14 @@
|
|||||||
pull_request_rules:
|
pull_request_rules:
|
||||||
- name: Automatically open backport PR to release-harvester-v1.5
|
|
||||||
conditions:
|
|
||||||
- base=main
|
|
||||||
- label="require backport 1.5"
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- "release-harvester-v1.5"
|
|
||||||
assignees:
|
|
||||||
- "{{ author }}"
|
|
||||||
labels:
|
|
||||||
- "v1.5 backport PR"
|
|
||||||
|
|
||||||
- name: Automatically open backport PR to release-harvester-v1.0
|
|
||||||
conditions:
|
|
||||||
- base=main
|
|
||||||
- label="require backport 1.0"
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- "release-harvester-v1.0"
|
|
||||||
assignees:
|
|
||||||
- "{{ author }}"
|
|
||||||
labels:
|
|
||||||
- "v1.0 backport PR"
|
|
||||||
|
|
||||||
- name: Ask to resolve conflict
|
- name: Ask to resolve conflict
|
||||||
conditions:
|
conditions:
|
||||||
- conflict
|
- conflict
|
||||||
actions:
|
actions:
|
||||||
comment:
|
comment:
|
||||||
message: This pull request is now in conflict. Could you fix it @{{author}}? 🙏
|
message: This pull request is now in conflict. Could you fix it @{{author}}? 🙏
|
||||||
|
|
||||||
|
commands_restrictions:
|
||||||
|
backport:
|
||||||
|
conditions:
|
||||||
|
- or:
|
||||||
|
- sender-permission>=write
|
||||||
|
- sender=github-actions[bot]
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# .github/release.yml
|
||||||
|
changelog:
|
||||||
|
categories:
|
||||||
|
- title: Features
|
||||||
|
labels:
|
||||||
|
- feat
|
||||||
|
- title: Bug Fixes
|
||||||
|
labels:
|
||||||
|
- fix
|
||||||
|
- title: Dependencies
|
||||||
|
labels:
|
||||||
|
- deps
|
||||||
|
- title: Performance
|
||||||
|
labels:
|
||||||
|
- perf
|
||||||
|
- title: Documentation
|
||||||
|
labels:
|
||||||
|
- docs
|
||||||
|
- title: Style
|
||||||
|
labels:
|
||||||
|
- style
|
||||||
|
- title: Build & Continuous Integration
|
||||||
|
labels:
|
||||||
|
- build
|
||||||
|
- ci
|
||||||
|
- title: Security
|
||||||
|
labels:
|
||||||
|
- security
|
||||||
|
- title: Tests
|
||||||
|
labels:
|
||||||
|
- test
|
||||||
|
- title: Refactoring
|
||||||
|
labels:
|
||||||
|
- refactor
|
||||||
|
- title: Chores
|
||||||
|
labels:
|
||||||
|
- chore
|
||||||
|
- title: Others
|
||||||
|
labels:
|
||||||
|
- other
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
name: "[PR Management] Request Backport via Mergify"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [closed]
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
comment-backport:
|
||||||
|
if: github.event.pull_request.merged == true
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.base_ref }}
|
||||||
|
|
||||||
|
- name: Post Mergify backport command
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
pr_number=${{ github.event.pull_request.number }}
|
||||||
|
repo="${{ github.repository }}"
|
||||||
|
|
||||||
|
labels_json='${{ toJson(github.event.pull_request.labels.*.name) }}'
|
||||||
|
labels=$(echo "$labels_json" | jq -r '.[] // empty')
|
||||||
|
|
||||||
|
echo "Labels on PR: $labels"
|
||||||
|
|
||||||
|
matches=$(echo "$labels" | grep -oE '^require backport/v[0-9]+\.[0-9]+$' || true)
|
||||||
|
|
||||||
|
if [[ -z "$matches" ]]; then
|
||||||
|
echo "No back‑port labels found — skipping."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
branches=$(echo "$matches" \
|
||||||
|
| sed -E 's/^require backport\/v/release-harvester-v/' \
|
||||||
|
| sort -u | tr '\n' ' ')
|
||||||
|
branches=${branches%% }
|
||||||
|
|
||||||
|
cmd="@Mergifyio backport $branches"
|
||||||
|
echo "Posting Mergify command: $cmd"
|
||||||
|
gh pr comment "$pr_number" --repo "$repo" --body "$cmd"
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
name: "[PR Management] Add PR Label"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, reopened, edited]
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- 'release-harvester-v*'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
auto-assign-pr-label:
|
||||||
|
if: github.event.pull_request.draft == false
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.base_ref }}
|
||||||
|
- name: Setup Nodejs and yarn install
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
- name: Set PR label
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
PR_LABEL=$(node ./scripts/extract-release-label.mjs "${{ github.event.pull_request.title }}")
|
||||||
|
echo "PR_LABEL = $PR_LABEL"
|
||||||
|
gh pr edit ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --add-label "$PR_LABEL"
|
||||||
@@ -7,6 +7,7 @@ on:
|
|||||||
- main
|
- main
|
||||||
- 'release-*'
|
- 'release-*'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
types: [opened, reopened, edited, synchronize]
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- 'release-*'
|
- 'release-*'
|
||||||
@@ -22,6 +23,11 @@ jobs:
|
|||||||
- name: Run tests
|
- name: Run tests
|
||||||
uses: ./.github/actions/lint
|
uses: ./.github/actions/lint
|
||||||
|
|
||||||
|
- name: Validate PR title lint
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
shell: bash
|
||||||
|
run: echo "${{ github.event.pull_request.title }}" | npx commitlint
|
||||||
|
|
||||||
- name: Validate commit messages
|
- name: Validate commit messages
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -138,7 +138,6 @@ To validate changes in a release series, switch to the appropriate `vX.Y-head` b
|
|||||||
- Examples:
|
- Examples:
|
||||||
- Test `1.0.x` series → `v1.0-head`
|
- Test `1.0.x` series → `v1.0-head`
|
||||||
- Test `1.5.x` series → `v1.5-head`
|
- Test `1.5.x` series → `v1.5-head`
|
||||||
- Test `1.6.x` series → `v1.6-head`
|
|
||||||
|
|
||||||
**Steps:**
|
**Steps:**
|
||||||
1. Navigate to **Rancher UI** → **Local** → **App** → **Repositories**
|
1. Navigate to **Rancher UI** → **Local** → **App** → **Repositories**
|
||||||
|
|||||||
+3
-2
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "harvester-ui-extension",
|
"name": "harvester-ui-extension",
|
||||||
"version": "1.6.0-rc5",
|
"version": "1.7.0-dev",
|
||||||
"private": false,
|
"private": false,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20.0.0"
|
"node": ">=20.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-transform-class-static-block": "7.26.0",
|
"@babel/plugin-transform-class-static-block": "7.26.0",
|
||||||
"@rancher/shell": "3.0.5-rc.7",
|
"@rancher/shell": "3.0.5-rc.8",
|
||||||
"cache-loader": "^4.1.0",
|
"cache-loader": "^4.1.0",
|
||||||
"color": "4.2.3",
|
"color": "4.2.3",
|
||||||
"ip": "2.0.1",
|
"ip": "2.0.1",
|
||||||
@@ -46,6 +46,7 @@
|
|||||||
"prepare": "husky"
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@commitlint/load": "^19.8.1",
|
||||||
"@commitlint/cli": "^19.8.1",
|
"@commitlint/cli": "^19.8.1",
|
||||||
"@commitlint/config-conventional": "^19.8.1",
|
"@commitlint/config-conventional": "^19.8.1",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
softReboot() {
|
softReboot() {
|
||||||
this.vmResource.softrebootVM();
|
this.vmResource.doSoftReboot();
|
||||||
},
|
},
|
||||||
|
|
||||||
showKeysModal() {
|
showKeysModal() {
|
||||||
@@ -372,3 +372,12 @@ export default {
|
|||||||
background: rgb(40, 40, 40);
|
background: rgb(40, 40, 40);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.vm-console .v-popper__arrow-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.vm-console .v-popper__popper{
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -48,7 +48,9 @@ const FEATURE_FLAGS = {
|
|||||||
'cpuMemoryHotplug',
|
'cpuMemoryHotplug',
|
||||||
'cdiSettings',
|
'cdiSettings',
|
||||||
'vmCloneRunStrategy',
|
'vmCloneRunStrategy',
|
||||||
]
|
],
|
||||||
|
'v1.6.1': [],
|
||||||
|
'v1.7.0': []
|
||||||
};
|
};
|
||||||
|
|
||||||
const generateFeatureFlags = () => {
|
const generateFeatureFlags = () => {
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { HCI } from '../types';
|
||||||
|
|
||||||
// TODO: delete this not used variable
|
// TODO: delete this not used variable
|
||||||
export const MemoryUnit = [{
|
export const MemoryUnit = [{
|
||||||
label: 'Mi',
|
label: 'Mi',
|
||||||
@@ -81,3 +83,14 @@ export const CSI_SECRETS = {
|
|||||||
CSI_NODE_STAGE_SECRET_NAME: 'csi.storage.k8s.io/node-stage-secret-name',
|
CSI_NODE_STAGE_SECRET_NAME: 'csi.storage.k8s.io/node-stage-secret-name',
|
||||||
CSI_NODE_STAGE_SECRET_NAMESPACE: 'csi.storage.k8s.io/node-stage-secret-namespace',
|
CSI_NODE_STAGE_SECRET_NAMESPACE: 'csi.storage.k8s.io/node-stage-secret-namespace',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Some harvester CRD type is not equal to model file name, define the mapping here
|
||||||
|
export const HARVESTER_CRD_MAP = {
|
||||||
|
node: HCI.HOST,
|
||||||
|
configmap: HCI.CLOUD_TEMPLATE,
|
||||||
|
persistentvolumeclaim: HCI.VOLUME,
|
||||||
|
'snapshot.storage.k8s.io.volumesnapshot': HCI.SNAPSHOT,
|
||||||
|
// specific groupable table detail page
|
||||||
|
'network.harvesterhci.io.vlanconfig': HCI.CLUSTER_NETWORK,
|
||||||
|
'kubeovn.io.subnet': HCI.VPC
|
||||||
|
};
|
||||||
|
|||||||
@@ -44,6 +44,12 @@ export default {
|
|||||||
};
|
};
|
||||||
|
|
||||||
await allHash(hash);
|
await allHash(hash);
|
||||||
|
|
||||||
|
if (this.mode === _CREATE ) {
|
||||||
|
this.setDefaultVolumeSnapshotClass();
|
||||||
|
} else {
|
||||||
|
this.initCDISettingsFromAnnotations();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
@@ -59,14 +65,6 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
|
||||||
if (this.mode === _CREATE ) {
|
|
||||||
this.setDefaultVolumeSnapshotClass();
|
|
||||||
} else {
|
|
||||||
this.initCDISettingsFromAnnotations();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
inStore() {
|
inStore() {
|
||||||
return this.$store.getters['currentProduct'].inStore;
|
return this.$store.getters['currentProduct'].inStore;
|
||||||
@@ -148,7 +146,7 @@ export default {
|
|||||||
setDefaultVolumeSnapshotClass() {
|
setDefaultVolumeSnapshotClass() {
|
||||||
try {
|
try {
|
||||||
const setting = this.$store.getters[`${ this.inStore }/byId`](HCI.SETTING, HCI_SETTING.CSI_DRIVER_CONFIG);
|
const setting = this.$store.getters[`${ this.inStore }/byId`](HCI.SETTING, HCI_SETTING.CSI_DRIVER_CONFIG);
|
||||||
const config = JSON.parse(setting?.value || '{}');
|
const config = JSON.parse(setting?.value || setting?.default || '{}');
|
||||||
const defaultClass = config?.[this.provisioner]?.volumeSnapshotClassName || null;
|
const defaultClass = config?.[this.provisioner]?.volumeSnapshotClassName || null;
|
||||||
|
|
||||||
const allClasses = this.$store.getters[`${ this.inStore }/all`](VOLUME_SNAPSHOT_CLASS) || [];
|
const allClasses = this.$store.getters[`${ this.inStore }/all`](VOLUME_SNAPSHOT_CLASS) || [];
|
||||||
|
|||||||
@@ -257,6 +257,7 @@ export default {
|
|||||||
:label="t('harvester.vmTemplate.tabs.basics')"
|
:label="t('harvester.vmTemplate.tabs.basics')"
|
||||||
>
|
>
|
||||||
<CpuMemory
|
<CpuMemory
|
||||||
|
class="mb-20"
|
||||||
:cpu="cpu"
|
:cpu="cpu"
|
||||||
:memory="memory"
|
:memory="memory"
|
||||||
:max-cpu="maxCpu"
|
:max-cpu="maxCpu"
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="mt-20">
|
<div>
|
||||||
<LabeledSelect
|
<LabeledSelect
|
||||||
v-model:value="checkedSsh"
|
v-model:value="checkedSsh"
|
||||||
:label="t('harvester.virtualMachine.input.sshKey')"
|
:label="t('harvester.virtualMachine.input.sshKey')"
|
||||||
|
|||||||
@@ -605,6 +605,7 @@ export default {
|
|||||||
:label="t('harvester.virtualMachine.detail.tabs.basics')"
|
:label="t('harvester.virtualMachine.detail.tabs.basics')"
|
||||||
>
|
>
|
||||||
<CpuMemory
|
<CpuMemory
|
||||||
|
class="mb-20"
|
||||||
:cpu="cpu"
|
:cpu="cpu"
|
||||||
:max-cpu="maxCpu"
|
:max-cpu="maxCpu"
|
||||||
:memory="memory"
|
:memory="memory"
|
||||||
|
|||||||
@@ -691,11 +691,14 @@ export default {
|
|||||||
this.spec.template.spec.domain.cpu.cores = this.cpu;
|
this.spec.template.spec.domain.cpu.cores = this.cpu;
|
||||||
this.spec.template.spec.domain.resources.limits.cpu = this.cpu?.toString();
|
this.spec.template.spec.domain.resources.limits.cpu = this.cpu?.toString();
|
||||||
this.spec.template.spec.domain.resources.limits.memory = this.memory;
|
this.spec.template.spec.domain.resources.limits.memory = this.memory;
|
||||||
// clean
|
// clean below fields as we don't need them if not enable CPU and memory hotplug
|
||||||
delete this.spec.template.spec.resources;
|
if (this.spec?.template?.spec?.domain?.cpu?.maxSockets) {
|
||||||
delete this.spec.template.spec.domain.memory;
|
|
||||||
delete this.spec.template.spec.domain.cpu.maxSockets;
|
delete this.spec.template.spec.domain.cpu.maxSockets;
|
||||||
}
|
}
|
||||||
|
if (this.spec?.template?.spec?.domain?.memory?.maxGuest) {
|
||||||
|
delete this.spec.template.spec.domain.memory.maxGuest;
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
parseDiskRows(disk) {
|
parseDiskRows(disk) {
|
||||||
|
|||||||
@@ -1,17 +1,19 @@
|
|||||||
import SteveModel from '@shell/plugins/steve/steve-class';
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
||||||
import { VIEW_IN_API, DEV } from '@shell/store/prefs';
|
import { VIEW_IN_API, DEV } from '@shell/store/prefs';
|
||||||
import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../config/harvester';
|
import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../config/harvester';
|
||||||
|
import { HARVESTER_CRD_MAP } from '../config/harvester-map';
|
||||||
|
|
||||||
export default class HarvesterResource extends SteveModel {
|
export default class HarvesterResource extends SteveModel {
|
||||||
get listLocation() {
|
get listLocation() {
|
||||||
const name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
const name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
const resource = HARVESTER_CRD_MAP[this.type] || this.type;
|
||||||
|
|
||||||
return this.$rootGetters['type-map/optionsFor'](this.type).customRoute || {
|
return this.$rootGetters['type-map/optionsFor'](this.type).customRoute || {
|
||||||
name,
|
name,
|
||||||
params: {
|
params: {
|
||||||
product: this.$rootGetters['productId'],
|
product: this.$rootGetters['productId'],
|
||||||
cluster: this.$rootGetters['clusterId'],
|
cluster: this.$rootGetters['clusterId'],
|
||||||
resource: this.type,
|
resource
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// This file is Cloud Configuration Templates page model
|
||||||
import { clone } from '@shell/utils/object';
|
import { clone } from '@shell/utils/object';
|
||||||
import { HCI } from '../../types';
|
import { HCI } from '../../types';
|
||||||
import HarvesterResource from '../harvester';
|
import HarvesterResource from '../harvester';
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export default class HarvesterNetworkAttachmentDef extends NetworkAttachmentDef
|
|||||||
params: {
|
params: {
|
||||||
product: HARVESTER_PRODUCT,
|
product: HARVESTER_PRODUCT,
|
||||||
cluster: this.$rootGetters['clusterId'],
|
cluster: this.$rootGetters['clusterId'],
|
||||||
resource: this.type,
|
resource: HCI.NETWORK_ATTACHMENT,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,19 @@ export default class HciClusterflow extends HarvesterFlow {
|
|||||||
return this.$rootGetters['harvester/all'](LOGGING.CLUSTER_OUTPUT) || [];
|
return this.$rootGetters['harvester/all'](LOGGING.CLUSTER_OUTPUT) || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get listLocation() {
|
||||||
|
const listLocation = clone(super.listLocation);
|
||||||
|
|
||||||
|
listLocation.name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
listLocation.params.resource = HCI.CLUSTER_FLOW;
|
||||||
|
|
||||||
|
return listLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
get harvesterResourcesInExplorer() {
|
||||||
|
return this.$rootGetters['productId'] !== HARVESTER_PRODUCT;
|
||||||
|
}
|
||||||
|
|
||||||
get _detailLocation() {
|
get _detailLocation() {
|
||||||
const schema = this.$getters['schemaFor'](this.type);
|
const schema = this.$getters['schemaFor'](this.type);
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,19 @@ export default class HciClusteroutput extends LogOutput {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get listLocation() {
|
||||||
|
const listLocation = clone(super.listLocation);
|
||||||
|
|
||||||
|
listLocation.name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
listLocation.params.resource = HCI.CLUSTER_OUTPUT;
|
||||||
|
|
||||||
|
return listLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
get harvesterResourcesInExplorer() {
|
||||||
|
return this.$rootGetters['productId'] !== HARVESTER_PRODUCT;
|
||||||
|
}
|
||||||
|
|
||||||
get detailLocation() {
|
get detailLocation() {
|
||||||
const detailLocation = clone(this._detailLocation);
|
const detailLocation = clone(this._detailLocation);
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,19 @@ export default class HarvesterLogFlow extends Flow {
|
|||||||
return this.$rootGetters['harvester/all'](LOGGING.CLUSTER_OUTPUT) || [];
|
return this.$rootGetters['harvester/all'](LOGGING.CLUSTER_OUTPUT) || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get listLocation() {
|
||||||
|
const listLocation = clone(super.listLocation);
|
||||||
|
|
||||||
|
listLocation.name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
listLocation.params.resource = HCI.FLOW;
|
||||||
|
|
||||||
|
return listLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
get harvesterResourcesInExplorer() {
|
||||||
|
return this.$rootGetters['productId'] !== HARVESTER_PRODUCT;
|
||||||
|
}
|
||||||
|
|
||||||
get _detailLocation() {
|
get _detailLocation() {
|
||||||
const schema = this.$getters['schemaFor'](this.type);
|
const schema = this.$getters['schemaFor'](this.type);
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,19 @@ export default class HarvesterLogOutput extends LogOutput {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get listLocation() {
|
||||||
|
const listLocation = clone(super.listLocation);
|
||||||
|
|
||||||
|
listLocation.name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
listLocation.params.resource = HCI.OUTPUT;
|
||||||
|
|
||||||
|
return listLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
get harvesterResourcesInExplorer() {
|
||||||
|
return this.$rootGetters['productId'] !== HARVESTER_PRODUCT;
|
||||||
|
}
|
||||||
|
|
||||||
get detailLocation() {
|
get detailLocation() {
|
||||||
const detailLocation = clone(this._detailLocation);
|
const detailLocation = clone(this._detailLocation);
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,19 @@ export default class HciAlertmanagerConfig extends SteveModel {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get listLocation() {
|
||||||
|
const listLocation = clone(super.listLocation);
|
||||||
|
|
||||||
|
listLocation.name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
listLocation.params.resource = HCI.ALERTMANAGERCONFIG;
|
||||||
|
|
||||||
|
return listLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
get harvesterResourcesInExplorer() {
|
||||||
|
return this.$rootGetters['productId'] !== HARVESTER_PRODUCT;
|
||||||
|
}
|
||||||
|
|
||||||
get doneOverride() {
|
get doneOverride() {
|
||||||
const detailLocation = clone(this._detailLocation);
|
const detailLocation = clone(this._detailLocation);
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,25 @@ import Secret from '@shell/models/secret';
|
|||||||
import { NAMESPACE } from '@shell/config/types';
|
import { NAMESPACE } from '@shell/config/types';
|
||||||
|
|
||||||
export default class HciSecret extends Secret {
|
export default class HciSecret extends Secret {
|
||||||
|
// prevent harvester secret detail page be overridden.
|
||||||
|
// See isFullPageOverride in https://github.com/rancher/dashboard/blob/master/shell/components/ResourceDetail/index.vue
|
||||||
|
get fullDetailPageOverride() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
get listLocation() {
|
||||||
|
const listLocation = clone(super.listLocation);
|
||||||
|
|
||||||
|
listLocation.name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
listLocation.params.resource = HCI.SECRET;
|
||||||
|
|
||||||
|
return listLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
get harvesterResourcesInExplorer() {
|
||||||
|
return this.$rootGetters['productId'] !== HARVESTER_PRODUCT;
|
||||||
|
}
|
||||||
|
|
||||||
get _detailLocation() {
|
get _detailLocation() {
|
||||||
const schema = this.$getters['schemaFor'](this.type);
|
const schema = this.$getters['schemaFor'](this.type);
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,19 @@ import { isInternalStorageClass } from '../../utils/storage-class';
|
|||||||
export const LVM_DRIVER = 'lvm.driver.harvesterhci.io';
|
export const LVM_DRIVER = 'lvm.driver.harvesterhci.io';
|
||||||
|
|
||||||
export default class HciStorageClass extends StorageClass {
|
export default class HciStorageClass extends StorageClass {
|
||||||
|
get listLocation() {
|
||||||
|
const listLocation = clone(super.listLocation);
|
||||||
|
|
||||||
|
listLocation.name = this.harvesterResourcesInExplorer ? 'c-cluster-product-resource' : `${ HARVESTER_PRODUCT }-c-cluster-resource`;
|
||||||
|
listLocation.params.resource = HCI.STORAGE;
|
||||||
|
|
||||||
|
return listLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
get harvesterResourcesInExplorer() {
|
||||||
|
return this.$rootGetters['productId'] !== HARVESTER_PRODUCT;
|
||||||
|
}
|
||||||
|
|
||||||
get detailLocation() {
|
get detailLocation() {
|
||||||
const detailLocation = clone(this._detailLocation);
|
const detailLocation = clone(this._detailLocation);
|
||||||
|
|
||||||
@@ -94,13 +107,14 @@ export default class HciStorageClass extends StorageClass {
|
|||||||
get availableActions() {
|
get availableActions() {
|
||||||
let out = super.availableActions || [];
|
let out = super.availableActions || [];
|
||||||
|
|
||||||
out = out.map((action) => {
|
if (this.isInternalStorageClass()) {
|
||||||
if ((action.action === 'setDefault' || action.action === 'setAsDefault' || action.action === 'promptRemove') && this.isInternalStorageClass()) {
|
out = out.filter((action) => {
|
||||||
return { ...action, enabled: false };
|
return !['setDefault', 'setAsDefault', 'promptRemove'].includes(action.action);
|
||||||
}
|
|
||||||
|
|
||||||
return action;
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
if (out[0] && out[0].divider === true) {
|
||||||
|
out = out.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -327,6 +327,10 @@ export default class VirtVm extends HarvesterResource {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doSoftReboot() {
|
||||||
|
this.doActionGrowl('softreboot', {});
|
||||||
|
}
|
||||||
|
|
||||||
softrebootVM(resources = this) {
|
softrebootVM(resources = this) {
|
||||||
this.$dispatch('promptModal', {
|
this.$dispatch('promptModal', {
|
||||||
resources,
|
resources,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "harvester",
|
"name": "harvester",
|
||||||
"description": "Rancher UI Extension for Harvester",
|
"description": "Rancher UI Extension for Harvester",
|
||||||
"version": "1.6.0-rc5",
|
"version": "1.7.0-dev",
|
||||||
"private": false,
|
"private": false,
|
||||||
"rancher": {
|
"rancher": {
|
||||||
"annotations": {
|
"annotations": {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ if [[ "$VERSION" != "$EXTENSION_VERSION" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${TAG_VERSION}" != "$PKG_VERSION" ]]; then
|
if [[ "${TAG_VERSION}" != "${PKG_VERSION}"* ]]; then
|
||||||
echo "Package version $PKG_VERSION in pkg/harvester/package.json does not match tag version ${TAG_VERSION}"
|
echo "Package version $PKG_VERSION in pkg/harvester/package.json does not match tag version ${TAG_VERSION}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/* eslint-disable no-console */
|
||||||
|
import load from "@commitlint/load";
|
||||||
|
|
||||||
|
if (process.argv.length < 3) {
|
||||||
|
console.error('No PR title as first argument');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const prTitle = process.argv[2];
|
||||||
|
const prLabel = prTitle.split(':')[0].trim();
|
||||||
|
|
||||||
|
const config = await load({ extends: ["./commitlint.config.js"] });
|
||||||
|
const commitPrefix = config?.rules?.['type-enum']?.[2] || [];
|
||||||
|
const label = commitPrefix.includes(prLabel) ? prLabel : 'other';
|
||||||
|
|
||||||
|
console.log(label);
|
||||||
Reference in New Issue
Block a user