BryanMLima opened a new pull request, #8942:
URL: https://github.com/apache/cloudstack/pull/8942

   ### Description
   
   #### 1. Problem description
   
   Currently ACS allows the GUI personalization (color changing, add a 
personalized logo, and so on); however, those configurations are set for the 
whole environment, which does not allow Apache CloudStack to have a 
personalized GUI by domain, account and so on. In a scenario of cloud providers 
reselling the infrastructure, the current behavior does not allow the operators 
to personalize the GUI for each use case (reseller, domain, account, and so on).
   
   #### 2. Proposed Changes
   
   This spec introduces the concept of Runtime White Label to the Apache 
CloudStack GUI, which combines the market concept of White Label and enables it 
to be configured in runtime and by scope (domain, account, and so on). Briefly, 
we will introduce APIs to allow the operators to define GUI themes for a set of 
Internet common names (fixed or wildcard), a set of ACS domain UUIDs (also 
known as ID for the end-user), and a set of ACS account UUIDs (also known as ID 
for the end-user). The APIs will receive the CSS and JSON configuration as 
parameter and will store them into the database. When accessing Apache 
CloudStack, the UI will retrieve the CSS and JSON configurations according to 
the access definition and import them into the browser. If there are no themes 
match, the GUI will fallback to the current environment configuration.
   
   Operations that create/modify/remove the themes will be registered with 
events in ACS.
   
   ##### 2.1. Database model
   
   A table named `gui_themes` will be created in the `cloud` schema and will 
have the following columns:
   
   | Name | Type | Nullable | Default | Description |
   | ------ | ------ | ------ | ------ | ------ |
   | id | bigint(20) unsigned | No | Auto increment | - |
   | uuid | varchar(40) | No | null | - |
   | name | varchar(2048) | No | null | A name to identify the theme. |
   | description | varchar(4096) | Yes | null | A description for the theme. |
   | css | text | Yes | null | The CSS to be retrieved and imported into the 
GUI when matching the theme access configurations. |
   
   
   | Name | Type | Nullable | Default | Description |
   | ------ | ------ | ------ | ------ | ------ |
   | json_configuration | text | Yes | null | The JSON with the configurations 
to be retrieved and imported into the GUI when matching the theme access 
configurations.
   | common_names | text | Yes | null | A set of Internet common names (fixed 
or wildcard) separated by comma that can use the theme; e.g.: 
`*acme.com,acme2.com`. |
   | domain_uuids | text | Yes | null | A set of \[ACS\] domain IDs separated 
by comma that can use the theme.
   | account_uuids | text | Yes | null | A set of \[ACS\] account IDs separated 
by comma that can use the theme |
   | is_public | boolean | Yes | true | Defines whether a theme can be 
retrieved by anyone when only the `common_names` is informed. If the 
`domain_uuids` or `account_uuids` is informed, it is considered as `false`. |
   | created | datetime | No | null | When the theme was created. |
   | removed | datetime | Yes | null | When the theme was removed. |
   
   ##### 2.2. APIs
   
   Right below there are the descriptions of the APIs to be introduced to allow 
the management of GUI themes by scope.
   
   ###### 2.2.1. createGuiTheme
   
   The API `createGuiTheme` will be accessible only by the operators (Root 
Admin accounts) and will allow them to create themes for several scopes. It 
will have the following parameters:
   
   | Parameter | Description | Mandatory | Type | Default value | Length |
   | ------ | ------ | ------ | ------ | ------ | ------ |
   | name | A name to identify the theme. | Yes | String | null | 2048 |
   | description | A description for the theme. | No | String | null | 4096 |
   
   
   | Parameter | Description | Mandatory | Type | Default value | Length |
   | ------ | ------ | ------ | ------ | ------ | ------ |
   | css | The CSS to be retrieved and imported into the GUI when matching the 
theme access configurations. | No | String | null | 65535 |
   | jsonconfiguration | The JSON with the configurations to be retrieved and 
imported into the GUI when matching the theme access configurations. More 
details about the JSON configurations can be found in the <a 
href="#json-configurations" class="internal-link">JSON Configurations</a> 
session. | No | String | null | 65535 |
   | commonnames | A set of Internet common names (fixed or wildcard) separated 
by comma that can retrieve the theme; e.g.: `*acme.com,acme2.com` | No | String 
| null | 65535 |
   | domainids | A set of \[ACS\] domain UUIDs (also known as ID for the 
end-user) separated by comma that can retrieve the theme. | No | String | null 
| 65535 |
   | accountids | A set of \[ACS\] account UUIDs (also known as ID for the 
end-user) separated by comma that can retrieve the theme | No | String | null | 
65535 |
   | ispublic | Defines whether a theme can be retrieved by anyone when only 
the `domainnames` is informed. If the `domainids` or `accountids` is informed, 
it is considered as `false`. | No | Boolean | true | - |
   
   Either `css` or `jsonconfiguration` parameter must be informed for the GUI 
theme creation. If neither `commonnames`, `domainids`, and `accountids` is 
defined, the theme will be considered as the default; there can exist only one 
default theme and it automatically will be public. If there are no themes 
match, the GUI will fallback to the current environment configuration.
   
   ###### 2.2.2. listGuiThemes
   
   The API `listGuiThemes` will be accessible by anyone and will retrieve the 
themes according to the parameters and the caller access. It will have the 
following parameters:
   
   | Parameter | Description | Mandatory | Type | Default value | Length |
   | ------ | ------ | ------ | ------ | ------ | ------ |
   | id | The theme ID. | No | String | null | 40 |
   | name | The name of the theme. | No | String | null | 2048 |
   | commonname | The Internet common name to be filtered. | No | String | null 
