@cloud-ru/uikit-product-calculator 0.33.3

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.
Files changed (205) hide show
  1. package/CHANGELOG.md +1508 -0
  2. package/LICENSE +201 -0
  3. package/README.md +85 -0
  4. package/package.json +75 -0
  5. package/src/components/Calculator/Calculator.tsx +79 -0
  6. package/src/components/Calculator/index.ts +1 -0
  7. package/src/components/CalculatorContent/CalculatorContent.tsx +38 -0
  8. package/src/components/CalculatorContent/index.ts +1 -0
  9. package/src/components/CalculatorContent/styles.module.scss +79 -0
  10. package/src/components/Catalog/Catalog.tsx +225 -0
  11. package/src/components/Catalog/components/PrivateCardHeader.tsx +63 -0
  12. package/src/components/Catalog/components/index.ts +1 -0
  13. package/src/components/Catalog/components/styles.module.scss +35 -0
  14. package/src/components/Catalog/index.ts +1 -0
  15. package/src/components/Catalog/styles.module.scss +104 -0
  16. package/src/components/Controls/AlertControl/AlertControl.tsx +44 -0
  17. package/src/components/Controls/AlertControl/index.ts +1 -0
  18. package/src/components/Controls/ArrayControl/ArrayControl.tsx +105 -0
  19. package/src/components/Controls/ArrayControl/index.ts +1 -0
  20. package/src/components/Controls/ArrayControl/styles.module.scss +33 -0
  21. package/src/components/Controls/CarouselControl/CarouselControl.tsx +173 -0
  22. package/src/components/Controls/CarouselControl/index.ts +1 -0
  23. package/src/components/Controls/CarouselControl/styles.module.scss +32 -0
  24. package/src/components/Controls/Control/Control.tsx +205 -0
  25. package/src/components/Controls/Control/index.ts +1 -0
  26. package/src/components/Controls/ObjectControl/ObjectControl.tsx +150 -0
  27. package/src/components/Controls/ObjectControl/index.ts +1 -0
  28. package/src/components/Controls/ObjectControl/styles.module.scss +18 -0
  29. package/src/components/Controls/ObjectDecorator/ObjectDecorator.tsx +23 -0
  30. package/src/components/Controls/ObjectDecorator/index.ts +1 -0
  31. package/src/components/Controls/ObjectDecorator/styles.module.scss +15 -0
  32. package/src/components/Controls/SegmentedControl/SegmentedControl.tsx +79 -0
  33. package/src/components/Controls/SegmentedControl/SegmentedControlCard.tsx +38 -0
  34. package/src/components/Controls/SegmentedControl/index.ts +1 -0
  35. package/src/components/Controls/SegmentedControl/styles.module.scss +8 -0
  36. package/src/components/Controls/SelectControl/SelectControl.tsx +172 -0
  37. package/src/components/Controls/SelectControl/index.ts +1 -0
  38. package/src/components/Controls/SelectControl/styles.module.scss +5 -0
  39. package/src/components/Controls/SliderControl/SliderControl.tsx +92 -0
  40. package/src/components/Controls/SliderControl/index.ts +1 -0
  41. package/src/components/Controls/StepperControl/StepperControl.tsx +160 -0
  42. package/src/components/Controls/StepperControl/index.ts +1 -0
  43. package/src/components/Controls/StepperControl/styles.module.scss +16 -0
  44. package/src/components/Controls/TableControl/TableControl.tsx +162 -0
  45. package/src/components/Controls/TableControl/helperComponents/StepperWithAllowedValues.tsx +50 -0
  46. package/src/components/Controls/TableControl/helperComponents/index.ts +1 -0
  47. package/src/components/Controls/TableControl/helperComponents/styles.module.scss +53 -0
  48. package/src/components/Controls/TableControl/index.ts +1 -0
  49. package/src/components/Controls/TableControl/styles.module.scss +104 -0
  50. package/src/components/Controls/ToggleCard/ToggleCard.tsx +46 -0
  51. package/src/components/Controls/ToggleCard/index.ts +1 -0
  52. package/src/components/Controls/ToggleCard/styles.module.scss +11 -0
  53. package/src/components/Controls/ToggleCardsControl/ToggleCardsControl.tsx +93 -0
  54. package/src/components/Controls/ToggleCardsControl/index.ts +1 -0
  55. package/src/components/Controls/ToggleCardsControl/styles.module.scss +40 -0
  56. package/src/components/Controls/ToggleControl/ToggleControl.tsx +59 -0
  57. package/src/components/Controls/ToggleControl/components/SwitchRow.tsx +98 -0
  58. package/src/components/Controls/ToggleControl/components/index.ts +1 -0
  59. package/src/components/Controls/ToggleControl/components/styles.module.scss +110 -0
  60. package/src/components/Controls/ToggleControl/index.ts +1 -0
  61. package/src/components/Controls/ToggleObjectControl/ToggleObjectControl.tsx +111 -0
  62. package/src/components/Controls/ToggleObjectControl/index.ts +1 -0
  63. package/src/components/Controls/ToggleObjectControl/styles.module.scss +13 -0
  64. package/src/components/Controls/constants.ts +16 -0
  65. package/src/components/Controls/index.tsx +26 -0
  66. package/src/components/Controls/types.ts +181 -0
  67. package/src/components/Controls/utils.ts +49 -0
  68. package/src/components/Disclaimer/Disclaimer.tsx +33 -0
  69. package/src/components/Disclaimer/index.ts +1 -0
  70. package/src/components/Disclaimer/styles.module.scss +14 -0
  71. package/src/components/HeaderContainer/index.tsx +32 -0
  72. package/src/components/HeaderContainer/styles.module.scss +24 -0
  73. package/src/components/PriceSummary/PriceSummary.tsx +158 -0
  74. package/src/components/PriceSummary/components/PricePeriodSelect/PricePeriodSelect.tsx +81 -0
  75. package/src/components/PriceSummary/components/PricePeriodSelect/index.ts +1 -0
  76. package/src/components/PriceSummary/components/ProductCard/ProductCard.tsx +85 -0
  77. package/src/components/PriceSummary/components/ProductCard/index.ts +1 -0
  78. package/src/components/PriceSummary/components/ProductCard/styles.module.scss +7 -0
  79. package/src/components/PriceSummary/components/ProductListActions/ProductListActions.tsx +118 -0
  80. package/src/components/PriceSummary/components/ProductListActions/index.ts +1 -0
  81. package/src/components/PriceSummary/components/ProductListActions/styles.module.scss +38 -0
  82. package/src/components/PriceSummary/components/index.ts +3 -0
  83. package/src/components/PriceSummary/hooks.ts +36 -0
  84. package/src/components/PriceSummary/index.ts +1 -0
  85. package/src/components/PriceSummary/styles.module.scss +110 -0
  86. package/src/components/PriceSummary/utils/getTotalPrice.ts +19 -0
  87. package/src/components/PriceSummary/utils/index.ts +2 -0
  88. package/src/components/PriceSummary/utils/transformToProductCardData.ts +36 -0
  89. package/src/components/ProductHeadline/ProductPageHeadline.tsx +134 -0
  90. package/src/components/ProductHeadline/components/PriceCount.tsx +93 -0
  91. package/src/components/ProductHeadline/components/index.ts +1 -0
  92. package/src/components/ProductHeadline/components/styles.module.scss +52 -0
  93. package/src/components/ProductHeadline/index.ts +1 -0
  94. package/src/components/ProductHeadline/styles.module.scss +32 -0
  95. package/src/components/ProductPage/ProductPage.tsx +105 -0
  96. package/src/components/ProductPage/index.ts +1 -0
  97. package/src/components/ProductPage/styles.module.scss +13 -0
  98. package/src/components/Welcome/Welcome.tsx +138 -0
  99. package/src/components/Welcome/index.ts +1 -0
  100. package/src/components/Welcome/styles.module.scss +155 -0
  101. package/src/components/index.ts +3 -0
  102. package/src/config/config.tsx +27 -0
  103. package/src/config/index.ts +2 -0
  104. package/src/config/platforms/advanced/catalog.ts +82 -0
  105. package/src/config/platforms/advanced/constants.ts +23 -0
  106. package/src/config/platforms/advanced/index.ts +5 -0
  107. package/src/config/platforms/advanced/platform.tsx +13 -0
  108. package/src/config/platforms/advanced/product-config/AdvancedCloudBackup.ts +76 -0
  109. package/src/config/platforms/advanced/product-config/AdvancedCloudContainerEngine.tsx +260 -0
  110. package/src/config/platforms/advanced/product-config/AdvancedCloudServer.tsx +526 -0
  111. package/src/config/platforms/advanced/product-config/AdvancedDataAsYouUse.ts +159 -0
  112. package/src/config/platforms/advanced/product-config/AdvancedDataLakeInsight.ts +134 -0
  113. package/src/config/platforms/advanced/product-config/AdvancedDataWarehouseService.ts +94 -0
  114. package/src/config/platforms/advanced/product-config/AdvancedDcsMemcached.ts +69 -0
  115. package/src/config/platforms/advanced/product-config/AdvancedDcsRedis.ts +220 -0
  116. package/src/config/platforms/advanced/product-config/AdvancedDmsKafka.tsx +186 -0
  117. package/src/config/platforms/advanced/product-config/AdvancedDmsRabbitMq.ts +202 -0
  118. package/src/config/platforms/advanced/product-config/AdvancedDocumentDatabase.tsx +323 -0
  119. package/src/config/platforms/advanced/product-config/AdvancedElasticLoadBalance.tsx +252 -0
  120. package/src/config/platforms/advanced/product-config/AdvancedElasticSearch.ts +365 -0
  121. package/src/config/platforms/advanced/product-config/AdvancedFunctionGraph.tsx +65 -0
  122. package/src/config/platforms/advanced/product-config/AdvancedMapReduce.tsx +394 -0
  123. package/src/config/platforms/advanced/product-config/AdvancedMySqlDataBase.ts +417 -0
  124. package/src/config/platforms/advanced/product-config/AdvancedNetwork.ts +146 -0
  125. package/src/config/platforms/advanced/product-config/AdvancedObjectStorage.ts +232 -0
  126. package/src/config/platforms/advanced/product-config/AdvancedPostgreSqlDatabase.ts +402 -0
  127. package/src/config/platforms/advanced/product-config/AdvancedScalableFile.tsx +161 -0
  128. package/src/config/platforms/advanced/product-config/AdvancedSqlDatabase.ts +380 -0
  129. package/src/config/platforms/advanced/product-config/index.ts +21 -0
  130. package/src/config/platforms/advanced/products.ts +267 -0
  131. package/src/config/platforms/evolution/catalog.tsx +107 -0
  132. package/src/config/platforms/evolution/constants.ts +80 -0
  133. package/src/config/platforms/evolution/index.ts +5 -0
  134. package/src/config/platforms/evolution/platform.tsx +13 -0
  135. package/src/config/platforms/evolution/product-config/EvolutionArenadataDb.ts +151 -0
  136. package/src/config/platforms/evolution/product-config/EvolutionArtifactRegistry.ts +57 -0
  137. package/src/config/platforms/evolution/product-config/EvolutionBareMetal.tsx +172 -0
  138. package/src/config/platforms/evolution/product-config/EvolutionCloudServer.tsx +407 -0
  139. package/src/config/platforms/evolution/product-config/EvolutionCloudServerFreeTier.tsx +185 -0
  140. package/src/config/platforms/evolution/product-config/EvolutionCloudServerGpu.tsx +301 -0
  141. package/src/config/platforms/evolution/product-config/EvolutionContainerApps.ts +84 -0
  142. package/src/config/platforms/evolution/product-config/EvolutionContainerAppsFreeTier.ts +29 -0
  143. package/src/config/platforms/evolution/product-config/EvolutionKubernetes.ts +388 -0
  144. package/src/config/platforms/evolution/product-config/EvolutionManagedMetastore.ts +38 -0
  145. package/src/config/platforms/evolution/product-config/EvolutionManagedRedis.ts +161 -0
  146. package/src/config/platforms/evolution/product-config/EvolutionManagedSpark.ts +360 -0
  147. package/src/config/platforms/evolution/product-config/EvolutionManagedTrino.ts +53 -0
  148. package/src/config/platforms/evolution/product-config/EvolutionMlInference.tsx +703 -0
  149. package/src/config/platforms/evolution/product-config/EvolutionPostgreSql.ts +217 -0
  150. package/src/config/platforms/evolution/product-config/EvolutionPublicIp.ts +39 -0
  151. package/src/config/platforms/evolution/product-config/EvolutionSnatGateway.ts +22 -0
  152. package/src/config/platforms/evolution/product-config/EvolutionStorageS3.ts +223 -0
  153. package/src/config/platforms/evolution/product-config/EvolutionStorageS3FreeTier.ts +97 -0
  154. package/src/config/platforms/evolution/product-config/index.ts +17 -0
  155. package/src/config/platforms/evolution/products.ts +260 -0
  156. package/src/config/platforms/index.ts +3 -0
  157. package/src/config/platforms/vmware/catalog.ts +19 -0
  158. package/src/config/platforms/vmware/constants.ts +6 -0
  159. package/src/config/platforms/vmware/index.ts +5 -0
  160. package/src/config/platforms/vmware/platform.tsx +13 -0
  161. package/src/config/platforms/vmware/product-config/VmWareCloudBackup.ts +56 -0
  162. package/src/config/platforms/vmware/product-config/VmWareVirtualDataCenter.ts +309 -0
  163. package/src/config/platforms/vmware/product-config/VmWareVirtualMachinesBackup.ts +58 -0
  164. package/src/config/platforms/vmware/product-config/VmWareVirtualWorkspaces.tsx +210 -0
  165. package/src/config/platforms/vmware/product-config/index.ts +4 -0
  166. package/src/config/platforms/vmware/products.ts +63 -0
  167. package/src/config/styles.module.scss +9 -0
  168. package/src/config/utils/disk.ts +94 -0
  169. package/src/config/utils/diskPostgreSqlMySQL.ts +94 -0
  170. package/src/config/utils/eip.ts +104 -0
  171. package/src/config/utils/index.ts +52 -0
  172. package/src/config/utils/obs.ts +100 -0
  173. package/src/constants.ts +56 -0
  174. package/src/contexts/CalculatorContext.tsx +193 -0
  175. package/src/contexts/ProductContext.ts +25 -0
  176. package/src/contexts/index.ts +2 -0
  177. package/src/hooks/index.ts +6 -0
  178. package/src/hooks/useAdaptive.ts +20 -0
  179. package/src/hooks/useCatalogCardClick.ts +37 -0
  180. package/src/hooks/useProductClick.ts +14 -0
  181. package/src/hooks/useProductDelete.ts +46 -0
  182. package/src/index.ts +6 -0
  183. package/src/services/constants.ts +5 -0
  184. package/src/services/getFetcherFn.ts +57 -0
  185. package/src/services/getInitPrice.ts +64 -0
  186. package/src/services/getOnDownloadFileClick.ts +37 -0
  187. package/src/services/getOnShareClick.ts +56 -0
  188. package/src/services/index.ts +4 -0
  189. package/src/types/CalculatorType.ts +16 -0
  190. package/src/types/CatalogConfig.ts +13 -0
  191. package/src/types/Category.ts +14 -0
  192. package/src/types/FetcherFn.ts +26 -0
  193. package/src/types/FormValues.ts +4 -0
  194. package/src/types/Platform.ts +24 -0
  195. package/src/types/Price.ts +18 -0
  196. package/src/types/Product.ts +39 -0
  197. package/src/types/ProductState.ts +11 -0
  198. package/src/types/State.ts +7 -0
  199. package/src/types/index.ts +10 -0
  200. package/src/utils/filterNonEmptyArrays.ts +13 -0
  201. package/src/utils/formatNumber.ts +5 -0
  202. package/src/utils/getPrice.ts +38 -0
  203. package/src/utils/index.ts +5 -0
  204. package/src/utils/parseKeyToDataTest.ts +14 -0
  205. package/src/utils/value.ts +11 -0
