@rancher/shell 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/images/providers/ovhcloudmks.svg +122 -0
- package/assets/images/providers/ovhcloudpubliccloud.svg +122 -0
- package/assets/styles/global/_layout.scss +99 -0
- package/assets/translations/en-us.yaml +30 -5
- package/assets/translations/zh-hans.yaml +1 -1
- package/babel.config.js +7 -1
- package/chart/monitoring/alerting/index.vue +7 -21
- package/chart/monitoring/grafana/index.vue +55 -0
- package/chart/monitoring/index.vue +51 -17
- package/chart/monitoring/prometheus/index.vue +37 -43
- package/chart/rancher-backup/index.vue +2 -1
- package/cloud-credential/azure.vue +4 -17
- package/components/Certificates.vue +164 -0
- package/components/CodeMirror.vue +19 -21
- package/components/CruResource.vue +1 -0
- package/components/EtcdInfoBanner.vue +1 -1
- package/components/ExplorerProjectsNamespaces.vue +25 -1
- package/components/IconOrSvg.vue +1 -1
- package/components/LandingPagePreference.vue +1 -4
- package/components/Questions/index.vue +1 -1
- package/components/ResourceDetail/Masthead.vue +16 -3
- package/components/ResourceTable.vue +14 -2
- package/components/ResourceYaml.vue +5 -0
- package/components/SideNav.vue +1 -1
- package/components/SingleClusterInfo.vue +1 -4
- package/components/Tabbed/index.vue +12 -0
- package/components/fleet/FleetRepos.vue +62 -27
- package/components/fleet/FleetResources.vue +6 -1
- package/components/form/ArrayListSelect.vue +10 -0
- package/components/form/KeyValue.vue +4 -0
- package/components/form/LabeledSelect.vue +4 -0
- package/components/formatter/Checked.vue +11 -3
- package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
- package/components/formatter/FleetSummaryGraph.vue +23 -11
- package/components/formatter/LiveDuration.vue +1 -1
- package/components/formatter/PercentageBar.vue +1 -1
- package/components/formatter/__tests__/Checked.test.ts +19 -0
- package/components/nav/Group.vue +2 -2
- package/components/nav/Header.vue +0 -1
- package/components/nav/TopLevelMenu.vue +36 -6
- package/components/nav/Type.vue +1 -3
- package/components/nav/WindowManager/ContainerLogs.vue +101 -3
- package/components/nav/WindowManager/ContainerShell.vue +6 -1
- package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
- package/components/nav/WindowManager/index.vue +11 -10
- package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
- package/components/nav/__tests__/Type.test.ts +1 -1
- package/components/nuxt/nuxt-child.js +14 -78
- package/components/nuxt/nuxt.js +1 -1
- package/{layouts → components/templates}/blank.vue +1 -1
- package/{layouts → components/templates}/default.vue +8 -98
- package/{layouts → components/templates}/error.vue +10 -19
- package/{layouts → components/templates}/home.vue +4 -1
- package/{layouts → components/templates}/plain.vue +4 -1
- package/{layouts → components/templates}/standalone.vue +1 -1
- package/{layouts → components/templates}/unauthenticated.vue +1 -1
- package/composables/useCompactInput.ts +20 -0
- package/composables/useLabeledFormElement.ts +138 -0
- package/config/harvester-manager-types.js +2 -0
- package/config/private-label.js +22 -0
- package/config/product/explorer.js +3 -0
- package/config/product/fleet.js +6 -1
- package/config/product/manager.js +8 -2
- package/config/query-params.js +1 -0
- package/config/router.js +385 -364
- package/config/settings.ts +1 -0
- package/config/store.js +1 -1
- package/config/system-namespaces.js +3 -0
- package/config/table-headers.js +47 -0
- package/core/plugin-routes.ts +56 -114
- package/core/plugin.ts +16 -10
- package/core/plugins-loader.js +7 -9
- package/core/plugins.js +0 -3
- package/creators/app/files/.gitlab-ci.yml +1 -1
- package/detail/fleet.cattle.io.cluster.vue +11 -1
- package/detail/provisioning.cattle.io.cluster.vue +4 -3
- package/dialog/ScaleMachineDownDialog.vue +34 -17
- package/edit/__tests__/service.test.ts +89 -0
- package/edit/auth/googleoauth.vue +1 -5
- package/edit/catalog.cattle.io.clusterrepo.vue +18 -0
- package/edit/cloudcredential.vue +2 -0
- package/edit/configmap.vue +2 -1
- package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +4 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
- package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
- package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
- package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
- package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
- package/edit/service.vue +12 -0
- package/edit/workload/mixins/workload.js +1 -1
- package/initialize/App.js +25 -71
- package/initialize/client.js +21 -162
- package/initialize/index.js +27 -123
- package/list/management.cattle.io.feature.vue +1 -7
- package/list/node.vue +1 -0
- package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
- package/machine-config/vmwarevsphere.vue +73 -51
- package/middleware/authenticated.js +10 -17
- package/mixins/auth-config.js +2 -7
- package/mixins/brand.js +29 -41
- package/mixins/labeled-form-element.ts +6 -1
- package/models/__tests__/management.cattle.io.node.ts +85 -0
- package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
- package/models/__tests__/namespace.test.ts +49 -9
- package/models/__tests__/workload.test.ts +91 -0
- package/models/cluster/node.js +4 -4
- package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
- package/models/fleet.cattle.io.cluster.js +4 -0
- package/models/fleet.cattle.io.gitrepo.js +56 -13
- package/models/management.cattle.io.kontainerdriver.js +1 -1
- package/models/management.cattle.io.node.js +18 -14
- package/models/management.cattle.io.nodepool.js +17 -0
- package/models/namespace.js +1 -1
- package/models/pod.js +20 -0
- package/models/provisioning.cattle.io.cluster.js +20 -3
- package/models/secret.js +117 -18
- package/models/workload.js +16 -0
- package/models/workload.service.js +18 -0
- package/package.json +10 -9
- package/pages/about.vue +0 -1
- package/pages/account/create-key.vue +0 -1
- package/pages/account/index.vue +0 -1
- package/pages/auth/login.vue +0 -1
- package/pages/auth/logout.vue +0 -2
- package/pages/auth/setup.vue +0 -4
- package/pages/auth/verify.vue +14 -8
- package/pages/c/_cluster/apps/charts/install.vue +4 -4
- package/pages/c/_cluster/apps/index.vue +0 -2
- package/pages/c/_cluster/auth/index.vue +0 -2
- package/pages/c/_cluster/ecm/index.vue +0 -2
- package/pages/c/_cluster/explorer/index.vue +28 -2
- package/pages/c/_cluster/fleet/index.vue +1 -1
- package/pages/c/_cluster/index.vue +0 -2
- package/pages/c/_cluster/settings/banners.vue +0 -2
- package/pages/c/_cluster/settings/brand.vue +0 -2
- package/pages/c/_cluster/settings/index.vue +0 -2
- package/pages/c/_cluster/settings/links.vue +0 -1
- package/pages/c/_cluster/settings/performance.vue +0 -1
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
- package/pages/c/_cluster/uiplugins/index.vue +0 -2
- package/pages/diagnostic.vue +1 -2
- package/pages/fail-whale.vue +0 -1
- package/pages/prefs.vue +0 -1
- package/pages/support/index.vue +2 -8
- package/pkg/auto-import.js +1 -1
- package/plugins/axios.js +0 -36
- package/plugins/back-button.js +3 -5
- package/plugins/codemirror-loader.js +1 -1
- package/plugins/codemirror.js +41 -0
- package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
- package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
- package/plugins/dashboard-store/actions.js +30 -4
- package/plugins/dashboard-store/classify.js +1 -18
- package/plugins/dashboard-store/getters.js +10 -5
- package/plugins/dashboard-store/index.js +0 -12
- package/plugins/dashboard-store/mutations.js +0 -4
- package/plugins/dashboard-store/resource-class.js +59 -18
- package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
- package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
- package/plugins/steve/getters.js +4 -1
- package/plugins/steve/norman-class.js +19 -0
- package/plugins/steve/steve-class.js +22 -0
- package/plugins/steve/subscribe.js +4 -10
- package/rancher-components/Accordion/Accordion.test.ts +45 -0
- package/rancher-components/Accordion/Accordion.vue +85 -0
- package/rancher-components/Accordion/index.ts +1 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +19 -2
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +12 -1
- package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
- package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
- package/rancher-components/Form/Radio/RadioGroup.vue +4 -0
- package/rancher-components/StringList/StringList.test.ts +270 -0
- package/rancher-components/StringList/StringList.vue +57 -18
- package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
- package/rancher-components/components/Accordion/Accordion.vue +85 -0
- package/rancher-components/components/Accordion/index.ts +1 -0
- package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +19 -2
- package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +4 -1
- package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
- package/scripts/extension/parse-tag-name +2 -2
- package/scripts/publish-shell.sh +10 -0
- package/scripts/test-plugins-build.sh +85 -9
- package/server/har-file.js +183 -0
- package/store/catalog.js +1 -1
- package/store/features.js +1 -0
- package/store/i18n.js +11 -0
- package/store/index.js +10 -11
- package/store/prefs.js +33 -35
- package/store/type-map.js +8 -7
- package/tsconfig.json +35 -9
- package/tsconfig.paths.json +18 -0
- package/types/shell/index.d.ts +345 -214
- package/utils/__tests__/create-yaml.test.ts +60 -0
- package/utils/axios.js +0 -19
- package/utils/azure.js +24 -0
- package/utils/create-yaml.js +17 -10
- package/utils/monitoring.js +1 -1
- package/utils/nuxt.js +18 -39
- package/utils/object.js +14 -0
- package/utils/router.scrollBehavior.js +12 -14
- package/utils/time.js +1 -1
- package/utils/url.ts +1 -1
- package/vue.config.js +23 -2
- package/.DS_Store +0 -0
- package/assets/images/providers/aks-black.svg +0 -28
- package/assets/images/providers/aks.svg +0 -31
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
- package/initialize/layouts.ts +0 -26
- package/mixins/fetch.server.js +0 -73
- package/pages/c/index.vue +0 -9
- package/pages/rio/mesh.vue +0 -508
- package/plugins/transitions.js +0 -4
- package/scripts/.DS_Store +0 -0
- package/scripts/verdaccio.log +0 -205
- package/tsconfig.default.json +0 -46
- package/yarn-error.log +0 -200
- /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
- /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
- /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
|
@@ -7,6 +7,9 @@ echo "Checking plugin build"
|
|
|
7
7
|
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
|
8
8
|
BASE_DIR="$( cd $SCRIPT_DIR && cd ../.. & pwd)"
|
|
9
9
|
SHELL_DIR=$BASE_DIR/shell/
|
|
10
|
+
SHELL_VERSION="99.99.99"
|
|
11
|
+
DEFAULT_YARN_REGISTRY="https://registry.npmjs.org"
|
|
12
|
+
VERDACCIO_YARN_REGISTRY="http://localhost:4873"
|
|
10
13
|
|
|
11
14
|
echo ${SCRIPT_DIR}
|
|
12
15
|
|
|
@@ -66,21 +69,24 @@ else
|
|
|
66
69
|
rm -rf ~/.config/verdaccio/storage/@rancher/*
|
|
67
70
|
fi
|
|
68
71
|
|
|
69
|
-
export YARN_REGISTRY
|
|
72
|
+
export YARN_REGISTRY=$VERDACCIO_YARN_REGISTRY
|
|
70
73
|
export NUXT_TELEMETRY_DISABLED=1
|
|
71
74
|
|
|
72
75
|
# Remove test package from previous run, if present
|
|
73
|
-
|
|
76
|
+
if [ $TEST_PERSIST_BUILD != "true" ]; then
|
|
77
|
+
echo "Removing folder ${BASE_DIR}/pkg/test-pkg"
|
|
78
|
+
rm -rf ${BASE_DIR}/pkg/test-pkg
|
|
79
|
+
fi
|
|
74
80
|
|
|
75
81
|
# We need to patch the version number of the shell, otherwise if we are running
|
|
76
82
|
# with the currently published version, things will fail as those versions
|
|
77
83
|
# are already published and Verdaccio will check, since it is a read-through cache
|
|
78
|
-
sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"
|
|
84
|
+
sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\(-alpha\.[0-9]*\|-release[0-9]*.[0-9]*.[0-9]*\|-rc\.[0-9]*\)\{0,1\}\",/\"version\": \"${SHELL_VERSION}\",/g" ${SHELL_DIR}/package.json
|
|
79
85
|
rm ${SHELL_DIR}/package.json.bak
|
|
80
86
|
|
|
81
87
|
# Same as above for Rancher Components
|
|
82
88
|
# We might have bumped the version number but its not published yet, so this will fail
|
|
83
|
-
sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"
|
|
89
|
+
sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\(-alpha\.[0-9]*\|-release[0-9]*.[0-9]*.[0-9]*\|-rc\.[0-9]*\)\{0,1\}\",/\"version\": \"${SHELL_VERSION}\",/g" ${BASE_DIR}/pkg/rancher-components/package.json
|
|
84
90
|
|
|
85
91
|
# Publish shell
|
|
86
92
|
echo "Publishing shell packages to local registry"
|
|
@@ -108,6 +114,7 @@ if [ "${SKIP_STANDALONE}" == "false" ]; then
|
|
|
108
114
|
yarn install
|
|
109
115
|
|
|
110
116
|
echo "Building skeleton app"
|
|
117
|
+
|
|
111
118
|
FORCE_COLOR=true yarn build | cat
|
|
112
119
|
|
|
113
120
|
# Package creator
|
|
@@ -127,22 +134,91 @@ if [ "${SKIP_STANDALONE}" == "false" ]; then
|
|
|
127
134
|
echo "Cleaning temporary dir"
|
|
128
135
|
popd > /dev/null
|
|
129
136
|
|
|
130
|
-
|
|
137
|
+
if [ $TEST_PERSIST_BUILD != "true" ]; then
|
|
138
|
+
echo "Removing folder ${DIR}"
|
|
139
|
+
rm -rf ${DIR}
|
|
140
|
+
fi
|
|
131
141
|
fi
|
|
132
142
|
|
|
133
143
|
pushd $BASE_DIR
|
|
134
|
-
pwd
|
|
135
|
-
ls
|
|
136
144
|
|
|
137
145
|
# Now try a plugin within the dashboard codebase
|
|
138
146
|
echo "Validating in-tree package"
|
|
139
147
|
|
|
140
148
|
yarn install
|
|
141
149
|
|
|
142
|
-
|
|
150
|
+
if [ $TEST_PERSIST_BUILD != "true" ]; then
|
|
151
|
+
echo "Removing folder ./pkg/test-pkg"
|
|
152
|
+
rm -rf ./pkg/test-pkg
|
|
153
|
+
fi
|
|
154
|
+
|
|
143
155
|
yarn create @rancher/pkg test-pkg -t
|
|
144
156
|
cp ${SHELL_DIR}/list/catalog.cattle.io.clusterrepo.vue ./pkg/test-pkg/list
|
|
145
157
|
FORCE_COLOR=true yarn build-pkg test-pkg | cat
|
|
146
|
-
|
|
158
|
+
if [ $TEST_PERSIST_BUILD != "true" ]; then
|
|
159
|
+
echo "Removing folder ./pkg/test-pkg"
|
|
160
|
+
rm -rf ./pkg/test-pkg
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
# function to clone repos and install dependencies (including the newly published shell version)
|
|
164
|
+
function clone_repo_test_extension_build() {
|
|
165
|
+
REPO_NAME=$1
|
|
166
|
+
PKG_NAME=$2
|
|
167
|
+
|
|
168
|
+
echo -e "\nSetting up $REPO_NAME repository locally\n"
|
|
169
|
+
|
|
170
|
+
# set registry to default (to install all of the other dependencies)
|
|
171
|
+
yarn config set registry ${DEFAULT_YARN_REGISTRY}
|
|
172
|
+
|
|
173
|
+
if [ $TEST_PERSIST_BUILD != "true" ]; then
|
|
174
|
+
echo "Removing folder ${BASE_DIR}/$REPO_NAME"
|
|
175
|
+
rm -rf ${BASE_DIR}/$REPO_NAME
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
# cloning repo
|
|
179
|
+
git clone https://github.com/rancher/$REPO_NAME.git
|
|
180
|
+
pushd ${BASE_DIR}/$REPO_NAME
|
|
181
|
+
|
|
182
|
+
echo -e "\nInstalling dependencies for $REPO_NAME\n"
|
|
183
|
+
yarn install
|
|
184
|
+
|
|
185
|
+
# set registry to local verdaccio (to install new shell)
|
|
186
|
+
yarn config set registry ${VERDACCIO_YARN_REGISTRY}
|
|
187
|
+
|
|
188
|
+
# update package.json to use a specific version of shell
|
|
189
|
+
sed -i.bak -e "s/\"\@rancher\/shell\": \"[0-9]*.[0-9]*.[0-9]*\",/\"\@rancher\/shell\": \"${SHELL_VERSION}\",/g" package.json
|
|
190
|
+
rm package.json.bak
|
|
191
|
+
|
|
192
|
+
# we need to remove yarn.lock, otherwise it would install a version that we don't want
|
|
193
|
+
rm yarn.lock
|
|
194
|
+
|
|
195
|
+
echo -e "\nInstalling newly built shell version\n"
|
|
196
|
+
|
|
197
|
+
# installing new version of shell
|
|
198
|
+
yarn add @rancher/shell@${SHELL_VERSION}
|
|
199
|
+
|
|
200
|
+
# test build-pkg
|
|
201
|
+
FORCE_COLOR=true yarn build-pkg $PKG_NAME | cat
|
|
202
|
+
|
|
203
|
+
# kubewarden has some unit tests and they should be quick to run... Let's check them as well
|
|
204
|
+
if [ "${REPO_NAME}" == "kubewarden-ui" ]; then
|
|
205
|
+
yarn test:ci
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
# return back to the base path
|
|
209
|
+
popd
|
|
210
|
+
|
|
211
|
+
# delete folder
|
|
212
|
+
if [ $TEST_PERSIST_BUILD != "true" ]; then
|
|
213
|
+
echo "Removing folder ${BASE_DIR}/$REPO_NAME"
|
|
214
|
+
rm -rf ${BASE_DIR}/$REPO_NAME
|
|
215
|
+
fi
|
|
216
|
+
yarn config set registry ${DEFAULT_YARN_REGISTRY}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
# Here we just add the extension that we want to include as a check (all our official extensions should be included here)
|
|
220
|
+
# Don't forget to add the unit tests exception to clone_repo_test_extension_build function if a new extension has those
|
|
221
|
+
clone_repo_test_extension_build "kubewarden-ui" "kubewarden"
|
|
222
|
+
clone_repo_test_extension_build "elemental-ui" "elemental"
|
|
147
223
|
|
|
148
224
|
echo "All done"
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
// When we receive a request to this URL we will reset the session to replay again from the HAR file
|
|
5
|
+
// This allows the user to refresh the browser and replay the HAR file again
|
|
6
|
+
const RESET_URL = '/api/v1/namespaces/cattle-ui-plugin-system/services/http:ui-plugin-operator:80/proxy/index.json';
|
|
7
|
+
|
|
8
|
+
const EXCLUDES_QS = '?exclude=metadata.managedFields';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Load the network requests/responses from the har file
|
|
12
|
+
* @param name name/path of the file
|
|
13
|
+
* @param port port that the local dev server is running on
|
|
14
|
+
* @returns har file data
|
|
15
|
+
*/
|
|
16
|
+
function loadFile(name, port, dashboard) {
|
|
17
|
+
const newBase = `https://127.0.0.1:${ port }`;
|
|
18
|
+
const data = {};
|
|
19
|
+
|
|
20
|
+
console.log(`Loading HAR file: ${ name }`); // eslint-disable-line no-console
|
|
21
|
+
|
|
22
|
+
const rawData = fs.readFileSync(name);
|
|
23
|
+
const har = JSON.parse(rawData);
|
|
24
|
+
let base = '';
|
|
25
|
+
let uri = '';
|
|
26
|
+
|
|
27
|
+
if (har?.log?.pages) {
|
|
28
|
+
const page = har.log.pages.find((page) => page.title.includes('/dashboard/'));
|
|
29
|
+
|
|
30
|
+
if (page) {
|
|
31
|
+
const parts = page.title.split('/dashboard');
|
|
32
|
+
|
|
33
|
+
base = parts[0];
|
|
34
|
+
uri = parts[1];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (har?.log?.entries) {
|
|
39
|
+
console.log('Network requests:'); // eslint-disable-line no-console
|
|
40
|
+
|
|
41
|
+
har.log.entries.forEach((r) => {
|
|
42
|
+
const mimeType = r.response.content.mimeType;
|
|
43
|
+
|
|
44
|
+
// Only cache json responses
|
|
45
|
+
if (mimeType === 'application/json' || mimeType === 'text/plain') {
|
|
46
|
+
let url = r.request.url;
|
|
47
|
+
|
|
48
|
+
if (url.startsWith(base)) {
|
|
49
|
+
url = url.substr(base.length);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
console.log(` ${ r.request.method } ${ decodeURIComponent(url) }`); // eslint-disable-line no-console
|
|
53
|
+
|
|
54
|
+
data[url] = data[url] || {};
|
|
55
|
+
data[url][r.request.method] = data[url][r.request.method] || [];
|
|
56
|
+
|
|
57
|
+
const item = {
|
|
58
|
+
status: r.response.status,
|
|
59
|
+
statusText: r.response.statusText,
|
|
60
|
+
headers: r.response.headers,
|
|
61
|
+
content: r.response.content
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
if (item.content.text) {
|
|
65
|
+
item.content.text = item.content.text.replaceAll(base, newBase);
|
|
66
|
+
data[url][r.request.method].push(item);
|
|
67
|
+
} else {
|
|
68
|
+
console.log(' Warning: Omitting this response as there is no content - UI may not work as expected'); // eslint-disable-line no-console
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
console.log('Page:'); // eslint-disable-line no-console
|
|
75
|
+
console.log(` ${ newBase }${ dashboard }${ uri }`); // eslint-disable-line no-console
|
|
76
|
+
console.log(''); // eslint-disable-line no-console
|
|
77
|
+
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function exportToFiles(data, folder) {
|
|
82
|
+
console.log(`Exporting request data to ${ folder }`); // eslint-disable-line no-console
|
|
83
|
+
|
|
84
|
+
Object.keys(data).forEach((r) => {
|
|
85
|
+
const out = path.join(folder, `.${ r }`);
|
|
86
|
+
const dir = path.dirname(out);
|
|
87
|
+
|
|
88
|
+
console.log(r); // eslint-disable-line no-console
|
|
89
|
+
|
|
90
|
+
Object.keys(data[r]).forEach((method) => {
|
|
91
|
+
const name = `${ path.basename(out) }.${ method.toLowerCase() }.json`;
|
|
92
|
+
|
|
93
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
94
|
+
|
|
95
|
+
data[r][method].forEach((request) => {
|
|
96
|
+
const formatted = JSON.stringify(JSON.parse(request.content.text), null, 2);
|
|
97
|
+
|
|
98
|
+
fs.writeFileSync(path.join(dir, name), formatted);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function harProxy(responses, folder) {
|
|
105
|
+
let session = JSON.parse(JSON.stringify(responses));
|
|
106
|
+
|
|
107
|
+
return (req, res, next) => {
|
|
108
|
+
if (req.originalUrl === RESET_URL) {
|
|
109
|
+
session = JSON.parse(JSON.stringify(responses));
|
|
110
|
+
console.log('>>>>>>>> Reset session replay from har file'); // eslint-disable-line no-console
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const url = decodeURIComponent(req.originalUrl);
|
|
114
|
+
let playback = session[req.originalUrl];
|
|
115
|
+
|
|
116
|
+
// If it did not match, try without the metadata excludes query string that was adding in 2.8.0
|
|
117
|
+
// This might allow HAR captures with Rancher < 2.8.0 to be replayed on >= 2.8.0
|
|
118
|
+
if (!playback && req.originalUrl.endsWith(EXCLUDES_QS)) {
|
|
119
|
+
playback = session[req.originalUrl.slice(0, -EXCLUDES_QS.length)];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (playback && playback[req.method] && playback[req.method].length) {
|
|
123
|
+
const resp = playback[req.method][0];
|
|
124
|
+
|
|
125
|
+
if (playback[req.method].length > 1) {
|
|
126
|
+
playback[req.method].shift();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const body = resp.content?.text || '';
|
|
130
|
+
|
|
131
|
+
res.type(resp.content.mimeType);
|
|
132
|
+
res.status(resp.status);
|
|
133
|
+
res.send(Buffer.from(body));
|
|
134
|
+
res.end();
|
|
135
|
+
|
|
136
|
+
const char = !!resp.used ? '*' : ' ';
|
|
137
|
+
|
|
138
|
+
console.log(`${ req.method }${ char } ${ resp.status } ${ url }`); // eslint-disable-line no-console
|
|
139
|
+
|
|
140
|
+
resp.used = true;
|
|
141
|
+
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (req.originalUrl.startsWith('/v1/') || req.originalUrl.startsWith('/v3/') || req.originalUrl.startsWith('/k8s/')) {
|
|
146
|
+
// If we have been configured with a folder, look for a file with the contents to use for the request
|
|
147
|
+
if (folder) {
|
|
148
|
+
// Remove query string
|
|
149
|
+
const name = req.originalUrl.split('?')[0];
|
|
150
|
+
const requestFile = path.join(folder, `.${ name }.${ req.method.toLowerCase() }.json`);
|
|
151
|
+
|
|
152
|
+
if (fs.existsSync(requestFile)) {
|
|
153
|
+
const data = fs.readFileSync(requestFile);
|
|
154
|
+
|
|
155
|
+
console.log(`${ req.method }f 200 ${ url }`); // eslint-disable-line no-console
|
|
156
|
+
|
|
157
|
+
res.type('application/json');
|
|
158
|
+
res.status(200);
|
|
159
|
+
res.send(data);
|
|
160
|
+
|
|
161
|
+
return res.end();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Fallback to sending a 404 response
|
|
166
|
+
res.status(404);
|
|
167
|
+
res.send('Not Found');
|
|
168
|
+
|
|
169
|
+
console.log(`${ req.method }? 404 ${ url }`); // eslint-disable-line no-console
|
|
170
|
+
|
|
171
|
+
return res.end();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Continue on to serve up other resources
|
|
175
|
+
return next();
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
module.exports = {
|
|
180
|
+
loadFile,
|
|
181
|
+
harProxy,
|
|
182
|
+
exportToFiles,
|
|
183
|
+
};
|
package/store/catalog.js
CHANGED
|
@@ -354,7 +354,7 @@ export const actions = {
|
|
|
354
354
|
|
|
355
355
|
// As per comment above, when there are no clusters this will be management. Store it such that it can be used for those cases
|
|
356
356
|
commit('setInStore', inStore);
|
|
357
|
-
hash.cluster = hash.cluster
|
|
357
|
+
hash.cluster = hash.cluster?.filter((repo) => !(repo?.metadata?.annotations?.[CATALOG_ANNOTATIONS.HIDDEN_REPO] === 'true'));
|
|
358
358
|
|
|
359
359
|
commit('setRepos', hash);
|
|
360
360
|
|
package/store/features.js
CHANGED
|
@@ -27,6 +27,7 @@ export const mapFeature = function(name) {
|
|
|
27
27
|
export const MULTI_CLUSTER = create('multi-cluster-management', true);
|
|
28
28
|
export const LEGACY = create('legacy', false);
|
|
29
29
|
export const RKE2 = create('rke2', true);
|
|
30
|
+
export const RKE1_UI = create('rke1-ui', true);
|
|
30
31
|
export const UNSUPPORTED_STORAGE_DRIVERS = create('unsupported-storage-drivers', false);
|
|
31
32
|
export const FLEET = create('continuous-delivery', true);
|
|
32
33
|
export const HARVESTER = create('harvester', true);
|
package/store/i18n.js
CHANGED
|
@@ -308,6 +308,17 @@ export const actions = {
|
|
|
308
308
|
p.push(dispatch('mergeLoad', { locale, module: fn }));
|
|
309
309
|
});
|
|
310
310
|
|
|
311
|
+
// load all of the default locales from the plugins for fallback
|
|
312
|
+
if (locale !== DEFAULT_LOCALE) {
|
|
313
|
+
const defaultI18nExt = rootState.$plugin?.getDynamic('l10n', DEFAULT_LOCALE);
|
|
314
|
+
|
|
315
|
+
if (defaultI18nExt && defaultI18nExt.length) {
|
|
316
|
+
defaultI18nExt.forEach((fn) => {
|
|
317
|
+
p.push(dispatch('mergeLoad', { locale: DEFAULT_LOCALE, module: fn }));
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
311
322
|
try {
|
|
312
323
|
await Promise.all(p);
|
|
313
324
|
} catch (e) {
|
package/store/index.js
CHANGED
|
@@ -713,10 +713,7 @@ export const actions = {
|
|
|
713
713
|
|
|
714
714
|
const promises = {
|
|
715
715
|
// Clusters guaranteed always available or your money back
|
|
716
|
-
clusters: dispatch('management/findAll', {
|
|
717
|
-
type: MANAGEMENT.CLUSTER,
|
|
718
|
-
opt: { url: MANAGEMENT.CLUSTER }
|
|
719
|
-
}),
|
|
716
|
+
clusters: dispatch('management/findAll', { type: MANAGEMENT.CLUSTER }),
|
|
720
717
|
|
|
721
718
|
// Features checks on its own if they are available
|
|
722
719
|
features: dispatch('features/loadServer'),
|
|
@@ -887,6 +884,10 @@ export const actions = {
|
|
|
887
884
|
// Try and wait until the schema exists before proceeding
|
|
888
885
|
await dispatch('management/waitForSchema', { type: MANAGEMENT.CLUSTER });
|
|
889
886
|
|
|
887
|
+
// Similar to above, we're still waiting on loadManagement to fetch required resources
|
|
888
|
+
// If we don't have all mgmt clusters yet a request to fetch this cluster and then all clusters (in cleanNamespaces) is kicked off
|
|
889
|
+
await dispatch('management/waitForHaveAll', { type: MANAGEMENT.CLUSTER });
|
|
890
|
+
|
|
890
891
|
// See if it really exists
|
|
891
892
|
try {
|
|
892
893
|
const cluster = await dispatch('management/find', {
|
|
@@ -1046,15 +1047,13 @@ export const actions = {
|
|
|
1046
1047
|
if ( route.name === 'index' ) {
|
|
1047
1048
|
router.replace('/auth/login');
|
|
1048
1049
|
} else {
|
|
1049
|
-
|
|
1050
|
-
const backTo = window.localStorage.getItem(BACK_TO);
|
|
1050
|
+
const backTo = window.localStorage.getItem(BACK_TO);
|
|
1051
1051
|
|
|
1052
|
-
|
|
1053
|
-
|
|
1052
|
+
const isLogin = route.name === 'auth-login' || route.path === '/login'; // Cover dashboard and case of log out from ember;
|
|
1053
|
+
const isLogout = route.name === 'auth-logout';
|
|
1054
1054
|
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
}
|
|
1055
|
+
if (!backTo && !isLogin && !isLogout) {
|
|
1056
|
+
window.localStorage.setItem(BACK_TO, window.location.href);
|
|
1058
1057
|
}
|
|
1059
1058
|
|
|
1060
1059
|
const QUERY = (LOGGED_OUT in route.query) ? LOGGED_OUT : TIMED_OUT;
|
package/store/prefs.js
CHANGED
|
@@ -345,46 +345,44 @@ export const actions = {
|
|
|
345
345
|
commit('cookiesLoaded');
|
|
346
346
|
},
|
|
347
347
|
|
|
348
|
-
loadTheme({
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
348
|
+
loadTheme({ dispatch }) {
|
|
349
|
+
const watchDark = window.matchMedia('(prefers-color-scheme: dark)');
|
|
350
|
+
const watchLight = window.matchMedia('(prefers-color-scheme: light)');
|
|
351
|
+
const watchNone = window.matchMedia('(prefers-color-scheme: no-preference)');
|
|
352
|
+
|
|
353
|
+
const interval = 30 * 60 * 1000;
|
|
354
|
+
const nextHalfHour = interval - Math.round(new Date().getTime()) % interval;
|
|
355
|
+
|
|
356
|
+
setTimeout(() => {
|
|
357
|
+
dispatch('loadTheme');
|
|
358
|
+
}, nextHalfHour);
|
|
359
|
+
// console.log('Update theme in', nextHalfHour, 'ms');
|
|
360
|
+
|
|
361
|
+
if ( watchDark.matches ) {
|
|
362
|
+
changed('dark');
|
|
363
|
+
} else if ( watchLight.matches ) {
|
|
364
|
+
changed('light');
|
|
365
|
+
} else {
|
|
366
|
+
changed(fromClock());
|
|
367
|
+
}
|
|
361
368
|
|
|
362
|
-
|
|
369
|
+
watchDark.addListener((e) => {
|
|
370
|
+
if ( e.matches ) {
|
|
363
371
|
changed('dark');
|
|
364
|
-
} else if ( watchLight.matches ) {
|
|
365
|
-
changed('light');
|
|
366
|
-
} else {
|
|
367
|
-
changed(fromClock());
|
|
368
372
|
}
|
|
373
|
+
});
|
|
369
374
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
watchLight.addListener((e) => {
|
|
377
|
-
if ( e.matches ) {
|
|
378
|
-
changed('light');
|
|
379
|
-
}
|
|
380
|
-
});
|
|
375
|
+
watchLight.addListener((e) => {
|
|
376
|
+
if ( e.matches ) {
|
|
377
|
+
changed('light');
|
|
378
|
+
}
|
|
379
|
+
});
|
|
381
380
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
}
|
|
381
|
+
watchNone.addListener((e) => {
|
|
382
|
+
if ( e.matches ) {
|
|
383
|
+
changed(fromClock());
|
|
384
|
+
}
|
|
385
|
+
});
|
|
388
386
|
|
|
389
387
|
function changed(value) {
|
|
390
388
|
// console.log('Prefers Theme:', value);
|
package/store/type-map.js
CHANGED
|
@@ -912,6 +912,10 @@ export const getters = {
|
|
|
912
912
|
continue;
|
|
913
913
|
}
|
|
914
914
|
|
|
915
|
+
if (item.ifFeature && !rootGetters['features/get'](item.ifFeature)) {
|
|
916
|
+
continue;
|
|
917
|
+
}
|
|
918
|
+
|
|
915
919
|
if ( isBasic && !getters.groupForBasicType(product, id) ) {
|
|
916
920
|
continue;
|
|
917
921
|
} else if ( mode === FAVORITE && !getters.isFavorite(id) ) {
|
|
@@ -1844,15 +1848,12 @@ function _rowValueGetter(col) {
|
|
|
1844
1848
|
// We will use JsonPath to look up this value, which is costly - so if we can detect this format
|
|
1845
1849
|
// Use a more efficient function to get the value
|
|
1846
1850
|
const value = col.field.startsWith('.') ? `$${ col.field }` : col.field;
|
|
1851
|
+
const found = value.match(FIELD_REGEX);
|
|
1847
1852
|
|
|
1848
|
-
if (
|
|
1849
|
-
const
|
|
1853
|
+
if (found && found.length === 2) {
|
|
1854
|
+
const fieldIndex = parseInt(found[1], 10);
|
|
1850
1855
|
|
|
1851
|
-
|
|
1852
|
-
const fieldIndex = parseInt(found[1], 10);
|
|
1853
|
-
|
|
1854
|
-
return (row) => row.metadata?.fields?.[fieldIndex];
|
|
1855
|
-
}
|
|
1856
|
+
return (row) => row.metadata?.fields?.[fieldIndex];
|
|
1856
1857
|
}
|
|
1857
1858
|
|
|
1858
1859
|
return value;
|
package/tsconfig.json
CHANGED
|
@@ -1,16 +1,42 @@
|
|
|
1
1
|
{
|
|
2
|
-
"extends": "./tsconfig.
|
|
2
|
+
"extends": "./tsconfig.paths.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
|
+
"target": "ES2018",
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"moduleResolution": "Node",
|
|
7
|
+
"lib": [
|
|
8
|
+
"ESNext",
|
|
9
|
+
"ESNext.AsyncIterable",
|
|
10
|
+
"DOM"
|
|
11
|
+
],
|
|
12
|
+
"allowJs": true,
|
|
13
|
+
"sourceMap": true,
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noEmit": false,
|
|
16
|
+
"esModuleInterop": true,
|
|
17
|
+
"baseUrl": ".",
|
|
18
|
+
"rootDir": ".",
|
|
4
19
|
"types": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
20
|
+
"node",
|
|
21
|
+
"jest",
|
|
22
|
+
],
|
|
23
|
+
"typeRoots": [
|
|
24
|
+
"./node_modules/@types",
|
|
25
|
+
"../node_modules/@types"
|
|
26
|
+
],
|
|
9
27
|
},
|
|
10
28
|
"exclude": [
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
29
|
+
"node_modules",
|
|
30
|
+
".nuxt",
|
|
31
|
+
"dist",
|
|
32
|
+
"dist-pkg",
|
|
33
|
+
"../dist",
|
|
34
|
+
"../dist-pkg",
|
|
35
|
+
"../creators",
|
|
36
|
+
"../scripts",
|
|
37
|
+
"../cypress",
|
|
38
|
+
"../cypress.config.ts",
|
|
39
|
+
"../docusaurus",
|
|
40
|
+
"../**/*.spec.ts"
|
|
15
41
|
]
|
|
16
42
|
}
|