From 71ba2f83f87eecee1e8f83c7b85f07b57a154b3e Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 16 Mar 2021 13:40:00 +0530 Subject: [PATCH 01/11] ui: added customization details Signed-off-by: Abhishek Kumar --- source/_static/images/ui-custom-plugin.png | Bin 0 -> 53558 bytes source/adminguide/ui.rst | 53 ++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 source/_static/images/ui-custom-plugin.png diff --git a/source/_static/images/ui-custom-plugin.png b/source/_static/images/ui-custom-plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..3e59b59864259f98802f790dfc7b16a29d81662c GIT binary patch literal 53558 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 literal 0 HcmV?d00001 diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index b47e53c35e..b575c6d3a0 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -187,6 +187,10 @@ To change the logo, login banner, error page icon, etc. the following details ca .. parsed-literal:: + "apiBase": "/client/api", + "docBase": "http://docs.cloudstack.apache.org/en/latest", + "appTitle": "CloudStack", + "footer": "Licensed under the Apache License, Version 2.0.", "logo": "assets/logo.svg", "banner": "assets/banner.svg", "error": { @@ -196,7 +200,10 @@ To change the logo, login banner, error page icon, etc. the following details ca } where, - +- apiBase: changes the suffix for the API endpoint. +- docBase: changes the base URL for the documentation. +- appTitle: changes the title of the portal. +- footer: changes the footer text. - logo: changes the logo top-left side image. - banner: changes the login banner image. - error.404: changes the image of error Page not found. @@ -273,6 +280,47 @@ Some assorted primary theme colours: - Green: #52C41A - Purple: #722ED1 +Contextual help documentation URLs can be customized with the help of `docBase` and `docHelpMappings` properties. +A list of documentation help suffixes in code can be obtained using following command: + +.. parsed-literal:: + + grep -rnw cloudstack/ui/src/config/section -e 'docHelp:' + +Below example shows configuration changes for custom documentation help URLs: + +.. parsed-literal:: + + { + ... + "docBase": http://mycustomwebsite.com, + ... + "docHelpMappings": { + "adminguide/virtual_machines.html": "custom_vm_page.html", + "adminguide/templates.html": "custom_templates_page.html" + }, + ... + } + +UI also provides option to show custom plugins by displaying a custom HTML page or service in an iframe. Such plugins can be listed in the config file using `plugins` property. +Example for adding a custom plugin: + +.. parsed-literal:: + + { + ... + plugins: [ + { + "name": "ExamplePlugin", + "icon": "appstore", + "path": "example.html" + } + ] + ... + } + +|ui-custom-plugin.png| + Advanced Customisation ~~~~~~~~~~~~~~~~~~~~~~ @@ -296,3 +344,6 @@ The following features are no longer supported or available: .. |change-password.png| image:: /_static/images/change-password.png :alt: button to change a user's password + +.. |ui-custom-plugin.png| image:: /_static/images/ui-custom-plugin.png + :alt: Custom plugin shown in UI with navigation From 3d95968e2f7d7ce7efdd8487fb6e3ac2d9ee97a2 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 7 Apr 2021 15:34:50 +0530 Subject: [PATCH 02/11] review changes Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index b575c6d3a0..54c6fd454a 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -281,11 +281,7 @@ Some assorted primary theme colours: - Purple: #722ED1 Contextual help documentation URLs can be customized with the help of `docBase` and `docHelpMappings` properties. -A list of documentation help suffixes in code can be obtained using following command: - -.. parsed-literal:: - - grep -rnw cloudstack/ui/src/config/section -e 'docHelp:' +To override a particular documentation URL, a mapping can be added for the URL path in the config. Any documentation URL is formed by combining docBase URL base and a path set in the source code. Adding a mapping for any particular path in the configuration will result in generating documetation URL with overridden path. Below example shows configuration changes for custom documentation help URLs: @@ -303,7 +299,7 @@ Below example shows configuration changes for custom documentation help URLs: } UI also provides option to show custom plugins by displaying a custom HTML page or service in an iframe. Such plugins can be listed in the config file using `plugins` property. -Example for adding a custom plugin: +Example for adding custom plugins: .. parsed-literal:: @@ -314,11 +310,19 @@ Example for adding a custom plugin: "name": "ExamplePlugin", "icon": "appstore", "path": "example.html" + }, + { + "name": "ExamplePlugin1", + "icon": "appstore", + "path": "https://cloudstack.apache.org/" } ] ... } +`icon` for the plugin can be chosen from Ant Design icons listed at `Icon - Ant Design Vue https://www.antdv.com/components/icon/`_. +`path` for a custom html file for the plugin is relative to CloudStack management server's web application directory on the server, i.e., */usr/share/cloudstack-management/webapp*. + |ui-custom-plugin.png| Advanced Customisation @@ -331,6 +335,15 @@ building the UI from the source available on `github.com/apache/cloudstack require some experience in JavaScript and VueJS, a development and customisation guide in the source repository. +Useful documentations: + +- `VueJS Guide `_ +- `Vue Ant Design `_ +- `UI Developer `_ +- `JavaScript ES6 Reference `_ +- `Introduction to ES6 `_ + + Known Limitations ~~~~~~~~~~~~~~~~~ From 3deba635c0884955e7d246916dc60e024e3ef1ac Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 7 Apr 2021 15:42:03 +0530 Subject: [PATCH 03/11] edit Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index 54c6fd454a..17caa6ee15 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -281,7 +281,7 @@ Some assorted primary theme colours: - Purple: #722ED1 Contextual help documentation URLs can be customized with the help of `docBase` and `docHelpMappings` properties. -To override a particular documentation URL, a mapping can be added for the URL path in the config. Any documentation URL is formed by combining docBase URL base and a path set in the source code. Adding a mapping for any particular path in the configuration will result in generating documetation URL with overridden path. +To override a particular documentation URL, a mapping can be added for the URL path in the config. A documentation URL is formed by combining the `docBase` URL base and a path set in the source code. Adding a mapping for any particular path in the configuration will result in generating documetation URL with overridden path. Below example shows configuration changes for custom documentation help URLs: From f3b12ae9aac7dfb227b71db9e87dea27318bfd2f Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 7 Apr 2021 17:06:21 +0530 Subject: [PATCH 04/11] change Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index 17caa6ee15..f983d80c3d 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -321,7 +321,7 @@ Example for adding custom plugins: } `icon` for the plugin can be chosen from Ant Design icons listed at `Icon - Ant Design Vue https://www.antdv.com/components/icon/`_. -`path` for a custom html file for the plugin is relative to CloudStack management server's web application directory on the server, i.e., */usr/share/cloudstack-management/webapp*. +For displaying a custom HTML in the plugin, HTML file can be stored in the CloudStack management server's web application directory on the server, i.e., */usr/share/cloudstack-management/webapp* and `path` can be set to the name of the file. For displaying a service or a web page, URL can be set as the `path` of the plugin. |ui-custom-plugin.png| From b79fdc60b174f4f9d4c2ea473de71462e303db42 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 16 Apr 2021 13:47:13 +0530 Subject: [PATCH 05/11] changes Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 84 ++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index f983d80c3d..f7f4f5412e 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -185,6 +185,20 @@ Users can now customize the CloudStack's user interface by means of a configurat To change the logo, login banner, error page icon, etc. the following details can be edited in config.json: +========== ================================================== +Property Description +========== ================================================== +apiBase Changes the suffix for the API endpoint +docBase Changes the base URL for the documentation +appTitle Changes the title of the portal +footer Changes the footer text +logo Changes the logo top-left side image +banner Changes the login banner image +error.404 Changes the image of error Page not found +error.403 Changes the image of error Forbidden +error.500 Changes the image of error Internal Server Error. +========== ================================================== + .. parsed-literal:: "apiBase": "/client/api", @@ -199,18 +213,36 @@ To change the logo, login banner, error page icon, etc. the following details ca "500": "assets/500.png" } -where, -- apiBase: changes the suffix for the API endpoint. -- docBase: changes the base URL for the documentation. -- appTitle: changes the title of the portal. -- footer: changes the footer text. -- logo: changes the logo top-left side image. -- banner: changes the login banner image. -- error.404: changes the image of error Page not found. -- error.403: changes the image of error Forbidden. -- error.500: changes the image of error Internal Server Error. -Customization of themes is also possible, such as, modifying banner width, general color, etc. This can be done by editing the "theme" section of the config.json file: +Customization of themes is also possible, such as, modifying banner width, general color, etc. This can be done by editing the "theme" section of the config.json file. Theme section provides following properties for customization: + +============================= ================================================================ +Property Description +============================= ================================================================ +@logo-background-color Changes the logo background color +@project-nav-text-color Changes the navigation menu background color of the project +@project-nav-text-color Changes the navigation menu background color of the project view. +@navigation-background-color Changes the navigation menu background color +@primary-color Changes the major background color of the page (background button, icon hover, etc). +@link-color Changes the link color +@link-hover-color Changes the link hover color +@loading-color Changes the message loading color and page loading bar at the top page +@success-color Changes success state color +@processing-color Changes processing state color. Exp: progress status +@warning-color Changes warning state color +@error-color Changes error state color +@heading-color Changes table header color +@text-color Change in major text color +@text-color-secondary Change of secondary text color (breadcrumb icon) +@disabled-color Disable state color (disabled button, switch, etc) +@border-color-base Change in major border color +@logo-width Change the width of the logo top-left side +@logo-height Change the height of the logo top-left side +@banner-width Changes the width of the login banner +@banner-height Changes the height of the login banner +@error-width Changes the width of the error image +@error-height Changes the height of the error image +============================= ================================================================ .. parsed-literal:: @@ -244,33 +276,6 @@ Customization of themes is also possible, such as, modifying banner width, gener "@error-height": "256px" } -where, - -- @logo-background-color changes the logo background color. -- @project-nav-background-color changes the navigation menu background color of the project. -- @project-nav-text-color changes the navigation menu background color of the project view. -- @navigation-background-color changes the navigation menu background color. -- @navigation-text-color changes the navigation text color. -- @primary-color: changes the major background color of the page (background button, icon hover, etc). -- @link-color changes the link color. -- @link-hover-color changes the link hover color. -- @loading-color changes the message loading color and page loading bar at the top page. -- @success-color: changes success state color. -- @processing-color: changes processing state color. Exp: progress status. -- @warning-color: changes warning state color. -- @error-color: changes error state color. -- @heading-color: changes table header color. -- @text-color: change in major text color. -- @text-color-secondary: change of secondary text color (breadcrumb icon). -- @disabled-color: disable state color (disabled button, switch, etc). -- @border-color-base: change in major border color. -- @logo-width: change the width of the logo top-left side. -- @logo-height: change the height of the logo top-left side. -- @banner-width: changes the width of the login banner. -- @banner-height: changes the height of the login banner. -- @error-width: changes the width of the error image. -- @error-height: changes the height of the error image. - Some assorted primary theme colours: - Blue: #1890FF @@ -285,6 +290,9 @@ To override a particular documentation URL, a mapping can be added for the URL p Below example shows configuration changes for custom documentation help URLs: +By default, docBase is set to `http://docs.cloudstack.apache.org/en/latest` and contextual help on Instances page links to `http://docs.cloudstack.apache.org/en/latest/adminguide/virtual_machines.html`. +To make Instances page link to `http://mycustomwebsite.com/custom_vm_page.html`, docBase can be set to `http://mycustomwebsite.com` and a docHelpMapping can be added for `adminguide/virtual_machines.html` as `custom_vm_page.html`. + .. parsed-literal:: { From 85a585f1a386eb9b3f6b5fb3e56de177fde240c4 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 30 Apr 2021 17:38:08 +0530 Subject: [PATCH 06/11] fix Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index f7f4f5412e..078633b31a 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -306,7 +306,7 @@ To make Instances page link to `http://mycustomwebsite.com/custom_vm_page.html`, ... } -UI also provides option to show custom plugins by displaying a custom HTML page or service in an iframe. Such plugins can be listed in the config file using `plugins` property. +UI also provides option to show custom plugins for displaying custom HTML pages or HTTP services in an iframe. Such plugins can be listed in the config file using `plugins` property. Example for adding custom plugins: .. parsed-literal:: From 6659009be779ca097a5e77b28c1906e83ae26199 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 10 May 2021 15:11:05 +0530 Subject: [PATCH 07/11] change configuration file path Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index 078633b31a..f3a3da291c 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -181,7 +181,7 @@ new, unique value. Basic UI Customization ~~~~~~~~~~~~~~~~~~~~~~ -Users can now customize the CloudStack's user interface by means of a configuration file at /usr/share/cloudstack-management/webapp/config.json which can be used to modify the theme, logos, etc. to align to one's requirement. +Users can customize the CloudStack's user interface by means of a configuration file at /etc/cloudstack/management/config.json which can be used to modify the theme, logos, etc. to align to one's requirement. To change the logo, login banner, error page icon, etc. the following details can be edited in config.json: From 5c3b59efd7030b5662cd92ca24619b76ef988d02 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 11 May 2021 13:32:12 +0530 Subject: [PATCH 08/11] list docHelp suffixes Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 121 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index f3a3da291c..940802ca60 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -287,6 +287,127 @@ Some assorted primary theme colours: Contextual help documentation URLs can be customized with the help of `docBase` and `docHelpMappings` properties. To override a particular documentation URL, a mapping can be added for the URL path in the config. A documentation URL is formed by combining the `docBase` URL base and a path set in the source code. Adding a mapping for any particular path in the configuration will result in generating documetation URL with overridden path. +By default, `docHelpMappings` lists all existing documentation URL suffixes, mapped to themselves, in the configuration file that are used in the code. + +.. parsed-literal:: + + { + ... + "docHelpMappings": { + "adminguide/accounts.html": "adminguide/accounts.html", + "adminguide/accounts.html#domains": "adminguide/accounts.html#domains", + "adminguide/accounts.html#roles": "adminguide/accounts.html#roles", + "adminguide/accounts.html#users": "adminguide/accounts.html#users", + "adminguide/accounts.html#using-an-ldap-server-for-user-authentication": "adminguide/accounts.html#using-an-ldap-server-for-user-authentication", + "adminguide/events.html": "adminguide/events.html", + "adminguide/events.html#deleting-and-archiving-events-and-alerts": "adminguide/events.html#deleting-and-archiving-events-and-alerts", + "adminguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters": "adminguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters", + "adminguide/hosts.html#kvm-rolling-maintenance": "adminguide/hosts.html#kvm-rolling-maintenance", + "adminguide/hosts.html#maintaining-hypervisors-on-hosts": "adminguide/hosts.html#maintaining-hypervisors-on-hosts", + "adminguide/hosts.html#out-of-band-management": "adminguide/hosts.html#out-of-band-management", + "adminguide/hosts.html#removing-hosts": "adminguide/hosts.html#removing-hosts", + "adminguide/installguide/configuration.html#adding-a-cluster": "adminguide/installguide/configuration.html#adding-a-cluster", + "adminguide/installguide/configuration.html#adding-a-host": "adminguide/installguide/configuration.html#adding-a-host", + "adminguide/installguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters": "adminguide/installguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters", + "adminguide/management.html#administrator-alerts": "adminguide/management.html#administrator-alerts", + "adminguide/management.html#reporting-cpu-sockets": "adminguide/management.html#reporting-cpu-sockets", + "adminguide/networking_and_traffic.html#acl-on-private-gateway": "adminguide/networking_and_traffic.html#acl-on-private-gateway", + "adminguide/networking_and_traffic.html#adding-a-private-gateway-to-a-vpc": "adminguide/networking_and_traffic.html#adding-a-private-gateway-to-a-vpc", + "adminguide/networking_and_traffic.html#adding-a-security-group": "adminguide/networking_and_traffic.html#adding-a-security-group", + "adminguide/networking_and_traffic.html#adding-a-virtual-private-cloud": "adminguide/networking_and_traffic.html#adding-a-virtual-private-cloud", + "adminguide/networking_and_traffic.html#advanced-zone-physical-network-configuration": "adminguide/networking_and_traffic.html#advanced-zone-physical-network-configuration", + "adminguide/networking_and_traffic.html#basic-zone-physical-network-configuration": "adminguide/networking_and_traffic.html#basic-zone-physical-network-configuration", + "adminguide/networking_and_traffic.html#configure-guest-traffic-in-an-advanced-zone": "adminguide/networking_and_traffic.html#configure-guest-traffic-in-an-advanced-zone", + "adminguide/networking_and_traffic.html#configuring-a-virtual-private-cloud": "adminguide/networking_and_traffic.html#configuring-a-virtual-private-cloud", + "adminguide/networking_and_traffic.html#configuring-network-access-control-list": "adminguide/networking_and_traffic.html#configuring-network-access-control-list", + "adminguide/networking_and_traffic.html#creating-acl-lists": "adminguide/networking_and_traffic.html#creating-acl-lists", + "adminguide/networking_and_traffic.html#creating-and-updating-a-vpn-customer-gateway": "adminguide/networking_and_traffic.html#creating-and-updating-a-vpn-customer-gateway", + "adminguide/networking_and_traffic.html#creating-an-internal-lb-rule": "adminguide/networking_and_traffic.html#creating-an-internal-lb-rule", + "adminguide/networking_and_traffic.html#creating-a-vpn-connection": "adminguide/networking_and_traffic.html#creating-a-vpn-connection", + "adminguide/networking_and_traffic.html#creating-a-vpn-gateway-for-the-vpc": "adminguide/networking_and_traffic.html#creating-a-vpn-gateway-for-the-vpc", + "adminguide/networking_and_traffic.html#enabling-or-disabling-static-nat": "adminguide/networking_and_traffic.html#enabling-or-disabling-static-nat", + "adminguide/networking_and_traffic.html#load-balancing-across-tiers": "adminguide/networking_and_traffic.html#load-balancing-across-tiers", + "adminguide/networking_and_traffic.html#releasing-an-ip-address-alloted-to-a-vpc": "adminguide/networking_and_traffic.html#releasing-an-ip-address-alloted-to-a-vpc", + "adminguide/networking_and_traffic.html#reserving-public-ip-addresses-and-vlans-for-accounts": "adminguide/networking_and_traffic.html#reserving-public-ip-addresses-and-vlans-for-accounts", + "adminguide/networking_and_traffic.html#restarting-and-removing-a-vpn-connection": "adminguide/networking_and_traffic.html#restarting-and-removing-a-vpn-connection", + "adminguide/networking_and_traffic.html#security-groups": "adminguide/networking_and_traffic.html#security-groups", + "adminguide/networking_and_traffic.html#setting-up-a-site-to-site-vpn-connection": "adminguide/networking_and_traffic.html#setting-up-a-site-to-site-vpn-connection", + "adminguide/networking_and_traffic.html#updating-and-removing-a-vpn-customer-gateway": "adminguide/networking_and_traffic.html#updating-and-removing-a-vpn-customer-gateway", + "adminguide/networking.html#creating-a-new-network-offering": "adminguide/networking.html#creating-a-new-network-offering", + "adminguide/networking.html#network-offerings": "adminguide/networking.html#network-offerings", + "adminguide/networking.html#network-service-providers": "adminguide/networking.html#network-service-providers", + "adminguide/projects.html": "adminguide/projects.html", + "adminguide/projects.html#accepting-a-membership-invitation": "adminguide/projects.html#accepting-a-membership-invitation", + "adminguide/projects.html#adding-project-members-from-the-ui": "adminguide/projects.html#adding-project-members-from-the-ui", + "adminguide/projects.html#creating-a-new-project": "adminguide/projects.html#creating-a-new-project", + "adminguide/projects.html#sending-project-membership-invitations": "adminguide/projects.html#sending-project-membership-invitations", + "adminguide/projects.html#suspending-or-deleting-a-project": "adminguide/projects.html#suspending-or-deleting-a-project", + "adminguide/reliability.html#ha-for-hosts": "adminguide/reliability.html#ha-for-hosts", + "adminguide/service_offerings.html#compute-and-disk-service-offerings": "adminguide/service_offerings.html#compute-and-disk-service-offerings", + "adminguide/service_offerings.html#creating-a-new-compute-offering": "adminguide/service_offerings.html#creating-a-new-compute-offering", + "adminguide/service_offerings.html#creating-a-new-disk-offering": "adminguide/service_offerings.html#creating-a-new-disk-offering", + "adminguide/service_offerings.html#creating-a-new-system-service-offering": "adminguide/service_offerings.html#creating-a-new-system-service-offering", + "adminguide/service_offerings.html#modifying-or-deleting-a-service-offering": "adminguide/service_offerings.html#modifying-or-deleting-a-service-offering", + "adminguide/service_offerings.html#system-service-offerings": "adminguide/service_offerings.html#system-service-offerings", + "adminguide/storage.html#creating-a-new-volume": "adminguide/storage.html#creating-a-new-volume", + "adminguide/storage.html#id2": "adminguide/storage.html#id2", + "adminguide/storage.html#primary-storage": "adminguide/storage.html#primary-storage", + "adminguide/storage.html#resizing-volumes": "adminguide/storage.html#resizing-volumes", + "adminguide/storage.html#secondary-storage": "adminguide/storage.html#secondary-storage", + "adminguide/storage.html#uploading-an-existing-volume-to-a-virtual-machine": "adminguide/storage.html#uploading-an-existing-volume-to-a-virtual-machine", + "adminguide/storage.html#working-with-volumes": "adminguide/storage.html#working-with-volumes", + "adminguide/storage.html#working-with-volume-snapshots": "adminguide/storage.html#working-with-volume-snapshots", + "adminguide/systemvm.html": "adminguide/systemvm.html", + "adminguide/systemvm.html#upgrading-virtual-routers": "adminguide/systemvm.html#upgrading-virtual-routers", + "adminguide/systemvm.html#virtual-router": "adminguide/systemvm.html#virtual-router", + "adminguide/templates.html": "adminguide/templates.html", + "adminguide/templates.html#attaching-an-iso-to-a-vm": "adminguide/templates.html#attaching-an-iso-to-a-vm", + "adminguide/templates.html#exporting-templates": "adminguide/templates.html#exporting-templates", + "adminguide/templates.html#id10": "adminguide/templates.html#id10", + "adminguide/templates.html#sharing-templates-with-other-accounts-projects": "adminguide/templates.html#sharing-templates-with-other-accounts-projects", + "adminguide/templates.html#uploading-templates-and-isos-from-a-local-computer": "adminguide/templates.html#uploading-templates-and-isos-from-a-local-computer", + "adminguide/templates.html#uploading-templates-from-a-remote-http-server": "adminguide/templates.html#uploading-templates-from-a-remote-http-server", + "adminguide/templates.html#working-with-isos": "adminguide/templates.html#working-with-isos", + "adminguide/virtual_machines.html": "adminguide/virtual_machines.html", + "adminguide/virtual_machines.html#affinity-groups": "adminguide/virtual_machines.html#affinity-groups", + "adminguide/virtual_machines.html#backup-offerings": "adminguide/virtual_machines.html#backup-offerings", + "adminguide/virtual_machines.html#change-affinity-group-for-an-existing-vm": "adminguide/virtual_machines.html#change-affinity-group-for-an-existing-vm", + "adminguide/virtual_machines.html#changing-the-vm-name-os-or-group": "adminguide/virtual_machines.html#changing-the-vm-name-os-or-group", + "adminguide/virtual_machines.html#creating-a-new-affinity-group": "adminguide/virtual_machines.html#creating-a-new-affinity-group", + "adminguide/virtual_machines.html#creating-the-ssh-keypair": "adminguide/virtual_machines.html#creating-the-ssh-keypair", + "adminguide/virtual_machines.html#creating-vm-backups": "adminguide/virtual_machines.html#creating-vm-backups", + "adminguide/virtual_machines.html#creating-vms": "adminguide/virtual_machines.html#creating-vms", + "adminguide/virtual_machines.html#delete-an-affinity-group": "adminguide/virtual_machines.html#delete-an-affinity-group", + "adminguide/virtual_machines.html#deleting-vms": "adminguide/virtual_machines.html#deleting-vms", + "adminguide/virtual_machines.html#how-to-dynamically-scale-cpu-and-ram": "adminguide/virtual_machines.html#how-to-dynamically-scale-cpu-and-ram", + "adminguide/virtual_machines.html#importing-backup-offerings": "adminguide/virtual_machines.html#importing-backup-offerings", + "adminguide/virtual_machines.html#moving-vms-between-hosts-manual-live-migration": "adminguide/virtual_machines.html#moving-vms-between-hosts-manual-live-migration", + "adminguide/virtual_machines.html#resetting-ssh-keys": "adminguide/virtual_machines.html#resetting-ssh-keys", + "adminguide/virtual_machines.html#restoring-vm-backups": "adminguide/virtual_machines.html#restoring-vm-backups", + "adminguide/virtual_machines.html#stopping-and-starting-vms": "adminguide/virtual_machines.html#stopping-and-starting-vms", + "adminguide/virtual_machines.html#using-ssh-keys-for-authentication": "adminguide/virtual_machines.html#using-ssh-keys-for-authentication", + "adminguide/virtual_machines.html#virtual-machine-snapshots": "adminguide/virtual_machines.html#virtual-machine-snapshots", + "installguide/configuration.html#adding-a-pod": "installguide/configuration.html#adding-a-pod", + "installguide/configuration.html#adding-a-zone": "installguide/configuration.html#adding-a-zone", + "installguide/configuration.html#add-primary-storage": "installguide/configuration.html#add-primary-storage", + "installguide/configuration.html#add-secondary-storage": "installguide/configuration.html#add-secondary-storage", + "plugins/cloudian-connector.html": "plugins/cloudian-connector.html", + "plugins/cloudstack-kubernetes-service.html": "plugins/cloudstack-kubernetes-service.html", + "plugins/cloudstack-kubernetes-service.html#creating-a-new-kubernetes-cluster": "plugins/cloudstack-kubernetes-service.html#creating-a-new-kubernetes-cluster", + "plugins/cloudstack-kubernetes-service.html#deleting-kubernetes-cluster": "plugins/cloudstack-kubernetes-service.html#deleting-kubernetes-cluster", + "plugins/cloudstack-kubernetes-service.html#kubernetes-supported-versions": "plugins/cloudstack-kubernetes-service.html#kubernetes-supported-versions", + "plugins/cloudstack-kubernetes-service.html#scaling-kubernetes-cluster": "plugins/cloudstack-kubernetes-service.html#scaling-kubernetes-cluster", + "plugins/cloudstack-kubernetes-service.html#starting-a-stopped-kubernetes-cluster": "plugins/cloudstack-kubernetes-service.html#starting-a-stopped-kubernetes-cluster", + "plugins/cloudstack-kubernetes-service.html#stopping-kubernetes-cluster": "plugins/cloudstack-kubernetes-service.html#stopping-kubernetes-cluster", + "plugins/cloudstack-kubernetes-service.html#upgrading-kubernetes-cluster": "plugins/cloudstack-kubernetes-service.html#upgrading-kubernetes-cluster", + "plugins/nuage-plugin.html?#optional-create-and-enable-vpc-offering": "plugins/nuage-plugin.html?#optional-create-and-enable-vpc-offering", + "plugins/nuage-plugin.html?#vpc-offerings": "plugins/nuage-plugin.html?#vpc-offerings", + "plugins/quota.html": "plugins/quota.html", + "plugins/quota.html#quota-credits": "plugins/quota.html#quota-credits", + "plugins/quota.html#quota-tariff": "plugins/quota.html#quota-tariff" + }, + ... + } Below example shows configuration changes for custom documentation help URLs: From a95d21add061b317accb1b04420c4769362e1e3b Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 11 May 2021 13:48:24 +0530 Subject: [PATCH 09/11] fix Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index 940802ca60..1439cce46c 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -454,8 +454,8 @@ For displaying a custom HTML in the plugin, HTML file can be stored in the Cloud |ui-custom-plugin.png| -Advanced Customisation -~~~~~~~~~~~~~~~~~~~~~~ +Advanced UI Customisation +~~~~~~~~~~~~~~~~~~~~~~~~~ The advanced UI customisation is possible only by changing JavaScript based config files which define rules for sections, names, icons, actions and components and by From 3dd9e06bef4fed7ab6d7ff5a12ac2771b7a07b54 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 21 May 2021 11:30:01 +0530 Subject: [PATCH 10/11] unsupported features comment Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index 1439cce46c..c85989ee9b 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -476,9 +476,8 @@ Useful documentations: Known Limitations ~~~~~~~~~~~~~~~~~ -The following features are no longer supported or available: +The following features are no longer supported or available in the UI but are still supported at the API level: -- Deployment of a basic zone is not supported. However, existing basic zones will continue to be supported as well as all the actions and views of various resources within the existing basic zone. - Support for S3 based secondary storage. - NFS secondary staging storage list/resource view and add/update actions. - SSL certificate for Guest network LB rule. From b36e4f64f528ddef4f38b2ea68e72a4609d59770 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 21 May 2021 11:38:26 +0530 Subject: [PATCH 11/11] edit Signed-off-by: Abhishek Kumar --- source/adminguide/ui.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/adminguide/ui.rst b/source/adminguide/ui.rst index c85989ee9b..5f8594b015 100644 --- a/source/adminguide/ui.rst +++ b/source/adminguide/ui.rst @@ -476,7 +476,7 @@ Useful documentations: Known Limitations ~~~~~~~~~~~~~~~~~ -The following features are no longer supported or available in the UI but are still supported at the API level: +The following features are no longer supported or available in the UI but are still supported at the API level and in the legacy UI: - Support for S3 based secondary storage. - NFS secondary staging storage list/resource view and add/update actions.