@@ -0,0 +1,134 @@
1
+ import { CONTROL, FormConfig } from '../../../../components';
2
+ import { generateCpuItems, getObs } from '../../../utils';
3
+
4
+ const resourceUsageModeItem = {
5
+ Dedicated: 'dedicated',
6
+ NonDedicated: 'nonDedicated',
7
+ };
8
+
9
+ const requestQueueTypeItem = {
10
+ Sql: 'sql',
11
+ GeneralPurpose: 'general-purpose',
12
+ };
13
+
14
+ export const DATA_LAKE_INSIGHT_FORM_CONFIG: FormConfig = {
15
+ ui: ['requestQueueType', ['resourceUsageMode', 'queryRunTime'], ['computeUnitCount'], ['obs', 'scannedDataVolume']],
16
+ controls: {
17
+ requestQueueType: {
18
+ type: CONTROL.Carousel,
19
+ accessorKey: 'requestQueueType',
20
+ defaultValue: requestQueueTypeItem.Sql,
21
+ items: [
22
+ {
23
+ value: requestQueueTypeItem.Sql,
24
+ label: 'For SQL',
25
+ description:
26
+ 'Используется стандартный SQL, Spark и Presto SQL для запроса и анализа разнородных данных из нескольких облачных служб. Задания SQL поддерживают основные форматы данных, такие как CSV, JSON, Parquet, Carbon и ORC',
27
+ },
28
+ {
29
+ value: requestQueueTypeItem.GeneralPurpose,
30
+ label: 'For General Purpose',
31
+ description:
32
+ 'Включает в себя Задания Spark и Flink. Spark предназначен для создания сеансов и заданий пакетной обработки через консоль управления. Flink предназначен для анализа потоков в реальном времени с помощью инструкций или загруженных файлов.',
33
+ },
34
+ ],
35
+ decoratorProps: {
36
+ label: 'Тип очереди запроса',
37
+ },
38
+ uiProps: {
39
+ showItems: 2,
40
+ pagination: false,
41
+ arrows: false,
42
+ },
43
+ },
44
+ resourceUsageMode: {
45
+ type: CONTROL.Segmented,
46
+ accessorKey: 'resourceUsageMode',
47
+ defaultValue: resourceUsageModeItem.Dedicated,
48
+ items: [
49
+ {
50
+ value: resourceUsageModeItem.Dedicated,
51
+ label: 'Выделенный',
52
+ },
53
+ {
54
+ value: resourceUsageModeItem.NonDedicated,
55
+ label: 'Невыделенный',
56
+ },
57
+ ],
58
+ decoratorProps: {
59
+ label: 'Режим использования ресурса',
60
+ },
61
+ },
62
+ queryRunTime: {
63
+ type: CONTROL.Stepper,
64
+ accessorKey: 'queryRunTime',
65
+ defaultValue: 0,
66
+ decoratorProps: {
67
+ label: 'Время использования ресурса',
68
+ },
69
+ uiProps: {
70
+ min: 0,
71
+ max: 10_000,
72
+ postfix: 'ч',
73
+ showHint: false,
74
+ visible: false,
75
+ },
76
+ watchedControls: { resourceUsageMode: 'resourceUsageMode' },
77
+ relateFn: ({ resourceUsageMode }) => {
78
+ if (resourceUsageModeItem.NonDedicated === resourceUsageMode) {
79
+ return {
80
+ uiProps: {
81
+ visible: true,
82
+ },
83
+ };
84
+ }
85
+ },
86
+ },
87
+ computeUnitCount: {
88
+ type: CONTROL.Segmented,
89
+ accessorKey: 'computeUnitCount',
90
+ items: generateCpuItems([16, 64, 256, 512]),
91
+ defaultValue: '16',
92
+ decoratorProps: {
93
+ label: 'Количество CU',
94
+ labelTooltip: 'CU (Compute unit) — единица тарификации, которая состоит из 1 vCPU и 4 ГБ памяти.',
95
+ },
96
+ },
97
+ scannedDataVolume: {
98
+ type: CONTROL.Stepper,
99
+ accessorKey: 'scannedDataVolume',
100
+ decoratorProps: {
101
+ label: 'Объем сканируемых данных',
102
+ },
103
+ uiProps: {
104
+ min: 0,
105
+ max: 9_999_999_999,
106
+ postfix: 'ГБ',
107
+ showHint: false,
108
+ visible: false,
109
+ },
110
+ watchedControls: { requestQueueType: 'requestQueueType' },
111
+ relateFn: ({ requestQueueType }) => {
112
+ if (requestQueueTypeItem.Sql === requestQueueType) {
113
+ return {
114
+ uiProps: {
115
+ visible: true,
116
+ },
117
+ };
118
+ }
119
+ },
120
+ },
121
+ obs: getObs({
122
+ space: {
123
+ accessorKey: 'obs.space',
124
+ defaultValue: 0,
125
+ uiProps: {
126
+ min: 0,
127
+ },
128
+ },
129
+ units: {
130
+ accessorKey: 'obs.unitsOfCalculation',
131
+ },
132
+ }),
133
+ },
134
+ };
@@ -0,0 +1,94 @@
1
+ import { CONTROL, FormConfig } from '../../../../components';
2
+ import { generateInstanceConfigItems, getDisk, getObs } from '../../../utils';
3
+
4
+ const nodeValueItems = generateInstanceConfigItems([
5
+ [4, 32],
6
+ [8, 64],
7
+ [32, 256],
8
+ [64, 512],
9
+ ]);
10
+
11
+ export const DATA_WAREHOUSE_SERVICE_FORM_CONFIG: FormConfig = {
12
+ ui: [
13
+ ['nodeValue', 'nodeCount'],
14
+ ['evs', 'obs'],
15
+ ],
16
+ controls: {
17
+ nodeValue: {
18
+ type: CONTROL.SelectSingle,
19
+ accessorKey: 'node.value',
20
+ defaultValue: nodeValueItems[0].value,
21
+ items: nodeValueItems,
22
+ decoratorProps: {
23
+ label: 'Конфигурация узла',
24
+ },
25
+ },
26
+ nodeCount: {
27
+ type: CONTROL.Stepper,
28
+ accessorKey: 'node.count',
29
+ defaultValue: 3,
30
+ decoratorProps: {
31
+ label: 'Количество узлов (нод)',
32
+ },
33
+ uiProps: {
34
+ min: 3,
35
+ max: 256,
36
+ postfix: 'Шт',
37
+ },
38
+ },
39
+ evs: getDisk({
40
+ space: {
41
+ accessorKey: 'evs.systemDisk.diskSpace',
42
+ defaultValue: 20,
43
+ label: 'Горячее хранилище',
44
+ decoratorProps: {
45
+ labelTooltip: 'Хранилище на базе сервиса EVS',
46
+ },
47
+ uiProps: {
48
+ min: 20,
49
+ max: 2_000,
50
+ },
51
+ watchedControls: { nodeValue: 'node.value' },
52
+ relateFn: ({ nodeValue }) => {
53
+ if (nodeValue === nodeValueItems[1].value) {
54
+ return {
55
+ uiProps: {
56
+ min: 100,
57
+ max: 4_000,
58
+ },
59
+ };
60
+ }
61
+ if (nodeValue === nodeValueItems[2].value) {
62
+ return {
63
+ uiProps: {
64
+ min: 100,
65
+ max: 16_000,
66
+ },
67
+ };
68
+ }
69
+ if (nodeValue === nodeValueItems[3].value) {
70
+ return {
71
+ uiProps: {
72
+ min: 100,
73
+ max: 32_000,
74
+ },
75
+ };
76
+ }
77
+ },
78
+ },
79
+ specification: {
80
+ accessorKey: 'evs.systemDisk.specification',
81
+ defaultValue: 'SSD',
82
+ uiProps: {
83
+ disabled: true,
84
+ },
85
+ },
86
+ }),
87
+ obs: getObs({
88
+ space: {
89
+ defaultValue: 1,
90
+ },
91
+ units: {},
92
+ }),
93
+ },
94
+ };
@@ -0,0 +1,69 @@
1
+ import { CONTROL, FormConfig } from '../../../../components';
2
+ import { generateRamItems, getObs } from '../../../utils';
3
+
4
+ export const DSC_MEMCACHED_FORM_CONFIG: FormConfig = {
5
+ ui: ['instanceType', ['cacheSize', 'instancesCount'], 'alert', ['obs']],
6
+ controls: {
7
+ instanceType: {
8
+ type: CONTROL.Carousel,
9
+ defaultValue: 'Master/Standby',
10
+ accessorKey: 'instanceType',
11
+ items: [
12
+ {
13
+ value: 'Master/Standby',
14
+ label: 'Master/Standby',
15
+ description:
16
+ 'Каждый экземпляр работает на двух узлах кэша - один главный (для чтения/записи данных) и один резервный (реплицирует данныев режиме реального времени и берет на себя управление в случае сбоя основного кэш-узла)',
17
+ },
18
+ {
19
+ value: 'Single-Node',
20
+ label: 'Single-Node',
21
+ description:
22
+ 'Каждый экземпляр работает только на одном узле кэша. В основном используются для временного хранения данных и не подходят для сценариев обслуживания с высокой надежностью, поддерживают интенсивные параллельные операции чтения/записи, но не обеспечивают сохранение данных',
23
+ },
24
+ ],
25
+ decoratorProps: {
26
+ label: 'Тип инстанса',
27
+ },
28
+ },
29
+ cacheSize: {
30
+ type: CONTROL.Segmented,
31
+ accessorKey: 'cacheSize',
32
+ defaultValue: '2',
33
+ items: generateRamItems([2, 4, 8, 16, 32, 64]),
34
+ decoratorProps: {
35
+ label: 'Объем кэша',
36
+ labelTooltip:
37
+ 'Брокер — это приложение, которое преобразует сообщения и выступает посредником между другими приложениями',
38
+ },
39
+ },
40
+ instancesCount: {
41
+ type: CONTROL.Stepper,
42
+ accessorKey: 'instancesCount',
43
+ defaultValue: 1,
44
+ decoratorProps: {
45
+ label: 'Количество инстансов',
46
+ },
47
+ uiProps: {
48
+ min: 1,
49
+ max: 100,
50
+ postfix: 'Шт',
51
+ },
52
+ },
53
+ alert: {
54
+ type: CONTROL.Alert,
55
+ uiProps: {
56
+ description: 'Хранилище используется под бэкапы. Рекомендуем указывать объем не меньше объема кэша',
57
+ },
58
+ accessorKey: 'backup',
59
+ },
60
+ obs: getObs({
61
+ space: {
62
+ accessorKey: 'obs.space',
63
+ },
64
+ units: {
65
+ accessorKey: 'obs.unitsOfCalculation',
66
+ },
67
+ }),
68
+ },
69
+ };
@@ -0,0 +1,220 @@
1
+ import { CONTROL, FormConfig } from '../../../../components';
2
+ import { generateCpuItems, generateRamItems, getObs } from '../../../utils';
3
+
4
+ const RedisVersionItem = {
5
+ Redis3: '3',
6
+ Redis4: '4',
7
+ Redis5: '5',
8
+ Redis6: '6',
9
+ };
10
+
11
+ const versionItems = [
12
+ {
13
+ value: RedisVersionItem.Redis3,
14
+ label: 'Redis 3.0',
15
+ },
16
+ {
17
+ value: RedisVersionItem.Redis4,
18
+ label: 'Redis 4.0',
19
+ },
20
+ {
21
+ value: RedisVersionItem.Redis5,
22
+ label: 'Redis 5.0',
23
+ },
24
+ {
25
+ value: RedisVersionItem.Redis6,
26
+ label: 'Redis 6.0',
27
+ },
28
+ ];
29
+
30
+ const InstanceTypeItem = {
31
+ MasterStandby: 'Master/Standby',
32
+ SingleNode: 'Single-Node',
33
+ ProxyCluster: 'Proxy Cluster',
34
+ RedisCluster: 'Redis Cluster',
35
+ };
36
+
37
+ const instanceTypeItemMasterStandby = {
38
+ value: InstanceTypeItem.MasterStandby,
39
+ label: 'Master/Standby',
40
+ description:
41
+ 'Каждый экземпляр работает на двух узлах кэша - один главный (для чтения/записи данных) и один резервный (реплицирует данныев режиме реального времени и берет на себя управление в случае сбоя основного кэш-узла',
42
+ };
43
+
44
+ const instanceTypeItemSingleNode = {
45
+ value: InstanceTypeItem.SingleNode,
46
+ label: 'Single-Node',
47
+ description:
48
+ 'Каждый экземпляр работает только на одном узле кэша. В основном используются для временного хранения данных и не подходят для сценариев обслуживания с высокой надежностью, поддерживают интенсивные параллельные операции чтения/записи, но не обеспечивают сохранение данных',
49
+ };
50
+
51
+ const instanceTypeItemProxyCluster = {
52
+ value: InstanceTypeItem.ProxyCluster,
53
+ label: 'Proxy Cluster',
54
+ description: 'Используется так же, как экземпляр с одним узлом. Приложения получают доступ к Redis через прокси',
55
+ };
56
+
57
+ const instanceTypeItemRedisCluster = {
58
+ value: InstanceTypeItem.RedisCluster,
59
+ label: 'Redis Cluster',
60
+ description: 'Нативная распределенная реализация Redis. Приложения подключаются через клиентов Redis Cluster',
61
+ };
62
+
63
+ const versionToInstanceTypeMap = {
64
+ [RedisVersionItem.Redis3]: [instanceTypeItemMasterStandby, instanceTypeItemSingleNode, instanceTypeItemProxyCluster],
65
+ [RedisVersionItem.Redis4]: [instanceTypeItemMasterStandby, instanceTypeItemSingleNode, instanceTypeItemRedisCluster],
66
+ [RedisVersionItem.Redis5]: [instanceTypeItemMasterStandby, instanceTypeItemSingleNode, instanceTypeItemRedisCluster],
67
+ [RedisVersionItem.Redis6]: [instanceTypeItemMasterStandby, instanceTypeItemSingleNode],
68
+ };
69
+
70
+ const versionInstanceTypeToCacheSizeMap = {
71
+ [RedisVersionItem.Redis3]: {
72
+ [InstanceTypeItem.MasterStandby]: [2, 4, 8, 16, 32, 64],
73
+ [InstanceTypeItem.SingleNode]: [2, 4, 8, 16, 32, 64],
74
+ [InstanceTypeItem.ProxyCluster]: [64, 128, 256],
75
+ },
76
+ [RedisVersionItem.Redis4]: {
77
+ [InstanceTypeItem.MasterStandby]: [1, 2, 4, 8, 16, 24, 32, 48, 64],
78
+ [InstanceTypeItem.SingleNode]: [1, 2, 4, 8, 16, 24, 32, 48, 64],
79
+ [InstanceTypeItem.RedisCluster]: [4, 8, 16, 32, 64, 128, 256],
80
+ },
81
+ [RedisVersionItem.Redis5]: {
82
+ [InstanceTypeItem.MasterStandby]: [1, 2, 4, 8, 16, 24, 32, 48, 64],
83
+ [InstanceTypeItem.SingleNode]: [1, 2, 4, 8, 16, 24, 32, 48, 64],
84
+ [InstanceTypeItem.RedisCluster]: [4, 8, 16, 32, 64, 128, 256],
85
+ },
86
+ [RedisVersionItem.Redis6]: {
87
+ [InstanceTypeItem.MasterStandby]: [1, 2, 4, 8, 16, 24, 32, 48, 64],
88
+ [InstanceTypeItem.SingleNode]: [1, 2, 4, 8, 16, 24, 32, 48, 64],
89
+ },
90
+ };
91
+
92
+ const versionInstanceTypeToReplicasCountMap = {
93
+ [RedisVersionItem.Redis3]: {
94
+ [InstanceTypeItem.MasterStandby]: [],
95
+ [InstanceTypeItem.SingleNode]: [],
96
+ [InstanceTypeItem.ProxyCluster]: [],
97
+ },
98
+ [RedisVersionItem.Redis4]: {
99
+ [InstanceTypeItem.MasterStandby]: [2, 3, 4, 5],
100
+ [InstanceTypeItem.SingleNode]: [],
101
+ [InstanceTypeItem.RedisCluster]: [1, 2, 3, 4, 5],
102
+ },
103
+ [RedisVersionItem.Redis5]: {
104
+ [InstanceTypeItem.MasterStandby]: [2, 3, 4, 5],
105
+ [InstanceTypeItem.SingleNode]: [],
106
+ [InstanceTypeItem.RedisCluster]: [1, 2, 3, 4, 5],
107
+ },
108
+ [RedisVersionItem.Redis6]: {
109
+ [InstanceTypeItem.MasterStandby]: [2],
110
+ [InstanceTypeItem.SingleNode]: [],
111
+ },
112
+ };
113
+
114
+ const cacheSizeItems = generateRamItems([2, 4, 8, 16, 32, 64]);
115
+
116
+ export const DCS_REDIS_FORM_CONFIG: FormConfig = {
117
+ ui: [['version'], 'instanceType', ['cacheSize', 'instancesCount'], 'obsAlert', ['replicasCount'], ['obs']],
118
+ controls: {
119
+ version: {
120
+ type: CONTROL.SelectSingle,
121
+ accessorKey: 'version',
122
+ defaultValue: RedisVersionItem.Redis3,
123
+ items: versionItems,
124
+ decoratorProps: {
125
+ label: 'Версия',
126
+ labelTooltip: `Экземпляры Redis версии 3.0 разворачиваются на виртуальных машинах за несколько минут, а версии 4.0, 5.0 и 6.0 — в контейнерах за несколько секунд.`,
127
+ },
128
+ },
129
+ instanceType: {
130
+ type: CONTROL.Carousel,
131
+ accessorKey: 'instanceType',
132
+ items: [...versionToInstanceTypeMap[RedisVersionItem.Redis3]],
133
+ defaultValue: InstanceTypeItem.MasterStandby,
134
+ decoratorProps: { label: 'Тип инстанса' },
135
+ watchedControls: { version: 'version' },
136
+ relateFn: ({ version }) => ({ items: versionToInstanceTypeMap[version] }),
137
+ },
138
+ cacheSize: {
139
+ type: CONTROL.Segmented,
140
+ accessorKey: 'cacheSize',
141
+ defaultValue: cacheSizeItems[0].value,
142
+ items: cacheSizeItems,
143
+ decoratorProps: {
144
+ label: 'Объем кэша',
145
+ labelTooltip:
146
+ 'Брокер — это приложение, которое преобразует сообщения и выступает посредником между другими приложениями',
147
+ },
148
+ watchedControls: { version: 'version', instanceType: 'instanceType' },
149
+ relateFn: ({ version, instanceType }) => {
150
+ const items = versionInstanceTypeToCacheSizeMap[version][instanceType] || [];
151
+
152
+ return {
153
+ items: generateRamItems(items),
154
+ };
155
+ },
156
+ },
157
+ instancesCount: {
158
+ type: CONTROL.Stepper,
159
+ decoratorProps: {
160
+ label: 'Количество инстансов',
161
+ },
162
+ accessorKey: 'instancesCount',
163
+ defaultValue: 1,
164
+ uiProps: {
165
+ min: 1,
166
+ max: 100,
167
+ postfix: 'Шт',
168
+ },
169
+ },
170
+ obsAlert: {
171
+ type: CONTROL.Alert,
172
+ uiProps: {
173
+ description: 'Хранилище используется под бэкапы. Рекомендуем указывать объем не меньше объема кэша',
174
+ },
175
+ accessorKey: 'backup',
176
+ },
177
+ replicasCount: {
178
+ type: CONTROL.Segmented,
179
+ accessorKey: 'replicasCount',
180
+ defaultValue: '1',
181
+ items: generateCpuItems([1, 2, 3, 4, 5]),
182
+ decoratorProps: {
183
+ label: 'Количество реплик',
184
+ },
185
+ watchedControls: { version: 'version', instanceType: 'instanceType' },
186
+ relateFn: ({ version, instanceType }) => {
187
+ const items = versionInstanceTypeToReplicasCountMap?.[version]?.[instanceType];
188
+
189
+ if (items?.length > 0) {
190
+ return {
191
+ items: generateCpuItems(items),
192
+ uiProps: {
193
+ visible: true,
194
+ },
195
+ };
196
+ }
197
+
198
+ return {
199
+ uiProps: {
200
+ visible: false,
201
+ },
202
+ };
203
+ },
204
+ },
205
+
206
+ obs: getObs({
207
+ space: {
208
+ accessorKey: 'obs.space',
209
+ defaultValue: 0,
210
+ uiProps: {
211
+ min: 0,
212
+ max: 9_999_999_900,
213
+ },
214
+ },
215
+ units: {
216
+ accessorKey: 'obs.unitsOfCalculation',
217
+ },
218
+ }),
219
+ },
220
+ };
@@ -0,0 +1,186 @@
1
+ import { CONTROL, FormConfig } from '../../../../components';
2
+ import { formatNumber } from '../../../../utils';
3
+ import { getDisk } from '../../../utils';
4
+
5
+ enum ConfigTypeItem {
6
+ Kafka2_4 = 'kafka.2u4g.cluster',
7
+ Kafka4_8 = 'kafka.4u8g.cluster',
8
+ Kafka8_16 = 'kafka.8u16g.cluster',
9
+ Kafka12_24 = 'kafka.12u24g.cluster',
10
+ Kafka16_32 = 'kafka.16u32g.cluster',
11
+ }
12
+
13
+ const configItems = {
14
+ [ConfigTypeItem.Kafka2_4]: {
15
+ parts: '7',
16
+ partition: '250',
17
+ tps: '30000',
18
+ throughput: '100',
19
+ usersConnectionsCount: '2000',
20
+ usersGroupCount: '20',
21
+ },
22
+
23
+ [ConfigTypeItem.Kafka4_8]: {
24
+ parts: '14',
25
+ partition: '500',
26
+ tps: '100000',
27
+ throughput: '200',
28
+ usersConnectionsCount: '4000',
29
+ usersGroupCount: '100',
30
+ },
31
+
32
+ [ConfigTypeItem.Kafka8_16]: {
33
+ parts: '27',
34
+ partition: '1000',
35
+ tps: '150000',
36
+ throughput: '375',
37
+ usersConnectionsCount: '4000',
38
+ usersGroupCount: '150',
39
+ },
40
+
41
+ [ConfigTypeItem.Kafka12_24]: {
42
+ parts: '41',
43
+ partition: '1500',
44
+ tps: '200000',
45
+ throughput: '625',
46
+ usersConnectionsCount: '4000',
47
+ usersGroupCount: '200',
48
+ },
49
+
50
+ [ConfigTypeItem.Kafka16_32]: {
51
+ parts: '50',
52
+ partition: '2000',
53
+ tps: '250000',
54
+ throughput: '750',
55
+ usersConnectionsCount: '4000',
56
+ usersGroupCount: '200',
57
+ },
58
+ };
59
+
60
+ type Item = {
61
+ parts: string;
62
+ partition: string;
63
+ tps: string;
64
+ throughput: string;
65
+ usersConnectionsCount: string;
66
+ usersGroupCount: string;
67
+ };
68
+
69
+ function getDescription(configType: ConfigTypeItem) {
70
+ const rows: Item = configItems[configType];
71
+ const { parts, partition, tps, throughput, usersConnectionsCount, usersGroupCount } = rows;
72
+ return (
73
+ <>
74
+ {formatNumber(Number(parts))} частей ядра виртуального процессора <br />
75
+ {formatNumber(Number(partition))} партиций <br />
76
+ {formatNumber(Number(tps))} TPS <br />
77
+ {formatNumber(Number(throughput))} МБ/с пропускная способность <br />
78
+ {formatNumber(Number(usersConnectionsCount))} пользовательский подключений <br />
79
+ {formatNumber(Number(usersGroupCount))} пользовательских групп <br />
80
+ </>
81
+ ) as unknown as string;
82
+ }
83
+
84
+ const configTypeItems = [
85
+ {
86
+ value: ConfigTypeItem.Kafka2_4,
87
+ label: `Флейвор ${ConfigTypeItem.Kafka2_4}`,
88
+ description: getDescription(ConfigTypeItem.Kafka2_4),
89
+ },
90
+ {
91
+ value: ConfigTypeItem.Kafka4_8,
92
+ label: `Флейвор ${ConfigTypeItem.Kafka4_8}`,
93
+ description: getDescription(ConfigTypeItem.Kafka4_8),
94
+ },
95
+ {
96
+ value: ConfigTypeItem.Kafka8_16,
97
+ label: `Флейвор ${ConfigTypeItem.Kafka8_16}`,
98
+ description: getDescription(ConfigTypeItem.Kafka8_16),
99
+ },
100
+ {
101
+ value: ConfigTypeItem.Kafka12_24,
102
+ label: `Флейвор ${ConfigTypeItem.Kafka12_24}`,
103
+ description: getDescription(ConfigTypeItem.Kafka12_24),
104
+ },
105
+ {
106
+ value: ConfigTypeItem.Kafka16_32,
107
+ label: `Флейвор ${ConfigTypeItem.Kafka16_32}`,
108
+ description: getDescription(ConfigTypeItem.Kafka16_32),
109
+ },
110
+ ];
111
+
112
+ export const DMS_KAFKA_FORM_CONFIG: FormConfig = {
113
+ ui: ['configType', ['evs'], ['brokersCount']],
114
+ controls: {
115
+ configType: {
116
+ type: CONTROL.ToggleCards,
117
+ accessorKey: 'config.type',
118
+ defaultValue: ConfigTypeItem.Kafka2_4,
119
+ items: configTypeItems,
120
+ decoratorProps: {
121
+ label: 'Тип конфигурации',
122
+ labelTooltip: 'Данные конфигурации на 1 брокер в кластере',
123
+ },
124
+ onChangeFn: (value: ConfigTypeItem, setValue) => {
125
+ setValue([['config', { ...configItems[value], type: value }]]);
126
+ },
127
+ },
128
+ evs: getDisk({
129
+ space: {
130
+ accessorKey: 'evs.systemDisk.diskSpace',
131
+ defaultValue: 100,
132
+ decoratorProps: {
133
+ label: 'Объем системного диска',
134
+ labelTooltip: (
135
+ <>
136
+ Объем хранилища на 1 брокер в кластере
137
+ <br />
138
+ Рекомендуем указывать объем хранилища исходя из ожидаемого размера сообщений и количества реплик.
139
+ Например, если предполагаемый размер сообщения — 100 ГБ, то объем дискового пространства должен быть не
140
+ менее: 100 ГБ x количество реплик + 100 ГБ (резервное пространство).
141
+ </>
142
+ ),
143
+ },
144
+ uiProps: {
145
+ min: 100,
146
+ max: 30000,
147
+ showHint: true,
148
+ },
149
+ },
150
+ specification: {
151
+ accessorKey: 'evs.systemDisk.specification',
152
+ defaultValue: 'SSD',
153
+ },
154
+ }),
155
+ brokersCount: {
156
+ type: CONTROL.Stepper,
157
+ decoratorProps: {
158
+ label: 'Количество брокеров',
159
+ },
160
+ accessorKey: 'brokersCount',
161
+ defaultValue: 3,
162
+ uiProps: {
163
+ min: 3,
164
+ max: 50,
165
+ postfix: 'шт',
166
+ },
167
+ },
168
+ // set-default value
169
+ config: {
170
+ type: CONTROL.Segmented,
171
+ accessorKey: 'config',
172
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
173
+ // @ts-ignore
174
+ defaultValue: configItems[ConfigTypeItem.Kafka2_4],
175
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
176
+ // @ts-ignore
177
+ items: [configItems[ConfigTypeItem.Kafka2_4]],
178
+ decoratorProps: {
179
+ label: '',
180
+ },
181
+ uiProps: {
182
+ visible: false,
183
+ },
184
+ },
185
+ },
186
+ };