| 256 |
   | domainid | The UUID (also known as ID for the end-user) of the domain to 
be filtered. | No | String | null | 40 |
   | accountid | The UUID (also known as ID for the end-user) of the account to 
be filtered. | No | String | null | 40 |
   | listall | Whether to list all themes. | No | Boolean | false | - |
   | listremoved | Whether to list removed themes. | No | Boolean | false | - |
   | ispublic | Whether to list public themes. By default, it lists them all. | 
No | Boolean | null | - |
   | listonlydefaulttheme | Whether to list only the default theme. If this 
parameter is `true`, than all other parameters are ignored. | No | Boolean | 
false | - |
   
   In order to allow the theme to be displayed yet in the login web page, it 
will be possible to call this API without authentication; however, there will 
be limitations and all the parameters will be ignored. An unauthenticated call 
to the API `listGuiThemes` will retrieve no entry or only a single entry; the 
single entry will be the default theme or the public, most recently, and active 
theme that matches the Internet common name requesting the API.
   
   ###### 2.2.3. updateGuiTheme
   
   The API `updateGuiTheme` will be accessible only by the operators (Root 
Admin accounts) and will allow them to update a theme. It will have the 
following parameters:
   
   | Parameter | Description | Mandatory | Type | Default value | Length |
   | ------ | ------ | ------ | ------ | ------ | ------ |
   | id | The ID of the theme to be updated. | Yes | String | null | 40 |
   | name | A name to identify the theme. | No | String | null | 2048 |
   | description | A description for the theme. | No | String | null | 4096 |
   | css | The CSS to be retrieved and imported into the GUI when matching the 
theme access configurations. | No | String | null | 65535 |
   | jsonconfiguration | The JSON with the configurations to be retrieved and 
imported into the GUI when matching the theme access configurations. More 
details about the JSON configurations can be found in the <a 
href="#json-configurations" class="internal-link">JSON Configurations</a> 
session. | No | String | null | 65535 |
   | commonnames | A set of Internet common names (fixed or wildcard) separated 
by comma that can retrieve the theme; e.g.: `*acme.com,acme2.com` | No | String 
| null | 65535 |
   | domainids | A set of \[ACS\] domain UUIDs (also known as ID for the 
end-user) separated by comma that can retrieve the theme. | No | String | null 
| 65535 |
   | accountids | A set of \[ACS\] account UUIDs (also known as ID for the 
end-user) separated by comma that can retrieve the theme | No | String | null | 
65535 |
   | ispublic | Defines whether a theme can be retrieved by anyone when only 
the `domainnames` is informed. If the `domainids` or `accountids` is informed, 
it is considered as `false`. | No | Boolean | null | - |
   
   By default, all the parameters are `null`; therefore, to remove one of the 
parameters, it will be necessary to explicitly pass it as an empty string. If 
`commonnames`, `domainids`, and `accountids` are passed as empty, the theme 
will be considered as the default; there can exist only one default theme and 
it automatically will be public. If there are no themes match, the GUI will 
fallback to the current environment configuration.
   
   ###### 2.2.4. removeGuiTheme
   
   The API `removeGuiTheme` will be accessible only by the operators (Root 
Admin accounts) and will allow them to remove a theme. It will have the 
following parameter:
   
   | Parameter | Description | Mandatory | Type | Default value | Length |
   | ------ | ------ | ------ | ------ | ------ | ------ |
   | id | The UUID (also known as ID for the end-user) of the theme to be 
removed. | Yes | String | null | 40 |
   
   If the default theme is removed and there is no match to a theme access 
configuration, the GUI will fallback to the current environment configuration.
   
   ##### 3.0. Future works
   
   With this proposal, it will be only possible to manage the themes via API; 
for the future, we plan to add support for the themes management on the GUI. We 
will extend the feature to comply with projects, identity federation and 
domains change. Also, we will extend the feature to allow domain admins and 
users to manage their own themes.
   
   ### Types of changes
   
   - [ ] Breaking change (fix or feature that would cause existing 
functionality to change)
   - [x] New feature (non-breaking change which adds functionality)
   - [ ] Bug fix (non-breaking change which fixes an issue)
   - [ ] Enhancement (improves an existing feature and functionality)
   - [ ] Cleanup (Code refactoring and cleanup, that may add test cases)
   - [ ] build/CI
   
   ### Feature/Enhancement Scale or Bug Severity
   
   #### Feature/Enhancement Scale
   
   - [x] Major
   - [ ] Minor
   
   ### Screenshots (if appropriate):
   
   There were two themes added with this PR: Dark theme and Apache Foundation 
theme. They can be used by anyone using the `createGuiTheme` API. They serve 
only to demonstrate the usage of this new feature, as presented in the 
screenshots below:
   
   - Apache theme:  
    
   
![image](https://github.com/apache/cloudstack/assets/42067040/da617c2c-6546-4ef0-ab55-0701bdc86b54)
   
   
![image](https://github.com/apache/cloudstack/assets/42067040/444120dd-3c7c-4174-8fed-69286590c1bb)
   
   Dark theme:
   
   
![image](https://github.com/apache/cloudstack/assets/42067040/ce8ac566-47c3-48fe-b0fd-13e97a230fd1)
   
   
![image](https://github.com/apache/cloudstack/assets/42067040/95eb7aee-f91f-4db3-8951-c401887a88ca)
   
   ### How Has This Been Tested?
   
   I created multiple themes for specific accounts, domains and common names; 
they were correctly assigned.
   
   #### How did you try to break this feature and the system with this change?
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to