From fb7aa8d781e25b6989f516af2a258a13870cf82b Mon Sep 17 00:00:00 2001 From: Mateusz <76775507+szczygiel-m@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:52:07 +0100 Subject: [PATCH] Cleanup after UI migration, updated docs, fixed retransmission bug (#1786) --- .github/workflows/ci-console.yml | 2 +- docs/docs/configuration/console.md | 14 +- .../api/OfflineRetransmissionRequest.java | 39 +- .../hermes/api/OfflineRetransmissionTask.java | 7 +- hermes-console-vue/README.md | 50 -- hermes-console-vue/package.json | 65 --- .../SubscriptionSearchResults.vue | 71 --- .../TopicSearchResults.vue | 57 --- hermes-console/.bowerrc | 4 - .../.eslintrc.cjs | 0 .../.gitignore | 0 hermes-console/.jshintrc | 3 - .../.prettierrc.json | 0 .../.vscode/extensions.json | 0 hermes-console/Gruntfile.js | 30 -- hermes-console/README.md | 68 ++- hermes-console/bower.json | 29 -- hermes-console/config.json.example | 96 ---- hermes-console/config_default.json | 46 -- .../env.d.ts | 0 .../index.html | 0 .../json-server/db.json | 0 .../json-server/filter-debug.json | 0 .../json-server/routes.json | 0 .../json-server/server.ts | 0 .../json-server/subscriptions.json | 0 .../json-server/topics.json | 0 hermes-console/karma.config.js | 110 ----- hermes-console/package.json | 78 ++- hermes-console/package.sh | 43 -- .../public/favicon.ico | Bin hermes-console/run.sh | 5 - hermes-console/serve.js | 75 --- .../src/App.vue | 0 .../src/api/OffsetRetransmissionDate.ts | 0 .../src/api/access-token-response.ts | 0 .../src/api/app-configuration.ts | 0 .../src/api/constraints.ts | 0 .../src/api/consumer-group.ts | 0 .../src/api/content-type.ts | 0 .../src/api/datacenter-readiness.ts | 0 .../src/api/group.ts | 0 .../src/api/hermes-client/index.ts | 0 .../src/api/inconsistent-group.ts | 0 .../src/api/message-filters-verification.ts | 0 .../src/api/offline-clients-source.ts | 0 .../src/api/offline-retransmission.ts | 0 .../src/api/owner-id.ts | 0 .../src/api/owner.ts | 0 .../src/api/role.ts | 0 .../src/api/stats.ts | 0 .../src/api/subscription-health.ts | 0 .../src/api/subscription-metrics.ts | 0 .../src/api/subscription-undelivered.ts | 0 .../src/api/subscription.ts | 0 .../src/api/topic.ts | 0 .../src/assets/hermes-logo-dark-theme.png | Bin .../assets/hermes-logo-full-dark-theme.png | Bin .../src/assets/hermes-logo-full.png | Bin .../assets/hermes-logo-header-dark-theme.png | Bin .../src/assets/hermes-logo-header.png | Bin .../src/assets/hermes-logo.png | Bin .../src/components/ace-editor/AceEditor.vue | 0 .../src/components/ace-editor/ace-config.ts | 0 .../app-notification/AppNotification.vue | 0 .../AppNotificationProvider.vue | 0 .../ConfirmationDialog.spec.ts | 0 .../ConfirmationDialog.vue | 0 .../components/console-alert/ConsoleAlert.vue | 0 .../console-footer/ConsoleFooter.spec.ts | 0 .../console-footer/ConsoleFooter.vue | 0 .../console-header/ConsoleHeader.spec.ts | 0 .../console-header/ConsoleHeader.vue | 0 .../components/costs-card/CostsCard.spec.ts | 0 .../src/components/costs-card/CostsCard.vue | 0 .../environment-badge/EnviromentBadge.spec.ts | 0 .../environment-badge/EnviromentBadge.vue | 0 .../key-value-card/KeyValueCard.spec.ts | 0 .../key-value-card/KeyValueCard.vue | 0 .../KeyValueCardItem.spec.ts | 0 .../key-value-card-item/KeyValueCardItem.vue | 0 .../loading-spinner/LoadingSpinner.vue | 0 .../components/select-field/SelectField.vue | 0 .../src/components/select-field/types.ts | 0 .../src/components/text-field/TextField.vue | 0 .../theme-switch/ThemeSwitch.spec.ts | 0 .../components/theme-switch/ThemeSwitch.vue | 0 .../components/tooltip-icon/TooltipIcon.vue | 0 .../use-constraints/useConstraints.spec.ts | 0 .../use-constraints/useConstraints.ts | 0 .../useConsumerGroups.spec.ts | 0 .../use-consumer-groups/useConsumerGroups.ts | 0 .../dialog/use-dialog/useDialog.ts | 0 .../groups/use-groups/useGroups.spec.ts | 0 .../groups/use-groups/useGroups.ts | 0 .../useInconsistentTopics.spec.ts | 0 .../useInconsistentTopics.ts | 0 .../metrics/use-metrics/useMetrics.spec.ts | 0 .../metrics/use-metrics/useMetrics.ts | 0 .../use-readiness/useReadiness.spec.ts | 0 .../readiness/use-readiness/useReadiness.ts | 0 .../roles/use-roles/useRoles.spec.ts | 0 .../composables/roles/use-roles/useRoles.ts | 0 .../src/composables/search/useSearch.spec.ts | 0 .../src/composables/search/useSearch.ts | 0 .../stats/use-stats/useStats.spec.ts | 0 .../composables/stats/use-stats/useStats.ts | 0 .../use-create-subscription/types.ts | 0 .../useCreateSubscription.spec.ts | 0 .../useCreateSubscription.ts | 0 .../use-edit-subscription/types.ts | 0 .../useEditSubscription.spec.ts | 0 .../useEditSubscription.ts | 0 .../use-form-subscription/form-mapper.ts | 0 .../use-form-subscription/types.ts | 0 .../useFormSubscription.spec.ts | 0 .../useFormSubscription.ts | 0 .../useImportSubscription.ts | 0 .../useSubscriptionFiltersDebug.spec.ts | 0 .../useSubscriptionFiltersDebug.ts | 0 .../use-subscription/useSubscription.spec.ts | 0 .../use-subscription/useSubscription.ts | 0 .../topic/use-create-topic/types.ts | 0 .../use-create-topic/useCreateTopic.spec.ts | 0 .../topic/use-create-topic/useCreateTopic.ts | 0 .../composables/topic/use-edit-topic/types.ts | 0 .../topic/use-edit-topic/useEditTopic.spec.ts | 0 .../topic/use-edit-topic/useEditTopic.ts | 0 .../topic/use-form-topic/parser.ts | 0 .../composables/topic/use-form-topic/types.ts | 0 .../topic/use-form-topic/useFormTopic.spec.ts | 0 .../topic/use-form-topic/useFormTopic.ts | 0 .../topic/use-import-topic/useImportTopic.ts | 0 .../useOfflineRetransmission.spec.ts | 0 .../useOfflineRetransmission.ts | 0 .../topic/use-topic/useTopic.spec.ts | 0 .../composables/topic/use-topic/useTopic.ts | 0 .../src/dummy/app-config.ts | 0 .../src/dummy/constraints.ts | 0 .../src/dummy/consumerGroups.ts | 0 .../src/dummy/groupInconsistency.ts | 0 .../src/dummy/groups.ts | 0 .../src/dummy/inconsistentGroups.ts | 0 .../src/dummy/inconsistentMetadata.ts | 0 .../src/dummy/inconsistentTopics.ts | 0 .../src/dummy/jwt-tokens.ts | 0 .../src/dummy/metricsDashboardUrl.ts | 0 .../src/dummy/readiness.ts | 0 .../src/dummy/roles.ts | 0 .../src/dummy/stats.ts | 0 .../src/dummy/store.ts | 0 .../src/dummy/subscription-form.ts | 0 .../src/dummy/subscription.ts | 0 .../src/dummy/topic-form.ts | 0 .../src/dummy/topic.ts | 0 .../src/dummy/topics.ts | 0 .../src/i18n.ts | 0 .../src/i18n/en-US/index.ts | 0 .../src/i18n/en-US/subscription-form.ts | 0 .../src/i18n/en-US/topic-form.ts | 0 .../src/i18n/messages.ts | 0 .../src/main.scss | 0 .../src/main.ts | 0 .../src/mocks/handlers.ts | 0 .../src/router/index.ts | 0 .../src/settings.scss | 0 .../src/store/app-config/types.ts | 0 .../src/store/app-config/useAppConfigStore.ts | 0 .../src/store/app-notifications/types.ts | 0 .../app-notifications/useAppNotifications.ts | 0 .../src/store/auth/types.ts | 0 .../src/store/auth/useAuthStore.spec.ts | 0 .../src/store/auth/useAuthStore.ts | 0 .../src/store/consistency/types.ts | 0 .../consistency/useConsistencyStore.spec.ts | 0 .../store/consistency/useConsistencyStore.ts | 0 .../src/store/favorites/types.ts | 0 .../src/store/favorites/useFavorites.ts | 0 .../src/utils/axios/axios-instance.ts | 0 .../src/utils/axios/axios-utils.ts | 0 .../src/utils/copy-utils.ts | 0 .../date-formatter/date-formatter.spec.ts | 0 .../utils/date-formatter/date-formatter.ts | 0 .../src/utils/download-utils.ts | 0 .../src/utils/notification-utils.ts | 2 +- .../number-formatter/number-formatter.spec.ts | 0 .../number-formatter/number-formatter.ts | 0 .../src/utils/roles-util.ts | 0 .../subscription-utils.spec.ts | 0 .../subscription-utils/subscription-utils.ts | 0 .../src/utils/test-utils.ts | 0 .../src/utils/topic-utils/topic-utils.spec.ts | 0 .../src/utils/topic-utils/topic-utils.ts | 0 .../src/utils/validators/index.ts | 0 .../admin/consistency/ConsistencyView.spec.ts | 0 .../admin/consistency/ConsistencyView.vue | 0 .../InconsistentGroup.spec.ts | 0 .../inconsistent-group/InconsistentGroup.vue | 0 .../InconsistentGroupListing.spec.ts | 0 .../InconsistentGroupsListing.vue | 0 .../InconsistentMetadata.spec.ts | 0 .../InconsistentMetadata.vue | 0 .../InconsistentTopic.spec.ts | 0 .../inconsistent-topic/InconsistentTopic.vue | 0 .../InconsistentTopicsListing.spec.ts | 0 .../InconsistentTopicsListing.vue | 0 .../admin/constraints/ConstraintsView.spec.ts | 0 .../admin/constraints/ConstraintsView.vue | 0 .../ConstraintsListing.spec.ts | 0 .../ConstraintsListing.vue | 0 .../CreateConstraintDialog.vue | 0 .../CreateConstraintFormView.spec.ts | 0 .../CreateConstraintFormView.vue | 0 .../EditConstraintDialog.vue | 0 .../EditConstraintFormView.spec.ts | 0 .../EditConstraintFormView.vue | 0 .../ConsumerGroupsView.spec.ts | 0 .../consumer-groups/ConsumerGroupsView.vue | 0 .../ConsumerGroupMembers.spec.ts | 0 .../ConsumerGroupMembers.vue | 0 .../ConsumerGroupsTable.spec.ts | 0 .../ConsumerGroupsTable.vue | 0 .../admin/readiness/ReadinessView.spec.ts | 0 .../views/admin/readiness/ReadinessView.vue | 0 .../FavoriteSubscriptionsView.spec.ts | 0 .../FavoriteSubscriptionsView.vue | 0 .../FavoriteSubscriptionsListing.spec.ts | 0 .../FavoriteSubscriptionsListing.vue | 0 .../topics/FavoriteTopicsView.spec.ts | 0 .../favorite/topics/FavoriteTopicsView.vue | 0 .../FavoriteTopicsListing.spec.ts | 0 .../topic-listing/FavoriteTopicsListing.vue | 0 .../group-topics/GroupTopicsView.spec.ts | 0 .../views/group-topics/GroupTopicsView.vue | 0 .../GroupTopicsListing.spec.ts | 0 .../GroupTopicsListing.vue | 1 - .../src/views/groups/GroupsView.spec.ts | 0 .../src/views/groups/GroupsView.vue | 0 .../views/groups/group-form/GroupForm.spec.ts | 0 .../src/views/groups/group-form/GroupForm.vue | 0 .../groups/group-listing/GroupListing.spec.ts | 0 .../groups/group-listing/GroupListing.vue | 0 .../src/views/home/HomeView.spec.ts | 0 .../src/views/home/HomeView.vue | 0 .../src/views/home/home-menu/HomeMenu.spec.ts | 0 .../src/views/home/home-menu/HomeMenu.vue | 0 .../src/views/redirect/RedirectView.spec.ts | 0 .../src/views/redirect/RedirectView.vue | 0 .../src/views/search/SearchView.spec.ts | 0 .../src/views/search/SearchView.vue | 16 +- .../SubscriptionSearchResults.spec.ts | 0 .../SubscriptionSearchResults.vue | 89 ++++ .../TopicSearchResults.spec.ts | 0 .../TopicSearchResults.vue | 72 +++ .../src/views/stats/StatsView.spec.ts | 0 .../src/views/stats/StatsView.vue | 0 .../subscription/SubscriptionView.spec.ts | 0 .../views/subscription/SubscriptionView.vue | 0 .../subscription/filters-card/FiltersCard.vue | 0 .../filters-card/FitersCard.spec.ts | 0 .../headers-card/HeadersCard.spec.ts | 0 .../subscription/headers-card/HeadersCard.vue | 0 .../HealthProblemsAlerts.spec.ts | 0 .../HealthProblemsAlerts.vue | 0 .../LastUndeliveredMessage.spec.ts | 0 .../LastUndeliveredMessage.vue | 0 .../ManageMessagesCard.spec.ts | 0 .../ManageMessagesCard.vue | 0 .../metrics-card/MetricsCard.spec.ts | 0 .../subscription/metrics-card/MetricsCard.vue | 0 .../properties-card/PropertiesCard.spec.ts | 0 .../properties-card/PropertiesCard.vue | 2 +- .../ServiceResponseMetrics.spec.ts | 0 .../ServiceResponseMetrics.vue | 0 .../show-event-trace/ShowEventTrace.spec.ts | 0 .../show-event-trace/ShowEventTrace.vue | 0 .../SubscriptionForm.spec.ts | 0 .../subscription-form/SubscriptionForm.vue | 0 .../SubscriptionPathFilters.vue | 0 .../SubscriptionPathFiltersDebug.spec.ts | 0 .../SubscriptionPathFiltersDebug.vue | 0 .../path-filter-row/PathFilterRow.vue | 0 .../subscription-basic-filters/types.ts | 0 .../SubscriptionHeaderFilters.vue | 0 .../header-filter-row/HeaderFilterRow.vue | 0 .../subscription-header-filters/types.ts | 0 .../SubscriptionMetadata.spec.ts | 0 .../SubscriptionMetadata.vue | 0 .../UndeliveredMessagesCard.spec.ts | 0 .../UndeliveredMessagesCard.vue | 0 .../src/views/topic/TopicView.spec.ts | 0 .../src/views/topic/TopicView.vue | 0 .../messages-preview/MessagesPreview.spec.ts | 0 .../messages-preview/MessagesPreview.vue | 0 .../topic/metrics-list/MetricsList.spec.ts | 0 .../views/topic/metrics-list/MetricsList.vue | 0 .../offline-clients/OfflineClients.spec.ts | 0 .../topic/offline-clients/OfflineClients.vue | 0 .../OfflineRetransmissionDialog.vue | 0 .../OfflineRetransmissionForm.spec.ts | 0 .../OfflineRetransmissionForm.vue | 0 .../properties-list/PropertiesList.spec.ts | 0 .../topic/properties-list/PropertiesList.vue | 0 .../src/views/topic/schema-panel/AvroTypes.ts | 0 .../topic/schema-panel/SchemaPanel.spec.ts | 0 .../views/topic/schema-panel/SchemaPanel.vue | 0 .../schema-panel/avro-viewer/AvroNode.vue | 0 .../schema-panel/avro-viewer/AvroViewer.vue | 0 .../SubscriptionsList.spec.ts | 0 .../subscriptions-list/SubscriptionsList.vue | 0 .../views/topic/topic-form/TopicForm.spec.ts | 0 .../src/views/topic/topic-form/TopicForm.vue | 0 .../topic/topic-header/TopicHeader.spec.ts | 0 .../views/topic/topic-header/TopicHeader.vue | 4 +- hermes-console/static/css/main.css | 160 ------- .../static/img/hermes-logo-full.png | Bin 8445 -> 0 bytes hermes-console/static/img/hermes-logo.png | Bin 7434 -> 0 bytes hermes-console/static/index.html | 111 ----- hermes-console/static/js/app.js | 132 ----- hermes-console/static/js/bootstrap.js | 61 --- hermes-console/static/js/console/Auth.js | 109 ----- hermes-console/static/js/console/Discovery.js | 11 - hermes-console/static/js/console/Filters.js | 27 -- hermes-console/static/js/console/Groups.js | 216 --------- hermes-console/static/js/console/Home.js | 11 - .../static/js/console/MessagePreview.js | 70 --- .../js/console/MetricStoreUrlResolver.js | 73 --- hermes-console/static/js/console/Modals.js | 23 - hermes-console/static/js/console/Mode.js | 15 - .../static/js/console/PasswordService.js | 17 - hermes-console/static/js/console/Search.js | 97 ---- hermes-console/static/js/console/Stats.js | 51 -- .../static/js/console/Visibility.js | 50 -- .../consistency/ConsistencyController.js | 158 ------ .../consistency/ConsistencyRepository.js | 50 -- .../constraints/ConstraintsController.js | 172 ------- .../constraints/ConstraintsRepository.js | 53 --- .../diagnostics/DiagnosticsController.js | 52 -- .../diagnostics/DiagnosticsRepository.js | 14 - .../js/console/filters/FiltersDebugger.js | 70 --- .../js/console/filters/FiltersEditor.js | 46 -- .../js/console/filters/FiltersRepository.js | 11 - .../filters/HttpHeaderFiltersEditor.js | 36 -- .../OfflineRetransmissionController.js | 35 -- .../OfflineRetransmissionRespository.js | 12 - .../static/js/console/owner/OwnerName.js | 24 - .../js/console/owner/OwnerRepository.js | 21 - .../static/js/console/owner/OwnerSelector.js | 76 --- .../console/readiness/ReadinessController.js | 42 -- .../console/readiness/ReadinessRepository.js | 26 - .../subscription/SubscriptionController.js | 387 --------------- .../subscription/SubscriptionFactory.js | 39 -- .../subscription/SubscriptionHealth.js | 29 -- .../subscription/SubscriptionMetrics.js | 31 -- .../subscription/SubscriptionRepository.js | 80 ---- .../SubscriptionOffsetsController.js | 49 -- .../subscriptionoffsets/SubsriptionService.js | 17 - .../static/js/console/topic/AvroViewer.js | 161 ------- .../js/console/topic/TopicController.js | 358 -------------- .../static/js/console/topic/TopicFactory.js | 31 -- .../static/js/console/topic/TopicMetrics.js | 23 - .../js/console/topic/TopicRepository.js | 67 --- .../static/js/directives/bindHtml.js | 15 - .../static/js/directives/calendar.js | 30 -- .../static/js/directives/emptyToNull.js | 16 - .../static/js/directives/endpoint.js | 36 -- .../static/js/directives/hoverDelay.js | 30 -- hermes-console/static/partials/authPane.html | 4 - .../static/partials/avroViewerNode.html | 12 - .../static/partials/consistency.html | 86 ---- .../static/partials/constraints.html | 64 --- .../static/partials/diagnostics.html | 62 --- .../static/partials/filter/filtersEditor.html | 60 --- .../filter/httpHeaderFiltersEditor.html | 41 -- hermes-console/static/partials/group.html | 41 -- .../static/partials/groupConsistency.html | 67 --- hermes-console/static/partials/groups.html | 42 -- hermes-console/static/partials/home.html | 62 --- .../static/partials/modal/addConstraints.html | 40 -- .../static/partials/modal/confirm.html | 22 - .../static/partials/modal/debugFilters.html | 37 -- .../partials/modal/editConstraints.html | 30 -- .../static/partials/modal/editGroup.html | 29 -- .../partials/modal/editSubscription.html | 360 -------------- .../static/partials/modal/editTopic.html | 204 -------- .../static/partials/modal/messagePreview.html | 27 -- .../partials/modal/offlineRetransmission.html | 44 -- .../partials/modal/removeConstraints.html | 11 - hermes-console/static/partials/ownerName.html | 2 - .../static/partials/ownerSelector.html | 19 - hermes-console/static/partials/readiness.html | 37 -- hermes-console/static/partials/search.html | 78 --- hermes-console/static/partials/stats.html | 49 -- .../static/partials/subscription.html | 450 ------------------ .../static/partials/subscriptionOffsets.html | 30 -- hermes-console/static/partials/topic.html | 222 --------- .../static/partials/topicConsistency.html | 82 ---- hermes-console/test/fixture/config.js | 31 -- .../test/unit/AvroNodeControllerTest.js | 429 ----------------- .../test/unit/AvroNodeDirectiveTest.js | 53 --- .../test/unit/AvroViewerDirectiveTest.js | 63 --- .../test/unit/GroupControllerTest.js | 46 -- .../test/unit/GroupEditControllerTest.js | 40 -- .../test/unit/GroupsControllerTest.js | 59 --- .../test/unit/MessagePreviewControllerTest.js | 25 - .../SubscriptionEditControllerTest.js | 92 ---- .../tsconfig.app.json | 0 .../tsconfig.config.json | 0 .../tsconfig.json | 0 .../tsconfig.vitest.json | 0 .../vite.config.ts | 0 .../vitest.config.ts | 0 .../vitest.setup.ts | 0 .../yarn.lock | 0 hermes-management/build.gradle | 4 +- .../OfflineRetransmissionManagementTest.java | 31 +- 416 files changed, 332 insertions(+), 7464 deletions(-) delete mode 100644 hermes-console-vue/README.md delete mode 100644 hermes-console-vue/package.json delete mode 100644 hermes-console-vue/src/views/search/subscription-search-results/SubscriptionSearchResults.vue delete mode 100644 hermes-console-vue/src/views/search/topic-search-results/TopicSearchResults.vue delete mode 100644 hermes-console/.bowerrc rename {hermes-console-vue => hermes-console}/.eslintrc.cjs (100%) rename {hermes-console-vue => hermes-console}/.gitignore (100%) delete mode 100644 hermes-console/.jshintrc rename {hermes-console-vue => hermes-console}/.prettierrc.json (100%) rename {hermes-console-vue => hermes-console}/.vscode/extensions.json (100%) delete mode 100644 hermes-console/Gruntfile.js delete mode 100644 hermes-console/bower.json delete mode 100644 hermes-console/config.json.example delete mode 100644 hermes-console/config_default.json rename {hermes-console-vue => hermes-console}/env.d.ts (100%) rename {hermes-console-vue => hermes-console}/index.html (100%) rename {hermes-console-vue => hermes-console}/json-server/db.json (100%) rename {hermes-console-vue => hermes-console}/json-server/filter-debug.json (100%) rename {hermes-console-vue => hermes-console}/json-server/routes.json (100%) rename {hermes-console-vue => hermes-console}/json-server/server.ts (100%) rename {hermes-console-vue => hermes-console}/json-server/subscriptions.json (100%) rename {hermes-console-vue => hermes-console}/json-server/topics.json (100%) delete mode 100644 hermes-console/karma.config.js delete mode 100755 hermes-console/package.sh rename {hermes-console-vue => hermes-console}/public/favicon.ico (100%) delete mode 100755 hermes-console/run.sh delete mode 100755 hermes-console/serve.js rename {hermes-console-vue => hermes-console}/src/App.vue (100%) rename {hermes-console-vue => hermes-console}/src/api/OffsetRetransmissionDate.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/access-token-response.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/app-configuration.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/constraints.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/consumer-group.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/content-type.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/datacenter-readiness.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/group.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/hermes-client/index.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/inconsistent-group.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/message-filters-verification.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/offline-clients-source.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/offline-retransmission.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/owner-id.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/owner.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/role.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/stats.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/subscription-health.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/subscription-metrics.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/subscription-undelivered.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/subscription.ts (100%) rename {hermes-console-vue => hermes-console}/src/api/topic.ts (100%) rename {hermes-console-vue => hermes-console}/src/assets/hermes-logo-dark-theme.png (100%) rename {hermes-console-vue => hermes-console}/src/assets/hermes-logo-full-dark-theme.png (100%) rename {hermes-console-vue => hermes-console}/src/assets/hermes-logo-full.png (100%) rename {hermes-console-vue => hermes-console}/src/assets/hermes-logo-header-dark-theme.png (100%) rename {hermes-console-vue => hermes-console}/src/assets/hermes-logo-header.png (100%) rename {hermes-console-vue => hermes-console}/src/assets/hermes-logo.png (100%) rename {hermes-console-vue => hermes-console}/src/components/ace-editor/AceEditor.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/ace-editor/ace-config.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/app-notification/AppNotification.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/app-notification/AppNotificationProvider.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/confirmation-dialog/ConfirmationDialog.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/confirmation-dialog/ConfirmationDialog.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/console-alert/ConsoleAlert.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/console-footer/ConsoleFooter.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/console-footer/ConsoleFooter.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/console-header/ConsoleHeader.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/console-header/ConsoleHeader.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/costs-card/CostsCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/costs-card/CostsCard.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/environment-badge/EnviromentBadge.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/environment-badge/EnviromentBadge.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/key-value-card/KeyValueCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/key-value-card/KeyValueCard.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/key-value-card/key-value-card-item/KeyValueCardItem.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/key-value-card/key-value-card-item/KeyValueCardItem.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/loading-spinner/LoadingSpinner.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/select-field/SelectField.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/select-field/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/text-field/TextField.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/theme-switch/ThemeSwitch.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/components/theme-switch/ThemeSwitch.vue (100%) rename {hermes-console-vue => hermes-console}/src/components/tooltip-icon/TooltipIcon.vue (100%) rename {hermes-console-vue => hermes-console}/src/composables/constraints/use-constraints/useConstraints.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/constraints/use-constraints/useConstraints.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/dialog/use-dialog/useDialog.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/groups/use-groups/useGroups.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/groups/use-groups/useGroups.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/metrics/use-metrics/useMetrics.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/metrics/use-metrics/useMetrics.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/readiness/use-readiness/useReadiness.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/readiness/use-readiness/useReadiness.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/roles/use-roles/useRoles.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/roles/use-roles/useRoles.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/search/useSearch.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/search/useSearch.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/stats/use-stats/useStats.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/stats/use-stats/useStats.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-create-subscription/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-create-subscription/useCreateSubscription.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-create-subscription/useCreateSubscription.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-edit-subscription/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-edit-subscription/useEditSubscription.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-edit-subscription/useEditSubscription.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-form-subscription/form-mapper.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-form-subscription/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-form-subscription/useFormSubscription.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-form-subscription/useFormSubscription.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-import-subscription/useImportSubscription.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-subscription/useSubscription.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/subscription/use-subscription/useSubscription.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-create-topic/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-create-topic/useCreateTopic.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-create-topic/useCreateTopic.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-edit-topic/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-edit-topic/useEditTopic.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-edit-topic/useEditTopic.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-form-topic/parser.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-form-topic/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-form-topic/useFormTopic.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-form-topic/useFormTopic.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-import-topic/useImportTopic.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-topic/useTopic.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/composables/topic/use-topic/useTopic.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/app-config.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/constraints.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/consumerGroups.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/groupInconsistency.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/groups.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/inconsistentGroups.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/inconsistentMetadata.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/inconsistentTopics.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/jwt-tokens.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/metricsDashboardUrl.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/readiness.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/roles.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/stats.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/store.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/subscription-form.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/subscription.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/topic-form.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/topic.ts (100%) rename {hermes-console-vue => hermes-console}/src/dummy/topics.ts (100%) rename {hermes-console-vue => hermes-console}/src/i18n.ts (100%) rename {hermes-console-vue => hermes-console}/src/i18n/en-US/index.ts (100%) rename {hermes-console-vue => hermes-console}/src/i18n/en-US/subscription-form.ts (100%) rename {hermes-console-vue => hermes-console}/src/i18n/en-US/topic-form.ts (100%) rename {hermes-console-vue => hermes-console}/src/i18n/messages.ts (100%) rename {hermes-console-vue => hermes-console}/src/main.scss (100%) rename {hermes-console-vue => hermes-console}/src/main.ts (100%) rename {hermes-console-vue => hermes-console}/src/mocks/handlers.ts (100%) rename {hermes-console-vue => hermes-console}/src/router/index.ts (100%) rename {hermes-console-vue => hermes-console}/src/settings.scss (100%) rename {hermes-console-vue => hermes-console}/src/store/app-config/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/app-config/useAppConfigStore.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/app-notifications/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/app-notifications/useAppNotifications.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/auth/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/auth/useAuthStore.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/auth/useAuthStore.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/consistency/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/consistency/useConsistencyStore.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/consistency/useConsistencyStore.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/favorites/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/store/favorites/useFavorites.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/axios/axios-instance.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/axios/axios-utils.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/copy-utils.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/date-formatter/date-formatter.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/date-formatter/date-formatter.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/download-utils.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/notification-utils.ts (96%) rename {hermes-console-vue => hermes-console}/src/utils/number-formatter/number-formatter.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/number-formatter/number-formatter.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/roles-util.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/subscription-utils/subscription-utils.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/subscription-utils/subscription-utils.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/test-utils.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/topic-utils/topic-utils.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/topic-utils/topic-utils.ts (100%) rename {hermes-console-vue => hermes-console}/src/utils/validators/index.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/ConsistencyView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/ConsistencyView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-group/InconsistentGroup.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-group/InconsistentGroup.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupListing.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupsListing.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/ConstraintsView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/ConstraintsView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/constraints-listing/ConstraintsListing.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/constraints-listing/ConstraintsListing.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/create-constraint-form/CreateConstraintDialog.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/edit-constraint-form/EditConstraintDialog.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consumer-groups/ConsumerGroupsView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/readiness/ReadinessView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/admin/readiness/ReadinessView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/subscriptions/FavoriteSubscriptionsView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/subscriptions/FavoriteSubscriptionsView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/topics/FavoriteTopicsView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/topics/FavoriteTopicsView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/group-topics/GroupTopicsView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/group-topics/GroupTopicsView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/group-topics/group-topics-listing/GroupTopicsListing.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/group-topics/group-topics-listing/GroupTopicsListing.vue (97%) rename {hermes-console-vue => hermes-console}/src/views/groups/GroupsView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/groups/GroupsView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/groups/group-form/GroupForm.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/groups/group-form/GroupForm.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/groups/group-listing/GroupListing.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/groups/group-listing/GroupListing.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/home/HomeView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/home/HomeView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/home/home-menu/HomeMenu.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/home/home-menu/HomeMenu.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/redirect/RedirectView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/redirect/RedirectView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/search/SearchView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/search/SearchView.vue (91%) rename {hermes-console-vue => hermes-console}/src/views/search/subscription-search-results/SubscriptionSearchResults.spec.ts (100%) create mode 100644 hermes-console/src/views/search/subscription-search-results/SubscriptionSearchResults.vue rename {hermes-console-vue => hermes-console}/src/views/search/topic-search-results/TopicSearchResults.spec.ts (100%) create mode 100644 hermes-console/src/views/search/topic-search-results/TopicSearchResults.vue rename {hermes-console-vue => hermes-console}/src/views/stats/StatsView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/stats/StatsView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/SubscriptionView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/SubscriptionView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/filters-card/FiltersCard.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/filters-card/FitersCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/headers-card/HeadersCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/headers-card/HeadersCard.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/manage-messages-card/ManageMessagesCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/manage-messages-card/ManageMessagesCard.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/metrics-card/MetricsCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/metrics-card/MetricsCard.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/properties-card/PropertiesCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/properties-card/PropertiesCard.vue (99%) rename {hermes-console-vue => hermes-console}/src/views/subscription/service-response-metrics/ServiceResponseMetrics.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/service-response-metrics/ServiceResponseMetrics.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/show-event-trace/ShowEventTrace.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/show-event-trace/ShowEventTrace.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/SubscriptionForm.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/SubscriptionForm.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFilters.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-basic-filters/path-filter-row/PathFilterRow.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-basic-filters/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-header-filters/SubscriptionHeaderFilters.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-header-filters/header-filter-row/HeaderFilterRow.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-form/subscription-header-filters/types.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-metadata/SubscriptionMetadata.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/subscription-metadata/SubscriptionMetadata.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/TopicView.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/TopicView.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/messages-preview/MessagesPreview.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/messages-preview/MessagesPreview.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/metrics-list/MetricsList.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/metrics-list/MetricsList.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/offline-clients/OfflineClients.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/offline-clients/OfflineClients.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/offline-retransmission/OfflineRetransmissionDialog.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/offline-retransmission/OfflineRetransmissionForm.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/offline-retransmission/OfflineRetransmissionForm.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/properties-list/PropertiesList.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/properties-list/PropertiesList.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/schema-panel/AvroTypes.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/schema-panel/SchemaPanel.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/schema-panel/SchemaPanel.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/schema-panel/avro-viewer/AvroNode.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/schema-panel/avro-viewer/AvroViewer.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/subscriptions-list/SubscriptionsList.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/subscriptions-list/SubscriptionsList.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/topic-form/TopicForm.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/topic-form/TopicForm.vue (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/topic-header/TopicHeader.spec.ts (100%) rename {hermes-console-vue => hermes-console}/src/views/topic/topic-header/TopicHeader.vue (98%) delete mode 100644 hermes-console/static/css/main.css delete mode 100644 hermes-console/static/img/hermes-logo-full.png delete mode 100644 hermes-console/static/img/hermes-logo.png delete mode 100644 hermes-console/static/index.html delete mode 100644 hermes-console/static/js/app.js delete mode 100644 hermes-console/static/js/bootstrap.js delete mode 100644 hermes-console/static/js/console/Auth.js delete mode 100644 hermes-console/static/js/console/Discovery.js delete mode 100644 hermes-console/static/js/console/Filters.js delete mode 100644 hermes-console/static/js/console/Groups.js delete mode 100644 hermes-console/static/js/console/Home.js delete mode 100644 hermes-console/static/js/console/MessagePreview.js delete mode 100644 hermes-console/static/js/console/MetricStoreUrlResolver.js delete mode 100644 hermes-console/static/js/console/Modals.js delete mode 100644 hermes-console/static/js/console/Mode.js delete mode 100644 hermes-console/static/js/console/PasswordService.js delete mode 100644 hermes-console/static/js/console/Search.js delete mode 100644 hermes-console/static/js/console/Stats.js delete mode 100644 hermes-console/static/js/console/Visibility.js delete mode 100644 hermes-console/static/js/console/consistency/ConsistencyController.js delete mode 100644 hermes-console/static/js/console/consistency/ConsistencyRepository.js delete mode 100644 hermes-console/static/js/console/constraints/ConstraintsController.js delete mode 100644 hermes-console/static/js/console/constraints/ConstraintsRepository.js delete mode 100644 hermes-console/static/js/console/diagnostics/DiagnosticsController.js delete mode 100644 hermes-console/static/js/console/diagnostics/DiagnosticsRepository.js delete mode 100644 hermes-console/static/js/console/filters/FiltersDebugger.js delete mode 100644 hermes-console/static/js/console/filters/FiltersEditor.js delete mode 100644 hermes-console/static/js/console/filters/FiltersRepository.js delete mode 100644 hermes-console/static/js/console/filters/HttpHeaderFiltersEditor.js delete mode 100644 hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionController.js delete mode 100644 hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionRespository.js delete mode 100644 hermes-console/static/js/console/owner/OwnerName.js delete mode 100644 hermes-console/static/js/console/owner/OwnerRepository.js delete mode 100644 hermes-console/static/js/console/owner/OwnerSelector.js delete mode 100644 hermes-console/static/js/console/readiness/ReadinessController.js delete mode 100644 hermes-console/static/js/console/readiness/ReadinessRepository.js delete mode 100644 hermes-console/static/js/console/subscription/SubscriptionController.js delete mode 100644 hermes-console/static/js/console/subscription/SubscriptionFactory.js delete mode 100644 hermes-console/static/js/console/subscription/SubscriptionHealth.js delete mode 100644 hermes-console/static/js/console/subscription/SubscriptionMetrics.js delete mode 100644 hermes-console/static/js/console/subscription/SubscriptionRepository.js delete mode 100644 hermes-console/static/js/console/subscriptionoffsets/SubscriptionOffsetsController.js delete mode 100644 hermes-console/static/js/console/subscriptionoffsets/SubsriptionService.js delete mode 100644 hermes-console/static/js/console/topic/AvroViewer.js delete mode 100644 hermes-console/static/js/console/topic/TopicController.js delete mode 100644 hermes-console/static/js/console/topic/TopicFactory.js delete mode 100644 hermes-console/static/js/console/topic/TopicMetrics.js delete mode 100644 hermes-console/static/js/console/topic/TopicRepository.js delete mode 100644 hermes-console/static/js/directives/bindHtml.js delete mode 100644 hermes-console/static/js/directives/calendar.js delete mode 100644 hermes-console/static/js/directives/emptyToNull.js delete mode 100644 hermes-console/static/js/directives/endpoint.js delete mode 100644 hermes-console/static/js/directives/hoverDelay.js delete mode 100644 hermes-console/static/partials/authPane.html delete mode 100644 hermes-console/static/partials/avroViewerNode.html delete mode 100644 hermes-console/static/partials/consistency.html delete mode 100644 hermes-console/static/partials/constraints.html delete mode 100644 hermes-console/static/partials/diagnostics.html delete mode 100644 hermes-console/static/partials/filter/filtersEditor.html delete mode 100644 hermes-console/static/partials/filter/httpHeaderFiltersEditor.html delete mode 100644 hermes-console/static/partials/group.html delete mode 100644 hermes-console/static/partials/groupConsistency.html delete mode 100644 hermes-console/static/partials/groups.html delete mode 100644 hermes-console/static/partials/home.html delete mode 100644 hermes-console/static/partials/modal/addConstraints.html delete mode 100644 hermes-console/static/partials/modal/confirm.html delete mode 100644 hermes-console/static/partials/modal/debugFilters.html delete mode 100644 hermes-console/static/partials/modal/editConstraints.html delete mode 100644 hermes-console/static/partials/modal/editGroup.html delete mode 100644 hermes-console/static/partials/modal/editSubscription.html delete mode 100644 hermes-console/static/partials/modal/editTopic.html delete mode 100644 hermes-console/static/partials/modal/messagePreview.html delete mode 100644 hermes-console/static/partials/modal/offlineRetransmission.html delete mode 100644 hermes-console/static/partials/modal/removeConstraints.html delete mode 100644 hermes-console/static/partials/ownerName.html delete mode 100644 hermes-console/static/partials/ownerSelector.html delete mode 100644 hermes-console/static/partials/readiness.html delete mode 100644 hermes-console/static/partials/search.html delete mode 100644 hermes-console/static/partials/stats.html delete mode 100644 hermes-console/static/partials/subscription.html delete mode 100644 hermes-console/static/partials/subscriptionOffsets.html delete mode 100644 hermes-console/static/partials/topic.html delete mode 100644 hermes-console/static/partials/topicConsistency.html delete mode 100644 hermes-console/test/fixture/config.js delete mode 100644 hermes-console/test/unit/AvroNodeControllerTest.js delete mode 100644 hermes-console/test/unit/AvroNodeDirectiveTest.js delete mode 100644 hermes-console/test/unit/AvroViewerDirectiveTest.js delete mode 100644 hermes-console/test/unit/GroupControllerTest.js delete mode 100644 hermes-console/test/unit/GroupEditControllerTest.js delete mode 100644 hermes-console/test/unit/GroupsControllerTest.js delete mode 100644 hermes-console/test/unit/MessagePreviewControllerTest.js delete mode 100644 hermes-console/test/unit/subscription/SubscriptionEditControllerTest.js rename {hermes-console-vue => hermes-console}/tsconfig.app.json (100%) rename {hermes-console-vue => hermes-console}/tsconfig.config.json (100%) rename {hermes-console-vue => hermes-console}/tsconfig.json (100%) rename {hermes-console-vue => hermes-console}/tsconfig.vitest.json (100%) rename {hermes-console-vue => hermes-console}/vite.config.ts (100%) rename {hermes-console-vue => hermes-console}/vitest.config.ts (100%) rename {hermes-console-vue => hermes-console}/vitest.setup.ts (100%) rename {hermes-console-vue => hermes-console}/yarn.lock (100%) diff --git a/.github/workflows/ci-console.yml b/.github/workflows/ci-console.yml index 628fa9a7ee..a4c6f41272 100644 --- a/.github/workflows/ci-console.yml +++ b/.github/workflows/ci-console.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./hermes-console-vue + working-directory: ./hermes-console steps: - name: Checkout uses: actions/checkout@v3 diff --git a/docs/docs/configuration/console.md b/docs/docs/configuration/console.md index f327d0dd63..a67d509c6d 100644 --- a/docs/docs/configuration/console.md +++ b/docs/docs/configuration/console.md @@ -15,14 +15,12 @@ dashboard.docs | link to documentation, available on Console home page ## Metric Store integration -Hermes Console can be integrated with Metric Store. This means, that metrics shown in Console can link to actual graphs -plotted by Metric Store. At the moment only Graphite is supported. - -Option | Description ------------------------ | --------------------------------------------------------------------------- -metrics.type | type of metrics storage to link to (currently only `graphite` is supported) -metrics.graphite.url | URL to graphite -metrics.graphite.prefix | prefix to graphite metrics +Hermes console could have a button on the topics and subscriptions view that takes you to a dashboard with metrics. +In order to make it work you have to provide an implementation of `pl.allegro.tech.hermes.management.domain.MetricsDashboardUrlService`. + + Option | Description +-------------------------------------|-------------------------------------------------------------------------------------- + metrics.fetchingDashboardUrlEnabled | enable fetching dashboard url from hermes-management and show the referring UI button ## Authorization diff --git a/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionRequest.java b/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionRequest.java index ef79fef7fd..04d5a5c1cc 100644 --- a/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionRequest.java +++ b/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionRequest.java @@ -8,27 +8,54 @@ import pl.allegro.tech.hermes.api.jackson.InstantIsoSerializer; import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.List; public class OfflineRetransmissionRequest { + + private static final List formatters = List.of( + DateTimeFormatter.ISO_INSTANT, + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm'Z'").withZone(ZoneId.of("UTC")) + ); + @NotEmpty private final String sourceTopic; @NotEmpty private final String targetTopic; @NotNull - private final Instant startTimestamp; + private Instant startTimestamp; @NotNull - private final Instant endTimestamp; + private Instant endTimestamp; @JsonCreator public OfflineRetransmissionRequest( @JsonProperty("sourceTopic") String sourceTopic, @JsonProperty("targetTopic") String targetTopic, - @JsonProperty("startTimestamp") Instant startTimestamp, - @JsonProperty("endTimestamp") Instant endTimestamp) { + @JsonProperty("startTimestamp") String startTimestamp, + @JsonProperty("endTimestamp") String endTimestamp) { this.sourceTopic = sourceTopic; this.targetTopic = targetTopic; - this.startTimestamp = startTimestamp; - this.endTimestamp = endTimestamp; + initializeTimestamps(startTimestamp, endTimestamp); + } + + private void initializeTimestamps(String startTimestamp, String endTimestamp) { + if (startTimestamp == null || endTimestamp == null) { + this.startTimestamp = null; + this.endTimestamp = null; + return; + } + + for (DateTimeFormatter formatter : formatters) { + try { + this.startTimestamp = formatter.parse(startTimestamp, Instant::from); + this.endTimestamp = formatter.parse(endTimestamp, Instant::from); + break; + } catch (DateTimeParseException e) { + // ignore + } + } } public String getSourceTopic() { diff --git a/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionTask.java b/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionTask.java index ed1c69753e..9f7d68d0a3 100644 --- a/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionTask.java +++ b/hermes-api/src/main/java/pl/allegro/tech/hermes/api/OfflineRetransmissionTask.java @@ -21,7 +21,12 @@ public OfflineRetransmissionTask( @JsonProperty("startTimestamp") Instant startTimestamp, @JsonProperty("endTimestamp") Instant endTimestamp, @JsonProperty("createdAt") Instant createdAt) { - this(taskId, new OfflineRetransmissionRequest(sourceTopic, targetTopic, startTimestamp, endTimestamp), createdAt); + this(taskId, new OfflineRetransmissionRequest( + sourceTopic, + targetTopic, + startTimestamp.toString(), + endTimestamp.toString()), + createdAt); } public OfflineRetransmissionTask(String taskId, OfflineRetransmissionRequest request, Instant createdAt) { diff --git a/hermes-console-vue/README.md b/hermes-console-vue/README.md deleted file mode 100644 index 51dc8ee89a..0000000000 --- a/hermes-console-vue/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# hermes-console-vue - -Hermes console migrated from AngularJS to Vue 3. - -## Requirements - -* node >=18.0.0 -* yarn - -## Project Setup - -```sh -yarn -``` - -### Run mocked backend server - -```sh -yarn dev-server -``` - -### Compile and Hot-Reload for Development - -```sh -yarn dev -``` - -### Type-Check, Compile and Minify for Production - -```sh -yarn build -``` - -### Run Unit Tests with [Vitest](https://vitest.dev/) - -```sh -yarn test:unit -``` - -### Lint with [ESLint](https://eslint.org/) - -```sh -yarn lint -``` - -### Lint with [ESLint](https://eslint.org/) and fix - -```sh -yarn lint:fix -``` diff --git a/hermes-console-vue/package.json b/hermes-console-vue/package.json deleted file mode 100644 index 385c7e31de..0000000000 --- a/hermes-console-vue/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "hermes-console-vue", - "description": "Console for Hermes Management", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - }, - "scripts": { - "dev": "vite", - "build": "run-p type-check build-only", - "preview": "vite preview", - "test:unit": "vitest --environment jsdom", - "build-only": "vite build", - "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", - "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", - "dev-server": "node json-server/server.ts" - }, - "dependencies": { - "ace-builds": "1.28.0", - "axios": "1.4.0", - "base64-arraybuffer": "1.0.2", - "jwt-decode": "3.1.2", - "pinia": "2.1.4", - "pinia-plugin-persistedstate": "3.2.0", - "query-string": "8.1.0", - "uuid": "9.0.0", - "vue": "3.3.4", - "vue-i18n": "9.2.2", - "vue-router": "4.2.2", - "vue3-ace-editor": "2.2.3", - "vuetify": "3.3.2" - }, - "devDependencies": { - "@mdi/font": "7.1.96", - "@pinia/testing": "0.1.3", - "@rushstack/eslint-patch": "1.2.0", - "@testing-library/jest-dom": "5.16.5", - "@testing-library/user-event": "14.4.3", - "@testing-library/vue": "7.0.0", - "@types/jsdom": "21.1.0", - "@types/node": "18.13.0", - "@types/uuid": "9.0.2", - "@vitejs/plugin-vue": "4.0.0", - "@vue/eslint-config-prettier": "7.0.0", - "@vue/eslint-config-typescript": "11.0.2", - "@vue/test-utils": "2.3.2", - "@vue/tsconfig": "0.1.3", - "eslint": "8.34.0", - "eslint-plugin-sort-imports-es6-autofix": "0.6.0", - "eslint-plugin-vue": "9.9.0", - "jsdom": "22.1.0", - "json-server": "0.17.1", - "msw": "1.2.2", - "npm-run-all": "4.1.5", - "prettier": "2.8.4", - "sass": "1.58.1", - "typescript": "4.9.5", - "vite": "4.1.1", - "vite-plugin-rewrite-all": "1.0.1", - "vite-plugin-vuetify": "1.0.2", - "vitest": "0.31.4", - "vue-tsc": "1.0.24" - } -} diff --git a/hermes-console-vue/src/views/search/subscription-search-results/SubscriptionSearchResults.vue b/hermes-console-vue/src/views/search/subscription-search-results/SubscriptionSearchResults.vue deleted file mode 100644 index 8889cf8975..0000000000 --- a/hermes-console-vue/src/views/search/subscription-search-results/SubscriptionSearchResults.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - diff --git a/hermes-console-vue/src/views/search/topic-search-results/TopicSearchResults.vue b/hermes-console-vue/src/views/search/topic-search-results/TopicSearchResults.vue deleted file mode 100644 index 8669dcaa06..0000000000 --- a/hermes-console-vue/src/views/search/topic-search-results/TopicSearchResults.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/hermes-console/.bowerrc b/hermes-console/.bowerrc deleted file mode 100644 index a3a2355531..0000000000 --- a/hermes-console/.bowerrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "directory" : "static/components", - "registry": "https://bower.herokuapp.com" -} \ No newline at end of file diff --git a/hermes-console-vue/.eslintrc.cjs b/hermes-console/.eslintrc.cjs similarity index 100% rename from hermes-console-vue/.eslintrc.cjs rename to hermes-console/.eslintrc.cjs diff --git a/hermes-console-vue/.gitignore b/hermes-console/.gitignore similarity index 100% rename from hermes-console-vue/.gitignore rename to hermes-console/.gitignore diff --git a/hermes-console/.jshintrc b/hermes-console/.jshintrc deleted file mode 100644 index 53b202cb9f..0000000000 --- a/hermes-console/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "esversion": 6 -} \ No newline at end of file diff --git a/hermes-console-vue/.prettierrc.json b/hermes-console/.prettierrc.json similarity index 100% rename from hermes-console-vue/.prettierrc.json rename to hermes-console/.prettierrc.json diff --git a/hermes-console-vue/.vscode/extensions.json b/hermes-console/.vscode/extensions.json similarity index 100% rename from hermes-console-vue/.vscode/extensions.json rename to hermes-console/.vscode/extensions.json diff --git a/hermes-console/Gruntfile.js b/hermes-console/Gruntfile.js deleted file mode 100644 index a6e9e0fb43..0000000000 --- a/hermes-console/Gruntfile.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = function(grunt) { - - grunt.initConfig({ - jshint: { - files: ['Gruntfile.js', 'static/js/**/*.js', 'test/**/*.js'], - options: { - 'esnext': 6, - } }, - watch: { - files: ['<%= jshint.files %>'], - tasks: ['jshint', 'karma'] - }, - karma: { - unit: { - configFile: 'karma.config.js', - browsers: ['ChromeHeadless'] - } - } - }); - - - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-karma'); - grunt.loadNpmTasks('grunt-contrib-watch'); - - grunt.registerTask('test', ['jshint', 'karma']); - - grunt.registerTask('default', ['test']); - -}; diff --git a/hermes-console/README.md b/hermes-console/README.md index 1cbc2a23b1..71dff2200f 100644 --- a/hermes-console/README.md +++ b/hermes-console/README.md @@ -1,62 +1,50 @@ -Hermes Console -==== +# hermes-console -Hermes admin console - UI for Hermes Management API. +Hermes console written in Vue 3. -## Build and install +## Requirements -Install backend and frontend dependencies: +* node >=18.0.0 +* yarn -```bash -npm install -bower install -``` - -## Configuration - -Hermes Console has two initial configuration options, which can be specified using either -command line or environment variables: +## Project Setup -* `-p` or `HERMES_CONSOLE_PORT`: specify port (default: `8000`) -* `-c` or `HERMES_CONSOLE_CONFIG`: specify configuration source: local file or http resource (default: `./config.json`) +```sh +yarn +``` -For example to run Hermes Console at port 8001 and fetch configuration from remote source: +### Run mocked backend server -```bash -node serve.js -p 8001 -c http://configuration-source +```sh +yarn dev-server ``` -Other configuration can be found in `config.json.example` file. +### Compile and Hot-Reload for Development -## Run +```sh +yarn dev +``` -Use provided node script: +### Type-Check, Compile and Minify for Production -``` -./serve.js +```sh +yarn build ``` -Or explicitly via node: +### Run Unit Tests with [Vitest](https://vitest.dev/) -``` -node serve.js +```sh +yarn test:unit ``` -For development purposes to have hermes console autoreload changed files it can be run with `nodemon` +### Lint with [ESLint](https://eslint.org/) -Install: -``` -npm install nodemon -g -``` -Run: +```sh +yarn lint ``` -nodemon serve.js -``` - -## Tests -In order to run all tests and `jshint` code analysis run `grunt` tasks: +### Lint with [ESLint](https://eslint.org/) and fix -``` -grunt test +```sh +yarn lint:fix ``` diff --git a/hermes-console/bower.json b/hermes-console/bower.json deleted file mode 100644 index 82f162af4b..0000000000 --- a/hermes-console/bower.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "hermes-console", - "version": "1.0.0", - "description": "Console for Hermes project", - "main": [], - "private": true, - "dependencies": { - "bootstrap": "~3.3.5", - "angular": "~1.4.9", - "angular-resource": "~1.4.9", - "angular-ui-router": "~0.2.15", - "angular-bootstrap": "~0.14.2", - "angular-animate": "~1.4.9", - "angular-sanitize": "~1.4.9", - "angularjs-toaster": "0.4.15", - "lodash": "2.4.1", - "font-awesome": "4.2.0", - "json-formatter": "0.2.2", - "hello": "~1.3.7", - "jquery": "2.1.4", - "angular-deferred-bootstrap": "~0.1.9", - "utf8": "3.0.0", - "angular-ui-ace": "0.2.3", - "eonasdan-bootstrap-datetimepicker": "~4.17.47" - }, - "resolutions": { - "angular": "1.4.14" - } -} diff --git a/hermes-console/config.json.example b/hermes-console/config.json.example deleted file mode 100644 index 9f58136c63..0000000000 --- a/hermes-console/config.json.example +++ /dev/null @@ -1,96 +0,0 @@ -{ - "console": { - "title": "hermes console" // page title - "footer": "hermes.allegro.tech" // page footer - "criticalEnvironment": false // should env alert be alert-danger - "environmentName": "LOCAL" // console environment displayed in navbar - }, - "dashboard": { - "metrics": "", // link to metrics dashboard - "docs": "http://hermes-pubsub.rtfd.org" // link to documentation - }, - "hermes": { - "discovery": { - "type": "simple", - "simple": { - "url": "http://localhost:8080" - }, - "consul": { - "serviceName": "hermes-management", - "agentUrl": "http://localhost:8500" - } - } - }, - "metrics": { - "type": "graphite", // active metric store type - "graphite": { - "url": "localhost:8091", - "prefix": "hermes" - } - }, - "auth": { - "oauth": { - "enabled": false, - "url": "localhost:8092/auth", - "clientId": "hermes", - "scope": "hermes" - }, - "headers": { - "enabled": false, - "adminHeader": "Hermes-Admin-Password" - } - }, - "topic": { - "messagePreviewEnabled": false, - "authEnabled": false, - "defaults": { - "ack": "LEADER", - "contentType": "JSON", - "retentionTime": { - "duration": 1 - } - }, - "contentTypes": { - {"value": "AVRO", "label": "AVRO"}, - {"value": "JSON", "label": "JSON"} - }, - "removeSchema": false, - "buttonsExtension": "Migrate to AVRO", - "offlineClientsEnabled": false - }, - "group": { - "nonAdminCreationEnabled": false - }, - "subscription": { - "endpointAddressResolverMetadata": { - "exampleEntryEnabled": { - "title": "Example boolean entry", - "type": "boolean" - }, - "exampleTextEntry": { - "title": "Example text entry", - "type": "text", - "placeholder": "You should write something here", - "hint": "This should help somehow..." - }, - "exampleSelectEntry": { - "title": "Example select entry", - "type": "select", - "options": { - "": "", - "a": "An option", - "b": "Another option" - } - } - }, - "deliveryTypes": [ - {"value": "SERIAL", "label": "SERIAL"}, - {"value": "BATCH", "label": "BATCH"} - ] - }, - "owner": { - "sources": [ - {"name": "Crowd", "placeholder": "Crowd group (or groups separated by ',')"} - ] - } -} diff --git a/hermes-console/config_default.json b/hermes-console/config_default.json deleted file mode 100644 index 687d5536f5..0000000000 --- a/hermes-console/config_default.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "console": { - "title": "hermes console", - "criticalEnvironment": false, - "environmentName": "LOCAL" - }, - "dashboard": { - "docs": "http://hermes-pubsub.rtfd.org" - }, - "auth": { - "oauth": { - "enabled": false - }, - "headers": { - "enabled": false - } - }, - "topic": { - "messagePreviewEnabled": false, - "contentTypes": [ - {"value": "AVRO", "label": "AVRO"}, - {"value": "JSON", "label": "JSON"} - ], - "defaults": { - "contentType": "AVRO" - }, - "offlineClientsEnabled": false - }, - "group": { - "nonAdminCreationEnabled": true - }, - "subscription": { - "deliveryTypes": [ - {"value": "SERIAL", "label": "SERIAL"}, - {"value": "BATCH", "label": "BATCH"} - ] - }, - "owner": { - "sources": [ - {"name": "Crowd", "placeholder": "Crowd group (or groups separated by ',')"} - ] - }, - "consistency": { - "maxGroupBatchSize": 10 - } -} diff --git a/hermes-console-vue/env.d.ts b/hermes-console/env.d.ts similarity index 100% rename from hermes-console-vue/env.d.ts rename to hermes-console/env.d.ts diff --git a/hermes-console-vue/index.html b/hermes-console/index.html similarity index 100% rename from hermes-console-vue/index.html rename to hermes-console/index.html diff --git a/hermes-console-vue/json-server/db.json b/hermes-console/json-server/db.json similarity index 100% rename from hermes-console-vue/json-server/db.json rename to hermes-console/json-server/db.json diff --git a/hermes-console-vue/json-server/filter-debug.json b/hermes-console/json-server/filter-debug.json similarity index 100% rename from hermes-console-vue/json-server/filter-debug.json rename to hermes-console/json-server/filter-debug.json diff --git a/hermes-console-vue/json-server/routes.json b/hermes-console/json-server/routes.json similarity index 100% rename from hermes-console-vue/json-server/routes.json rename to hermes-console/json-server/routes.json diff --git a/hermes-console-vue/json-server/server.ts b/hermes-console/json-server/server.ts similarity index 100% rename from hermes-console-vue/json-server/server.ts rename to hermes-console/json-server/server.ts diff --git a/hermes-console-vue/json-server/subscriptions.json b/hermes-console/json-server/subscriptions.json similarity index 100% rename from hermes-console-vue/json-server/subscriptions.json rename to hermes-console/json-server/subscriptions.json diff --git a/hermes-console-vue/json-server/topics.json b/hermes-console/json-server/topics.json similarity index 100% rename from hermes-console-vue/json-server/topics.json rename to hermes-console/json-server/topics.json diff --git a/hermes-console/karma.config.js b/hermes-console/karma.config.js deleted file mode 100644 index 4222bdb6c7..0000000000 --- a/hermes-console/karma.config.js +++ /dev/null @@ -1,110 +0,0 @@ -// Karma configuration -// Generated on Wed Oct 15 2014 23:49:21 GMT+0200 (CEST) - -module.exports = function(config) { - config.set({ - - plugins:[ - 'karma-jasmine', - 'karma-requirejs', - 'karma-coverage', - 'karma-junit-reporter', - 'karma-chrome-launcher', - 'karma-ng-html2js-preprocessor' - ], - - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: '', - - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['jasmine'], - - - // list of files / patterns to load in the browser - files: [ - "test/fixture/config.js", - "static/components/angular/angular.js", - "static/components/angular-ui-router/release/angular-ui-router.min.js", - "static/components/angular-bootstrap/ui-bootstrap-tpls.min.js", - "static/components/angular-resource/angular-resource.js", - "static/components/angular-sanitize/angular-sanitize.js", - "static/components/angular-animate/angular-animate.min.js", - "static/components/lodash/dist/lodash.min.js", - "static/components/angularjs-toaster/toaster.js", - "static/components/json-formatter/dist/json-formatter.min.js.js", - "static/components/hello/dist/hello.min.js", - "static/components/jquery/dist/jquery.min.js", - "static/js/console/owner/OwnerRepository.js", - "static/js/**/*.js", - "static/partials/**/*.html", - "node_modules/angular-mocks/angular-mocks.js", - "test/unit/**/*.js" - ], - - junitReporter : { - outputFile: 'test_out/unit.xml', - suite: 'unit' - }, - - // list of files to exclude - exclude: [ - "static/js/bootstrap.js", - ], - - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - // source files, that you wanna generate coverage for - // do not include tests or libraries - // (these files will be instrumented by Istanbul) - 'js/**/*.js': ['coverage'], - 'static/partials/**/*.html': ['ng-html2js'] - }, - - ngHtml2JsPreprocessor: { - stripPrefix: 'static/', - moduleName: 'templates' - }, - - // optionally, configure the reporter - coverageReporter: { - type : 'html', - dir : 'coverage/' - }, - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ['progress', 'junit', 'coverage'], - - - // web server port - port: 9876, - - - // enable / disable colors in the output (reporters and logs) - colors: true, - - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: false, - - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['ChromeHeadless'], - - - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: true - }); -}; diff --git a/hermes-console/package.json b/hermes-console/package.json index 6d9980ff88..6a0195b9c6 100644 --- a/hermes-console/package.json +++ b/hermes-console/package.json @@ -1,31 +1,65 @@ { "name": "hermes-console", "description": "Console for Hermes Management", - "repository": "https://github.com/allegro/hermes", - "main": "serve.js", "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + }, + "scripts": { + "dev": "vite", + "build": "run-p type-check build-only", + "preview": "vite preview", + "test:unit": "vitest --environment jsdom", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", + "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "dev-server": "node json-server/server.ts" + }, "dependencies": { - "bower": "^1.7.2", - "lodash": "^4.17.4", - "node-static": "^0.7.6", - "request": "^2.67.0", - "yargs": "^3.32.0" + "ace-builds": "1.28.0", + "axios": "1.4.0", + "base64-arraybuffer": "1.0.2", + "jwt-decode": "3.1.2", + "pinia": "2.1.4", + "pinia-plugin-persistedstate": "3.2.0", + "query-string": "8.1.0", + "uuid": "9.0.0", + "vue": "3.3.4", + "vue-i18n": "9.2.2", + "vue-router": "4.2.2", + "vue3-ace-editor": "2.2.3", + "vuetify": "3.3.2" }, "devDependencies": { - "angular-mocks": "~1.4.7", - "grunt": "^0.4.5", - "grunt-cli": "~0.1.13", - "grunt-contrib-jshint": "0.11.3", - "grunt-contrib-watch": "~0.6.1", - "grunt-karma": "~0.12.1", - "jasmine-core": "~2.1.3", - "karma": "^6.3.4", - "karma-chrome-launcher": "^3.1.0", - "karma-coverage": "^2.0.3", - "karma-jasmine": "^4.0.1", - "karma-junit-reporter": "^2.0.1", - "karma-ng-html2js-preprocessor": "^1.0.0", - "karma-requirejs": "^1.1.0", - "phantomjs": "~1.9.18" + "@mdi/font": "7.1.96", + "@pinia/testing": "0.1.3", + "@rushstack/eslint-patch": "1.2.0", + "@testing-library/jest-dom": "5.16.5", + "@testing-library/user-event": "14.4.3", + "@testing-library/vue": "7.0.0", + "@types/jsdom": "21.1.0", + "@types/node": "18.13.0", + "@types/uuid": "9.0.2", + "@vitejs/plugin-vue": "4.0.0", + "@vue/eslint-config-prettier": "7.0.0", + "@vue/eslint-config-typescript": "11.0.2", + "@vue/test-utils": "2.3.2", + "@vue/tsconfig": "0.1.3", + "eslint": "8.34.0", + "eslint-plugin-sort-imports-es6-autofix": "0.6.0", + "eslint-plugin-vue": "9.9.0", + "jsdom": "22.1.0", + "json-server": "0.17.1", + "msw": "1.2.2", + "npm-run-all": "4.1.5", + "prettier": "2.8.4", + "sass": "1.58.1", + "typescript": "4.9.5", + "vite": "4.1.1", + "vite-plugin-rewrite-all": "1.0.1", + "vite-plugin-vuetify": "1.0.2", + "vitest": "0.31.4", + "vue-tsc": "1.0.24" } } diff --git a/hermes-console/package.sh b/hermes-console/package.sh deleted file mode 100755 index fb6e08b3f7..0000000000 --- a/hermes-console/package.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -NAME=hermes-console - -if [ -z ${1+x} ]; then - ARCHIVE_NAME=hermes-console -else - ARCHIVE_NAME=$1 -fi - -UNAME="$(uname -s)" -case "${UNAME}" in - Darwin*) DISTRO=darwin;; - *) DISTRO=linux -esac - -NODE_VERSION="v6.11.4" -NODE_DIST="node-$NODE_VERSION-$DISTRO-x64" - -printf "Packaging Hermes Console\n" - -if [ ! -e dist ]; then - mkdir -p dist -fi - -if [ ! -e dist/$NODE_DIST.tar.gz ]; then - printf "Downloading NodeJS distribution version $NODE_DIST\n" - wget --quiet --no-clobber "https://nodejs.org/dist/$NODE_VERSION/$NODE_DIST.tar.gz" --directory-prefix dist - mkdir -p dist/node - tar --extract --keep-old-files --strip 1 --file dist/$NODE_DIST.tar.gz -C dist/node -fi - -export PATH=$(pwd)/dist/node/bin:$PATH - -printf "Running NPM and bower\n" - -npm install --production --yes -node_modules/.bin/bower install --allow-root -F - -printf "Creating directory: dist/static\n" - -# copy static contents -cp -r static dist diff --git a/hermes-console-vue/public/favicon.ico b/hermes-console/public/favicon.ico similarity index 100% rename from hermes-console-vue/public/favicon.ico rename to hermes-console/public/favicon.ico diff --git a/hermes-console/run.sh b/hermes-console/run.sh deleted file mode 100755 index ebf7ac6fcd..0000000000 --- a/hermes-console/run.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -export PATH=$(pwd)/node/bin:$PATH - -node serve.js "$@" \ No newline at end of file diff --git a/hermes-console/serve.js b/hermes-console/serve.js deleted file mode 100755 index 079732eef7..0000000000 --- a/hermes-console/serve.js +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env node - -var static = require('node-static'); - -var request = require('request'); -var fs = require('fs'); - -var _ = require('lodash'); - -var DEFAULT_CONFIG = './config_default.json'; - -var yargs = require('yargs') - .env('HERMES_CONSOLE') - .option('p', { - alias: 'port', - default: 8000, - demand: true - }) - .option('c', { - alias: 'config', - default: './config.json', - demand: true - }) - .argv; - -var port = yargs.port; - -readConfiguration(yargs.config, startServer); - -function startServer(config) { - console.log('Starting Hermes Console at port: ' + port); - console.log('Config: ' + JSON.stringify(config, null, 2)); - - var file = new static.Server('./static'); - require('http').createServer((request, response) => { - response.setHeader('Pragma', 'no-cache'); - if(request.url == '/console') { - response.setHeader('Content-Type', 'application/json'); - response.end('var config = ' + JSON.stringify(config) + ';', 'UTF-8'); - } - else if(request.url == '/status/ping') { - response.end('pong', 'UTF-8'); - } - else { - request.addListener('end', function () { - file.serve(request, response); - }).resume(); - } - }).listen(port); -} - -function readConfiguration(source, callback) { - console.log('Reading default configuration from file: ' + DEFAULT_CONFIG); - var defaultConfig = JSON.parse(fs.readFileSync(DEFAULT_CONFIG, 'utf8')); - - if (source.indexOf('htt') === 0) { - console.log('Reading configuration from remote source: ' + source); - request.get(source, (error, res, body) => { callback(mergeConfig(defaultConfig, JSON.parse(body))); }); - } - else { - console.log('Reading configuration from file: ' + source); - var config = JSON.parse(fs.readFileSync(source, 'utf8')); - callback(mergeConfig(defaultConfig, config)); - } -} - -function mergeConfig(defaultConfig, config) { - return _.mergeWith(defaultConfig, config, customizer) -} - -function customizer(objValue, srcValue) { - if (_.isArray(objValue)) { - return srcValue - } -} \ No newline at end of file diff --git a/hermes-console-vue/src/App.vue b/hermes-console/src/App.vue similarity index 100% rename from hermes-console-vue/src/App.vue rename to hermes-console/src/App.vue diff --git a/hermes-console-vue/src/api/OffsetRetransmissionDate.ts b/hermes-console/src/api/OffsetRetransmissionDate.ts similarity index 100% rename from hermes-console-vue/src/api/OffsetRetransmissionDate.ts rename to hermes-console/src/api/OffsetRetransmissionDate.ts diff --git a/hermes-console-vue/src/api/access-token-response.ts b/hermes-console/src/api/access-token-response.ts similarity index 100% rename from hermes-console-vue/src/api/access-token-response.ts rename to hermes-console/src/api/access-token-response.ts diff --git a/hermes-console-vue/src/api/app-configuration.ts b/hermes-console/src/api/app-configuration.ts similarity index 100% rename from hermes-console-vue/src/api/app-configuration.ts rename to hermes-console/src/api/app-configuration.ts diff --git a/hermes-console-vue/src/api/constraints.ts b/hermes-console/src/api/constraints.ts similarity index 100% rename from hermes-console-vue/src/api/constraints.ts rename to hermes-console/src/api/constraints.ts diff --git a/hermes-console-vue/src/api/consumer-group.ts b/hermes-console/src/api/consumer-group.ts similarity index 100% rename from hermes-console-vue/src/api/consumer-group.ts rename to hermes-console/src/api/consumer-group.ts diff --git a/hermes-console-vue/src/api/content-type.ts b/hermes-console/src/api/content-type.ts similarity index 100% rename from hermes-console-vue/src/api/content-type.ts rename to hermes-console/src/api/content-type.ts diff --git a/hermes-console-vue/src/api/datacenter-readiness.ts b/hermes-console/src/api/datacenter-readiness.ts similarity index 100% rename from hermes-console-vue/src/api/datacenter-readiness.ts rename to hermes-console/src/api/datacenter-readiness.ts diff --git a/hermes-console-vue/src/api/group.ts b/hermes-console/src/api/group.ts similarity index 100% rename from hermes-console-vue/src/api/group.ts rename to hermes-console/src/api/group.ts diff --git a/hermes-console-vue/src/api/hermes-client/index.ts b/hermes-console/src/api/hermes-client/index.ts similarity index 100% rename from hermes-console-vue/src/api/hermes-client/index.ts rename to hermes-console/src/api/hermes-client/index.ts diff --git a/hermes-console-vue/src/api/inconsistent-group.ts b/hermes-console/src/api/inconsistent-group.ts similarity index 100% rename from hermes-console-vue/src/api/inconsistent-group.ts rename to hermes-console/src/api/inconsistent-group.ts diff --git a/hermes-console-vue/src/api/message-filters-verification.ts b/hermes-console/src/api/message-filters-verification.ts similarity index 100% rename from hermes-console-vue/src/api/message-filters-verification.ts rename to hermes-console/src/api/message-filters-verification.ts diff --git a/hermes-console-vue/src/api/offline-clients-source.ts b/hermes-console/src/api/offline-clients-source.ts similarity index 100% rename from hermes-console-vue/src/api/offline-clients-source.ts rename to hermes-console/src/api/offline-clients-source.ts diff --git a/hermes-console-vue/src/api/offline-retransmission.ts b/hermes-console/src/api/offline-retransmission.ts similarity index 100% rename from hermes-console-vue/src/api/offline-retransmission.ts rename to hermes-console/src/api/offline-retransmission.ts diff --git a/hermes-console-vue/src/api/owner-id.ts b/hermes-console/src/api/owner-id.ts similarity index 100% rename from hermes-console-vue/src/api/owner-id.ts rename to hermes-console/src/api/owner-id.ts diff --git a/hermes-console-vue/src/api/owner.ts b/hermes-console/src/api/owner.ts similarity index 100% rename from hermes-console-vue/src/api/owner.ts rename to hermes-console/src/api/owner.ts diff --git a/hermes-console-vue/src/api/role.ts b/hermes-console/src/api/role.ts similarity index 100% rename from hermes-console-vue/src/api/role.ts rename to hermes-console/src/api/role.ts diff --git a/hermes-console-vue/src/api/stats.ts b/hermes-console/src/api/stats.ts similarity index 100% rename from hermes-console-vue/src/api/stats.ts rename to hermes-console/src/api/stats.ts diff --git a/hermes-console-vue/src/api/subscription-health.ts b/hermes-console/src/api/subscription-health.ts similarity index 100% rename from hermes-console-vue/src/api/subscription-health.ts rename to hermes-console/src/api/subscription-health.ts diff --git a/hermes-console-vue/src/api/subscription-metrics.ts b/hermes-console/src/api/subscription-metrics.ts similarity index 100% rename from hermes-console-vue/src/api/subscription-metrics.ts rename to hermes-console/src/api/subscription-metrics.ts diff --git a/hermes-console-vue/src/api/subscription-undelivered.ts b/hermes-console/src/api/subscription-undelivered.ts similarity index 100% rename from hermes-console-vue/src/api/subscription-undelivered.ts rename to hermes-console/src/api/subscription-undelivered.ts diff --git a/hermes-console-vue/src/api/subscription.ts b/hermes-console/src/api/subscription.ts similarity index 100% rename from hermes-console-vue/src/api/subscription.ts rename to hermes-console/src/api/subscription.ts diff --git a/hermes-console-vue/src/api/topic.ts b/hermes-console/src/api/topic.ts similarity index 100% rename from hermes-console-vue/src/api/topic.ts rename to hermes-console/src/api/topic.ts diff --git a/hermes-console-vue/src/assets/hermes-logo-dark-theme.png b/hermes-console/src/assets/hermes-logo-dark-theme.png similarity index 100% rename from hermes-console-vue/src/assets/hermes-logo-dark-theme.png rename to hermes-console/src/assets/hermes-logo-dark-theme.png diff --git a/hermes-console-vue/src/assets/hermes-logo-full-dark-theme.png b/hermes-console/src/assets/hermes-logo-full-dark-theme.png similarity index 100% rename from hermes-console-vue/src/assets/hermes-logo-full-dark-theme.png rename to hermes-console/src/assets/hermes-logo-full-dark-theme.png diff --git a/hermes-console-vue/src/assets/hermes-logo-full.png b/hermes-console/src/assets/hermes-logo-full.png similarity index 100% rename from hermes-console-vue/src/assets/hermes-logo-full.png rename to hermes-console/src/assets/hermes-logo-full.png diff --git a/hermes-console-vue/src/assets/hermes-logo-header-dark-theme.png b/hermes-console/src/assets/hermes-logo-header-dark-theme.png similarity index 100% rename from hermes-console-vue/src/assets/hermes-logo-header-dark-theme.png rename to hermes-console/src/assets/hermes-logo-header-dark-theme.png diff --git a/hermes-console-vue/src/assets/hermes-logo-header.png b/hermes-console/src/assets/hermes-logo-header.png similarity index 100% rename from hermes-console-vue/src/assets/hermes-logo-header.png rename to hermes-console/src/assets/hermes-logo-header.png diff --git a/hermes-console-vue/src/assets/hermes-logo.png b/hermes-console/src/assets/hermes-logo.png similarity index 100% rename from hermes-console-vue/src/assets/hermes-logo.png rename to hermes-console/src/assets/hermes-logo.png diff --git a/hermes-console-vue/src/components/ace-editor/AceEditor.vue b/hermes-console/src/components/ace-editor/AceEditor.vue similarity index 100% rename from hermes-console-vue/src/components/ace-editor/AceEditor.vue rename to hermes-console/src/components/ace-editor/AceEditor.vue diff --git a/hermes-console-vue/src/components/ace-editor/ace-config.ts b/hermes-console/src/components/ace-editor/ace-config.ts similarity index 100% rename from hermes-console-vue/src/components/ace-editor/ace-config.ts rename to hermes-console/src/components/ace-editor/ace-config.ts diff --git a/hermes-console-vue/src/components/app-notification/AppNotification.vue b/hermes-console/src/components/app-notification/AppNotification.vue similarity index 100% rename from hermes-console-vue/src/components/app-notification/AppNotification.vue rename to hermes-console/src/components/app-notification/AppNotification.vue diff --git a/hermes-console-vue/src/components/app-notification/AppNotificationProvider.vue b/hermes-console/src/components/app-notification/AppNotificationProvider.vue similarity index 100% rename from hermes-console-vue/src/components/app-notification/AppNotificationProvider.vue rename to hermes-console/src/components/app-notification/AppNotificationProvider.vue diff --git a/hermes-console-vue/src/components/confirmation-dialog/ConfirmationDialog.spec.ts b/hermes-console/src/components/confirmation-dialog/ConfirmationDialog.spec.ts similarity index 100% rename from hermes-console-vue/src/components/confirmation-dialog/ConfirmationDialog.spec.ts rename to hermes-console/src/components/confirmation-dialog/ConfirmationDialog.spec.ts diff --git a/hermes-console-vue/src/components/confirmation-dialog/ConfirmationDialog.vue b/hermes-console/src/components/confirmation-dialog/ConfirmationDialog.vue similarity index 100% rename from hermes-console-vue/src/components/confirmation-dialog/ConfirmationDialog.vue rename to hermes-console/src/components/confirmation-dialog/ConfirmationDialog.vue diff --git a/hermes-console-vue/src/components/console-alert/ConsoleAlert.vue b/hermes-console/src/components/console-alert/ConsoleAlert.vue similarity index 100% rename from hermes-console-vue/src/components/console-alert/ConsoleAlert.vue rename to hermes-console/src/components/console-alert/ConsoleAlert.vue diff --git a/hermes-console-vue/src/components/console-footer/ConsoleFooter.spec.ts b/hermes-console/src/components/console-footer/ConsoleFooter.spec.ts similarity index 100% rename from hermes-console-vue/src/components/console-footer/ConsoleFooter.spec.ts rename to hermes-console/src/components/console-footer/ConsoleFooter.spec.ts diff --git a/hermes-console-vue/src/components/console-footer/ConsoleFooter.vue b/hermes-console/src/components/console-footer/ConsoleFooter.vue similarity index 100% rename from hermes-console-vue/src/components/console-footer/ConsoleFooter.vue rename to hermes-console/src/components/console-footer/ConsoleFooter.vue diff --git a/hermes-console-vue/src/components/console-header/ConsoleHeader.spec.ts b/hermes-console/src/components/console-header/ConsoleHeader.spec.ts similarity index 100% rename from hermes-console-vue/src/components/console-header/ConsoleHeader.spec.ts rename to hermes-console/src/components/console-header/ConsoleHeader.spec.ts diff --git a/hermes-console-vue/src/components/console-header/ConsoleHeader.vue b/hermes-console/src/components/console-header/ConsoleHeader.vue similarity index 100% rename from hermes-console-vue/src/components/console-header/ConsoleHeader.vue rename to hermes-console/src/components/console-header/ConsoleHeader.vue diff --git a/hermes-console-vue/src/components/costs-card/CostsCard.spec.ts b/hermes-console/src/components/costs-card/CostsCard.spec.ts similarity index 100% rename from hermes-console-vue/src/components/costs-card/CostsCard.spec.ts rename to hermes-console/src/components/costs-card/CostsCard.spec.ts diff --git a/hermes-console-vue/src/components/costs-card/CostsCard.vue b/hermes-console/src/components/costs-card/CostsCard.vue similarity index 100% rename from hermes-console-vue/src/components/costs-card/CostsCard.vue rename to hermes-console/src/components/costs-card/CostsCard.vue diff --git a/hermes-console-vue/src/components/environment-badge/EnviromentBadge.spec.ts b/hermes-console/src/components/environment-badge/EnviromentBadge.spec.ts similarity index 100% rename from hermes-console-vue/src/components/environment-badge/EnviromentBadge.spec.ts rename to hermes-console/src/components/environment-badge/EnviromentBadge.spec.ts diff --git a/hermes-console-vue/src/components/environment-badge/EnviromentBadge.vue b/hermes-console/src/components/environment-badge/EnviromentBadge.vue similarity index 100% rename from hermes-console-vue/src/components/environment-badge/EnviromentBadge.vue rename to hermes-console/src/components/environment-badge/EnviromentBadge.vue diff --git a/hermes-console-vue/src/components/key-value-card/KeyValueCard.spec.ts b/hermes-console/src/components/key-value-card/KeyValueCard.spec.ts similarity index 100% rename from hermes-console-vue/src/components/key-value-card/KeyValueCard.spec.ts rename to hermes-console/src/components/key-value-card/KeyValueCard.spec.ts diff --git a/hermes-console-vue/src/components/key-value-card/KeyValueCard.vue b/hermes-console/src/components/key-value-card/KeyValueCard.vue similarity index 100% rename from hermes-console-vue/src/components/key-value-card/KeyValueCard.vue rename to hermes-console/src/components/key-value-card/KeyValueCard.vue diff --git a/hermes-console-vue/src/components/key-value-card/key-value-card-item/KeyValueCardItem.spec.ts b/hermes-console/src/components/key-value-card/key-value-card-item/KeyValueCardItem.spec.ts similarity index 100% rename from hermes-console-vue/src/components/key-value-card/key-value-card-item/KeyValueCardItem.spec.ts rename to hermes-console/src/components/key-value-card/key-value-card-item/KeyValueCardItem.spec.ts diff --git a/hermes-console-vue/src/components/key-value-card/key-value-card-item/KeyValueCardItem.vue b/hermes-console/src/components/key-value-card/key-value-card-item/KeyValueCardItem.vue similarity index 100% rename from hermes-console-vue/src/components/key-value-card/key-value-card-item/KeyValueCardItem.vue rename to hermes-console/src/components/key-value-card/key-value-card-item/KeyValueCardItem.vue diff --git a/hermes-console-vue/src/components/loading-spinner/LoadingSpinner.vue b/hermes-console/src/components/loading-spinner/LoadingSpinner.vue similarity index 100% rename from hermes-console-vue/src/components/loading-spinner/LoadingSpinner.vue rename to hermes-console/src/components/loading-spinner/LoadingSpinner.vue diff --git a/hermes-console-vue/src/components/select-field/SelectField.vue b/hermes-console/src/components/select-field/SelectField.vue similarity index 100% rename from hermes-console-vue/src/components/select-field/SelectField.vue rename to hermes-console/src/components/select-field/SelectField.vue diff --git a/hermes-console-vue/src/components/select-field/types.ts b/hermes-console/src/components/select-field/types.ts similarity index 100% rename from hermes-console-vue/src/components/select-field/types.ts rename to hermes-console/src/components/select-field/types.ts diff --git a/hermes-console-vue/src/components/text-field/TextField.vue b/hermes-console/src/components/text-field/TextField.vue similarity index 100% rename from hermes-console-vue/src/components/text-field/TextField.vue rename to hermes-console/src/components/text-field/TextField.vue diff --git a/hermes-console-vue/src/components/theme-switch/ThemeSwitch.spec.ts b/hermes-console/src/components/theme-switch/ThemeSwitch.spec.ts similarity index 100% rename from hermes-console-vue/src/components/theme-switch/ThemeSwitch.spec.ts rename to hermes-console/src/components/theme-switch/ThemeSwitch.spec.ts diff --git a/hermes-console-vue/src/components/theme-switch/ThemeSwitch.vue b/hermes-console/src/components/theme-switch/ThemeSwitch.vue similarity index 100% rename from hermes-console-vue/src/components/theme-switch/ThemeSwitch.vue rename to hermes-console/src/components/theme-switch/ThemeSwitch.vue diff --git a/hermes-console-vue/src/components/tooltip-icon/TooltipIcon.vue b/hermes-console/src/components/tooltip-icon/TooltipIcon.vue similarity index 100% rename from hermes-console-vue/src/components/tooltip-icon/TooltipIcon.vue rename to hermes-console/src/components/tooltip-icon/TooltipIcon.vue diff --git a/hermes-console-vue/src/composables/constraints/use-constraints/useConstraints.spec.ts b/hermes-console/src/composables/constraints/use-constraints/useConstraints.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/constraints/use-constraints/useConstraints.spec.ts rename to hermes-console/src/composables/constraints/use-constraints/useConstraints.spec.ts diff --git a/hermes-console-vue/src/composables/constraints/use-constraints/useConstraints.ts b/hermes-console/src/composables/constraints/use-constraints/useConstraints.ts similarity index 100% rename from hermes-console-vue/src/composables/constraints/use-constraints/useConstraints.ts rename to hermes-console/src/composables/constraints/use-constraints/useConstraints.ts diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts b/hermes-console/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts rename to hermes-console/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.spec.ts diff --git a/hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts b/hermes-console/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts similarity index 100% rename from hermes-console-vue/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts rename to hermes-console/src/composables/consumer-groups/use-consumer-groups/useConsumerGroups.ts diff --git a/hermes-console-vue/src/composables/dialog/use-dialog/useDialog.ts b/hermes-console/src/composables/dialog/use-dialog/useDialog.ts similarity index 100% rename from hermes-console-vue/src/composables/dialog/use-dialog/useDialog.ts rename to hermes-console/src/composables/dialog/use-dialog/useDialog.ts diff --git a/hermes-console-vue/src/composables/groups/use-groups/useGroups.spec.ts b/hermes-console/src/composables/groups/use-groups/useGroups.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/groups/use-groups/useGroups.spec.ts rename to hermes-console/src/composables/groups/use-groups/useGroups.spec.ts diff --git a/hermes-console-vue/src/composables/groups/use-groups/useGroups.ts b/hermes-console/src/composables/groups/use-groups/useGroups.ts similarity index 100% rename from hermes-console-vue/src/composables/groups/use-groups/useGroups.ts rename to hermes-console/src/composables/groups/use-groups/useGroups.ts diff --git a/hermes-console-vue/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.spec.ts b/hermes-console/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.spec.ts rename to hermes-console/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.spec.ts diff --git a/hermes-console-vue/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.ts b/hermes-console/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.ts similarity index 100% rename from hermes-console-vue/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.ts rename to hermes-console/src/composables/inconsistent-topics/use-inconsistent-topics/useInconsistentTopics.ts diff --git a/hermes-console-vue/src/composables/metrics/use-metrics/useMetrics.spec.ts b/hermes-console/src/composables/metrics/use-metrics/useMetrics.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/metrics/use-metrics/useMetrics.spec.ts rename to hermes-console/src/composables/metrics/use-metrics/useMetrics.spec.ts diff --git a/hermes-console-vue/src/composables/metrics/use-metrics/useMetrics.ts b/hermes-console/src/composables/metrics/use-metrics/useMetrics.ts similarity index 100% rename from hermes-console-vue/src/composables/metrics/use-metrics/useMetrics.ts rename to hermes-console/src/composables/metrics/use-metrics/useMetrics.ts diff --git a/hermes-console-vue/src/composables/readiness/use-readiness/useReadiness.spec.ts b/hermes-console/src/composables/readiness/use-readiness/useReadiness.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/readiness/use-readiness/useReadiness.spec.ts rename to hermes-console/src/composables/readiness/use-readiness/useReadiness.spec.ts diff --git a/hermes-console-vue/src/composables/readiness/use-readiness/useReadiness.ts b/hermes-console/src/composables/readiness/use-readiness/useReadiness.ts similarity index 100% rename from hermes-console-vue/src/composables/readiness/use-readiness/useReadiness.ts rename to hermes-console/src/composables/readiness/use-readiness/useReadiness.ts diff --git a/hermes-console-vue/src/composables/roles/use-roles/useRoles.spec.ts b/hermes-console/src/composables/roles/use-roles/useRoles.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/roles/use-roles/useRoles.spec.ts rename to hermes-console/src/composables/roles/use-roles/useRoles.spec.ts diff --git a/hermes-console-vue/src/composables/roles/use-roles/useRoles.ts b/hermes-console/src/composables/roles/use-roles/useRoles.ts similarity index 100% rename from hermes-console-vue/src/composables/roles/use-roles/useRoles.ts rename to hermes-console/src/composables/roles/use-roles/useRoles.ts diff --git a/hermes-console-vue/src/composables/search/useSearch.spec.ts b/hermes-console/src/composables/search/useSearch.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/search/useSearch.spec.ts rename to hermes-console/src/composables/search/useSearch.spec.ts diff --git a/hermes-console-vue/src/composables/search/useSearch.ts b/hermes-console/src/composables/search/useSearch.ts similarity index 100% rename from hermes-console-vue/src/composables/search/useSearch.ts rename to hermes-console/src/composables/search/useSearch.ts diff --git a/hermes-console-vue/src/composables/stats/use-stats/useStats.spec.ts b/hermes-console/src/composables/stats/use-stats/useStats.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/stats/use-stats/useStats.spec.ts rename to hermes-console/src/composables/stats/use-stats/useStats.spec.ts diff --git a/hermes-console-vue/src/composables/stats/use-stats/useStats.ts b/hermes-console/src/composables/stats/use-stats/useStats.ts similarity index 100% rename from hermes-console-vue/src/composables/stats/use-stats/useStats.ts rename to hermes-console/src/composables/stats/use-stats/useStats.ts diff --git a/hermes-console-vue/src/composables/subscription/use-create-subscription/types.ts b/hermes-console/src/composables/subscription/use-create-subscription/types.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-create-subscription/types.ts rename to hermes-console/src/composables/subscription/use-create-subscription/types.ts diff --git a/hermes-console-vue/src/composables/subscription/use-create-subscription/useCreateSubscription.spec.ts b/hermes-console/src/composables/subscription/use-create-subscription/useCreateSubscription.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-create-subscription/useCreateSubscription.spec.ts rename to hermes-console/src/composables/subscription/use-create-subscription/useCreateSubscription.spec.ts diff --git a/hermes-console-vue/src/composables/subscription/use-create-subscription/useCreateSubscription.ts b/hermes-console/src/composables/subscription/use-create-subscription/useCreateSubscription.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-create-subscription/useCreateSubscription.ts rename to hermes-console/src/composables/subscription/use-create-subscription/useCreateSubscription.ts diff --git a/hermes-console-vue/src/composables/subscription/use-edit-subscription/types.ts b/hermes-console/src/composables/subscription/use-edit-subscription/types.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-edit-subscription/types.ts rename to hermes-console/src/composables/subscription/use-edit-subscription/types.ts diff --git a/hermes-console-vue/src/composables/subscription/use-edit-subscription/useEditSubscription.spec.ts b/hermes-console/src/composables/subscription/use-edit-subscription/useEditSubscription.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-edit-subscription/useEditSubscription.spec.ts rename to hermes-console/src/composables/subscription/use-edit-subscription/useEditSubscription.spec.ts diff --git a/hermes-console-vue/src/composables/subscription/use-edit-subscription/useEditSubscription.ts b/hermes-console/src/composables/subscription/use-edit-subscription/useEditSubscription.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-edit-subscription/useEditSubscription.ts rename to hermes-console/src/composables/subscription/use-edit-subscription/useEditSubscription.ts diff --git a/hermes-console-vue/src/composables/subscription/use-form-subscription/form-mapper.ts b/hermes-console/src/composables/subscription/use-form-subscription/form-mapper.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-form-subscription/form-mapper.ts rename to hermes-console/src/composables/subscription/use-form-subscription/form-mapper.ts diff --git a/hermes-console-vue/src/composables/subscription/use-form-subscription/types.ts b/hermes-console/src/composables/subscription/use-form-subscription/types.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-form-subscription/types.ts rename to hermes-console/src/composables/subscription/use-form-subscription/types.ts diff --git a/hermes-console-vue/src/composables/subscription/use-form-subscription/useFormSubscription.spec.ts b/hermes-console/src/composables/subscription/use-form-subscription/useFormSubscription.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-form-subscription/useFormSubscription.spec.ts rename to hermes-console/src/composables/subscription/use-form-subscription/useFormSubscription.spec.ts diff --git a/hermes-console-vue/src/composables/subscription/use-form-subscription/useFormSubscription.ts b/hermes-console/src/composables/subscription/use-form-subscription/useFormSubscription.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-form-subscription/useFormSubscription.ts rename to hermes-console/src/composables/subscription/use-form-subscription/useFormSubscription.ts diff --git a/hermes-console-vue/src/composables/subscription/use-import-subscription/useImportSubscription.ts b/hermes-console/src/composables/subscription/use-import-subscription/useImportSubscription.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-import-subscription/useImportSubscription.ts rename to hermes-console/src/composables/subscription/use-import-subscription/useImportSubscription.ts diff --git a/hermes-console-vue/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.spec.ts b/hermes-console/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.spec.ts rename to hermes-console/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.spec.ts diff --git a/hermes-console-vue/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.ts b/hermes-console/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.ts rename to hermes-console/src/composables/subscription/use-subscription-filters-debug/useSubscriptionFiltersDebug.ts diff --git a/hermes-console-vue/src/composables/subscription/use-subscription/useSubscription.spec.ts b/hermes-console/src/composables/subscription/use-subscription/useSubscription.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-subscription/useSubscription.spec.ts rename to hermes-console/src/composables/subscription/use-subscription/useSubscription.spec.ts diff --git a/hermes-console-vue/src/composables/subscription/use-subscription/useSubscription.ts b/hermes-console/src/composables/subscription/use-subscription/useSubscription.ts similarity index 100% rename from hermes-console-vue/src/composables/subscription/use-subscription/useSubscription.ts rename to hermes-console/src/composables/subscription/use-subscription/useSubscription.ts diff --git a/hermes-console-vue/src/composables/topic/use-create-topic/types.ts b/hermes-console/src/composables/topic/use-create-topic/types.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-create-topic/types.ts rename to hermes-console/src/composables/topic/use-create-topic/types.ts diff --git a/hermes-console-vue/src/composables/topic/use-create-topic/useCreateTopic.spec.ts b/hermes-console/src/composables/topic/use-create-topic/useCreateTopic.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-create-topic/useCreateTopic.spec.ts rename to hermes-console/src/composables/topic/use-create-topic/useCreateTopic.spec.ts diff --git a/hermes-console-vue/src/composables/topic/use-create-topic/useCreateTopic.ts b/hermes-console/src/composables/topic/use-create-topic/useCreateTopic.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-create-topic/useCreateTopic.ts rename to hermes-console/src/composables/topic/use-create-topic/useCreateTopic.ts diff --git a/hermes-console-vue/src/composables/topic/use-edit-topic/types.ts b/hermes-console/src/composables/topic/use-edit-topic/types.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-edit-topic/types.ts rename to hermes-console/src/composables/topic/use-edit-topic/types.ts diff --git a/hermes-console-vue/src/composables/topic/use-edit-topic/useEditTopic.spec.ts b/hermes-console/src/composables/topic/use-edit-topic/useEditTopic.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-edit-topic/useEditTopic.spec.ts rename to hermes-console/src/composables/topic/use-edit-topic/useEditTopic.spec.ts diff --git a/hermes-console-vue/src/composables/topic/use-edit-topic/useEditTopic.ts b/hermes-console/src/composables/topic/use-edit-topic/useEditTopic.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-edit-topic/useEditTopic.ts rename to hermes-console/src/composables/topic/use-edit-topic/useEditTopic.ts diff --git a/hermes-console-vue/src/composables/topic/use-form-topic/parser.ts b/hermes-console/src/composables/topic/use-form-topic/parser.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-form-topic/parser.ts rename to hermes-console/src/composables/topic/use-form-topic/parser.ts diff --git a/hermes-console-vue/src/composables/topic/use-form-topic/types.ts b/hermes-console/src/composables/topic/use-form-topic/types.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-form-topic/types.ts rename to hermes-console/src/composables/topic/use-form-topic/types.ts diff --git a/hermes-console-vue/src/composables/topic/use-form-topic/useFormTopic.spec.ts b/hermes-console/src/composables/topic/use-form-topic/useFormTopic.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-form-topic/useFormTopic.spec.ts rename to hermes-console/src/composables/topic/use-form-topic/useFormTopic.spec.ts diff --git a/hermes-console-vue/src/composables/topic/use-form-topic/useFormTopic.ts b/hermes-console/src/composables/topic/use-form-topic/useFormTopic.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-form-topic/useFormTopic.ts rename to hermes-console/src/composables/topic/use-form-topic/useFormTopic.ts diff --git a/hermes-console-vue/src/composables/topic/use-import-topic/useImportTopic.ts b/hermes-console/src/composables/topic/use-import-topic/useImportTopic.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-import-topic/useImportTopic.ts rename to hermes-console/src/composables/topic/use-import-topic/useImportTopic.ts diff --git a/hermes-console-vue/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.spec.ts b/hermes-console/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.spec.ts rename to hermes-console/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.spec.ts diff --git a/hermes-console-vue/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.ts b/hermes-console/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.ts rename to hermes-console/src/composables/topic/use-offline-retransmission/useOfflineRetransmission.ts diff --git a/hermes-console-vue/src/composables/topic/use-topic/useTopic.spec.ts b/hermes-console/src/composables/topic/use-topic/useTopic.spec.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-topic/useTopic.spec.ts rename to hermes-console/src/composables/topic/use-topic/useTopic.spec.ts diff --git a/hermes-console-vue/src/composables/topic/use-topic/useTopic.ts b/hermes-console/src/composables/topic/use-topic/useTopic.ts similarity index 100% rename from hermes-console-vue/src/composables/topic/use-topic/useTopic.ts rename to hermes-console/src/composables/topic/use-topic/useTopic.ts diff --git a/hermes-console-vue/src/dummy/app-config.ts b/hermes-console/src/dummy/app-config.ts similarity index 100% rename from hermes-console-vue/src/dummy/app-config.ts rename to hermes-console/src/dummy/app-config.ts diff --git a/hermes-console-vue/src/dummy/constraints.ts b/hermes-console/src/dummy/constraints.ts similarity index 100% rename from hermes-console-vue/src/dummy/constraints.ts rename to hermes-console/src/dummy/constraints.ts diff --git a/hermes-console-vue/src/dummy/consumerGroups.ts b/hermes-console/src/dummy/consumerGroups.ts similarity index 100% rename from hermes-console-vue/src/dummy/consumerGroups.ts rename to hermes-console/src/dummy/consumerGroups.ts diff --git a/hermes-console-vue/src/dummy/groupInconsistency.ts b/hermes-console/src/dummy/groupInconsistency.ts similarity index 100% rename from hermes-console-vue/src/dummy/groupInconsistency.ts rename to hermes-console/src/dummy/groupInconsistency.ts diff --git a/hermes-console-vue/src/dummy/groups.ts b/hermes-console/src/dummy/groups.ts similarity index 100% rename from hermes-console-vue/src/dummy/groups.ts rename to hermes-console/src/dummy/groups.ts diff --git a/hermes-console-vue/src/dummy/inconsistentGroups.ts b/hermes-console/src/dummy/inconsistentGroups.ts similarity index 100% rename from hermes-console-vue/src/dummy/inconsistentGroups.ts rename to hermes-console/src/dummy/inconsistentGroups.ts diff --git a/hermes-console-vue/src/dummy/inconsistentMetadata.ts b/hermes-console/src/dummy/inconsistentMetadata.ts similarity index 100% rename from hermes-console-vue/src/dummy/inconsistentMetadata.ts rename to hermes-console/src/dummy/inconsistentMetadata.ts diff --git a/hermes-console-vue/src/dummy/inconsistentTopics.ts b/hermes-console/src/dummy/inconsistentTopics.ts similarity index 100% rename from hermes-console-vue/src/dummy/inconsistentTopics.ts rename to hermes-console/src/dummy/inconsistentTopics.ts diff --git a/hermes-console-vue/src/dummy/jwt-tokens.ts b/hermes-console/src/dummy/jwt-tokens.ts similarity index 100% rename from hermes-console-vue/src/dummy/jwt-tokens.ts rename to hermes-console/src/dummy/jwt-tokens.ts diff --git a/hermes-console-vue/src/dummy/metricsDashboardUrl.ts b/hermes-console/src/dummy/metricsDashboardUrl.ts similarity index 100% rename from hermes-console-vue/src/dummy/metricsDashboardUrl.ts rename to hermes-console/src/dummy/metricsDashboardUrl.ts diff --git a/hermes-console-vue/src/dummy/readiness.ts b/hermes-console/src/dummy/readiness.ts similarity index 100% rename from hermes-console-vue/src/dummy/readiness.ts rename to hermes-console/src/dummy/readiness.ts diff --git a/hermes-console-vue/src/dummy/roles.ts b/hermes-console/src/dummy/roles.ts similarity index 100% rename from hermes-console-vue/src/dummy/roles.ts rename to hermes-console/src/dummy/roles.ts diff --git a/hermes-console-vue/src/dummy/stats.ts b/hermes-console/src/dummy/stats.ts similarity index 100% rename from hermes-console-vue/src/dummy/stats.ts rename to hermes-console/src/dummy/stats.ts diff --git a/hermes-console-vue/src/dummy/store.ts b/hermes-console/src/dummy/store.ts similarity index 100% rename from hermes-console-vue/src/dummy/store.ts rename to hermes-console/src/dummy/store.ts diff --git a/hermes-console-vue/src/dummy/subscription-form.ts b/hermes-console/src/dummy/subscription-form.ts similarity index 100% rename from hermes-console-vue/src/dummy/subscription-form.ts rename to hermes-console/src/dummy/subscription-form.ts diff --git a/hermes-console-vue/src/dummy/subscription.ts b/hermes-console/src/dummy/subscription.ts similarity index 100% rename from hermes-console-vue/src/dummy/subscription.ts rename to hermes-console/src/dummy/subscription.ts diff --git a/hermes-console-vue/src/dummy/topic-form.ts b/hermes-console/src/dummy/topic-form.ts similarity index 100% rename from hermes-console-vue/src/dummy/topic-form.ts rename to hermes-console/src/dummy/topic-form.ts diff --git a/hermes-console-vue/src/dummy/topic.ts b/hermes-console/src/dummy/topic.ts similarity index 100% rename from hermes-console-vue/src/dummy/topic.ts rename to hermes-console/src/dummy/topic.ts diff --git a/hermes-console-vue/src/dummy/topics.ts b/hermes-console/src/dummy/topics.ts similarity index 100% rename from hermes-console-vue/src/dummy/topics.ts rename to hermes-console/src/dummy/topics.ts diff --git a/hermes-console-vue/src/i18n.ts b/hermes-console/src/i18n.ts similarity index 100% rename from hermes-console-vue/src/i18n.ts rename to hermes-console/src/i18n.ts diff --git a/hermes-console-vue/src/i18n/en-US/index.ts b/hermes-console/src/i18n/en-US/index.ts similarity index 100% rename from hermes-console-vue/src/i18n/en-US/index.ts rename to hermes-console/src/i18n/en-US/index.ts diff --git a/hermes-console-vue/src/i18n/en-US/subscription-form.ts b/hermes-console/src/i18n/en-US/subscription-form.ts similarity index 100% rename from hermes-console-vue/src/i18n/en-US/subscription-form.ts rename to hermes-console/src/i18n/en-US/subscription-form.ts diff --git a/hermes-console-vue/src/i18n/en-US/topic-form.ts b/hermes-console/src/i18n/en-US/topic-form.ts similarity index 100% rename from hermes-console-vue/src/i18n/en-US/topic-form.ts rename to hermes-console/src/i18n/en-US/topic-form.ts diff --git a/hermes-console-vue/src/i18n/messages.ts b/hermes-console/src/i18n/messages.ts similarity index 100% rename from hermes-console-vue/src/i18n/messages.ts rename to hermes-console/src/i18n/messages.ts diff --git a/hermes-console-vue/src/main.scss b/hermes-console/src/main.scss similarity index 100% rename from hermes-console-vue/src/main.scss rename to hermes-console/src/main.scss diff --git a/hermes-console-vue/src/main.ts b/hermes-console/src/main.ts similarity index 100% rename from hermes-console-vue/src/main.ts rename to hermes-console/src/main.ts diff --git a/hermes-console-vue/src/mocks/handlers.ts b/hermes-console/src/mocks/handlers.ts similarity index 100% rename from hermes-console-vue/src/mocks/handlers.ts rename to hermes-console/src/mocks/handlers.ts diff --git a/hermes-console-vue/src/router/index.ts b/hermes-console/src/router/index.ts similarity index 100% rename from hermes-console-vue/src/router/index.ts rename to hermes-console/src/router/index.ts diff --git a/hermes-console-vue/src/settings.scss b/hermes-console/src/settings.scss similarity index 100% rename from hermes-console-vue/src/settings.scss rename to hermes-console/src/settings.scss diff --git a/hermes-console-vue/src/store/app-config/types.ts b/hermes-console/src/store/app-config/types.ts similarity index 100% rename from hermes-console-vue/src/store/app-config/types.ts rename to hermes-console/src/store/app-config/types.ts diff --git a/hermes-console-vue/src/store/app-config/useAppConfigStore.ts b/hermes-console/src/store/app-config/useAppConfigStore.ts similarity index 100% rename from hermes-console-vue/src/store/app-config/useAppConfigStore.ts rename to hermes-console/src/store/app-config/useAppConfigStore.ts diff --git a/hermes-console-vue/src/store/app-notifications/types.ts b/hermes-console/src/store/app-notifications/types.ts similarity index 100% rename from hermes-console-vue/src/store/app-notifications/types.ts rename to hermes-console/src/store/app-notifications/types.ts diff --git a/hermes-console-vue/src/store/app-notifications/useAppNotifications.ts b/hermes-console/src/store/app-notifications/useAppNotifications.ts similarity index 100% rename from hermes-console-vue/src/store/app-notifications/useAppNotifications.ts rename to hermes-console/src/store/app-notifications/useAppNotifications.ts diff --git a/hermes-console-vue/src/store/auth/types.ts b/hermes-console/src/store/auth/types.ts similarity index 100% rename from hermes-console-vue/src/store/auth/types.ts rename to hermes-console/src/store/auth/types.ts diff --git a/hermes-console-vue/src/store/auth/useAuthStore.spec.ts b/hermes-console/src/store/auth/useAuthStore.spec.ts similarity index 100% rename from hermes-console-vue/src/store/auth/useAuthStore.spec.ts rename to hermes-console/src/store/auth/useAuthStore.spec.ts diff --git a/hermes-console-vue/src/store/auth/useAuthStore.ts b/hermes-console/src/store/auth/useAuthStore.ts similarity index 100% rename from hermes-console-vue/src/store/auth/useAuthStore.ts rename to hermes-console/src/store/auth/useAuthStore.ts diff --git a/hermes-console-vue/src/store/consistency/types.ts b/hermes-console/src/store/consistency/types.ts similarity index 100% rename from hermes-console-vue/src/store/consistency/types.ts rename to hermes-console/src/store/consistency/types.ts diff --git a/hermes-console-vue/src/store/consistency/useConsistencyStore.spec.ts b/hermes-console/src/store/consistency/useConsistencyStore.spec.ts similarity index 100% rename from hermes-console-vue/src/store/consistency/useConsistencyStore.spec.ts rename to hermes-console/src/store/consistency/useConsistencyStore.spec.ts diff --git a/hermes-console-vue/src/store/consistency/useConsistencyStore.ts b/hermes-console/src/store/consistency/useConsistencyStore.ts similarity index 100% rename from hermes-console-vue/src/store/consistency/useConsistencyStore.ts rename to hermes-console/src/store/consistency/useConsistencyStore.ts diff --git a/hermes-console-vue/src/store/favorites/types.ts b/hermes-console/src/store/favorites/types.ts similarity index 100% rename from hermes-console-vue/src/store/favorites/types.ts rename to hermes-console/src/store/favorites/types.ts diff --git a/hermes-console-vue/src/store/favorites/useFavorites.ts b/hermes-console/src/store/favorites/useFavorites.ts similarity index 100% rename from hermes-console-vue/src/store/favorites/useFavorites.ts rename to hermes-console/src/store/favorites/useFavorites.ts diff --git a/hermes-console-vue/src/utils/axios/axios-instance.ts b/hermes-console/src/utils/axios/axios-instance.ts similarity index 100% rename from hermes-console-vue/src/utils/axios/axios-instance.ts rename to hermes-console/src/utils/axios/axios-instance.ts diff --git a/hermes-console-vue/src/utils/axios/axios-utils.ts b/hermes-console/src/utils/axios/axios-utils.ts similarity index 100% rename from hermes-console-vue/src/utils/axios/axios-utils.ts rename to hermes-console/src/utils/axios/axios-utils.ts diff --git a/hermes-console-vue/src/utils/copy-utils.ts b/hermes-console/src/utils/copy-utils.ts similarity index 100% rename from hermes-console-vue/src/utils/copy-utils.ts rename to hermes-console/src/utils/copy-utils.ts diff --git a/hermes-console-vue/src/utils/date-formatter/date-formatter.spec.ts b/hermes-console/src/utils/date-formatter/date-formatter.spec.ts similarity index 100% rename from hermes-console-vue/src/utils/date-formatter/date-formatter.spec.ts rename to hermes-console/src/utils/date-formatter/date-formatter.spec.ts diff --git a/hermes-console-vue/src/utils/date-formatter/date-formatter.ts b/hermes-console/src/utils/date-formatter/date-formatter.ts similarity index 100% rename from hermes-console-vue/src/utils/date-formatter/date-formatter.ts rename to hermes-console/src/utils/date-formatter/date-formatter.ts diff --git a/hermes-console-vue/src/utils/download-utils.ts b/hermes-console/src/utils/download-utils.ts similarity index 100% rename from hermes-console-vue/src/utils/download-utils.ts rename to hermes-console/src/utils/download-utils.ts diff --git a/hermes-console-vue/src/utils/notification-utils.ts b/hermes-console/src/utils/notification-utils.ts similarity index 96% rename from hermes-console-vue/src/utils/notification-utils.ts rename to hermes-console/src/utils/notification-utils.ts index fc8f479e05..12a201fc10 100644 --- a/hermes-console-vue/src/utils/notification-utils.ts +++ b/hermes-console/src/utils/notification-utils.ts @@ -6,7 +6,7 @@ export function dispatchErrorNotification( notificationStore: any, title: string, ): void { - let text = ''; + let text: string; if (axios.isAxiosError(err)) { const e = err as AxiosError; // @ts-ignore diff --git a/hermes-console-vue/src/utils/number-formatter/number-formatter.spec.ts b/hermes-console/src/utils/number-formatter/number-formatter.spec.ts similarity index 100% rename from hermes-console-vue/src/utils/number-formatter/number-formatter.spec.ts rename to hermes-console/src/utils/number-formatter/number-formatter.spec.ts diff --git a/hermes-console-vue/src/utils/number-formatter/number-formatter.ts b/hermes-console/src/utils/number-formatter/number-formatter.ts similarity index 100% rename from hermes-console-vue/src/utils/number-formatter/number-formatter.ts rename to hermes-console/src/utils/number-formatter/number-formatter.ts diff --git a/hermes-console-vue/src/utils/roles-util.ts b/hermes-console/src/utils/roles-util.ts similarity index 100% rename from hermes-console-vue/src/utils/roles-util.ts rename to hermes-console/src/utils/roles-util.ts diff --git a/hermes-console-vue/src/utils/subscription-utils/subscription-utils.spec.ts b/hermes-console/src/utils/subscription-utils/subscription-utils.spec.ts similarity index 100% rename from hermes-console-vue/src/utils/subscription-utils/subscription-utils.spec.ts rename to hermes-console/src/utils/subscription-utils/subscription-utils.spec.ts diff --git a/hermes-console-vue/src/utils/subscription-utils/subscription-utils.ts b/hermes-console/src/utils/subscription-utils/subscription-utils.ts similarity index 100% rename from hermes-console-vue/src/utils/subscription-utils/subscription-utils.ts rename to hermes-console/src/utils/subscription-utils/subscription-utils.ts diff --git a/hermes-console-vue/src/utils/test-utils.ts b/hermes-console/src/utils/test-utils.ts similarity index 100% rename from hermes-console-vue/src/utils/test-utils.ts rename to hermes-console/src/utils/test-utils.ts diff --git a/hermes-console-vue/src/utils/topic-utils/topic-utils.spec.ts b/hermes-console/src/utils/topic-utils/topic-utils.spec.ts similarity index 100% rename from hermes-console-vue/src/utils/topic-utils/topic-utils.spec.ts rename to hermes-console/src/utils/topic-utils/topic-utils.spec.ts diff --git a/hermes-console-vue/src/utils/topic-utils/topic-utils.ts b/hermes-console/src/utils/topic-utils/topic-utils.ts similarity index 100% rename from hermes-console-vue/src/utils/topic-utils/topic-utils.ts rename to hermes-console/src/utils/topic-utils/topic-utils.ts diff --git a/hermes-console-vue/src/utils/validators/index.ts b/hermes-console/src/utils/validators/index.ts similarity index 100% rename from hermes-console-vue/src/utils/validators/index.ts rename to hermes-console/src/utils/validators/index.ts diff --git a/hermes-console-vue/src/views/admin/consistency/ConsistencyView.spec.ts b/hermes-console/src/views/admin/consistency/ConsistencyView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/ConsistencyView.spec.ts rename to hermes-console/src/views/admin/consistency/ConsistencyView.spec.ts diff --git a/hermes-console-vue/src/views/admin/consistency/ConsistencyView.vue b/hermes-console/src/views/admin/consistency/ConsistencyView.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/ConsistencyView.vue rename to hermes-console/src/views/admin/consistency/ConsistencyView.vue diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-group/InconsistentGroup.spec.ts b/hermes-console/src/views/admin/consistency/inconsistent-group/InconsistentGroup.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-group/InconsistentGroup.spec.ts rename to hermes-console/src/views/admin/consistency/inconsistent-group/InconsistentGroup.spec.ts diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-group/InconsistentGroup.vue b/hermes-console/src/views/admin/consistency/inconsistent-group/InconsistentGroup.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-group/InconsistentGroup.vue rename to hermes-console/src/views/admin/consistency/inconsistent-group/InconsistentGroup.vue diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupListing.spec.ts b/hermes-console/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupListing.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupListing.spec.ts rename to hermes-console/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupListing.spec.ts diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupsListing.vue b/hermes-console/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupsListing.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupsListing.vue rename to hermes-console/src/views/admin/consistency/inconsistent-groups-listing/InconsistentGroupsListing.vue diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.spec.ts b/hermes-console/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.spec.ts rename to hermes-console/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.spec.ts diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.vue b/hermes-console/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.vue rename to hermes-console/src/views/admin/consistency/inconsistent-metadata/InconsistentMetadata.vue diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.spec.ts b/hermes-console/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.spec.ts rename to hermes-console/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.spec.ts diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.vue b/hermes-console/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.vue rename to hermes-console/src/views/admin/consistency/inconsistent-topic/InconsistentTopic.vue diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.spec.ts b/hermes-console/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.spec.ts rename to hermes-console/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.spec.ts diff --git a/hermes-console-vue/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.vue b/hermes-console/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.vue rename to hermes-console/src/views/admin/consistency/inconsistent-topics-listing/InconsistentTopicsListing.vue diff --git a/hermes-console-vue/src/views/admin/constraints/ConstraintsView.spec.ts b/hermes-console/src/views/admin/constraints/ConstraintsView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/ConstraintsView.spec.ts rename to hermes-console/src/views/admin/constraints/ConstraintsView.spec.ts diff --git a/hermes-console-vue/src/views/admin/constraints/ConstraintsView.vue b/hermes-console/src/views/admin/constraints/ConstraintsView.vue similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/ConstraintsView.vue rename to hermes-console/src/views/admin/constraints/ConstraintsView.vue diff --git a/hermes-console-vue/src/views/admin/constraints/constraints-listing/ConstraintsListing.spec.ts b/hermes-console/src/views/admin/constraints/constraints-listing/ConstraintsListing.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/constraints-listing/ConstraintsListing.spec.ts rename to hermes-console/src/views/admin/constraints/constraints-listing/ConstraintsListing.spec.ts diff --git a/hermes-console-vue/src/views/admin/constraints/constraints-listing/ConstraintsListing.vue b/hermes-console/src/views/admin/constraints/constraints-listing/ConstraintsListing.vue similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/constraints-listing/ConstraintsListing.vue rename to hermes-console/src/views/admin/constraints/constraints-listing/ConstraintsListing.vue diff --git a/hermes-console-vue/src/views/admin/constraints/create-constraint-form/CreateConstraintDialog.vue b/hermes-console/src/views/admin/constraints/create-constraint-form/CreateConstraintDialog.vue similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/create-constraint-form/CreateConstraintDialog.vue rename to hermes-console/src/views/admin/constraints/create-constraint-form/CreateConstraintDialog.vue diff --git a/hermes-console-vue/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.spec.ts b/hermes-console/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.spec.ts rename to hermes-console/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.spec.ts diff --git a/hermes-console-vue/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.vue b/hermes-console/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.vue similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.vue rename to hermes-console/src/views/admin/constraints/create-constraint-form/CreateConstraintFormView.vue diff --git a/hermes-console-vue/src/views/admin/constraints/edit-constraint-form/EditConstraintDialog.vue b/hermes-console/src/views/admin/constraints/edit-constraint-form/EditConstraintDialog.vue similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/edit-constraint-form/EditConstraintDialog.vue rename to hermes-console/src/views/admin/constraints/edit-constraint-form/EditConstraintDialog.vue diff --git a/hermes-console-vue/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.spec.ts b/hermes-console/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.spec.ts rename to hermes-console/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.spec.ts diff --git a/hermes-console-vue/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.vue b/hermes-console/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.vue similarity index 100% rename from hermes-console-vue/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.vue rename to hermes-console/src/views/admin/constraints/edit-constraint-form/EditConstraintFormView.vue diff --git a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts b/hermes-console/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts rename to hermes-console/src/views/admin/consumer-groups/ConsumerGroupsView.spec.ts diff --git a/hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue b/hermes-console/src/views/admin/consumer-groups/ConsumerGroupsView.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consumer-groups/ConsumerGroupsView.vue rename to hermes-console/src/views/admin/consumer-groups/ConsumerGroupsView.vue diff --git a/hermes-console-vue/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.spec.ts b/hermes-console/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.spec.ts rename to hermes-console/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.spec.ts diff --git a/hermes-console-vue/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.vue b/hermes-console/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.vue rename to hermes-console/src/views/admin/consumer-groups/consumer-group-member/ConsumerGroupMembers.vue diff --git a/hermes-console-vue/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.spec.ts b/hermes-console/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.spec.ts rename to hermes-console/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.spec.ts diff --git a/hermes-console-vue/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.vue b/hermes-console/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.vue similarity index 100% rename from hermes-console-vue/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.vue rename to hermes-console/src/views/admin/consumer-groups/consumer-groups-table/ConsumerGroupsTable.vue diff --git a/hermes-console-vue/src/views/admin/readiness/ReadinessView.spec.ts b/hermes-console/src/views/admin/readiness/ReadinessView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/admin/readiness/ReadinessView.spec.ts rename to hermes-console/src/views/admin/readiness/ReadinessView.spec.ts diff --git a/hermes-console-vue/src/views/admin/readiness/ReadinessView.vue b/hermes-console/src/views/admin/readiness/ReadinessView.vue similarity index 100% rename from hermes-console-vue/src/views/admin/readiness/ReadinessView.vue rename to hermes-console/src/views/admin/readiness/ReadinessView.vue diff --git a/hermes-console-vue/src/views/favorite/subscriptions/FavoriteSubscriptionsView.spec.ts b/hermes-console/src/views/favorite/subscriptions/FavoriteSubscriptionsView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/favorite/subscriptions/FavoriteSubscriptionsView.spec.ts rename to hermes-console/src/views/favorite/subscriptions/FavoriteSubscriptionsView.spec.ts diff --git a/hermes-console-vue/src/views/favorite/subscriptions/FavoriteSubscriptionsView.vue b/hermes-console/src/views/favorite/subscriptions/FavoriteSubscriptionsView.vue similarity index 100% rename from hermes-console-vue/src/views/favorite/subscriptions/FavoriteSubscriptionsView.vue rename to hermes-console/src/views/favorite/subscriptions/FavoriteSubscriptionsView.vue diff --git a/hermes-console-vue/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.spec.ts b/hermes-console/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.spec.ts similarity index 100% rename from hermes-console-vue/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.spec.ts rename to hermes-console/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.spec.ts diff --git a/hermes-console-vue/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.vue b/hermes-console/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.vue similarity index 100% rename from hermes-console-vue/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.vue rename to hermes-console/src/views/favorite/subscriptions/subscription-listing/FavoriteSubscriptionsListing.vue diff --git a/hermes-console-vue/src/views/favorite/topics/FavoriteTopicsView.spec.ts b/hermes-console/src/views/favorite/topics/FavoriteTopicsView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/favorite/topics/FavoriteTopicsView.spec.ts rename to hermes-console/src/views/favorite/topics/FavoriteTopicsView.spec.ts diff --git a/hermes-console-vue/src/views/favorite/topics/FavoriteTopicsView.vue b/hermes-console/src/views/favorite/topics/FavoriteTopicsView.vue similarity index 100% rename from hermes-console-vue/src/views/favorite/topics/FavoriteTopicsView.vue rename to hermes-console/src/views/favorite/topics/FavoriteTopicsView.vue diff --git a/hermes-console-vue/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.spec.ts b/hermes-console/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.spec.ts similarity index 100% rename from hermes-console-vue/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.spec.ts rename to hermes-console/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.spec.ts diff --git a/hermes-console-vue/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.vue b/hermes-console/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.vue similarity index 100% rename from hermes-console-vue/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.vue rename to hermes-console/src/views/favorite/topics/topic-listing/FavoriteTopicsListing.vue diff --git a/hermes-console-vue/src/views/group-topics/GroupTopicsView.spec.ts b/hermes-console/src/views/group-topics/GroupTopicsView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/group-topics/GroupTopicsView.spec.ts rename to hermes-console/src/views/group-topics/GroupTopicsView.spec.ts diff --git a/hermes-console-vue/src/views/group-topics/GroupTopicsView.vue b/hermes-console/src/views/group-topics/GroupTopicsView.vue similarity index 100% rename from hermes-console-vue/src/views/group-topics/GroupTopicsView.vue rename to hermes-console/src/views/group-topics/GroupTopicsView.vue diff --git a/hermes-console-vue/src/views/group-topics/group-topics-listing/GroupTopicsListing.spec.ts b/hermes-console/src/views/group-topics/group-topics-listing/GroupTopicsListing.spec.ts similarity index 100% rename from hermes-console-vue/src/views/group-topics/group-topics-listing/GroupTopicsListing.spec.ts rename to hermes-console/src/views/group-topics/group-topics-listing/GroupTopicsListing.spec.ts diff --git a/hermes-console-vue/src/views/group-topics/group-topics-listing/GroupTopicsListing.vue b/hermes-console/src/views/group-topics/group-topics-listing/GroupTopicsListing.vue similarity index 97% rename from hermes-console-vue/src/views/group-topics/group-topics-listing/GroupTopicsListing.vue rename to hermes-console/src/views/group-topics/group-topics-listing/GroupTopicsListing.vue index 6ed86677cd..f2a2759b83 100644 --- a/hermes-console-vue/src/views/group-topics/group-topics-listing/GroupTopicsListing.vue +++ b/hermes-console/src/views/group-topics/group-topics-listing/GroupTopicsListing.vue @@ -27,7 +27,6 @@ } function onTopicBlankClick(topicName: string) { - console.log(router.currentRoute.value.path); window.open( `${router.currentRoute.value.path}/topics/${topicName}`, '_blank', diff --git a/hermes-console-vue/src/views/groups/GroupsView.spec.ts b/hermes-console/src/views/groups/GroupsView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/groups/GroupsView.spec.ts rename to hermes-console/src/views/groups/GroupsView.spec.ts diff --git a/hermes-console-vue/src/views/groups/GroupsView.vue b/hermes-console/src/views/groups/GroupsView.vue similarity index 100% rename from hermes-console-vue/src/views/groups/GroupsView.vue rename to hermes-console/src/views/groups/GroupsView.vue diff --git a/hermes-console-vue/src/views/groups/group-form/GroupForm.spec.ts b/hermes-console/src/views/groups/group-form/GroupForm.spec.ts similarity index 100% rename from hermes-console-vue/src/views/groups/group-form/GroupForm.spec.ts rename to hermes-console/src/views/groups/group-form/GroupForm.spec.ts diff --git a/hermes-console-vue/src/views/groups/group-form/GroupForm.vue b/hermes-console/src/views/groups/group-form/GroupForm.vue similarity index 100% rename from hermes-console-vue/src/views/groups/group-form/GroupForm.vue rename to hermes-console/src/views/groups/group-form/GroupForm.vue diff --git a/hermes-console-vue/src/views/groups/group-listing/GroupListing.spec.ts b/hermes-console/src/views/groups/group-listing/GroupListing.spec.ts similarity index 100% rename from hermes-console-vue/src/views/groups/group-listing/GroupListing.spec.ts rename to hermes-console/src/views/groups/group-listing/GroupListing.spec.ts diff --git a/hermes-console-vue/src/views/groups/group-listing/GroupListing.vue b/hermes-console/src/views/groups/group-listing/GroupListing.vue similarity index 100% rename from hermes-console-vue/src/views/groups/group-listing/GroupListing.vue rename to hermes-console/src/views/groups/group-listing/GroupListing.vue diff --git a/hermes-console-vue/src/views/home/HomeView.spec.ts b/hermes-console/src/views/home/HomeView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/home/HomeView.spec.ts rename to hermes-console/src/views/home/HomeView.spec.ts diff --git a/hermes-console-vue/src/views/home/HomeView.vue b/hermes-console/src/views/home/HomeView.vue similarity index 100% rename from hermes-console-vue/src/views/home/HomeView.vue rename to hermes-console/src/views/home/HomeView.vue diff --git a/hermes-console-vue/src/views/home/home-menu/HomeMenu.spec.ts b/hermes-console/src/views/home/home-menu/HomeMenu.spec.ts similarity index 100% rename from hermes-console-vue/src/views/home/home-menu/HomeMenu.spec.ts rename to hermes-console/src/views/home/home-menu/HomeMenu.spec.ts diff --git a/hermes-console-vue/src/views/home/home-menu/HomeMenu.vue b/hermes-console/src/views/home/home-menu/HomeMenu.vue similarity index 100% rename from hermes-console-vue/src/views/home/home-menu/HomeMenu.vue rename to hermes-console/src/views/home/home-menu/HomeMenu.vue diff --git a/hermes-console-vue/src/views/redirect/RedirectView.spec.ts b/hermes-console/src/views/redirect/RedirectView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/redirect/RedirectView.spec.ts rename to hermes-console/src/views/redirect/RedirectView.spec.ts diff --git a/hermes-console-vue/src/views/redirect/RedirectView.vue b/hermes-console/src/views/redirect/RedirectView.vue similarity index 100% rename from hermes-console-vue/src/views/redirect/RedirectView.vue rename to hermes-console/src/views/redirect/RedirectView.vue diff --git a/hermes-console-vue/src/views/search/SearchView.spec.ts b/hermes-console/src/views/search/SearchView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/search/SearchView.spec.ts rename to hermes-console/src/views/search/SearchView.spec.ts diff --git a/hermes-console-vue/src/views/search/SearchView.vue b/hermes-console/src/views/search/SearchView.vue similarity index 91% rename from hermes-console-vue/src/views/search/SearchView.vue rename to hermes-console/src/views/search/SearchView.vue index e025c8ccd3..1028e14d70 100644 --- a/hermes-console-vue/src/views/search/SearchView.vue +++ b/hermes-console/src/views/search/SearchView.vue @@ -94,13 +94,15 @@ - - - - + + + + + + diff --git a/hermes-console-vue/src/views/search/subscription-search-results/SubscriptionSearchResults.spec.ts b/hermes-console/src/views/search/subscription-search-results/SubscriptionSearchResults.spec.ts similarity index 100% rename from hermes-console-vue/src/views/search/subscription-search-results/SubscriptionSearchResults.spec.ts rename to hermes-console/src/views/search/subscription-search-results/SubscriptionSearchResults.spec.ts diff --git a/hermes-console/src/views/search/subscription-search-results/SubscriptionSearchResults.vue b/hermes-console/src/views/search/subscription-search-results/SubscriptionSearchResults.vue new file mode 100644 index 0000000000..f7c66412ff --- /dev/null +++ b/hermes-console/src/views/search/subscription-search-results/SubscriptionSearchResults.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/hermes-console-vue/src/views/search/topic-search-results/TopicSearchResults.spec.ts b/hermes-console/src/views/search/topic-search-results/TopicSearchResults.spec.ts similarity index 100% rename from hermes-console-vue/src/views/search/topic-search-results/TopicSearchResults.spec.ts rename to hermes-console/src/views/search/topic-search-results/TopicSearchResults.spec.ts diff --git a/hermes-console/src/views/search/topic-search-results/TopicSearchResults.vue b/hermes-console/src/views/search/topic-search-results/TopicSearchResults.vue new file mode 100644 index 0000000000..6a4ade1f5c --- /dev/null +++ b/hermes-console/src/views/search/topic-search-results/TopicSearchResults.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/hermes-console-vue/src/views/stats/StatsView.spec.ts b/hermes-console/src/views/stats/StatsView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/stats/StatsView.spec.ts rename to hermes-console/src/views/stats/StatsView.spec.ts diff --git a/hermes-console-vue/src/views/stats/StatsView.vue b/hermes-console/src/views/stats/StatsView.vue similarity index 100% rename from hermes-console-vue/src/views/stats/StatsView.vue rename to hermes-console/src/views/stats/StatsView.vue diff --git a/hermes-console-vue/src/views/subscription/SubscriptionView.spec.ts b/hermes-console/src/views/subscription/SubscriptionView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/SubscriptionView.spec.ts rename to hermes-console/src/views/subscription/SubscriptionView.spec.ts diff --git a/hermes-console-vue/src/views/subscription/SubscriptionView.vue b/hermes-console/src/views/subscription/SubscriptionView.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/SubscriptionView.vue rename to hermes-console/src/views/subscription/SubscriptionView.vue diff --git a/hermes-console-vue/src/views/subscription/filters-card/FiltersCard.vue b/hermes-console/src/views/subscription/filters-card/FiltersCard.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/filters-card/FiltersCard.vue rename to hermes-console/src/views/subscription/filters-card/FiltersCard.vue diff --git a/hermes-console-vue/src/views/subscription/filters-card/FitersCard.spec.ts b/hermes-console/src/views/subscription/filters-card/FitersCard.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/filters-card/FitersCard.spec.ts rename to hermes-console/src/views/subscription/filters-card/FitersCard.spec.ts diff --git a/hermes-console-vue/src/views/subscription/headers-card/HeadersCard.spec.ts b/hermes-console/src/views/subscription/headers-card/HeadersCard.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/headers-card/HeadersCard.spec.ts rename to hermes-console/src/views/subscription/headers-card/HeadersCard.spec.ts diff --git a/hermes-console-vue/src/views/subscription/headers-card/HeadersCard.vue b/hermes-console/src/views/subscription/headers-card/HeadersCard.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/headers-card/HeadersCard.vue rename to hermes-console/src/views/subscription/headers-card/HeadersCard.vue diff --git a/hermes-console-vue/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.spec.ts b/hermes-console/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.spec.ts rename to hermes-console/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.spec.ts diff --git a/hermes-console-vue/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.vue b/hermes-console/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.vue rename to hermes-console/src/views/subscription/health-problems-alerts/HealthProblemsAlerts.vue diff --git a/hermes-console-vue/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.spec.ts b/hermes-console/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.spec.ts rename to hermes-console/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.spec.ts diff --git a/hermes-console-vue/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.vue b/hermes-console/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.vue rename to hermes-console/src/views/subscription/last-undelivered-message/LastUndeliveredMessage.vue diff --git a/hermes-console-vue/src/views/subscription/manage-messages-card/ManageMessagesCard.spec.ts b/hermes-console/src/views/subscription/manage-messages-card/ManageMessagesCard.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/manage-messages-card/ManageMessagesCard.spec.ts rename to hermes-console/src/views/subscription/manage-messages-card/ManageMessagesCard.spec.ts diff --git a/hermes-console-vue/src/views/subscription/manage-messages-card/ManageMessagesCard.vue b/hermes-console/src/views/subscription/manage-messages-card/ManageMessagesCard.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/manage-messages-card/ManageMessagesCard.vue rename to hermes-console/src/views/subscription/manage-messages-card/ManageMessagesCard.vue diff --git a/hermes-console-vue/src/views/subscription/metrics-card/MetricsCard.spec.ts b/hermes-console/src/views/subscription/metrics-card/MetricsCard.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/metrics-card/MetricsCard.spec.ts rename to hermes-console/src/views/subscription/metrics-card/MetricsCard.spec.ts diff --git a/hermes-console-vue/src/views/subscription/metrics-card/MetricsCard.vue b/hermes-console/src/views/subscription/metrics-card/MetricsCard.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/metrics-card/MetricsCard.vue rename to hermes-console/src/views/subscription/metrics-card/MetricsCard.vue diff --git a/hermes-console-vue/src/views/subscription/properties-card/PropertiesCard.spec.ts b/hermes-console/src/views/subscription/properties-card/PropertiesCard.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/properties-card/PropertiesCard.spec.ts rename to hermes-console/src/views/subscription/properties-card/PropertiesCard.spec.ts diff --git a/hermes-console-vue/src/views/subscription/properties-card/PropertiesCard.vue b/hermes-console/src/views/subscription/properties-card/PropertiesCard.vue similarity index 99% rename from hermes-console-vue/src/views/subscription/properties-card/PropertiesCard.vue rename to hermes-console/src/views/subscription/properties-card/PropertiesCard.vue index 8dba5276bf..dbe02867ea 100644 --- a/hermes-console-vue/src/views/subscription/properties-card/PropertiesCard.vue +++ b/hermes-console/src/views/subscription/properties-card/PropertiesCard.vue @@ -36,7 +36,7 @@ key ]!!; const value = - data?.options == undefined || data?.options == null + data?.options == undefined ? props.subscription.endpointAddressResolverMetadata[key] : data.options[props.subscription.endpointAddressResolverMetadata[key]]; return { diff --git a/hermes-console-vue/src/views/subscription/service-response-metrics/ServiceResponseMetrics.spec.ts b/hermes-console/src/views/subscription/service-response-metrics/ServiceResponseMetrics.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/service-response-metrics/ServiceResponseMetrics.spec.ts rename to hermes-console/src/views/subscription/service-response-metrics/ServiceResponseMetrics.spec.ts diff --git a/hermes-console-vue/src/views/subscription/service-response-metrics/ServiceResponseMetrics.vue b/hermes-console/src/views/subscription/service-response-metrics/ServiceResponseMetrics.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/service-response-metrics/ServiceResponseMetrics.vue rename to hermes-console/src/views/subscription/service-response-metrics/ServiceResponseMetrics.vue diff --git a/hermes-console-vue/src/views/subscription/show-event-trace/ShowEventTrace.spec.ts b/hermes-console/src/views/subscription/show-event-trace/ShowEventTrace.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/show-event-trace/ShowEventTrace.spec.ts rename to hermes-console/src/views/subscription/show-event-trace/ShowEventTrace.spec.ts diff --git a/hermes-console-vue/src/views/subscription/show-event-trace/ShowEventTrace.vue b/hermes-console/src/views/subscription/show-event-trace/ShowEventTrace.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/show-event-trace/ShowEventTrace.vue rename to hermes-console/src/views/subscription/show-event-trace/ShowEventTrace.vue diff --git a/hermes-console-vue/src/views/subscription/subscription-form/SubscriptionForm.spec.ts b/hermes-console/src/views/subscription/subscription-form/SubscriptionForm.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/SubscriptionForm.spec.ts rename to hermes-console/src/views/subscription/subscription-form/SubscriptionForm.spec.ts diff --git a/hermes-console-vue/src/views/subscription/subscription-form/SubscriptionForm.vue b/hermes-console/src/views/subscription/subscription-form/SubscriptionForm.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/SubscriptionForm.vue rename to hermes-console/src/views/subscription/subscription-form/SubscriptionForm.vue diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFilters.vue b/hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFilters.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFilters.vue rename to hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFilters.vue diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.spec.ts b/hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.spec.ts rename to hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.spec.ts diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.vue b/hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.vue rename to hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/SubscriptionPathFiltersDebug.vue diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/path-filter-row/PathFilterRow.vue b/hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/path-filter-row/PathFilterRow.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/path-filter-row/PathFilterRow.vue rename to hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/path-filter-row/PathFilterRow.vue diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/types.ts b/hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/types.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-basic-filters/types.ts rename to hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/types.ts diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-header-filters/SubscriptionHeaderFilters.vue b/hermes-console/src/views/subscription/subscription-form/subscription-header-filters/SubscriptionHeaderFilters.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-header-filters/SubscriptionHeaderFilters.vue rename to hermes-console/src/views/subscription/subscription-form/subscription-header-filters/SubscriptionHeaderFilters.vue diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-header-filters/header-filter-row/HeaderFilterRow.vue b/hermes-console/src/views/subscription/subscription-form/subscription-header-filters/header-filter-row/HeaderFilterRow.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-header-filters/header-filter-row/HeaderFilterRow.vue rename to hermes-console/src/views/subscription/subscription-form/subscription-header-filters/header-filter-row/HeaderFilterRow.vue diff --git a/hermes-console-vue/src/views/subscription/subscription-form/subscription-header-filters/types.ts b/hermes-console/src/views/subscription/subscription-form/subscription-header-filters/types.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-form/subscription-header-filters/types.ts rename to hermes-console/src/views/subscription/subscription-form/subscription-header-filters/types.ts diff --git a/hermes-console-vue/src/views/subscription/subscription-metadata/SubscriptionMetadata.spec.ts b/hermes-console/src/views/subscription/subscription-metadata/SubscriptionMetadata.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-metadata/SubscriptionMetadata.spec.ts rename to hermes-console/src/views/subscription/subscription-metadata/SubscriptionMetadata.spec.ts diff --git a/hermes-console-vue/src/views/subscription/subscription-metadata/SubscriptionMetadata.vue b/hermes-console/src/views/subscription/subscription-metadata/SubscriptionMetadata.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/subscription-metadata/SubscriptionMetadata.vue rename to hermes-console/src/views/subscription/subscription-metadata/SubscriptionMetadata.vue diff --git a/hermes-console-vue/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.spec.ts b/hermes-console/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.spec.ts similarity index 100% rename from hermes-console-vue/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.spec.ts rename to hermes-console/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.spec.ts diff --git a/hermes-console-vue/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.vue b/hermes-console/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.vue similarity index 100% rename from hermes-console-vue/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.vue rename to hermes-console/src/views/subscription/undelivered-messages-card/UndeliveredMessagesCard.vue diff --git a/hermes-console-vue/src/views/topic/TopicView.spec.ts b/hermes-console/src/views/topic/TopicView.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/TopicView.spec.ts rename to hermes-console/src/views/topic/TopicView.spec.ts diff --git a/hermes-console-vue/src/views/topic/TopicView.vue b/hermes-console/src/views/topic/TopicView.vue similarity index 100% rename from hermes-console-vue/src/views/topic/TopicView.vue rename to hermes-console/src/views/topic/TopicView.vue diff --git a/hermes-console-vue/src/views/topic/messages-preview/MessagesPreview.spec.ts b/hermes-console/src/views/topic/messages-preview/MessagesPreview.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/messages-preview/MessagesPreview.spec.ts rename to hermes-console/src/views/topic/messages-preview/MessagesPreview.spec.ts diff --git a/hermes-console-vue/src/views/topic/messages-preview/MessagesPreview.vue b/hermes-console/src/views/topic/messages-preview/MessagesPreview.vue similarity index 100% rename from hermes-console-vue/src/views/topic/messages-preview/MessagesPreview.vue rename to hermes-console/src/views/topic/messages-preview/MessagesPreview.vue diff --git a/hermes-console-vue/src/views/topic/metrics-list/MetricsList.spec.ts b/hermes-console/src/views/topic/metrics-list/MetricsList.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/metrics-list/MetricsList.spec.ts rename to hermes-console/src/views/topic/metrics-list/MetricsList.spec.ts diff --git a/hermes-console-vue/src/views/topic/metrics-list/MetricsList.vue b/hermes-console/src/views/topic/metrics-list/MetricsList.vue similarity index 100% rename from hermes-console-vue/src/views/topic/metrics-list/MetricsList.vue rename to hermes-console/src/views/topic/metrics-list/MetricsList.vue diff --git a/hermes-console-vue/src/views/topic/offline-clients/OfflineClients.spec.ts b/hermes-console/src/views/topic/offline-clients/OfflineClients.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/offline-clients/OfflineClients.spec.ts rename to hermes-console/src/views/topic/offline-clients/OfflineClients.spec.ts diff --git a/hermes-console-vue/src/views/topic/offline-clients/OfflineClients.vue b/hermes-console/src/views/topic/offline-clients/OfflineClients.vue similarity index 100% rename from hermes-console-vue/src/views/topic/offline-clients/OfflineClients.vue rename to hermes-console/src/views/topic/offline-clients/OfflineClients.vue diff --git a/hermes-console-vue/src/views/topic/offline-retransmission/OfflineRetransmissionDialog.vue b/hermes-console/src/views/topic/offline-retransmission/OfflineRetransmissionDialog.vue similarity index 100% rename from hermes-console-vue/src/views/topic/offline-retransmission/OfflineRetransmissionDialog.vue rename to hermes-console/src/views/topic/offline-retransmission/OfflineRetransmissionDialog.vue diff --git a/hermes-console-vue/src/views/topic/offline-retransmission/OfflineRetransmissionForm.spec.ts b/hermes-console/src/views/topic/offline-retransmission/OfflineRetransmissionForm.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/offline-retransmission/OfflineRetransmissionForm.spec.ts rename to hermes-console/src/views/topic/offline-retransmission/OfflineRetransmissionForm.spec.ts diff --git a/hermes-console-vue/src/views/topic/offline-retransmission/OfflineRetransmissionForm.vue b/hermes-console/src/views/topic/offline-retransmission/OfflineRetransmissionForm.vue similarity index 100% rename from hermes-console-vue/src/views/topic/offline-retransmission/OfflineRetransmissionForm.vue rename to hermes-console/src/views/topic/offline-retransmission/OfflineRetransmissionForm.vue diff --git a/hermes-console-vue/src/views/topic/properties-list/PropertiesList.spec.ts b/hermes-console/src/views/topic/properties-list/PropertiesList.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/properties-list/PropertiesList.spec.ts rename to hermes-console/src/views/topic/properties-list/PropertiesList.spec.ts diff --git a/hermes-console-vue/src/views/topic/properties-list/PropertiesList.vue b/hermes-console/src/views/topic/properties-list/PropertiesList.vue similarity index 100% rename from hermes-console-vue/src/views/topic/properties-list/PropertiesList.vue rename to hermes-console/src/views/topic/properties-list/PropertiesList.vue diff --git a/hermes-console-vue/src/views/topic/schema-panel/AvroTypes.ts b/hermes-console/src/views/topic/schema-panel/AvroTypes.ts similarity index 100% rename from hermes-console-vue/src/views/topic/schema-panel/AvroTypes.ts rename to hermes-console/src/views/topic/schema-panel/AvroTypes.ts diff --git a/hermes-console-vue/src/views/topic/schema-panel/SchemaPanel.spec.ts b/hermes-console/src/views/topic/schema-panel/SchemaPanel.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/schema-panel/SchemaPanel.spec.ts rename to hermes-console/src/views/topic/schema-panel/SchemaPanel.spec.ts diff --git a/hermes-console-vue/src/views/topic/schema-panel/SchemaPanel.vue b/hermes-console/src/views/topic/schema-panel/SchemaPanel.vue similarity index 100% rename from hermes-console-vue/src/views/topic/schema-panel/SchemaPanel.vue rename to hermes-console/src/views/topic/schema-panel/SchemaPanel.vue diff --git a/hermes-console-vue/src/views/topic/schema-panel/avro-viewer/AvroNode.vue b/hermes-console/src/views/topic/schema-panel/avro-viewer/AvroNode.vue similarity index 100% rename from hermes-console-vue/src/views/topic/schema-panel/avro-viewer/AvroNode.vue rename to hermes-console/src/views/topic/schema-panel/avro-viewer/AvroNode.vue diff --git a/hermes-console-vue/src/views/topic/schema-panel/avro-viewer/AvroViewer.vue b/hermes-console/src/views/topic/schema-panel/avro-viewer/AvroViewer.vue similarity index 100% rename from hermes-console-vue/src/views/topic/schema-panel/avro-viewer/AvroViewer.vue rename to hermes-console/src/views/topic/schema-panel/avro-viewer/AvroViewer.vue diff --git a/hermes-console-vue/src/views/topic/subscriptions-list/SubscriptionsList.spec.ts b/hermes-console/src/views/topic/subscriptions-list/SubscriptionsList.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/subscriptions-list/SubscriptionsList.spec.ts rename to hermes-console/src/views/topic/subscriptions-list/SubscriptionsList.spec.ts diff --git a/hermes-console-vue/src/views/topic/subscriptions-list/SubscriptionsList.vue b/hermes-console/src/views/topic/subscriptions-list/SubscriptionsList.vue similarity index 100% rename from hermes-console-vue/src/views/topic/subscriptions-list/SubscriptionsList.vue rename to hermes-console/src/views/topic/subscriptions-list/SubscriptionsList.vue diff --git a/hermes-console-vue/src/views/topic/topic-form/TopicForm.spec.ts b/hermes-console/src/views/topic/topic-form/TopicForm.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/topic-form/TopicForm.spec.ts rename to hermes-console/src/views/topic/topic-form/TopicForm.spec.ts diff --git a/hermes-console-vue/src/views/topic/topic-form/TopicForm.vue b/hermes-console/src/views/topic/topic-form/TopicForm.vue similarity index 100% rename from hermes-console-vue/src/views/topic/topic-form/TopicForm.vue rename to hermes-console/src/views/topic/topic-form/TopicForm.vue diff --git a/hermes-console-vue/src/views/topic/topic-header/TopicHeader.spec.ts b/hermes-console/src/views/topic/topic-header/TopicHeader.spec.ts similarity index 100% rename from hermes-console-vue/src/views/topic/topic-header/TopicHeader.spec.ts rename to hermes-console/src/views/topic/topic-header/TopicHeader.spec.ts diff --git a/hermes-console-vue/src/views/topic/topic-header/TopicHeader.vue b/hermes-console/src/views/topic/topic-header/TopicHeader.vue similarity index 98% rename from hermes-console-vue/src/views/topic/topic-header/TopicHeader.vue rename to hermes-console/src/views/topic/topic-header/TopicHeader.vue index 0a80537a1f..7eeedbbd07 100644 --- a/hermes-console-vue/src/views/topic/topic-header/TopicHeader.vue +++ b/hermes-console/src/views/topic/topic-header/TopicHeader.vue @@ -36,14 +36,14 @@ remove: []; }>(); - const offlineRentramission = useOfflineRetransmission(); + const offlineRetransmission = useOfflineRetransmission(); const onRetransmit = ( targetTopic: string, startTimestamp: string, endTimestamp: string, ) => { - offlineRentramission.retransmit({ + offlineRetransmission.retransmit({ sourceTopic: props.topic.name, targetTopic, startTimestamp, diff --git a/hermes-console/static/css/main.css b/hermes-console/static/css/main.css deleted file mode 100644 index bde284526b..0000000000 --- a/hermes-console/static/css/main.css +++ /dev/null @@ -1,160 +0,0 @@ -body { - position: relative; - padding-bottom: 5rem; - min-height: 100vh; -} - -.logo-mini { - margin-top: -12px; - height: 40px; -} - -.hero-box { - margin-bottom: 4em; - margin-top: 4em; -} - -.margin-right-4 { - margin-right: 4px; -} - -.margin-right-half-em { - margin-right: .5em; -} - -.margin-top-10 { - margin-top: 10px; -} - -.padding-lr-2 { - padding-left: 2px; - padding-right: 2px; -} - -.input-dropdown-menu { - margin-top: 35px; -} - -.borderless td { - border: none; -} - -span.helpme { - color: #428bca; - padding: .2em .6em .2em; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -span.helpme-addon { - color: #428bca; - text-align: center; - font-weight: bold; -} - -.panel-body.collapsing:not(.in) { - padding: 0px; -} - -.btn-main { - color: #428bca; - background-color: #f5f5f5; - font-weight: bold; - font-size: 2em; - border-color: #e7e7e7; -} - -.btn-main:hover, .btn-main:focus { - color: #2a6496; -} - -.auth-pane { - margin: 10px; -} - -.loading-in-panel { - margin-left: 100px; -} - -a.navbar-brand.console-title { - color: #2a6496; -} - -.message-preview > .content { - margin: 10px 0 0 0; -} - -.message-preview > .truncated-info { - font-style: italic; -} - -#toast-container > div { - width: auto; - max-width: 800px; -} - -.tooltip .tooltip-inner { - color: #333; - background-color: #fff; - box-shadow: 0 5px 10px rgba(0,0,0,.2); - font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; - font-size: 14px; - font-style: normal; - font-weight: 400; - padding: 9px 14px; - border: 1px solid rgba(0,0,0,.2); - border-radius: 6px; -} - -footer { - position: absolute; - bottom: 0; - width: 100%; - padding: 1rem; - - background-color: #f8f8f8; - border: 1px solid #e7e7e7; - - text-align: center; - color: #b9b9b9; -} - -.full-width { - display: block; -} - -.ace_editor_debug { height: 300px; } -.ace_editor_schema { height: 500px; } - -.monospaced { - font-family: monospace, monospace; -} - -.flex-row { - display: flex; - flex-direction: row; -} - -.rotated-90-deg { - transform: rotate(-90deg) -} - -avro-viewer { - line-height: 1.7; -} - -.tree-branch { - position: absolute; - border-bottom: 1px dashed rgba(0, 0, 0, 0.2); - border-left: 1px dashed rgba(0, 0, 0, 0.2); - cursor: default; - margin-left: -1.5em; - height: 1em; - width: 1em; -} - -.long-branch { - width: 2em; -} diff --git a/hermes-console/static/img/hermes-logo-full.png b/hermes-console/static/img/hermes-logo-full.png deleted file mode 100644 index 1ab5050200ade375a6bc49b53e66f5a916e31d17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8445 zcmV0L zi+gZ@5RzCaSX*p1w-m zGcBpUV_BM+R$r=r{ndA?s_P8HkU-WyaVjerM*7RWcWIIkAqkTu2xRhdR?0x23l`tA0U=@-$P*WzX$H2LQq<|t|6_P|ynR8V^=cjAedtb6pRjGuG(t_fI$EQDMKWq#|QIAzxQ(UL!d{)7Jv{&&sK z8_(~1fOY*EYS$b_2ZRV&)UKbG%DP97ut-1-ZCIgMg(MEt6oqx$;WWZp6tD_eC{PUIDD50#+d%f%@f} zcY>2M8N)FOYqlIv5mrSqQ>_A4A#H0^5H+Ub5Lov!SY-!T#jqA3o??Zkn5=*Ngf1CS z9o2St3b*0HT+Q!|Up%-KK$Qrb0B!-l2=Ue&MhS!nao4CYM=E|S#dtiTS>JWitSQv2 zd2vgG_;vlt`o~YEzubFwg##!aSc~t-F0f7zSWDuz2=M|HoT&<@Ri|P+?ihiU*Q`bE zZ@a-P5Kfj5H&8VRCiH#$MET3N?q*d`jTnzjH0wSFtBSC);}wLHCBzL>9p87X-+n^= z@~wLo23C1rWsUqcOA7GEV-W#a+$JF{UO%x>37kd>z4ao2mCijyK5Nv5?A+_e-_P5A ziu^8jaeR9nyL=5nWdiYCSroJgjmm@%4~?zcemr~r?R#qrpjiP*eRbh2TF**eS(`&Q zESWQ4=fo`&pxQyDb}P}S`SWkz2fxq8>|oIl)#}1t+2&-i2LwjGo)wOk0F^mZc6cV% zJ$6hcuVh0{d>EA`UXJ$ghXzb`~+ zqtf3Qt$!zQ8u?3yeypPgRlw1+oj(9vB0y{6R`wC7Caj(*)baEC?x&h;-L}KU%f|CCGbJz4kAt`a(6iU77hK+O|ACVYxg8su~S{5ucQE_dxChsq{6v4INzO_Lwx zONXD-e6%YARuv{eZ-bg9KwJ%2JvB;TRS;GJ4ro`?Y={9={AX&{%ZE#K1Qw28LPtz; zFbPz2%7pY1s1(-iCx}gG34~NQv3588in9 zF4s9NnRN_hVHWfjsKik+#zNMkjuKc+?YdRXpmrUK2~_qy>O@^WGNL1}5bFgqWXR*1 zr_f|jMW(C!K_w20akY)Y=_$~37xouS+x6kGJo#Oj9Ah9RP}z2)WSjEkqfga2`&ID) zmWQ??G;J4xYQlQFVnFJ$y$XNg%oqgNA_Zs7mIDg>Y}%2rfC}3{C<|a!*foRzmYD|{ zng}%kZufwiCx4mfU?@t1yp=B;C@Lnb`_rb=Lx44mR1Bc9Z2>st^0B8?4p=`M)(zYm zzBGhamExEezmWm;`zD*v^lA{G*K@}742=U z+rSM1Drh`iim$?dnsv=k;ZK2m=*=wJu=$qbMh7a|#Ks5#wd`Y8GH9~_qX*rjby<|7 zl5|_x7gQ70W8i%3j&Udo4KEoqrfHNfjX$oN!2UK(yJPBn8G|u^S|y<7*mbVBa~EiI zh!AKqr(V)r;00ha2rj(R`13%QgA2obR9r>8J3&QQYi5;HY@qVa6m7Iihn}z+ZS{|S zodw6spjwuT7IX$G{CLaE$>((h74|)We{bMeu^QP{@msH?LomHmC1HX1PtF1`0JR->(YunZMmp#6p;0Ckjrsx-Cg z%R1GL+<kAVkR^4=gw-1Y*Oe&sJVZ)HFm68b8~Cwyz?vm97Dm!use@=z@1IAgH`E zHA#M~Tsr)u<$SGrV7F-+fR;57+VG%G6Hqf8r~vIw7f|P&b5o3};nNPSb~Zf+a$IA; zdMIgxMRJ>(o;(mnox2VVH>h9z)7v#4czIhp-v+oew78g6XrVwgVLbvTTUZ28*-eHn zxk5gumyeXJ?s(Pxzhw3-+=$^2pu!KunUgQ52x^*!b!hf16sS@gpt_hZj-a}>one_O z7R;DYGxYj@@2|O-CwYt`4|W5vL7k}#4(@Bh8vmH7AmJ%2-!llb|7zWkRrmcOZJ1gX zHHdAv%zRKG@{pZ5`C{GDs$8O@OF(tm#=tI|+S^+F&j&RZXv1Xdpxxz#3~>boRi@nr z@xIURyPw|7b=wY8&AP~-^7}NQCHCy)V^6nek(KwpoN_?if; z#|RWj7{%Gd69Fm&<#*r(juKeuiLKrCUWWW$F`vT3fND2Mh$Cid5I)~efxPP#n6d~o zErh?)1XOE|))kwTO4Hu$Sx~vpW{SC?y{B90&s{0Qm)Xf%L?<0e;}Y zDr^L6!a%i$yg=J(5FfRtP+K70tk8L|3`{ok0jTUer^v6%*Q$qA4%iX`n_3L*8a6yt zv0|4^AfU)Zx$y2oCa_z_GiH%A4br5cc!LHd(Eg28&z|F6^4Xs>{|K+RQ#G* z@pi3BBR#xHu+s+>7&(!T(sm6CDs+)&U4Q`3k^oz??wIv7oY>GfhCv z*dUc>PAls2%{##?&`js5uR!H{PvzQ2M^!FT0H23^GF)<0$%1y`s2V*%_c$s5t6tbI zTiwQ*EeA4KU?Q72`$U2Y|27gERkPWs6$c-_3CG&EbTBI!-{9d5ucm#>jTX+0&y0)|WDvY#8iQ zP}$FPOx(4<9%nPx0Ib6v*mOL&24ERsc;nPGrT|Bt8#co+6@5@oIn}& zD!kt~bLyo!=S=D5{900R_6)%KBFtS-CfgPI7*vVP3r1kAaM6LXhj#5~b@6sV#Rx!K znJLI=(=PSm*tU7j%j&{jfHsT4d9$EmVL=@wpemeJg#zmW{%z0fnV0FREz38(kjF7u z1APjr75XDT%5xu|sAEBl>XDXh+sSGRR1EgR&D_~xW~zZs3REI#7st2H%S+RmR0=MQ zbAksB-S1G0pn|5z5?FNv6%qqy`OpniZp}{Ysx8ky&jrSfRG)$hKSByRKlky;S^!g^ zt;O%!1{Gn2ZgC*u6lxWN^H5ZwT{`q*$F5@41LZVo+zc&tHnlK9Eu}gDmD*GUR4edL zynfwbPAxj=#cbu3x(TdNBG)NP*0`^}0+sz-B(So`fZ`Fx3Jq(gprW>kHP_!TtAS`N z6CMox^5Gr6*^ia?y^%4?=;(f+mNspDHi3pSOIwbS-JCFtk(tvw%Lpormfh_TN2OsK z0;?6_xOw4I|3C`sF+$^@Lc~ij^$#dZ5nP{yL{~F zj>iA2xbtOzJWW8YA*g9AmUfGy!nvsAI?GokU$c&V^X>nRjv}?Uhhhd5?7zAPsAf+S zKd2JU36`JxA^cdifm*Z9-7x4l{;Pl7+tJ8^ z)Zfb)YBrhs$Mca)Ux1i%9fE2)PUHcd`}8z(vNRW114RR(0yTr0EtSxslrT0bJmoqb z6N3F^1eH!47cw(dMUw>_#@dw+--uIhE)p5Z= zW$9@G>lr^-s|3_s?4Tm7W_q>zLAA#UGX&PU3F}L$)C^U%6Y!r#JKHi-sM+G(^`|Y3 zXWH8E+bpjXIFS{shseI(e0r-F9#K z+Fy^WT#lBC%)yXrP@`$-^O z48!GhqEQv{BEX(d%%qDecy?IXs*EM6b!I~T80vz6YQkECgKfZASubc+YmTbfiCwBo zBlnA>FzZBsy}JZ?{<)7&0(cuG|0PHZH+(y<;OD#xAHx`bjn77%XR|(hFino3I?ig+ z9X2Yz-NxB7FH?_w`KA{#IDS6W2R5o-92J};0_;iJHcP*=S)m}$yGJeOyXl+HCo32U zIOmeN%CPuqq#BiY{aNBnDQmZ?mW^@Yz?S;OgAeBeK5dCN0h(I%r+Oco08U-{*`?pT ztGx6(cc$k)IjscfP1PH|b$bRKrx6#eEywBgS8!Bk3A_ImS+nI`oSjb^N{B|qR4o0> z;+iP;H)A1DEeniB@g7*=vgLWVk#y1hNMs0+r^x5mY!PLWn_agzu~4 z&*@QIFP8dgFvLcH+8TdG%_=Ru^$v5+GUw|WC9oM#e2H;4{Gi5k&(7jlPm6e1v5W%pBbDVRWgUm(EX>m;nKGd8&!9P z)u@^4X$erd{Z(n5>ZfPwOK;tj$Dv87`PU_FAh6bONOsmKLlqaOX`G&Mz$M_1OXJXO zKpW{7)yE>ya4_!_TrAi1=Op`Qv!RCCaHhrysIs$W{Ylm^M=lHqP+Rr~_ZncWE&cW; zIzZB}&t6V^7iI#uNo-#K+O1gasXew}aVppB(`ZKeY zSM(;VbjFw+ivVhsn|4y-${Q^+ss87K^US2w#)mRAXx|DdXg_maRkHwnpaW3Z`4;Cs zn^12cu$uM51{+%i3qR)wsP#nw72~K-P+aICQ0cI00;`zBu zqIT`0qZY`^Zo3E9NNX7x*(vMvC{+W=^5-HQ0e#}(&ftt zDlKv3&JX7@Fe+C*_<4(_y6Fc`nTtf&K>hmnWzDZGZ~Vt6Ffu_$fi1qH&c_`W)3cRV>*)3CbfpuI{TfmXpn8U#Vh5F-1)Vb&ic^+;XLA+<{G4w> z!&JGskdQ7Ks0eG$)UM5idJ_a{1H&g^i)k~bm3a-jeA5eHW6J1I)Cs6r1l62UJyKBp zQnQHxmHj-4`TqLSTkl{>seu*#ZH=B?G*C@g_oXFfh#Qz%TO3fQxGY(1=G04$jk)}e z7um!TImwz6%L3?@*~wQimijD>0Q51a&5YD1r)vaOYHQDZI??tJ??naG0#<%Ijmx0R zl6{Jx=s}&LP7QHra3<;6%t`0z(Q)3Xc@s!DW^5p~I{B)Mpjufue^8wq%boz0ZL(qR z)6*TVZkPyAd0Ac9%hrd=@k{N51a-=2W@zecImoY$KkM3HEAHHdlP^d(o1l4Ye>+y< z&u!zC$=5Ut_`}qcJNg{daiUS>D7Z)*sPn*m=(o9mpz4>8KBWiQ=gPZZHD@a^(}cNs zvjYYRO*w-)ML^9WsAgeKi({2IQ2E(pbR5_31}d9d01^uW0YHrm(!_#F;MB0xPh*SZ zUON1w7Ir@??|q$3os*NAv;GYQ1F$VnXyHT3dEGh8e}z#Cr?pU-aLcRbxL@ZyZVgiwuuq+hzhCyb$}g>s%l%Nk>dv{nOhO z8<-iXx#T&#rxxH=O%YJDeFZAl(AHDB>cKr(Gu|o{x&&1Cw1L2Cmi_(k-_kg<-=KT- zR3K34w3b)@xL0*(vv!s?2Vrv*;J7kJF$-zTcl-W3T1cX+H7ZW)B4fj-Y=Hut61^nZ zW3I^rm8J}@eDHIG^=U|Om`hfM19ckBAoc1W-qhQK6JXTwMQzPa)-C1C34m9Q6Vk5e z`ms@Dydf>N(5eT1m9x^A2ESx^VnAhGbneQB2f25!_r_k{opBh$W+=Z zw4NKYJ(aKj^VfFmi9LzuT23m$S(AE5x(ZZVx1*p3TS3!+-k6p5y^%JDO5ne=l=D7?5R6k>yVG;RC^81t_RhoWfa1t3N9Iq1ISb(<7+p{b0`B}zX zR>y>P5kZCRApV#quxdWn;iNrP-nr}-=?PG6H=B9E!<^=6al$ay4<&oDS$wh}pf)f( zRe`E4UZdiSb|rKeQ!XC6>Nah-0JXb;%^To?ZE&(^hFAAq?j(#PK<#cV%OKF4JmeLdN3G>6>DsF}*bYa2@}O!QsB~39h*Msf zd`)+GaB|#hz~hw1!9MM`?!E6pb+7@^xw52zAumm`6m0+11Tq)Z(jXA~HpLKy| zAA{-uZQe)2F@Tw1A+{wMd@%`A?7<2;G(J)xM1UH^rsXwY#;1D@D=dXslX@^9FF;*< zfLS4iU3=PpwmUpb`_@EPEdUl@T!Z#Um=MB)nkki{0-hBo27#r8UimUR(7hchjB%k6kxGY@93ZFImgGsh8 zSD1M`p)nP|vF=!|c-G-hbgaDOJsXJ~mMkLHGmlf0)Q@{%fEqZS0zb_6ae7gW2VCaXxDjZK1!%DXk92dHgdR|KFk zMUX=X3T=FUoScswLK###Jm+a_=URZ{!8PrOfTvM%JS7fi3N(U-4HM+)J|}fPfDRhJ zhS0|$p&q^vGKgJWq0R3X5QrekpccV{1^4M3-Z!t~DG@;mvXksjjmzs#;nVBaEsRBY z%z>Z}NJ1dx+o}`U;WZM2)1*<3rX6!TCfcJrBW@#jAhYd&Iu%6AxjlJ!F+pdbo5rra z5mcKe4ALpQhIWr%4X~Y;jUE(IcC4W1TEY8hmwXHla}n-AP*A~9+CaW=9V{pS@8su= zKG2pt8aCx)b8f<8WylL)0nKm=d5!o$JBW@+yI_Emvk8yW38bUsbtAS_2G4yw1l-Wp zX}tF9@SNPPdjP$7yFw^Q{xeb+@jThF;9PIS<5hi>f*Jx;*0x3DhJO{Yy{aydszIG8 zSED^ZE$c0Os3Cx3GvepX;xXamhdml4!+F#}oT*R|3m<2y=oX1Ud#m8*U^$%!+M1fn zL*8ZR`U0kteU zF<<8Zj!9m5k0(AAvI~M`XYvtE5>fRDmz8{a1lNZJwYyvU*lkAH1JX&jr$Me4J?_yq zdQH0o>Y1?ZicSx^AE>1OJJ&tBwXE$aANFWGH6#?W$4!?*>?caQs^a&Md2BNsz|>GZ zoXH^9-w4?@3|2R#FdWcYixQRyd_Yu>kW~;Fk9cyj zAnm1x{Js5}B@ZW+DFioDtlVbL;dOs<0XRruv;dMN<#s}eUMbWt9<0PbKsxB;CHA?LgL=~edo0+VRecTm!OB&7 zX+dGd{kbK6^aTYKvkq?E5@af9{LJg(0A_5sFQoaI76Gf|TPVcZN%K++s1eJO^Kcng zSh+IH6u!=3en023eHPEd>%QsNFG4$lhwoJ%TEK>!wmAk~#TNFPptC_?eJoz9RZFP7 zhA`(|bNHK|45EpVb1=p1_h|>dq&8|g8c?&bWD%ZrxR4-OiviY{_zIe*ZuoS4{i0Rt zQm_R>Qnq#uQ+J^TfHV>_X2~Koq9V1I5B3w#!a1>0UW81=eI8`~}Jspn_QcLM9S>#46V-b`;Zfj2aOyr`y+^m6a&X|zs+S<+G fN>p0={{_EHTC&Lu9QaL}G^Q zz9JeS>)8FK-yiqA&vW1BoO{lD&-t9sxo-->SeK1OfCT^mu<7e*-KWlY>WE@upgwOI z9dJ`8W9H0tyq`bV%)~15ICOSI9{+}1q`^N z|I>$t?paa#-Tr>D;@I^OeWkJ4xY4mz*u{1u(fCyOb=BLdfx}N*lqbS8&OqT2HGZi^ znX)Q{N%LVii07KSL7wa2{@G2dxo4)W&Qtnu=cdAb=+YJwJQz zOci)`beH+ZPIe)pcwnuzdn?eZNbz!4pr;t^kwpIQa z!zlGd)5;Z-VvSrJA5o#(zH!BHY52_r-sFV(L=-)D97{dBTSdUis2)wdrj_PU%Rns4 z$b0v1zvI=?OP$h&Op7!UAg0$4K=#m0MIR+gW>M}B0;o=TAspZlWy8d91roc>5MQ5| zA2>vZy1Wpwsm9$(HHiN1zct1oItXsqoMmD7O;(v2yE7ZK0?&X%v(3IYX$6GdO#6Z6 zc=sQ|3)ebo4=W#N>XP=; zx?M>qd+Bu{CT_e0e*e1&5`X+V`!knQvGi46++JHALtBV&3n6s?91lgtxxw}X{Ayxr3*+S2s?x~Vf8R7&fK(z7 zX0OZ;r#8+xj$r#vp#dTEa<7`jJ}A5=vKH7VI-bk%C&+0R&*sJ+f7Pnk{f$#yOcQ*< zn|7vFh&Br*C>by9g;TmjM<^}?3(Nte-xamkuW%l%T)bnB@mFH54$6{@9d5NnAy`jp@6GiR}&*5Yv& ztB;=2#pUM1s%}lcUfx#wFr_qOrexGTl&kLhm)szv(EWDrvOU)F^$YFRT7k)85Ft6o z%XC5|Vps*k#XYK^(NQ=(A6i`I=A%id-nu@gOr){+`+c)I?3ee_t59M6EJhqZdHs(v zO4Hg(M#{FU;iY;G0)&JkZm)WN$5{kdr%;4e|0t6+*vC7&J(8Z+%<~QVv6*9CD8xi+ z?CMAFY+Sw0f*=2KZbO`&4E>Z)u!fiM>vH&DY=J{#ut!ImfnNIs4P9ZB@2#;UwP)m} z`P*?cJ;(eR=-E%lNj9R8)xA2ZF$`r!l=0)vFp6nQ1m%VtC&xoCSe;{+}ny=uSOr0 zrRw?KG(S~kuZP@*Z|dl-3-R?`2=t-ZcbVo%&BFc&)8i zADh3U13W(J?@&Xhv+2=XE|=Kh8*ugem{prldJn4udo<1j5q-dvA}O*P4zM?2`viXm ze%nkH3pz~}tBW~lmt&Mdf|P~oGm{j!o11EC-ePI0Cj*tPjocn&I)`U|%H=q^1t^?W z4}vubOJ>9 zte&m@(GeW#*#}%Xs^qmZ%Y%6T2oTU^lc+ESRA`zxpCK%X5znko43 z{JjUy$piJq;th{Qk4!^~( zTMrMvS8J_|JLU4ADE^ufvUS*tCG=DzE$t{WJk$9LSJAqaT{&Tc;xD-+9sP8&WuKaC zD;>Et0#uVL)Q!=C48K^A+mvU{@k9bwm!DCzg{r^RO9nl`?<3>vQKo@I>C$yd z-90SWyd^~${#<@?kD!4Xhbbpp)>BCiQ0wk98D*G&7?*fb1()liv*U=dGpi@w>vsup z%IQybg1uDgobk-akud}|R2T+z4B!zqFTAo_7~^G!F7|mY%2EG$?y-i2|VQqrr~W~P}RCd8OxR51G*IE!asP~u_2 zagQ=}|BI(v=l)+ou1ZWk(xt&aah2+GhRm1Wpx^``DC^Vm)eH|nTWFzQ>|7WF^sy0r zO>)F35kz0}MKzQsgN-sGVc>rlt);=46ac>-$bk}-wuawNF6%s9>cymYt7ddw&^}$2 zf=jV@h*iJ7+oH}k($K2D0_aij;9?Vtd)v`*>TLV(liil=~LMfo6LpB>af0#b-ggDOg;_Q#hJ6m8;wK8PYOD0 zZECe?PzzRUavmKSDrS(5Xw1j2?r^iASQ}Uxc>6gF*auXW?U7+w#Cp^>^Wl0PJODq& zJnq%R!Gpa+z~~#{_0G&_)VAVvjqUMO=7}8RI@>kbK+tr~IKhH~WVts3D^0#@IXC|c z7_`p!6e9-n)}p`H!iQ@OYI`F{y9K*X4c&-dw~ZfvK54aLrt&y(NAlcTAzr&>Ao}Y) zJ&WOxQ9e%JvUM9t9M2af1beb6=gPn_N`M7MH*}JH*=w zmf6`~9NiK%7Auabcb>gSPihyY)1Nu|(`4QHSzDUTMnAaD*Y-9}Rx;_FFBw$!52G3D zNS-1MFexo5xKUk^E&_O1l@iF9^V2c7Jkqr0;r!C!KZR#Z8W+n#nd4Z(?dxq{7aGHd zl{3o%)@&v=78~iIPrf)}Q3z(_{#~$yXmGI8bIZteQpcuM@+ZV_7&k($1-oxjpuF(n zB*;6&4j#Ve;cHYB0|kzpjmZ4ODO!6C1wZG*{pxVO@Tct3(s~^s)l)`5(URksknlZa|vm<<31k7TWa^(|U3dZ{(7-uc2;J<<97-^VnpyOvQ zyR2D%Lq_mkOCN<^@aJf=7F-+oHzJa})A$==7;Ehlea8y{q^90qdTU!o+~IE6<={)p z1txKiC(_T`|CG9rxcZs!y=fS&V9Dy@@)~voF!9E)&={k@?jkZ)Cf$Kk)oFXwgx9tKg2= z+{Wb5D{-)CR3RTYYo>ul01keUZh8eL`Zm;M)#)NOYNv?e2L zvMUpNWDP(_PX2;z5i z?wQFDq30D32CGc9z+9S)V}SKn96E@e(cBZxV{qx1q4u zS)9x*pHb#TlY+?=OS8}WMvOvFEF{XX8v%ut&N(2-;Gc_ipiXqIdeoIfPHv3*JvhI@ z>c{V3#8_*4sw?{IP)tNc?Mr%}7$4nOTxaJn2VMqUUBiV$%h7p}2d|9vZ;Nwyna`nh zVg-kbkG4+?>(l32`y5dboe$>bEE z!KpOUH*ApP>)e_ud|KL8z~B9q-hc{xEH-Q094e1=xM}@`&0|@@B~BquLPT4IT=S3r zj!*I7RaPl50(f*IQIHW!&0VJCj7xR*_@q2cTL%PX(8EZJ_)ALfj>cE}S-YPwHtPT{ zL!(qD28IC;C!2B5OMWG*sNC{a`AbN2tx%l8mu@f(R8lV}0O#0(KNgCQOBE!#93%oM z0ea8J2$=TC+_tv56v=g?rjtWy;{9C7)JBtj#iberP^w+#LRePaTVJ#@y@-` znRNwQQ`PPSZVvA~OO<+P!{S*VxJ6BQeeUQ_(52Oiwj(RX$Ag<`uh{bE@tHTxA9;LE zjAOxGt>EFRW+uJF^zS6yx`cV3)5LR^^+0kXhG^}7UYbS44}ZiO6Ou*-7mO28qW0-x z;&v}(A9J)E43(o<{FdX?c&#$FbESg_#gcqZ+aInx-_C7E5)%c2w=HMR^<2n1w_j3$ z;yOC*YdgK?<}Bs2P?TVWiiqmedA`|4AEHaJYOoX-d~?|XYR#vBlAZnBzf%_uSm!vs zg%4k+Q{qk?*Qtq2zo*Rb?8VVZHDmpW?kk}Mr{AH-%=x58F{%ZlMQDQ@2uLd}hEObx zni%e}nn;INcqP4Rl&g(=r}~d4`{R!ZgtmZ;lYUUwwsqTe7`2hUIv8`}7jT%-tX1C0 z7x3cHlRS6&k+HPxXH(196(3yXG%PUuRDxJN93OqciwitH4i8r2ieTB9DIphI0ecRh zd#I~43)Bh|{bswlkJ7rz|IXl@He0j;yNgMb+>&&cZy+6a(u|o}*R7D_wNyE@+uEJ* zOU6DDf2$N|iQ=o1_>#P9R1QaOs5o(I8}2MM-Tt{Cr!@{`BFc%D!uNoVF|`F#0-e4l zU3QtTC+{U4g^8|dAV6ws6Vj4{o6|V}MZ03V)0VEz)zvVo&p8nPvpc;y>r?+Ji7H;! zJ~q`g9o+m^Gk#ktg$8dbCwz>R<-+}5yFnQafB5$2e-pc3GSI7;@L&@IM|JSw?@{#^ zD(5Kux!@O$HtQAIre}FlIIIiLqM2jSH>s}8;=3r+eOu2~s~D;;o~qZBEgr?=t+6_Y z!P~WL=zPf+;VPNqo+_N@`1jMkpE@k5go`ejUig%!w+{fm?Ed|wK!M6R-hQKVeaq6N z#QkP98(jL`++EJsN86F%haDWfFck@h4#9xyuxrqoiFv{U(L}#W8eHtplZZBmu2E?)POnjBPf!IaCepu0}cBRF+B4yV>8vb++nAu8^T`FlJMFVq1!K`%zXG)ConDO zmwI~c3w@uu+FEz_e@o z6TGiPGL#CNKF$xGhx5?m(5%J|2f022lfp5*nmh)03eM9P02BSR_XX$ij2-f`Pcu(Fcz-b&gTP%Vc%#tz<+6 zc5zeG1$1kMMr^O*m{{k|Aa3*2l^DLvAv+6fGUXr)#&iWcniH0+L0|pmp6>^$7ul2P) zL(<~!+1_{m{QY)fEV1UBT0a%^vXYbMem1+NR&)o0;PhD?EnUL353_l^jA02gg;C{SMuGZkZ@MJ7EYvFcC@M;!Pb8mMo(My zPS0;<{=^=EO)uePQ79Bg?-yBmOFZe7em=p^$bgYH>GdMe;eHkP13joPx3MkalY+IG zxcA`H8o0J^S(*PUa!3NFQy8TyB-_(h4}b~vN#(?r1>qcxsc8VF_G7mJk`WI3@Nwf% zdxNk;Xsk zM5jZV4rMXvjEYN4xl&Q)GA(lC#!6Vw5)`A75mkoPuv1q+{RUCk79GFkjZg*tr1dUQq+JTL7t+40ReBC!X9{O;Rrxn`pb?>le z>F=6a_dwBe6)nbDDI-MBQ@tp;9Ea%nay}+A$6@ySFFX)wO6wFb&S%8u$#W)*PMi`$ z*@Z1_BR6A{0_iT5HiyuGl83;Q07uA&1*$TIf64+%18&FJFns6*;`QG~lLw2fX;H+B zSO!8HMW|6dN872YPyjBJeZpkK&>^(cQsIcVau%{>?}gQYagmv8#9YabrmUHwm#M_) zKVWs_-#22bLyCDfadBpjtdsIEX+~6oh3|2k`8C|xUdC%mRqHR+jCNt}4kb}YNQh?7 zUis#h*@gir?DBiLlf<{?B9Z#^zb*w;KZGLUs`?L-*;C{_L7Uu~z2;iXIw{Ko$bij6 zIEyq3nd}qu7f~E79G*SnbtC#eQg~s6aD*53JS4M4!<((x%cqy|J33(z-Pw$S+6USrh3*lO*kRe+!Lg{R{aB$m3Ss82MTjk1E=VuPUf^eIp zg#2`G(^-YAJ=7oS{l912>orpYi~w$RrY?w-?b{2xxD>(=&%?;=bV^l*ukU(&=1X5y zUu)R*!OMh$EUQQU)z$Gcud?wj!PkfV5X!RK{`T$tSb4JV*52BbUWouf43{~5ZCJ@%`53>o{x9wa>jVBlVq}@ZG#zZOTg^(LaZOX^sko(bTL)a;%6itep$P zRFCr*zNYX6KN>Piv*96PcS~&ipLiFWo1By;@PE!($Xk}Cg&bY*nLR*$Jj&(;mxKgv z)X)%}wPs$$991mpzE8shev~IE)UFMB5jVniD(QjvtTW6-T%Q@_fWCU_X!@=bXq4Ik zVpu*W&mZjGDeB*(!ee`a4cy(wbnfZ;??_5r7lqa>gZy^duIU+eikt(PgBSha1SI)qKQT=-dp)n_gcQh5B zyiqnk9A3Wvy#xRi@31R2ie7o={6xt)yjnedb+&eefhaYgntSmRs2LZo{hkj0(JJIN z!=-`^Z?dc0!|$=EvLPDV^E)+W%uPZZ=MaoQ-8c~PDTlH65w$AUF=Q)roWagqlzjcm zW7==5`Cpahk+wm^LB<9!nC?}8>iQ=Q~zTE^tFw(YBiiN{{wwwN9O - - - - - - Hermes Console - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Running in read only mode

- If you need to make any modifications, please contact the Hermes administrators. -
- - -
- -
- - diff --git a/hermes-console/static/js/app.js b/hermes-console/static/js/app.js deleted file mode 100644 index dca2af1a57..0000000000 --- a/hermes-console/static/js/app.js +++ /dev/null @@ -1,132 +0,0 @@ -var hermes = angular.module('hermes', [ - 'ngResource', - 'ui.router', - 'ui.bootstrap', - 'jsonFormatter', - 'hermes.discovery', - 'hermes.home', - 'hermes.directives', - 'hermes.groups', - 'hermes.messagePreview', - 'hermes.auth', - 'hermes.search', - 'hermes.stats', - 'hermes.constraints', - 'hermes.diagnostics', - 'hermes.consistency', - 'hermes.visibility', - 'hermes.mode', - 'hermes.readiness', - 'hermes.subscriptionOffsets', - 'hermes.offlineRetransmission', - 'ui.ace', -]); - -hermes.constant('DASHBOARD_CONFIG', config.dashboard); -hermes.constant('DISCOVERY_CONFIG', config.hermes.discovery); -hermes.constant('AUTH_CONFIG', config.auth); -hermes.constant('AUTH_OAUTH_CONFIG', config.auth.oauth); -hermes.constant('METRICS_CONFIG', config.metrics); -hermes.constant('CONSOLE_CONFIG', config.console); -hermes.constant('TOPIC_CONFIG', config.topic || {}); -hermes.constant('GROUP_CONFIG', config.group || {}); -hermes.constant('SUBSCRIPTION_CONFIG', config.subscription || {}); -hermes.constant('OWNER_CONFIG', config.owner || {}); -hermes.constant('CONSISTENCY_CONFIG', config.consistency || {}); - -hermes.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', '$uibTooltipProvider', - function ($stateProvider, $urlRouterProvider, $httpProvider, $tooltipProvider) { - - $urlRouterProvider.otherwise('/'); - - $stateProvider - .state('home', { - url: '/', - templateUrl: 'partials/home.html' - }) - .state('groups', { - url: '/groups', - templateUrl: 'partials/groups.html' - }) - .state('group', { - url: '/groups/:groupName', - templateUrl: 'partials/group.html' - }) - .state('topic', { - url: '/groups/:groupName/topics/:topicName', - templateUrl: 'partials/topic.html' - }) - .state('subscription', { - url: '/groups/:groupName/topics/:topicName/subscriptions/:subscriptionName', - templateUrl: 'partials/subscription.html' - }) - .state('diagnostics', { - url: '/groups/:groupName/topics/:topicName/subscriptions/:subscriptionName/diagnostics', - templateUrl: 'partials/diagnostics.html' - }) - .state('constraints', { - url: '/constraints', - templateUrl: 'partials/constraints.html' - }) - .state('consistency', { - url: '/consistency', - templateUrl: 'partials/consistency.html' - }) - .state('groupConsistency', { - url: '/consistency/:groupName', - templateUrl: 'partials/groupConsistency.html' - }) - .state('topicConsistency', { - url: '/consistency/:groupName/topics/:topicName', - templateUrl: 'partials/topicConsistency.html' - }) - .state('datacenterReadiness', { - url: '/readiness', - templateUrl: 'partials/readiness.html' - }) - .state('subscriptionOffsets', { - url: '/subscription-offsets', - templateUrl: 'partials/subscriptionOffsets.html' - }) - .state('search', { - url: '/search?entity&property&operator&pattern', - templateUrl: 'partials/search.html' - }) - .state('stats', { - url: '/stats', - templateUrl: 'partials/stats.html' - }); - - $httpProvider.interceptors.push(['PasswordService', 'AUTH_CONFIG', 'AuthService', function (passwordService, authConfig, AuthService) { - return { - request: function (config) { - if (AuthService.isEnabled() && AuthService.isAuthorized()) { - config.headers.Authorization = 'Token ' + AuthService.getAccessToken(); - } else if (authConfig.headers.enabled) { - config.headers[authConfig.headers.adminHeader] = passwordService.getRoot(); - } - return config; - } - }; - }]); - - $tooltipProvider.options({ placement: 'left' }); - }]); - -hermes.run(['$rootScope', 'CONSOLE_CONFIG', 'AUTH_CONFIG', "$sce", 'Mode', 'Visibility', - function ($rootScope, config, authConfig, $sce, mode, visibility) { - $rootScope.console = { - title: config.title, - criticalEnvironment: config.criticalEnvironment, - environmentName: config.environmentName, - footer: $sce.trustAsHtml(config.footer) - }; - $rootScope.authEnabled = { - oauth: authConfig.oauth.enabled, - headers: authConfig.headers.enabled - }; - $rootScope.$on('$viewContentLoaded', function (event) { - visibility.update(); - }); - mode.reload(); -}]); diff --git a/hermes-console/static/js/bootstrap.js b/hermes-console/static/js/bootstrap.js deleted file mode 100644 index 771e7d9836..0000000000 --- a/hermes-console/static/js/bootstrap.js +++ /dev/null @@ -1,61 +0,0 @@ -deferredBootstrapper.bootstrap({ - element: document, - module: 'hermes', - resolve: { - HERMES_URLS: ['$http', '$q', function ($http, $q) { - var serviceDiscovery; - - if(config.hermes.discovery.type === 'consul') { - serviceDiscovery = new ConsulServiceDiscovery(config.hermes.discovery.consul, $http, $q); - } - else { - serviceDiscovery = new SimpleServiceDiscovery(config.hermes.discovery.simple.url, $q); - } - return serviceDiscovery.resolveInstances(); - }] - } -}); - -function removeTrailingSlash(url) { - if (url.indexOf("/", url.length - 1) !== -1) { - return url.slice(0, -1); - } - return url; -} - -function SimpleServiceDiscovery(url, $q) { - var normalizedUrl = removeTrailingSlash(url); - - this.resolveInstances = function() { - return $q(function(resolve) { resolve([normalizedUrl]); }); - }; -} - -function ConsulServiceDiscovery(config, $http, $q) { - var serviceName = config.serviceName; - - this.resolveInstances = function() { - return $http.get(config.agentUrl + '/v1/catalog/datacenters') - .then(function(response) { - var datacenters = response.data; - var promises = []; - for(var i = 0; i < datacenters.length; ++i) { - promises.push($http.get(config.agentUrl + '/v1/catalog/service/' + serviceName + '?dc=' + datacenters[i])); - } - return $q.all(promises); - }) - .then(function(results) { - var instances = []; - for(var i = 0; i < results.length; ++i) { - for(var j =0; j < results[i].data.length; ++j) { - instances = instances.concat(createUrl(results[i].data[j])); - } - } - return instances; - }); - }; - - function createUrl(data) { - return 'http://' + data.ServiceAddress + ':' + data.ServicePort; - } -} diff --git a/hermes-console/static/js/console/Auth.js b/hermes-console/static/js/console/Auth.js deleted file mode 100644 index e5466670c6..0000000000 --- a/hermes-console/static/js/console/Auth.js +++ /dev/null @@ -1,109 +0,0 @@ -var auth = angular.module('hermes.auth', []); - -auth.controller('AuthController', ['$scope', '$rootScope', 'AuthService', 'toaster', 'Visibility', - function($scope, $rootScope, AuthService, toaster, visibility) { - - $scope.enabled = AuthService.isEnabled(); - if(!AuthService.isEnabled()) { - // abandon any actions if OAuth is not enabled - return; - } - - AuthService.init(); - - $rootScope.isAuthorized = AuthService.isAuthorized(); - - $scope.signIn = function() { - AuthService.login().then(function() { - $rootScope.isAuthorized = true; - $rootScope.$apply(); - visibility.update(); - }, function(e) { - toaster.pop('error', 'An error occurred', AuthService.parseErrorMessage(e)); - $rootScope.$apply(); - }); - }; - - $scope.signOut = function() { - AuthService.logout().then(function() { - $rootScope.isAuthorized = false; - $rootScope.$apply(); - visibility.update(); - }, function() { - toaster.pop('error', 'An error occurred', AuthService.parseErrorMessage(e)); - $rootScope.$apply(); - }); - }; -}]); - -auth.service('AuthService', ['AUTH_OAUTH_CONFIG', function(authConfig) { - - this.init = function() { - hello.init({ - auth: { - name: 'auth', - oauth: { - version: 2, - auth: authConfig.url - }, - scope: { - basic: '' - }, - login: function(p) { - p.options.window_width = 500; - p.options.window_height = 400; - } - } - }); - hello.init({ - auth: authConfig.scope - }); - }; - - this.login = function(config) { - var options = angular.extend({display: 'popup', scope: authConfig.scope}, config); - return hello('auth').login(options); - }; - - this.logout = function() { - return hello('auth').logout(); - }; - - this.parseErrorMessage = function(response) { - if (response && response.error && response.error.message) { - // messages are in form of "text+text+text+text+text" - return response.error.message.replace(/\+/g, ' '); - } - if (response && response.error && response.error.code) { - // error codes are in form of "text_text" - return response.error.code.replace(/_/g, ' '); - } - return 'Unknown error'; - }; - - this.isEnabled = function() { - return authConfig.enabled; - }; - - this.isAuthorized = function() { - if(authConfig.enabled) { - var response = hello('auth').getAuthResponse(); - var now = new Date().getTime() / 1000; - // this is just a soft validation for UI, token must be validated on server - return response && response.access_token && response.expires > now; - } - return false; - }; - - this.getAccessToken = function() { - return hello('auth').getAuthResponse().access_token; - }; -}]); - -auth.directive('authPane', function() { - return { - restrict: 'E', - templateUrl: 'partials/authPane.html', - controller: 'AuthController' - }; -}); diff --git a/hermes-console/static/js/console/Discovery.js b/hermes-console/static/js/console/Discovery.js deleted file mode 100644 index 398809b6fb..0000000000 --- a/hermes-console/static/js/console/Discovery.js +++ /dev/null @@ -1,11 +0,0 @@ -var discovery = angular.module('hermes.discovery', []); - -discovery.factory('DiscoveryService', ['HERMES_URLS', function(urls) { - var counter = 0; - - return { - resolve: function(path) { - return urls[counter++ % urls.length] + path; - } - }; - }]); diff --git a/hermes-console/static/js/console/Filters.js b/hermes-console/static/js/console/Filters.js deleted file mode 100644 index 8a56ec5cbd..0000000000 --- a/hermes-console/static/js/console/Filters.js +++ /dev/null @@ -1,27 +0,0 @@ -var filters = angular.module('hermes.filters', []); - -filters.filter('readableSize', function () { - return function (size) { - if (size) { - var i = Math.floor(Math.log(size)/Math.log(1024)); - return (size / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i]; - } - return ""; - }; -}); - -filters.filter('prettyJson', function () { - - return function (jsonString) { - if (jsonString) { - return JSON.stringify(JSON.parse(jsonString), null, 2); - } - return "null"; - }; -}); - -filters.filter('toLowercase', function () { - return function(string) { - return angular.lowercase(string); - }; -}); diff --git a/hermes-console/static/js/console/Groups.js b/hermes-console/static/js/console/Groups.js deleted file mode 100644 index d8fa39d558..0000000000 --- a/hermes-console/static/js/console/Groups.js +++ /dev/null @@ -1,216 +0,0 @@ -var groups = angular.module('hermes.groups', ['hermes.topic', 'hermes.discovery', 'ui.bootstrap']); - -groups.controller('GroupsController', ['GROUP_CONFIG', 'GroupRepository', '$scope', '$rootScope', '$uibModal', - function (groupConfig, groupRepository, $scope, $rootScope, $modal) { - $scope.fetching = true; - $scope.search = groupRepository.getSearchFilter(); - - $scope.canCreateGroup = function() { - return $rootScope.admin || groupConfig.nonAdminCreationEnabled; - }; - - function loadGroups() { - groupRepository.list().then(function (groups) { - $scope.groups = groups; - $scope.fetching = false; - }); - } - - loadGroups(); - - $scope.addGroup = function () { - $modal.open({ - templateUrl: 'partials/modal/editGroup.html', - controller: 'GroupEditController', - size: 'lg', - backdrop: 'static', - resolve: { - group: function() { - return {}; - }, - operation: function() { - return 'ADD'; - } - } - }).result.then(function () { - loadGroups(); - }); - }; - - $scope.storeSearchFilter = function () { - groupRepository.storeSearchFilter($scope.search); - }; - }]); - -groups.controller('GroupController', ['GroupRepository', 'TopicFactory', '$scope', '$location', '$stateParams', '$uibModal', 'toaster', 'ConfirmationModal', 'PasswordService', - function (groupRepository, topicFactory, $scope, $location, $stateParams, $modal, toaster, confirmationModal, passwordService) { - $scope.fetching = true; - var groupName = $scope.groupName = $stateParams.groupName; - - $scope.group = groupRepository.get(groupName); - $scope.topics = []; - - $scope.showTopic = function(topicName) { - $location.path('/groups/' + groupName + '/topics/' + topicName); - }; - - $scope.fetchSubscriptions = function(topic) { - groupRepository.listSubscriptions(topic.name).then(function(subscriptions) { - topic.subscriptions = subscriptions; - }); - }; - - $scope.addTopic = function() { - $modal.open({ - templateUrl: 'partials/modal/editTopic.html', - controller: 'TopicEditController', - size: 'lg', - backdrop: 'static', - resolve: { - operation: function () { - return 'ADD'; - }, - groupName: function () { - return groupName; - }, - topic: function () { - return topicFactory.create(); - }, - messageSchema: function() { - return null; - } - } - }).result.then(function(){ - loadTopics(); - }); - - - }; - - $scope.edit = function() { - $modal.open({ - templateUrl: 'partials/modal/editGroup.html', - controller: 'GroupEditController', - size: 'lg', - backdrop: 'static', - resolve: { - group: function() { - return $scope.group; - }, - operation: function () { - return 'EDIT'; - } - } - }); - }; - - $scope.remove = function() { - confirmationModal.open({ - action: 'Remove', - actionSubject: 'Group ' + $scope.group.groupName, - passwordLabel: 'Root password', - passwordHint: 'root password ' - }).result.then(function (result) { - $scope.disableRemoveButton = true; - passwordService.setRoot(result.password); - groupRepository.remove($scope.group.groupName).$promise - .then(function () { - toaster.pop('success', 'Success', 'Group has been removed'); - $location.path('/groups').replace(); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - passwordService.reset(); - $scope.disableRemoveButton = false; - }); - }); - }; - - loadTopics = function() { - groupRepository.listTopics(groupName).then(function (topics) { - $scope.topics = topics; - $scope.fetching = false; - }); - }; - loadTopics(); - }]); - -groups.controller('GroupEditController', ['GroupRepository', '$scope', '$uibModalInstance', 'group', 'PasswordService', 'toaster', 'operation', - function (groupRepository, $scope, $modal, group, passwordService, toaster, operation) { - $scope.group = group; - $scope.operation = operation; - - $scope.save = function () { - $scope.disableSaveButton = true; - passwordService.setRoot($scope.rootPassword); - var response = operation === 'ADD'? groupRepository.add($scope.group) : groupRepository.save($scope.group); - response.$promise - .then(function () { - toaster.pop('success', 'Success', 'Group has been saved'); - $modal.close(); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - passwordService.reset(); - $scope.disableSaveButton = false; - }); - }; - }]); - -groups.factory('GroupRepository', ['$resource', '$q', '$location', 'TopicRepository', 'DiscoveryService', - function ($resource, $q, $location, topicRepository, discovery) { - var repository = $resource(discovery.resolve('/groups/:name'), null, {update: {method: 'PUT'}}); - var listing = $resource(discovery.resolve('/groups')); - - var filterGroupTopics = function (groupName, topics) { - return _.filter(topics, function (topic) { - return topic.indexOf(groupName) === 0 && groupName.length === topic.lastIndexOf('.'); - }); - }; - - var searchFilter = ''; - - return { - list: function () { - return $q.all([listing.query().$promise, topicRepository.list().$promise]).then(function (data) { - return _.map(data[0], function (group) { - return {name: group, topics: filterGroupTopics(group, data[1])}; - }); - }); - }, - get: function (name) { - return repository.get({name: name}, function() {}, function(e) { - if(e.status == 404) { $location.path('/groups'); } - }); - }, - add: function (group) { - return listing.save({}, group); - }, - save: function(group) { - return repository.update({name: group.groupName}, group); - }, - remove: function(groupName) { - return repository.remove({name: groupName}); - }, - listTopics: function (name) { - return topicRepository.list().$promise.then(_.curry(filterGroupTopics)(name)).then(function (topics) { - return _.map(topics, function (topic) { - return { name: topic }; - }); - }); - }, - listSubscriptions: function(topicName) { - return topicRepository.listSubscriptions(topicName).$promise; - }, - storeSearchFilter: function (filter) { - searchFilter = filter; - }, - getSearchFilter: function () { - return searchFilter; - } - }; - }]); diff --git a/hermes-console/static/js/console/Home.js b/hermes-console/static/js/console/Home.js deleted file mode 100644 index 9dbe5be48e..0000000000 --- a/hermes-console/static/js/console/Home.js +++ /dev/null @@ -1,11 +0,0 @@ -var home = angular.module('hermes.home', []); - -home.controller('HomeController', ['$scope', 'DASHBOARD_CONFIG', function($scope, config) { - - $scope.statsDashboard = config.metrics; - $scope.docs = config.docs; - $scope.costs = { - detailsUrl: window.config.costs.globalDetailsUrl, - enabled: window.config.costs.enabled - }; -}]); diff --git a/hermes-console/static/js/console/MessagePreview.js b/hermes-console/static/js/console/MessagePreview.js deleted file mode 100644 index 6af4be6aa7..0000000000 --- a/hermes-console/static/js/console/MessagePreview.js +++ /dev/null @@ -1,70 +0,0 @@ -var messagePreview = angular.module('hermes.messagePreview', ['ui.bootstrap', 'hermes.services', 'toaster', 'hermes.modals']); - -messagePreview.controller('MessagePreviewController', ['$scope', 'topicName', 'partition', 'offset', 'previewedMessage', - function ($scope, topicName, partition, offset, previewedMessage) { - $scope.previewedMessage = previewedMessage; - $scope.topicName = topicName; - $scope.partition = partition; - $scope.offset = offset; - - - } -]); - -messagePreview.factory('MessagePreviewModal', ['$uibModal', 'toaster', 'ConfirmationModal', 'PasswordService', 'MessagePreviewRepository', - function ($modal, toaster, confirmationModal, passwordService, messagePreviewRepository) { - return { - previewMessage: function (topicName, cluster, partition, offset, messageId) { - confirmationModal.open({ - action: 'Preview', - actionSubject: messageId, - passwordLabel: 'Superuser password' - }).result.then(function (result) { - passwordService.setRoot(result.password); - messagePreviewRepository.messagePreview(topicName, cluster, partition, offset).$promise - .then(function (previewedMessage) { - openModal(topicName, partition, offset, previewedMessage); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, 'Cannot get message preview due to error: ' + response.status + ' ' + response.statusText); - }) - .finally(function () { - passwordService.reset(); - }); - }); - - function openModal(topicName, partition, offset, previewedMessage) { - $modal.open({ - templateUrl: 'partials/modal/messagePreview.html', - controller: 'MessagePreviewController', - size: 'lg', - resolve: { - previewedMessage: function () { - return previewedMessage; - }, - topicName: function () { - return topicName; - }, - partition: function () { - return partition; - }, - offset: function () { - return offset; - } - } - }); - } - } - }; -}]); - - -messagePreview.factory('MessagePreviewRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - var messagePreview = $resource(discovery.resolve('/topics/:name/preview/cluster/:cluster/partition/:partition/offset/:offset')); - return { - messagePreview: function(topicName, cluster, partition, offset) { - return messagePreview.get({name: topicName, cluster: cluster, partition: partition, offset: offset}); - } - }; - }]); diff --git a/hermes-console/static/js/console/MetricStoreUrlResolver.js b/hermes-console/static/js/console/MetricStoreUrlResolver.js deleted file mode 100644 index 2bd08f609d..0000000000 --- a/hermes-console/static/js/console/MetricStoreUrlResolver.js +++ /dev/null @@ -1,73 +0,0 @@ -var metricStore = angular.module('hermes.metrics', []); - -metricStore.factory('MetricStoreUrlResolver', ['METRICS_CONFIG', function(config) { - if(config.type == 'graphite') { - return new GraphiteUrlResolver(config.graphite); - } else { - console.error('Metric store type: ' + config.type + ' is not supported.'); - } - }]); - -function GraphiteUrlResolver(config) { - var prefix = config.prefix; - - function compile(template, values) { - var regex = /{}/g; - var text = template; - var i = 0; - - while(regex.test(text)) { - text = text.replace(/{}/, values[i]); - i++; - } - return text; - } - - function sanitize(value) { - return value.replace(/\./g, '_'); - } - - function consumerGroupId(group, topic, subscription) { - return compile("{}_{}_{}", _.map([group, topic, subscription], function(item) { - return sanitize(item.replace(/_/g, '__')); - })); - } - - function url(value) { - return config.url + '/render/?width=1514&height=952&target=' + value; - } - - function topicPath(group, topic) { - return sanitize(group) + '.' + sanitize(topic); - } - - function subscriptionPath(group, topic, subscription) { - return topicPath(group, topic) + '.' + sanitize(subscription); - } - - this.topicMetrics = function(group, topic) { return { - rate: url(compile('sumSeries({}.producer.*.meter.{}.m1_rate)', [prefix, topicPath(group, topic)])), - deliveryRate: url(compile('sumSeries({}.consumer.*.meter.{}.m1_rate)', [prefix, topicPath(group, topic)])), - published: url(compile('sumSeries({}.producer.*.published.{}.count)', [prefix, topicPath(group, topic)])), - latency: url(compile('{}.producer.*.ack-*.latency.{}.p99', [prefix, topicPath(group, topic)])), - messageSize: url(compile('{}.producer.*.message-size.{}.max', [prefix, topicPath(group, topic)])) - }; - }; - - this.subscriptionMetrics = function(group, topic, subscription) { return { - rate: url(compile('sumSeries({}.consumer.*.meter.{}.m1_rate)', [prefix, subscriptionPath(group, topic, subscription)])), - delivered: url(compile('sumSeries({}.consumer.*.delivered.{}.count)', [prefix, subscriptionPath(group, topic, subscription)])), - discarded: url(compile('sumSeries({}.consumer.*.discarded.{}.count)', [prefix, subscriptionPath(group, topic, subscription)])), - outputRate: url(compile('sumSeries({}.consumer.*.output-rate.{})', [prefix, subscriptionPath(group, topic, subscription)])), - latency: url(compile('{}.consumer.*.latency.{}.p99', [prefix, subscriptionPath(group, topic, subscription)])), - timeouts: url(compile('sumSeries({}.consumer.*.status.{}.errors.timeout.m1_rate)', [prefix, subscriptionPath(group, topic, subscription)])), - networkErrors: url(compile('sumSeries({}.consumer.*.status.{}.errors.other.m1_rate)', [prefix, subscriptionPath(group, topic, subscription)])), - '2xx': url(compile('sumSeries({}.consumer.*.status.{}.2xx.m1_rate)', [prefix, subscriptionPath(group, topic, subscription)])), - '4xx': url(compile('sumSeries({}.consumer.*.status.{}.4xx.m1_rate)', [prefix, subscriptionPath(group, topic, subscription)])), - '5xx': url(compile('sumSeries({}.consumer.*.status.{}.5xx.m1_rate)', [prefix, subscriptionPath(group, topic, subscription)])), - lag: url(compile('sumSeries({}.consumer-offset.*.{}_{}*.{}.*.lag)', [ - prefix, sanitize(group), sanitize(topic), consumerGroupId(group, topic, subscription) - ])) - }; - }; -} diff --git a/hermes-console/static/js/console/Modals.js b/hermes-console/static/js/console/Modals.js deleted file mode 100644 index fb5b0fda16..0000000000 --- a/hermes-console/static/js/console/Modals.js +++ /dev/null @@ -1,23 +0,0 @@ -var modals = angular.module('hermes.modals', []); - -modals.factory('ConfirmationModal', ['$uibModal', function ($modal) { - return { - open: function (actionDescription) { - return $modal.open({ - templateUrl: 'partials/modal/confirm.html', - controller: 'ConfirmationController', - size: 'lg', - resolve: { - actionDescription: function () { - return actionDescription; - } - } - }); - } - }; - }]); - -modals.controller('ConfirmationController', ['$scope', 'actionDescription', - function ($scope, actionDescription) { - $scope.description = actionDescription; - }]); diff --git a/hermes-console/static/js/console/Mode.js b/hermes-console/static/js/console/Mode.js deleted file mode 100644 index 20a254b63e..0000000000 --- a/hermes-console/static/js/console/Mode.js +++ /dev/null @@ -1,15 +0,0 @@ -var modeModule = angular.module('hermes.mode', []); - -modeModule.factory('Mode', ['DiscoveryService', '$http', '$rootScope', - function (discovery, $http, $rootScope) { - return { - reload: function () { - // intentionally use $http over $resource because of https://stackoverflow.com/questions/24876593/resource-query-return-split-strings-array-of-char-instead-of-a-string - $http.get(discovery.resolve('/mode')).then( - function (response) { - $rootScope.readOnly = (response.data === 'readOnly' || response.data === 'readOnlyAdmin'); - }); - } - }; - - }]); diff --git a/hermes-console/static/js/console/PasswordService.js b/hermes-console/static/js/console/PasswordService.js deleted file mode 100644 index ef5f0793f1..0000000000 --- a/hermes-console/static/js/console/PasswordService.js +++ /dev/null @@ -1,17 +0,0 @@ -var services = angular.module('hermes.services', []); - -services.service('PasswordService', ['$rootScope', function ($rootScope) { - - return { - getRoot: function () { - return $rootScope.rootPassword; - }, - setRoot: function (password) { - $rootScope.rootPassword = password; - }, - reset: function() { - $rootScope.rootPassword = ''; - } - }; - - }]); \ No newline at end of file diff --git a/hermes-console/static/js/console/Search.js b/hermes-console/static/js/console/Search.js deleted file mode 100644 index 3928fe69fc..0000000000 --- a/hermes-console/static/js/console/Search.js +++ /dev/null @@ -1,97 +0,0 @@ -var search = angular.module('hermes.search', []); - -search.controller('SearchController', ['$scope', '$stateParams', 'SearchRepository', - function($scope, $stateParams, searchRepository) { - - $scope.entity = $stateParams.entity || 'subscription'; - $scope.property = $stateParams.property || 'endpoint'; - $scope.operator = $stateParams.operator || 'like'; - $scope.pattern = $stateParams.pattern || ''; - - $scope.fetching = false; - $scope.state = { - notSearched: true, - noResults: false - }; - - $scope.search = function() { - $scope.fetching = true; - var query = createQuery($scope.property, $scope.operator, $scope.pattern); - - searchRepository.search($scope.entity, query).then(function (items) { - $scope.items = postProcess($scope.entity, items); - $scope.fetching = false; - $scope.state.notSearched = false; - $scope.state.noResults = !items || items.length === 0; - }); - }; - - function createQuery(property, operator, value) { - var query = {}; - query[property] = {}; - - var sanitizedOperator = operator || 'like'; - query[property][sanitizedOperator] = decorateQueryValue(value); - - return {query: query}; - } - - function decorateQueryValue(value) { - if (value === '' || value.length < 4) { - return value; - } - - if (value.startsWith('.*') || value.endsWith('.*')) { - return value; - } - - return '.*' + value + '.*'; - } - - function postProcess(entity, items) { - if (entity === 'topic') { - return _.map(items, function(item) { - var fullName = decomposeTopicName(item.name); - return { - name: item.name, - data: [{label: 'owner', value: item.owner.id}], - url: '#/groups/' + fullName.group + '/topics/' + item.name - }; - }); - } - else if (entity === 'subscription') { - return _.map(items, function(item) { - var fullName = decomposeTopicName(item.topicName); - return { - name: item.topicName + '.' + item.name, - data: [{label: 'endpoint', value: item.endpoint}, {label: 'owner', value: item.owner.id}, {label: 'status', value: item.state}], - url: '#/groups/' + fullName.group + '/topics/' + item.topicName + '/subscriptions/' + item.name - }; - }); - } - } - - function decomposeTopicName(topicName) { - return { - group: topicName.substring(0, topicName.lastIndexOf(".")), - topic: topicName.substring(topicName.lastIndexOf(".") + 1) - }; - } -}]); - -search.factory('SearchRepository', ['$resource', 'DiscoveryService', - function ($resource, discovery) { - var querySubscriptions = $resource(discovery.resolve('/query/subscriptions'), null, {query: {method: 'POST', isArray: true}}); - var queryTopics = $resource(discovery.resolve('/query/topics'), null, {query: {method: 'POST', isArray: true}}); - - return { - search: function (entity, query) { - if (entity === 'topic') { - return queryTopics.query(query).$promise; - } - else if (entity === 'subscription') { - return querySubscriptions.query(query).$promise; - } - } - }; - }]); diff --git a/hermes-console/static/js/console/Stats.js b/hermes-console/static/js/console/Stats.js deleted file mode 100644 index d7a5104467..0000000000 --- a/hermes-console/static/js/console/Stats.js +++ /dev/null @@ -1,51 +0,0 @@ -var stats = angular.module('hermes.stats', ['ngResource', 'hermes.search', 'hermes.topic.repository']); - -stats.controller('StatsController', ['$scope', 'SearchRepository', 'TopicRepository', function($scope, searchRepository, topicRepository) { - - $scope.topics = {}; - $scope.subscriptions = {}; - - topicRepository.list().$promise - .then(function(list) { - $scope.topics.total = list.length; - }) - .then(function() { - searchRepository.search('topic', {query: {ack: {eq: 'ALL'}}}).then(function(ackAllTopics) { - $scope.topics.ackAll = { - count: ackAllTopics.length, - ratio: (ackAllTopics.length / $scope.topics.total) * 100 - }; - }); - searchRepository.search('topic', {query: {trackingEnabled: {eq: true}}}).then(function(trackedTopics) { - $scope.topics.tracked = { - count: trackedTopics.length, - ratio: (trackedTopics.length / $scope.topics.total) * 100 - }; - }); - searchRepository.search('topic', {query: {contentType: {eq: 'AVRO'}}}).then(function(avroTopics) { - $scope.topics.avro = { - count: avroTopics.length, - ratio: (avroTopics.length / $scope.topics.total) * 100 - }; - }); - }); - - searchRepository.search('subscription', {query: {name: {like: '.*'}}}).then(function(list) { - $scope.subscriptions.total = list.length; - }) - .then(function() { - searchRepository.search('subscription', {query: {trackingEnabled: {eq: true}}}).then(function(trackedTopics) { - $scope.subscriptions.tracked = { - count: trackedTopics.length, - ratio: (trackedTopics.length / $scope.subscriptions.total) * 100 - }; - }); - searchRepository.search('subscription', {query: {contentType: {eq: 'AVRO'}}}).then(function(avroTopics) { - $scope.subscriptions.avro = { - count: avroTopics.length, - ratio: (avroTopics.length / $scope.subscriptions.total) * 100 - }; - }); - }); - -}]); diff --git a/hermes-console/static/js/console/Visibility.js b/hermes-console/static/js/console/Visibility.js deleted file mode 100644 index 5df903f7b1..0000000000 --- a/hermes-console/static/js/console/Visibility.js +++ /dev/null @@ -1,50 +0,0 @@ -var rolesModule = angular.module('hermes.visibility', []); - -rolesModule.factory('Visibility', ['DiscoveryService', '$resource', '$rootScope', '$stateParams', - function (discovery, $resource, $rootScope, $stateParams) { - - return { - update: function () { - - var topicName = $stateParams.topicName; - var subscriptionName = $stateParams.subscriptionName; - - var topicPath = topicName && '/topics/' + topicName || ''; - var subscriptionPath = topicPath && subscriptionName && '/subscriptions/' + subscriptionName || ''; - - var rolesResource = $resource(discovery.resolve('/roles' + topicPath + subscriptionPath)); - - function isAdmin(rolesList) { - return rolesList.includes('admin'); - } - - function hasSufficientPrivileges(rolesList) { - if (isAdmin(rolesList)) { - return true; - } - if (subscriptionName) { - return rolesList.includes('subscriptionOwner'); - } - if (topicName) { - return rolesList.includes('topicOwner'); - } - return rolesList.includes('any'); - } - - rolesResource.query().$promise.then( - function (commaSeparatedRoles) { - const rolesList = commaSeparatedRoles.toString().split(','); - $rootScope.admin = isAdmin(rolesList); - $rootScope.userHasSufficientPrivileges = hasSufficientPrivileges(rolesList); - $rootScope.userWithoutAccess = $rootScope.readOnly ? !$rootScope.admin : !$rootScope.userHasSufficientPrivileges; - }, - function() { - $rootScope.admin = false; - $rootScope.userHasSufficientPrivileges = false; - $rootScope.userWithoutAccess = true; - } - ); - } - }; - -}]); diff --git a/hermes-console/static/js/console/consistency/ConsistencyController.js b/hermes-console/static/js/console/consistency/ConsistencyController.js deleted file mode 100644 index 577b062c98..0000000000 --- a/hermes-console/static/js/console/consistency/ConsistencyController.js +++ /dev/null @@ -1,158 +0,0 @@ -var consistency = angular.module('hermes.consistency', [ - 'ui.bootstrap', - 'hermes.consistency.repository' -]); - -consistency.controller('ConsistencyController', ['$scope', '$state', 'toaster', 'CONSISTENCY_CONFIG', 'ConsistencyRepository', 'ConfirmationModal', - function ($scope, $state, toaster, config, consistencyRepository, confirmationModal) { - - const consistencyCheckingStates = { - READY: 'READY', - CHECKING_CONSISTENCY: 'CHECKING_CONSISTENCY' - }; - - $scope.consistencyChecking = { - state: consistencyCheckingStates.READY, - result: consistencyRepository.getLastConsistencyCheckingResult() - }; - - $scope.topicsConsistencyChecking = { - state: consistencyCheckingStates.READY, - result: consistencyRepository.getLastTopicsConsistencyCheckingResult() - }; - - $scope.$watch('consistencyChecking.result', function (result) { - consistencyRepository.setLastConsistencyCheckingResult(result); - }, true); - - $scope.$watch('topicsConsistencyChecking.result', function (result) { - consistencyRepository.setLastTopicsConsistencyCheckingResult(result); - }, true); - - $scope.checkConsistency = function() { - checkGroupConsistency(); - findTopicsNotPresentInHermes(); - }; - - $scope.removeTopic = function (topicName) { - confirmationModal.open({ - actionSubject: 'Are you sure you want to remove topic: ' + topicName, - action: "Remove" - }).result.then(function () { - consistencyRepository.removeTopic(topicName); - }) - .then(function () { - let newArray = $scope.topicsConsistencyChecking.result.filter( - function (element) { - return element !== topicName; - }); - setInconsistentTopics(newArray); - toaster.pop('success', 'Success', 'Topic has been removed'); - }) - .catch(function (e) { - showErrorPopup("cannot remove topic: " + e); - setInconsistentTopics(null); - }); - }; - - function checkGroupConsistency() { - setGroupsState(consistencyCheckingStates.CHECKING_CONSISTENCY); - setInconsistentGroups(null); - setInconsistentTopics(null); - $scope.processedGroupsPercent = 0; - $scope.processedGroups = 0; - - consistencyRepository.listGroupNames() - .then(function (groups) { - - return partition(groups, config.maxGroupBatchSize) - .reduce( - (promise, groupsToCheck) => promise - .then(inconsistentGroups => listInconsistentGroups(groupsToCheck) - .then(function (newInconsistentGroups) { - $scope.processedGroups += groupsToCheck.length; - $scope.processedGroupsPercent = Math.floor(($scope.processedGroups / groups.length) * 100); - return inconsistentGroups.concat(newInconsistentGroups); - }) - ), - Promise.resolve([]) - ) - .then(setInconsistentGroups); - }) - .catch(function (response) { - showErrorPopup('Cannot check consistency', response); - setInconsistentGroups(null); - }) - .finally(function () { - setGroupsState(consistencyCheckingStates.READY); - }); - } - - function findTopicsNotPresentInHermes() { - setTopicsState(consistencyCheckingStates.CHECKING_CONSISTENCY); - consistencyRepository.listInconsistentTopics() - .then(function (topics) { - setInconsistentTopics(topics); - }) - .finally(function () { - setTopicsState(consistencyCheckingStates.READY); - }); - } - - function showErrorPopup(message, response) { - toaster.pop( - 'error', - 'Error ' + response.status, - message + ' due to error: ' + response.status + ' ' + response.statusText - ); - } - - function setGroupsState(inconsistentGroupsState) { - $scope.consistencyChecking.state = inconsistentGroupsState; - } - - function setTopicsState(inconsistentGroupsState) { - $scope.topicsConsistencyChecking.state = inconsistentGroupsState; - } - - function setInconsistentGroups(inconsistentGroups) { - $scope.consistencyChecking.result = inconsistentGroups - } - - function setInconsistentTopics(inconsistentTopics) { - $scope.topicsConsistencyChecking.result =inconsistentTopics - } - - function partition(items, size) { - const result = _.groupBy(items, function (item, i) { - return Math.floor(i / size); - }); - return _.values(result); - } - - function listInconsistentGroups(groupsToCheck) { - return consistencyRepository.listInconsistentGroups(groupsToCheck); - } - }]); - -consistency.controller('GroupConsistencyController', ['$scope', '$stateParams', '$state', 'ConsistencyRepository', - function ($scope, $stateParams, $state, consistencyRepository) { - - $scope.groupName = $stateParams.groupName; - $scope.group = consistencyRepository.getGroup($scope.groupName); - - if (!$scope.group) { - $state.go('consistency'); - } - }]); - -consistency.controller('TopicConsistencyController', ['$scope', '$stateParams', '$state', 'ConsistencyRepository', - function ($scope, $stateParams, $state, consistencyRepository) { - - $scope.groupName = $stateParams.groupName; - $scope.topicName = $stateParams.topicName; - $scope.topic = consistencyRepository.getTopic($scope.groupName, $scope.topicName); - if (!$scope.topic) { - $state.go('groupConsistency',{groupName: $scope.groupName}); - } - }]); diff --git a/hermes-console/static/js/console/consistency/ConsistencyRepository.js b/hermes-console/static/js/console/consistency/ConsistencyRepository.js deleted file mode 100644 index b678c08f66..0000000000 --- a/hermes-console/static/js/console/consistency/ConsistencyRepository.js +++ /dev/null @@ -1,50 +0,0 @@ -var repository = angular.module('hermes.consistency.repository', []); - -repository.factory('ConsistencyRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - - const consistencyResource = $resource(discovery.resolve('/consistency/inconsistencies/groups')); - const groupsResource = $resource(discovery.resolve('/consistency/groups')); - const consistencyTopicsResource = $resource(discovery.resolve('/consistency/inconsistencies/topics')); - - var lastConsistencyCheckingResult = { - inconsistentGroups: null, - inconsistentTopics: null - }; - - function getGroup(groupName) { - return _.find(lastConsistencyCheckingResult.inconsistentGroups, {'name': groupName}); - } - - return { - listInconsistentGroups: function (groupNames) { - return consistencyResource.query({groupNames: groupNames}).$promise; - }, - listGroupNames: function () { - return groupsResource.query().$promise; - }, - setLastConsistencyCheckingResult: function (result) { - lastConsistencyCheckingResult.inconsistentGroups = result; - }, - getLastConsistencyCheckingResult: function () { - return lastConsistencyCheckingResult.inconsistentGroups; - }, - getLastTopicsConsistencyCheckingResult: function () { - return lastConsistencyCheckingResult.inconsistentTopics; - }, - setLastTopicsConsistencyCheckingResult: function (result) { - lastConsistencyCheckingResult.inconsistentTopics = result; - }, - listInconsistentTopics: function () { - return consistencyTopicsResource.query().$promise; - }, - removeTopic: function (topicName) { - return consistencyTopicsResource.remove({topicName: topicName}); - }, - getGroup: getGroup, - getTopic: function (groupName, topicName) { - const group = getGroup(groupName) || {}; - return _.find(group.inconsistentTopics, {'name': topicName}); - } - }; - }]); diff --git a/hermes-console/static/js/console/constraints/ConstraintsController.js b/hermes-console/static/js/console/constraints/ConstraintsController.js deleted file mode 100644 index 29d2ffd00f..0000000000 --- a/hermes-console/static/js/console/constraints/ConstraintsController.js +++ /dev/null @@ -1,172 +0,0 @@ -var constraints = angular.module('hermes.constraints', [ - 'ui.bootstrap', - 'hermes.constraints.repository' -]); - -constraints.controller('ConstraintsController', ['ConstraintsRepository', '$scope', '$stateParams', '$location', '$uibModal', - function (constraintsRepository, $scope, $stateParams, $location, $modal) { - - var isSubscription = function (constraints) { - return constraints.subscriptionName !== undefined; - }; - - $scope.edit = function (constraints) { - $modal.open({ - templateUrl: 'partials/modal/editConstraints.html', - controller: 'ConstraintsEditController', - size: 'lg', - resolve: { - constraintsType: function () { - return isSubscription(constraints) ? 'subscription' : 'topic'; - }, - constraintsName: function () { - return isSubscription(constraints) ? constraints.subscriptionName : constraints.topicName; - }, - consumersNumber: function () { - return constraints.consumersNumber; - } - } - }).result.then(function () { - loadConstraints(); - }); - }; - - var addConstraints = function (constraintsType) { - $modal.open({ - templateUrl: 'partials/modal/addConstraints.html', - controller: 'ConstraintsAddController', - size: 'lg', - resolve: { - constraintsType: function () { - return constraintsType; - } - } - }).result.then(function () { - loadConstraints(); - }); - }; - - $scope.addTopicConstraints = function () { - addConstraints('topic'); - }; - - $scope.addSubscriptionConstraints = function () { - addConstraints('subscription'); - }; - - var loadConstraints = function () { - constraintsRepository.getWorkloadConstraints() - .then(function (workloadConstraints) { - $scope.topicConstraints = workloadConstraints.topicConstraints; - $scope.subscriptionConstraints = workloadConstraints.subscriptionConstraints; - }); - }; - - loadConstraints(); - }]); - -constraints.controller('ConstraintsAddController', ['ConstraintsRepository', '$scope', '$uibModalInstance', 'constraintsType', - function (constraintsRepository, $scope, $modalInstance, constraintsType) { - $scope.constraintsType = constraintsType; - $scope.consumersNumber = 1; - $scope.constraintsName = { topicName: '', subscriptionName: '' }; - - $scope.save = function () { - if ($scope.constraintsType === 'topic') { - constraintsRepository.updateTopicConstraints({ - topicName: $scope.constraintsName.topicName, - constraints: { - consumersNumber: $scope.consumersNumber - } - }).then(function () { - $modalInstance.close(); - }); - } else { - constraintsRepository.updateSubscriptionConstraints({ - subscriptionName: $scope.constraintsName.topicName + '$' + $scope.constraintsName.subscriptionName, - constraints: { - consumersNumber: $scope.consumersNumber - } - }).then(function () { - $modalInstance.close(); - }); - } - }; - }]); - -constraints.controller('ConstraintsEditController', ['ConstraintsRepository', '$scope', '$uibModal', '$uibModalInstance', - 'constraintsType', 'constraintsName', 'consumersNumber', - function (constraintsRepository, $scope, $modal, $modalInstance, constraintsType, constraintsName, consumersNumber) { - $scope.constraintsType = constraintsType; - $scope.constraintsName = constraintsName; - $scope.consumersNumber = consumersNumber; - - $scope.save = function () { - if ($scope.constraintsType === 'topic') { - constraintsRepository.updateTopicConstraints({ - topicName: $scope.constraintsName, - constraints: { - consumersNumber: $scope.consumersNumber - } - }).then(closeModal); - } else { - constraintsRepository.updateSubscriptionConstraints({ - subscriptionName: $scope.constraintsName, - constraints: { - consumersNumber: $scope.consumersNumber - } - }).then(closeModal); - } - }; - - $scope.remove = function () { - $modal.open({ - templateUrl: 'partials/modal/removeConstraints.html', - controller: 'ConstraintsRemoveController', - size: 'lg', - resolve: { - constraintsName: function () { - return $scope.constraintsName; - }, - constraintsType: function () { - return $scope.constraintsType; - } - } - }).result.then(acceptHandler, dismissHandler); - }; - - var closeModal = function () { - $modalInstance.close(); - }; - - var acceptHandler = function (response) { - if (response === 'REMOVE') { - if ($scope.constraintsType === 'topic') { - constraintsRepository.removeTopicConstraints($scope.constraintsName) - .$promise - .then(closeModal); - } else { - var splittedName = $scope.constraintsName.split("$"); - var topicName = splittedName[0]; - var subscriptionName = splittedName[1]; - constraintsRepository.removeSubscriptionConstraints(topicName, subscriptionName) - .$promise - .then(closeModal); - } - } - }; - - var dismissHandler = function () { - $modalInstance.dismiss(); - }; - }]); - -constraints.controller('ConstraintsRemoveController', ['ConstraintsRepository', '$scope', '$uibModalInstance', - 'constraintsName', 'constraintsType', - function (constraintsRepository, $scope, $modalInstance, constraintsName, constraintsType) { - $scope.constraintsName = constraintsName; - $scope.constraintsType = constraintsType; - $scope.remove = function () { - $modalInstance.close('REMOVE'); - }; - }]); diff --git a/hermes-console/static/js/console/constraints/ConstraintsRepository.js b/hermes-console/static/js/console/constraints/ConstraintsRepository.js deleted file mode 100644 index 20b3085fe0..0000000000 --- a/hermes-console/static/js/console/constraints/ConstraintsRepository.js +++ /dev/null @@ -1,53 +0,0 @@ -var repository = angular.module('hermes.constraints.repository', []); - -repository.factory('ConstraintsRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - var workloadConstraints = $resource(discovery.resolve('/workload-constraints'), {}, { query: { method: 'GET' } }); - var updateTopicConstraintsEndpoint = $resource(discovery.resolve('/workload-constraints/topic'), null, { update: { method: 'PUT' } }); - var updateSubscriptionConstraintsEndpoint = $resource(discovery.resolve('/workload-constraints/subscription'), null, { update: { method: 'PUT' } }); - var removeTopicConstraintsEndpoint = $resource(discovery.resolve('/workload-constraints/topic/:topicName')); - var removeSubscriptionConstraintsEndpoint = $resource(discovery.resolve('/workload-constraints/subscription/:topicName/:subscriptionName')); - - return { - getWorkloadConstraints: function () { - return workloadConstraints.query({}).$promise - .then(function (response) { - var workloadConstraints = {}; - workloadConstraints.topicConstraints = []; - for (var topicName in response.topicConstraints) { - workloadConstraints.topicConstraints.push({ - topicName: topicName, - consumersNumber: response.topicConstraints[topicName].consumersNumber - }); - } - - workloadConstraints.subscriptionConstraints = []; - for (var subscriptionName in response.subscriptionConstraints) { - workloadConstraints.subscriptionConstraints.push({ - subscriptionName: subscriptionName, - consumersNumber: response.subscriptionConstraints[subscriptionName].consumersNumber - }); - } - return workloadConstraints; - }) - .catch(function () { - return { - topicConstraints: [], - subscriptionConstraints: [] - }; - }); - }, - updateTopicConstraints: function (topicConstraints) { - return updateTopicConstraintsEndpoint.update({}, topicConstraints).$promise; - }, - updateSubscriptionConstraints: function (subscriptionConstraints) { - return updateSubscriptionConstraintsEndpoint.update({}, subscriptionConstraints).$promise; - }, - removeTopicConstraints: function (topicName) { - return removeTopicConstraintsEndpoint.remove({ topicName: topicName }); - }, - removeSubscriptionConstraints: function (topicName, subscriptionName) { - return removeSubscriptionConstraintsEndpoint.remove({ topicName: topicName, subscriptionName: subscriptionName }); - } - }; - }]); diff --git a/hermes-console/static/js/console/diagnostics/DiagnosticsController.js b/hermes-console/static/js/console/diagnostics/DiagnosticsController.js deleted file mode 100644 index 8967d26de5..0000000000 --- a/hermes-console/static/js/console/diagnostics/DiagnosticsController.js +++ /dev/null @@ -1,52 +0,0 @@ -var diagnostics = angular.module('hermes.diagnostics', [ - 'ui.bootstrap', - 'hermes.diagnostics.repository' -]); - -diagnostics.controller('DiagnosticsController', ['DiagnosticsRepository', '$scope', '$stateParams', - function (diagnosticsRepository, $scope, $stateParams) { - $scope.groupName = $stateParams.groupName; - $scope.topicName = $stateParams.topicName; - $scope.subscriptionName = $stateParams.subscriptionName; - - diagnosticsRepository.getConsumerGroups($scope.topicName, $scope.subscriptionName) - .then(function (consumerGroups) { - $scope.consumerGroups = consumerGroups; - }) - .catch(function () { - $scope.consumerGroups = []; - }); - - $scope.isConsumerGroupStable = function (consumerGroup) { - return consumerGroup.state === 'Stable'; - }; - - $scope.isConsumerGroupDuringRebalance = function (consumerGroup) { - return consumerGroup.state === 'PreparingRebalance' || consumerGroup.state === 'CompletingRebalance'; - }; - - $scope.isConsumerGroupUnstable = function (consumerGroup) { - return !$scope.isConsumerGroupStable(consumerGroup) && !$scope.isConsumerGroupDuringRebalance(consumerGroup); - }; - - $scope.isJsonTopic = function (partition) { - return partition.contentType === 'JSON'; - }; - - $scope.isAvroTopic = function (partition) { - return partition.contentType === 'AVRO'; - }; - - $scope.consumerGroupExists = function () { - return !_.isEmpty($scope.consumerGroups); - }; - - $scope.copyTopicNameToClipboard = function (partition) { - var tempElement = document.createElement('textarea'); - tempElement.value = partition.topic; - document.body.appendChild(tempElement); - tempElement.select(); - document.execCommand('copy'); - document.body.removeChild(tempElement); - }; - }]); diff --git a/hermes-console/static/js/console/diagnostics/DiagnosticsRepository.js b/hermes-console/static/js/console/diagnostics/DiagnosticsRepository.js deleted file mode 100644 index d0cfd60219..0000000000 --- a/hermes-console/static/js/console/diagnostics/DiagnosticsRepository.js +++ /dev/null @@ -1,14 +0,0 @@ -var repository = angular.module('hermes.diagnostics.repository', []); - -repository.factory('DiagnosticsRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - - var consumerGroups = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/consumer-groups'), - {}, {query: {method: 'GET', isArray: true}}); - - return { - getConsumerGroups: function (topicName, subscriptionName) { - return consumerGroups.query({topicName: topicName, subscriptionName: subscriptionName}).$promise; - } - }; - }]); diff --git a/hermes-console/static/js/console/filters/FiltersDebugger.js b/hermes-console/static/js/console/filters/FiltersDebugger.js deleted file mode 100644 index fb4ecd0cd2..0000000000 --- a/hermes-console/static/js/console/filters/FiltersDebugger.js +++ /dev/null @@ -1,70 +0,0 @@ -angular.module('hermes.filters.debugger', ['hermes.filters.repository']) - .controller('FiltersDebuggerController', ['$scope', '$uibModalInstance', 'FiltersRepository', 'topicName', - 'messageFilters', 'topicContentType', - function ($scope, $modal, filtersRepository, topicName, messageFilters, topicContentType) { - - $scope.topicName = topicName; - $scope.messageFilters = messageFilters; - $scope.topicContentType = topicContentType; - - resetVerificationState(); - - $scope.verify = function () { - resetVerificationState(); - var filtersWithoutHeaderFilterType = _.reject($scope.messageFilters, function (f) { - return f.header; - }); - filtersRepository.verify($scope.topicName, filtersWithoutHeaderFilterType, $scope.message).$promise - .then(function (response) { - $scope.verificationStatus = response.status; - $scope.errorMessage = response.errorMessage; - }) - .catch(function (response) { - $scope.verificationStatus = 'ERROR'; - $scope.errorMessage = response.data.message; - }) - .finally(function () { - $scope.verificationInProgress = false; - }); - beautifyText(); - }; - - $scope.updateFilters = function () { - $modal.close({messageFilters: $scope.messageFilters}); - }; - - function resetVerificationState() { - $scope.verificationStatus = ''; - $scope.errorMessage = null; - $scope.verificationInProgress = false; - } - function beautifyText(){ - const obj_message = JSON.parse($scope.message); - if (obj_message !== undefined) { - $scope.message = JSON.stringify(obj_message, null, 4); - } - } - }]) - .factory('FiltersDebuggerModalFactory', ['$uibModal', function ($modal) { - return { - open: function (topicName, messageFilters, topicContentType) { - return $modal.open({ - templateUrl: 'partials/modal/debugFilters.html', - controller: 'FiltersDebuggerController', - size: 'lg', - backdrop: 'static', - resolve: { - topicName: function () { - return topicName; - }, - topicContentType: function () { - return topicContentType; - }, - messageFilters: function () { - return _.cloneDeep(messageFilters); - } - } - }).result; - } - }; - }]); diff --git a/hermes-console/static/js/console/filters/FiltersEditor.js b/hermes-console/static/js/console/filters/FiltersEditor.js deleted file mode 100644 index 72a27ecc88..0000000000 --- a/hermes-console/static/js/console/filters/FiltersEditor.js +++ /dev/null @@ -1,46 +0,0 @@ -angular.module('hermes.filters') - .controller('FiltersEditorController', ['$scope', '$uibModal', - 'FiltersDebuggerModalFactory', - function ($scope, $modal, filtersDebuggerModal) { - - $scope.addFilter = function () { - if (!$scope.filter.path || !$scope.filter.matcher) { - return; - } - - $scope.filters.push({ - type: $scope.topicContentType === 'JSON' ? 'jsonpath' : 'avropath', - path: $scope.filter.path, - matcher: $scope.filter.matcher, - matchingStrategy: $scope.filter.matchingStrategy - }); - $scope.filter = {}; - }; - - $scope.delFilter = function (filter) { - $scope.filters = _.reject($scope.filters, function (f) { - return f === filter; - }); - }; - - $scope.debugFilters = function () { - filtersDebuggerModal.open($scope.topicName, $scope.filters, $scope.topicContentType) - .then(function (result) { - $scope.filters = result.messageFilters; - }); - }; - }]) - .directive('filtersEditor', function () { - return { - controller: 'FiltersEditorController', - restrict: 'E', - templateUrl: 'partials/filter/filtersEditor.html', - scope: { - form: '=', - topicContentType: '=topicContentType', - filters: '=filters', - withDebugger: '=', - topicName: '=' - } - }; - }); diff --git a/hermes-console/static/js/console/filters/FiltersRepository.js b/hermes-console/static/js/console/filters/FiltersRepository.js deleted file mode 100644 index 4539e5be18..0000000000 --- a/hermes-console/static/js/console/filters/FiltersRepository.js +++ /dev/null @@ -1,11 +0,0 @@ -angular.module('hermes.filters.repository', []) - .factory('FiltersRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - var filtersResource = $resource(discovery.resolve('/filters/:topicName'), null, {verify: {method: 'POST'}}); - - return { - verify: function (topicName, filters, message) { - return filtersResource.verify({topicName: topicName}, {filters: filters, message: btoa(utf8.encode(message || ""))}); - } - }; - }]); diff --git a/hermes-console/static/js/console/filters/HttpHeaderFiltersEditor.js b/hermes-console/static/js/console/filters/HttpHeaderFiltersEditor.js deleted file mode 100644 index 160df33b9a..0000000000 --- a/hermes-console/static/js/console/filters/HttpHeaderFiltersEditor.js +++ /dev/null @@ -1,36 +0,0 @@ -angular.module('hermes.filters') - .controller('HttpHeaderFiltersEditorController', ['$scope', - function ($scope) { - - $scope.addFilter = function () { - if (!$scope.filter.header || !$scope.filter.matcher) { - return; - } - - $scope.filters.push({ - type: 'header', - header: $scope.filter.header, - matcher: $scope.filter.matcher, - matchingStrategy: $scope.filter.matchingStrategy - }); - $scope.filter = {}; - }; - - $scope.delFilter = function (filter) { - $scope.filters = _.reject($scope.filters, function (f) { - return f === filter; - }); - }; - - }]) - .directive('httpHeaderFiltersEditor', function () { - return { - controller: 'HttpHeaderFiltersEditorController', - restrict: 'E', - templateUrl: 'partials/filter/httpHeaderFiltersEditor.html', - scope: { - form: '=', - filters: '=filters' - } - }; - }); diff --git a/hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionController.js b/hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionController.js deleted file mode 100644 index 1ac31d7532..0000000000 --- a/hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionController.js +++ /dev/null @@ -1,35 +0,0 @@ -var offlineRetransmission = angular.module('hermes.offlineRetransmission', [ - 'hermes.offlineRetransmission.repository' -]); - -offlineRetransmission.controller('OfflineRetransmissionController', ['$scope', 'RetransmissionRepository', 'toaster', '$uibModalInstance', 'topic', 'topicConfig', - function ($scope, retransmissionRepository, toaster, $modal, topic, topicConfig) { - if (topic.offlineStorage.retentionTime.infinite) { - $scope.calendarDaysBack = 1000; - } else { - $scope.calendarDaysBack = topic.offlineStorage.retentionTime.duration; - } - $scope.retransmissionRequest = { - targetTopic: null, - startTimestamp: null, - endTimestamp: null - }; - $scope.retransmissionDescription = topicConfig.offlineRetransmissionDescription; - - $scope.createTask = function () { - const request = { - sourceTopic: topic.name, - targetTopic: $scope.retransmissionRequest.targetTopic, - startTimestamp: new Date($scope.retransmissionRequest.startTimestamp).toISOString(), - endTimestamp: new Date($scope.retransmissionRequest.endTimestamp).toISOString() - }; - retransmissionRepository.createTask(request) - .then(function () { - toaster.pop('success', 'Success', 'Retransmission has been scheduled.'); - $modal.close(); - } - ).catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }); - }; - }]); diff --git a/hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionRespository.js b/hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionRespository.js deleted file mode 100644 index 6b23908ce5..0000000000 --- a/hermes-console/static/js/console/offlineretransmission/OfflineRetransmissionRespository.js +++ /dev/null @@ -1,12 +0,0 @@ -var repository = angular.module('hermes.offlineRetransmission.repository', ['hermes.discovery']); - -repository.factory('RetransmissionRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - const retransmissionEndpoint = $resource(discovery.resolve('/offline-retransmission/tasks/'), null, {save: {method: 'POST'}}); - - return { - createTask: function (task) { - return retransmissionEndpoint.save({}, task).$promise; - } - }; - }]); diff --git a/hermes-console/static/js/console/owner/OwnerName.js b/hermes-console/static/js/console/owner/OwnerName.js deleted file mode 100644 index b4085417a5..0000000000 --- a/hermes-console/static/js/console/owner/OwnerName.js +++ /dev/null @@ -1,24 +0,0 @@ -var owner = angular.module('hermes.owner'); -owner.controller('OwnerNameController', ['$scope', 'OwnerRepository', function ($scope, ownerRepository) { - $scope.$watch('owner', function (newOwner) { - if (newOwner !== undefined && newOwner.id && newOwner.source) { - ownerRepository.getOwner(newOwner.source, newOwner.id).then(function (owner) { - $scope.name = owner.name; - $scope.url = owner.url ? owner.url : null; - }); - } else { - $scope.name = ""; - $scope.url = null; - } - }, true); -}]); -owner.directive('ownerName', function () { - return { - controller: 'OwnerNameController', - restrict: 'E', - templateUrl: 'partials/ownerName.html', - scope: { - owner: '=' - } - }; -}); \ No newline at end of file diff --git a/hermes-console/static/js/console/owner/OwnerRepository.js b/hermes-console/static/js/console/owner/OwnerRepository.js deleted file mode 100644 index 0527c79fe9..0000000000 --- a/hermes-console/static/js/console/owner/OwnerRepository.js +++ /dev/null @@ -1,21 +0,0 @@ -angular.module('hermes.owner', ['hermes.services']) - .service('OwnerRepository', ['$resource', 'DiscoveryService', - function ($resource, discovery) { - - var searchOwnersResource = $resource(discovery.resolve('/owners/sources/:source')); - var getOwnerResource = $resource(discovery.resolve('/owners/sources/:source/:id')); - var sourceNamesResource = $resource(discovery.resolve('/owners/sources')); - - this.getOwners = function (source, searchString) { - return searchOwnersResource.query({source: source, search: searchString}).$promise; - }; - - this.getOwner = function (source, id) { - return getOwnerResource.get({source: source, id: id}).$promise; - }; - - this.getSourceNames = function () { - return sourceNamesResource.query().$promise; - }; - - }]); \ No newline at end of file diff --git a/hermes-console/static/js/console/owner/OwnerSelector.js b/hermes-console/static/js/console/owner/OwnerSelector.js deleted file mode 100644 index d6b3b63b30..0000000000 --- a/hermes-console/static/js/console/owner/OwnerSelector.js +++ /dev/null @@ -1,76 +0,0 @@ -angular.module('hermes.owner') - .controller('OwnerSelectorController', ['$scope', 'OWNER_CONFIG', 'OwnerRepository', - function ($scope, config, ownerRepository) { - - ownerRepository.getSourceNames().then(function (sources) { - $scope.possibleSources = _.filter(sources, function (source) { - return !source.deprecated || $scope.sourceName === source.name; - }); - $scope.sourceSelectModel = _.find($scope.possibleSources, {'name': $scope.sourceName}) || _.first($scope.possibleSources); - if ($scope.ownerId) { - ownerRepository.getOwner($scope.sourceSelectModel.name, $scope.ownerId).then(function(owner) { - if ($scope.sourceSelectModel.autocomplete) { - $scope.ownerInputModel = {id: owner.id, name: owner.name}; - } else { - $scope.ownerInputModel = owner.id; - } - }); - } - }); - - $scope.onSourceChanged = function () { - $scope.ownerInputModel = ''; - }; - - $scope.$watch('sourceSelectModel', function (model) { - if (model === undefined) { - return; - } - - $scope.sourceName = model.name; - }); - - $scope.$watch('ownerInputModel', function(model) { - if (model === undefined) { - return; - } - - if (model instanceof Object && model.id !== undefined) { - $scope.ownerId = model.id; - } else { - $scope.ownerId = model; - } - }); - - $scope.owners = function(searchString) { - return ownerRepository.getOwners($scope.sourceSelectModel.name, searchString); - }; - - $scope.placeholder = function () { - if (!$scope.sourceName) { - return ''; - } - - var sourceConfig = _.find(config.sources, function (s) { - return s.name === $scope.sourceName; - }); - - if (sourceConfig && sourceConfig.placeholder) { - return sourceConfig.placeholder; - } - - return "who's the owner?"; - }; - }]) - .directive('ownerSelector', function () { - return { - controller: 'OwnerSelectorController', - restrict: 'E', - templateUrl: 'partials/ownerSelector.html', - scope: { - sourceName: '=source', - ownerId: '=owner', - form: '=' - } - }; - }); diff --git a/hermes-console/static/js/console/readiness/ReadinessController.js b/hermes-console/static/js/console/readiness/ReadinessController.js deleted file mode 100644 index 3d5bd8b0ec..0000000000 --- a/hermes-console/static/js/console/readiness/ReadinessController.js +++ /dev/null @@ -1,42 +0,0 @@ -var readiness = angular.module('hermes.readiness', ['hermes.readiness.repository']); - -readiness.controller('ReadinessController', ['$scope', 'ReadinessRepository', 'ConfirmationModal', - function ($scope, readinessRepository, confirmationModal) { - - $scope.error = null; - - function loadDatacenters() { - return readinessRepository.getDatacenters().then(function (data) { - $scope.datacenters = data; - }).catch(function (e) { - displayError(e); - }); - } - - $scope.openModal = function openModal(datacenterInfo) { - var action = datacenterInfo.status === 'READY' ? "Turn off" : "Turn on"; - confirmationModal.open({ - actionSubject: 'Are you sure you want to ' + action.toLowerCase() + ' the ' + datacenterInfo.datacenter + ' datacenter ?', - action: action - }).result.then(function () { - readinessRepository.setReadiness(datacenterInfo) - .then(function () { - clearError(); - return loadDatacenters(); - }) - .catch(function (e) { - displayError(e); - }); - }); - }; - - function displayError(msg) { - $scope.error = msg; - } - - function clearError() { - $scope.error = null; - } - - loadDatacenters(); - }]); \ No newline at end of file diff --git a/hermes-console/static/js/console/readiness/ReadinessRepository.js b/hermes-console/static/js/console/readiness/ReadinessRepository.js deleted file mode 100644 index ac25b6b3eb..0000000000 --- a/hermes-console/static/js/console/readiness/ReadinessRepository.js +++ /dev/null @@ -1,26 +0,0 @@ -var repository = angular.module('hermes.readiness.repository', ['hermes.discovery']); - -repository.factory('ReadinessRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - var queryEndpoint = $resource(discovery.resolve('/readiness/datacenters'), null, { - query: { - method: 'GET', - isArray: true - } - }); - var setReadinessEndpoint = $resource(discovery.resolve('/readiness/datacenters/:datacenter'), null, {save: {method: 'POST'}}); - - return { - getDatacenters: function () { - return queryEndpoint.query().$promise.then(function (data) { - return data; - }); - }, - setReadiness: function (datacenterInfo) { - return setReadinessEndpoint.save( - {datacenter: datacenterInfo.datacenter}, - {isReady: datacenterInfo.status === 'NOT_READY'} - ).$promise; - } - }; - }]); diff --git a/hermes-console/static/js/console/subscription/SubscriptionController.js b/hermes-console/static/js/console/subscription/SubscriptionController.js deleted file mode 100644 index 3fc2dc3237..0000000000 --- a/hermes-console/static/js/console/subscription/SubscriptionController.js +++ /dev/null @@ -1,387 +0,0 @@ -var subscriptions = angular.module('hermes.subscription', [ - 'ui.bootstrap', - 'hermes.modals', - 'hermes.subscription.repository', - 'hermes.subscription.health', - 'hermes.subscription.metrics', - 'hermes.subscription.factory', - 'hermes.topic.metrics', - 'hermes.filters.debugger', - 'hermes.owner' -]); - -subscriptions.controller('SubscriptionController', ['SubscriptionRepository', 'SubscriptionHealth', 'SubscriptionMetrics', - 'TopicRepository', 'TopicMetrics', '$scope', '$location', '$stateParams', '$uibModal', '$q', 'ConfirmationModal', - 'toaster', 'PasswordService', 'MessagePreviewModal', 'FiltersDebuggerModalFactory', 'SUBSCRIPTION_CONFIG', '$sce', - function (subscriptionRepository, subscriptionHealth, subscriptionMetrics, topicRepository, topicMetrics, - $scope, $location, $stateParams, $modal, $q, confirmationModal, toaster, passwordService, - messagePreviewModal, filtersDebuggerModal, config, $sce) { - var groupName = $scope.groupName = $stateParams.groupName; - var topicName = $scope.topicName = $stateParams.topicName; - var subscriptionName = $scope.subscriptionName = $stateParams.subscriptionName; - $scope.config = config; - $scope.costs = { - enabled: window.config.costs.enabled, - iframeUrl: $sce.trustAsResourceUrl(resolveCostsUrl(window.config.costs.subscriptionIframeUrl)), - detailsUrl: resolveCostsUrl(window.config.costs.subscriptionDetailsUrl) - }; - - function resolveCostsUrl(template) { - if (template) { - return template.replace('{{topic_name}}', topicName).replace('{{subscription_name}}', subscriptionName); - } - return template; - } - - function getUndelivered() { - subscriptionRepository.undelivered(topicName, subscriptionName).$promise - .then(function (undelivered) { - $scope.undelivered = undelivered; - }) - .catch(function () { - $scope.undelivered = []; - }); - } - - function getLastUndelivered() { - subscriptionRepository.lastUndelivered(topicName, subscriptionName).$promise - .then(function (lastUndelivered) { - $scope.lastUndelivered = lastUndelivered; - }) - .catch(function () { - $scope.lastUndelivered = null; - }); - } - - - subscriptionRepository.get(topicName, subscriptionName).$promise - .then(function(subscription) { - $scope.subscription = subscription; - if (subscription && subscription.createdAt && subscription.modifiedAt) { - var createdAt = new Date(0); - createdAt.setUTCSeconds(subscription.createdAt); - $scope.subscription.createdAt = createdAt; - - var modifiedAt = new Date(0); - modifiedAt.setUTCSeconds(subscription.modifiedAt); - $scope.subscription.modifiedAt = modifiedAt; - } - }); - - $scope.retransmissionLoading = false; - - $scope.showHeadersFilter = config.showHeadersFilter; - $scope.showFixedHeaders = config.showFixedHeaders; - - $scope.endpointAddressResolverMetadataConfig = config.endpointAddressResolverMetadata; - - $scope.metricsUrls = subscriptionMetrics.metricsUrls(groupName, topicName, subscriptionName); - - topicRepository.get(topicName).then(function(topic) { - $scope.topicContentType = topic.contentType; - $scope.daysBack = topic.retentionTime.duration; - }); - - subscriptionMetrics.metrics(topicName, subscriptionName).then(function(metrics) { - $scope.metrics = metrics; - }); - - subscriptionHealth.health(topicName, subscriptionName).then(function(health) { - $scope.health = health; - }); - - $scope.$watch('userHasSufficientPrivileges', function (currentValue) { - // user has privileges to see undelivered messages - if (currentValue === true) { - getUndelivered(); - getLastUndelivered(); - } - }); - - $scope.notSupportedEndpointAddressResolverMetadataEntries = function(metadataEntries) { - var filtered = {}; - _.each(metadataEntries, function(entry, key) { - if (key in config.endpointAddressResolverMetadata === false) { - filtered[key] = entry; - } - }); - return filtered; - }; - - $scope.edit = function (subscription) { - $modal.open({ - templateUrl: 'partials/modal/editSubscription.html', - controller: 'SubscriptionEditController', - size: 'lg', - backdrop: 'static', - resolve: { - subscription: function () { - return _.cloneDeep(subscription); - }, - topicName: function () { - return topicName; - }, - operation: function () { - return 'EDIT'; - }, - endpointAddressResolverMetadataConfig: function() { - return config.endpointAddressResolverMetadata; - }, - topicContentType: function () { - return $scope.topicContentType; - }, - showFixedHeaders: function () { - return $scope.showFixedHeaders; - }, - showHeadersFilter: function () { - return $scope.showHeadersFilter; - } - } - }).result.then(function(response){ - $scope.subscription = response.subscription; - }); - }; - - $scope.clone = function () { - $modal.open({ - templateUrl: 'partials/modal/editSubscription.html', - controller: 'SubscriptionEditController', - size: 'lg', - backdrop: 'static', - resolve: { - subscription: function () { - return $scope.subscription; - }, - topicName: function () { - return topicName; - }, - operation: function () { - return 'ADD'; - }, - endpointAddressResolverMetadataConfig: function() { - return config.endpointAddressResolverMetadata; - }, - topicContentType: function () { - return $scope.topicContentType; - }, - showFixedHeaders: function () { - return $scope.showFixedHeaders; - }, - showHeadersFilter: function () { - return $scope.showHeadersFilter; - } - } - }).result.then(function(response){ - var subscriptionName = response.subscription.name; - $location.path('/groups/' + groupName + '/topics/' + topicName + '/subscriptions/' + subscriptionName); - }); - }; - - $scope.remove = function () { - confirmationModal.open({ - action: 'Remove', - actionSubject: 'Subscription ' + $scope.subscription.name, - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function (result) { - $scope.disableRemoveButton = true; - passwordService.setRoot(result.password); - subscriptionRepository.remove(topicName, $scope.subscription.name).$promise - .then(function () { - toaster.pop('success', 'Success', 'Subscription has been removed'); - $location.path('/groups/' + groupName + '/topics/' + topicName).replace(); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - passwordService.reset(); - $scope.disableRemoveButton = false; - }); - }); - }; - - $scope.suspend = function () { - confirmationModal.open({ - action: 'Suspend', - actionSubject: 'Subscription '+ $scope.subscription.name, - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function (result) { - passwordService.setRoot(result.password); - subscriptionRepository.suspend(topicName, $scope.subscription.name).$promise - .then(function () { - $scope.subscription.state = 'SUSPENDED'; - toaster.pop('success', 'Success', 'Subscription has been suspended'); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - passwordService.reset(); - }); - }); - }; - - $scope.activate = function () { - confirmationModal.open({ - action: 'Activate', - actionSubject: 'Subcription ' + $scope.subscription.name, - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function (result) { - passwordService.setRoot(result.password); - subscriptionRepository.activate(topicName, $scope.subscription.name).$promise - .then(function () { - $scope.subscription.state = 'ACTIVE'; - toaster.pop('success', 'Success', 'Subscription has been activated'); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - passwordService.reset(); - }); - }); - }; - - $scope.previewMessage = function(cluster, partition, offset, messageId) { - messagePreviewModal.previewMessage(topicName, cluster, partition, offset, messageId); - }; - - $scope.showTrace = function() { - subscriptionRepository.eventTrace(topicName, subscriptionName, $scope.eventId).$promise - .then(function (trace) { - $scope.eventTrace = trace; - }) - .catch(function () { - $scope.eventTrace = []; - }); - }; - - $scope.retransmit = function() { - var retransmitFromDate = $('#retransmitFromDate').data().date; - - if (!retransmitFromDate) { - toaster.pop('info', 'Info', 'Select date & time from which retransmission should be started'); - return; - } - - confirmationModal.open({ - action: 'Retransmit', - actionSubject: 'Subscription ' + $scope.subscription.name, - additionalInfo: "This action re-send all messages starting from given date. Do you want to continue?", - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function (result) { - passwordService.setRoot(result.password); - $scope.retransmissionLoading = true; - subscriptionRepository.retransmit(topicName, $scope.subscription.name, retransmitFromDate).$promise - .then(function () { - toaster.pop('success', 'Success', 'Retransmission started'); - $scope.retransmissionLoading = false; - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - $scope.retransmissionLoading = false; - }); - }); - }; - $scope.skipMessages = function (){ - tommorowDate = new Date(); - tommorowDate.setDate(tommorowDate.getDate() + 1); - - confirmationModal.open({ - action: 'Skip messages', - actionSubject: 'Subscription ' + $scope.subscription.name, - additionalInfo: "This action will skip all undelivered messages for this subscription. Do you want to continue?", - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function (result) { - passwordService.setRoot(result.password); - $scope.skipMessagesLoading = true; - subscriptionRepository.retransmit(topicName, $scope.subscription.name, tommorowDate.toISOString()).$promise - .then(function () { - toaster.pop('success', 'Success', 'Skipped messages.'); - $scope.skipMessagesLoading = false; - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - $scope.skipMessagesLoading = false; - }); - }); - - }; - $scope.debugFilters = function () { - filtersDebuggerModal.open(topicName, $scope.subscription.filters, $scope.topicContentType) - .then(function (result) { - var subscription = _.cloneDeep($scope.subscription); - subscription.filters = result.messageFilters; - $scope.edit(subscription); - }); - }; - - $scope.trackingModeName = {"trackingOff": "No tracking", "discardedOnly": "Track message discarding only", "trackingAll": "Track everything"}; - - $scope.goToCostDetails = function () { - window.open($scope.costs.detailsUrl, '_blank'); - }; - }]); - -subscriptions.controller('SubscriptionEditController', ['SubscriptionRepository', '$scope', '$uibModalInstance', 'subscription', - 'topicName', 'PasswordService', 'toaster', 'operation', 'endpointAddressResolverMetadataConfig', 'topicContentType', - 'showFixedHeaders', 'showHeadersFilter', 'SUBSCRIPTION_CONFIG', - function (subscriptionRepository, $scope, $modal, subscription, topicName, passwordService, toaster, operation, - endpointAddressResolverMetadataConfig, topicContentType, showFixedHeaders, showHeadersFilter, subscriptionConfig) { - $scope.topicName = topicName; - $scope.topicContentType = topicContentType; - $scope.subscription = _.cloneDeep(subscription); - $scope.operation = operation; - $scope.endpointAddressResolverMetadataConfig = endpointAddressResolverMetadataConfig; - $scope.showFixedHeaders = showFixedHeaders; - $scope.showHeadersFilter = showHeadersFilter; - $scope.config = subscriptionConfig; - - $scope.save = function () { - $scope.disableSaveButton = true; - var promise; - var subscriptionToSave = _.cloneDeep($scope.subscription); - passwordService.setRoot($scope.rootPassword); - - if (operation === 'ADD') { - promise = subscriptionRepository.add(topicName, subscriptionToSave).$promise; - } else { - if(subscription.endpoint === subscriptionToSave.endpoint) { - delete subscriptionToSave.endpoint; - } - delete subscriptionToSave.oAuthPolicy; // prevent from resetting password - promise = subscriptionRepository.save(topicName, subscriptionToSave).$promise; - } - - promise - .then(function () { - toaster.pop('success', 'Success', 'Subscription has been saved'); - $modal.close({ subscription: $scope.subscription }); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - passwordService.reset(); - $scope.disableSaveButton = false; - }); - }; - - $scope.addHeader = function() { - if(!$scope.header.name || !$scope.header.value) { - return; - } - $scope.subscription.headers.push(angular.copy($scope.header)); - $scope.header = {}; - }; - - $scope.delHeader = function (index) { - $scope.subscription.headers.splice(index, 1); - }; - - }]); \ No newline at end of file diff --git a/hermes-console/static/js/console/subscription/SubscriptionFactory.js b/hermes-console/static/js/console/subscription/SubscriptionFactory.js deleted file mode 100644 index 0f3bea3699..0000000000 --- a/hermes-console/static/js/console/subscription/SubscriptionFactory.js +++ /dev/null @@ -1,39 +0,0 @@ -var subscriptions = angular.module('hermes.subscription.factory', []); - -subscriptions.factory('SubscriptionFactory', ['SUBSCRIPTION_CONFIG', function (subscriptionConfig) { - return { - create: function (topicName) { - var defaults = { - topicName: topicName, - name: '', - endpoint: '', - description: '', - owner: { - source: '', - id: '' - }, - deliveryType: 'SERIAL', - mode: 'ANYCAST', - filters: [], - headers: [], - contentType: 'JSON', - subscriptionPolicy: { - messageTtl: 3600, - messageBackoff: 1000, - sendingDelay: 0, - backoffMultiplier: 1.0, - backoffMaxIntervalInSec: 600, - requestTimeout: 1000 - }, - monitoringDetails: { - severity: 'NON_IMPORTANT', - reaction: '' - } - }; - - _.merge(defaults, subscriptionConfig.defaults); - return defaults; - } - }; - - }]); diff --git a/hermes-console/static/js/console/subscription/SubscriptionHealth.js b/hermes-console/static/js/console/subscription/SubscriptionHealth.js deleted file mode 100644 index 6730a29e27..0000000000 --- a/hermes-console/static/js/console/subscription/SubscriptionHealth.js +++ /dev/null @@ -1,29 +0,0 @@ -var health = angular.module('hermes.subscription.health', []); - -health.factory('SubscriptionHealth', ['DiscoveryService', '$resource', - function (discovery, $resource) { - var health = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/health')); - - return { - health: function (topicName, subscriptionName) { - return health.get({topicName: topicName, subscriptionName: subscriptionName}) - .$promise.then(function (health) { - var problemOccurs = function (problemCode) { - return _.some(health.problems, {code: problemCode}); - }; - - return { - status: health.status, - problems: { - lagging: problemOccurs('LAGGING'), - malfunctioning: problemOccurs('MALFUNCTIONING'), - receivingMalformedMessages: problemOccurs('RECEIVING_MALFORMED_MESSAGES'), - timingOut: problemOccurs('TIMING_OUT'), - unreachable: problemOccurs('UNREACHABLE') - } - }; - }); - } - }; - } -]); diff --git a/hermes-console/static/js/console/subscription/SubscriptionMetrics.js b/hermes-console/static/js/console/subscription/SubscriptionMetrics.js deleted file mode 100644 index 21932680ec..0000000000 --- a/hermes-console/static/js/console/subscription/SubscriptionMetrics.js +++ /dev/null @@ -1,31 +0,0 @@ -var metrics = angular.module('hermes.subscription.metrics', ['hermes.metrics']); - -metrics.factory('SubscriptionMetrics', ['DiscoveryService', '$resource', 'MetricStoreUrlResolver', - function(discovery, $resource, metricStoreUrlResolver) { - var metrics = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/metrics')); - - return { - metrics: function (topicName, subscriptionName) { - return metrics.get({topicName: topicName, subscriptionName: subscriptionName}) - .$promise.then(function(metrics) { - return { - rate: parseFloat(metrics.rate), - delivered: metrics.delivered, - discarded: metrics.discarded, - lag: metrics.lag, - responses: { - '2xx': parseFloat(metrics.codes2xx), - '4xx': parseFloat(metrics.codes4xx), - '5xx': parseFloat(metrics.codes5xx), - errors: parseFloat(metrics.otherErrors), - timeouts: parseFloat(metrics.timeouts) - }, - }; - }); - }, - metricsUrls: function(groupName, topicName, subscriptionName) { - var topicWithoutGroup = topicName.substring(groupName.length + 1, topicName.length); - return metricStoreUrlResolver.subscriptionMetrics(groupName, topicWithoutGroup, subscriptionName); - } - }; - }]); diff --git a/hermes-console/static/js/console/subscription/SubscriptionRepository.js b/hermes-console/static/js/console/subscription/SubscriptionRepository.js deleted file mode 100644 index e476edd41c..0000000000 --- a/hermes-console/static/js/console/subscription/SubscriptionRepository.js +++ /dev/null @@ -1,80 +0,0 @@ -var repository = angular.module('hermes.subscription.repository', []); - -repository.factory('SubscriptionRepository', ['DiscoveryService', '$resource', function (discovery, $resource) { - var repository = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName'), null, {update: {method: 'PUT'}}); - var state = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/state'), null, {update: {method: 'PUT'}}); - var lastUndelivered = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/undelivered/last')); - var undelivered = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/undelivered'), {}, { - query: { - method:'GET', - isArray:true, - transformResponse: function (data, header) { - var extended = angular.fromJson(data); - angular.forEach(extended, function(item, idx) { - extended[idx].isPreviewable = function() { - return typeof this.offset !== 'undefined' && typeof this.partition !== 'undefined'; - }; - }); - return extended; - } - } - }); - var metrics = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/metrics')); - var listing = $resource(discovery.resolve('/topics/:topicName/subscriptions/')); - var eventTrace = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/events/:eventId/trace')); - var retransmission = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/retransmission'), null, {save: {method: 'PUT'}}); - - return { - list: function (topicName) { - return listing.query({topicName: topicName}); - }, - get: function (topicName, subscriptionName) { - return repository.get({topicName: topicName, subscriptionName: subscriptionName}); - }, - add: function (topicName, subscription) { - return listing.save({topicName: topicName}, subscription); - }, - save: function (topicName, subscription) { - return repository.update({topicName: topicName, subscriptionName: subscription.name}, subscription); - }, - metrics: function (topicName, subscriptionName) { - return metrics.get({topicName: topicName, subscriptionName: subscriptionName}) - .$promise.then(function(metrics) { - return { - rate: parseFloat(metrics.rate), - delivered: metrics.delivered, - discarded: metrics.discarded, - lag: metrics.lag, - responses: { - '2xx': parseFloat(metrics.codes2xx), - '4xx': parseFloat(metrics.codes4xx), - '5xx': parseFloat(metrics.codes5xx), - errors: parseFloat(metrics.otherErrors), - timeouts: parseFloat(metrics.timeouts) - }, - }; - }); - }, - remove: function (topicName, subscriptionName) { - return repository.remove({topicName: topicName, subscriptionName: subscriptionName}); - }, - suspend: function (topicName, subscriptionName) { - return state.update({topicName: topicName, subscriptionName: subscriptionName}, '"SUSPENDED"'); - }, - activate: function (topicName, subscriptionName) { - return state.update({topicName: topicName, subscriptionName: subscriptionName}, '"ACTIVE"'); - }, - lastUndelivered: function(topicName, subscriptionName) { - return lastUndelivered.get({topicName: topicName, subscriptionName: subscriptionName}); - }, - undelivered: function(topicName, subscriptionName) { - return undelivered.query({topicName: topicName, subscriptionName: subscriptionName}); - }, - eventTrace: function(topicName, subscriptionName, eventId) { - return eventTrace.query({topicName: topicName, subscriptionName: subscriptionName, eventId: eventId}); - }, - retransmit: function (topicName, subscriptionName, fromDate) { - return retransmission.save({topicName: topicName, subscriptionName: subscriptionName}, {retransmissionDate: fromDate}); - } - }; -}]); diff --git a/hermes-console/static/js/console/subscriptionoffsets/SubscriptionOffsetsController.js b/hermes-console/static/js/console/subscriptionoffsets/SubscriptionOffsetsController.js deleted file mode 100644 index ce4bb8af52..0000000000 --- a/hermes-console/static/js/console/subscriptionoffsets/SubscriptionOffsetsController.js +++ /dev/null @@ -1,49 +0,0 @@ -var subscriptionOffsets = angular.module('hermes.subscriptionOffsets', ['hermes.subscriptionOffsets.service']); - -subscriptionOffsets.controller('SubscriptionOffsetsController', ['$scope', 'SubscriptionService', 'toaster', - function ($scope, subscriptionService, toaster) { - $scope.error = null; - $scope.subscriptionFullName = ''; - - $scope.moveOffsets = function () { - var subscription = parseSubscription($scope.subscriptionFullName); - subscriptionService.moveOffsets(subscription.topicName, subscription.subscriptionName) - .then(function () { - clearError(); - clearData(); - displaySuccess(); - }) - .catch(function (e) { - displayError(e); - }); - }; - - function displayError(msg) { - $scope.error = msg; - } - - function clearError() { - $scope.error = null; - } - - function displaySuccess() { - toaster.pop('success', 'Success', 'Offsets moved successfully'); - } - - function clearData() { - $scope.subscriptionFullName = ""; - } - - function parseSubscription(subscriptionFullName) { - var subscriptionChunks = subscriptionFullName.split('.'); - var subscriptionName = subscriptionChunks.pop(); - return { - topicName: subscriptionChunks.join('.'), - subscriptionName: subscriptionName, - }; - } - - function validate() { - - } - }]); \ No newline at end of file diff --git a/hermes-console/static/js/console/subscriptionoffsets/SubsriptionService.js b/hermes-console/static/js/console/subscriptionoffsets/SubsriptionService.js deleted file mode 100644 index c5d37b8baf..0000000000 --- a/hermes-console/static/js/console/subscriptionoffsets/SubsriptionService.js +++ /dev/null @@ -1,17 +0,0 @@ -var service = angular.module('hermes.subscriptionOffsets.service', ['hermes.discovery']); - -repository.factory('SubscriptionService', ['DiscoveryService', '$resource', - function (discovery, $resource) { - var subscriptionOffsetsEndpoint = $resource(discovery.resolve('/topics/:topicName/subscriptions/:subscriptionName/moveOffsetsToTheEnd'), null, { - query: { - method: 'POST', - isArray: true - } - }); - - return { - moveOffsets: function (topicName, subscriptionName) { - return subscriptionOffsetsEndpoint.save({topicName: topicName, subscriptionName: subscriptionName}, {}).$promise; - } - }; - }]); diff --git a/hermes-console/static/js/console/topic/AvroViewer.js b/hermes-console/static/js/console/topic/AvroViewer.js deleted file mode 100644 index 264e649b20..0000000000 --- a/hermes-console/static/js/console/topic/AvroViewer.js +++ /dev/null @@ -1,161 +0,0 @@ -var avroViewer = angular.module('hermes.topic.avroViewer', []); - -avroViewer.directive('avroViewer', function () { - return { - template: '', - restrict: 'E', - scope: { - schema: '=' - }, - controller: function ($scope) { - $scope.$watch('schema', (value) => value && updateFields()); - - function updateFields() { - const jsonSchema = JSON.parse($scope.schema); - $scope.rootField = { - name: jsonSchema.name, - doc: jsonSchema.doc, - type: { - type: "record", - fields: jsonSchema.fields.filter(field => field.name !== '__metadata') - } - }; - } - } - }; -}); - -avroViewer.controller('AvroNodeController', ['$scope', function ($scope) { - $scope.name = $scope.root ? $scope.field.name : `${$scope.field.name}:`; - $scope.doc = $scope.field.doc && formatDocumentation($scope.field.doc); - $scope.types = getTypes($scope.field.type); - $scope.isRecord = $scope.types.some(type => type.includes('record')); - $scope.isEnum = $scope.types.some(type => type.includes('enum')); - $scope.expandable = $scope.isRecord || $scope.isEnum; - $scope.expanded = true; - - const FOLD_EVENT = "fold"; - $scope.toggleExpansion = function () { - $scope.expanded = !$scope.expanded; - if ($scope.expanded === false) { - $scope.$broadcast(FOLD_EVENT); - } - }; - $scope.$on(FOLD_EVENT, () => $scope.expanded = false); - - if ($scope.isRecord) { - $scope.nestedType = findNestedType($scope.field.type); - } - - if ($scope.isEnum) { - $scope.enumSymbols = findEnumSymbols($scope.field.type); - } - - if ($scope.expandable) { - $scope.expandableTypesNumber = countExpandableTypes($scope.types); - } - - function getTypes(typeField) { - if (typeof typeField === 'string' || typeField instanceof String) { - return [typeField.toLowerCase()]; - } else if (Array.isArray(typeField)) { - let types = typeField.flatMap(type => getTypes(type)); - const nullable = types.includes('null'); - if (nullable) { - types = types.filter(type => type !== 'null').map(type => `${type}?`); - } - return types; - } else if (typeField.hasOwnProperty('type')) { - return [getComplexType(typeField)]; - } - return ['unknown']; - } - - function getComplexType(type) { - if (type.type === 'array') { - const arrayType = getTypes(type.items)[0]; - return `[]${arrayType}`; - } else if (type.type === 'map') { - const mapType = getTypes(type.values)[0]; - return `map[string]${mapType}`; - } else if (type.type === 'fixed') { - return `fixed(${type.size}B)`; - } - return type.type; - } - - function findNestedType(type) { - if (Array.isArray(type)) { - return type - .map(subType => findNestedType(subType)) - .find(subType => subType.hasOwnProperty('type')); - } - if (type.type === 'array') { - return type.items; - } - if (type.type === 'map') { - return type.values; - } - return type; - } - - function findEnumSymbols(type) { - if (Array.isArray(type)) { - return type.find(subType => subType.hasOwnProperty('symbols')).symbols; - } - if (type.type === 'enum') { - return type.symbols; - } - if (type.type === 'array') { - return type.items.symbols; - } - if (type.type === 'map') { - return type.values.symbols; - } - } - - function countExpandableTypes(types) { - return types - .filter(subType => subType.includes("record") || subType.includes("enum")) - .length; - } - - function formatDocumentation(documentation) { - let formattedDocumentation = documentation.trim(); - if(formattedDocumentation.length === 0) { - return null; - } - formattedDocumentation = formattedDocumentation[0].toUpperCase() + formattedDocumentation.slice(1); - if(formattedDocumentation.slice(-1).match(/[a-zA-Z0-9]/i)) { - formattedDocumentation += '.'; - } - return formattedDocumentation; - } -}]); - -avroViewer.directive('avroNode', ['$compile', function ($compile) { - return { - templateUrl: 'partials/avroViewerNode.html', - restrict: 'E', - scope: { - field: '=', - root: '=?' - }, - controller: 'AvroNodeController', - link: function postLink(scope, element) { - let template; - if (scope.isRecord) { - template = ``; - } else if (scope.isEnum) { - template = `
- - {{symbol}} - , - `; - } - const newElement = $compile(template)(scope); - element.find('[data-ref="children"]').html(newElement); - } - }; -}]); diff --git a/hermes-console/static/js/console/topic/TopicController.js b/hermes-console/static/js/console/topic/TopicController.js deleted file mode 100644 index 1c0bcd1907..0000000000 --- a/hermes-console/static/js/console/topic/TopicController.js +++ /dev/null @@ -1,358 +0,0 @@ -var topics = angular.module('hermes.topic', [ - 'ui.bootstrap', - 'toaster', - 'hermes.subscription', - 'hermes.topic.repository', - 'hermes.topic.metrics', - 'hermes.topic.factory', - 'hermes.topic.avroViewer', - 'hermes.services', - 'hermes.filters', - 'hermes.owner', - 'hermes.offlineRetransmission' -]); - -topics.controller('TopicController', ['TOPIC_CONFIG', 'TopicRepository', 'TopicMetrics', '$scope', '$location', '$stateParams', '$uibModal', '$sce', - 'ConfirmationModal', 'toaster', 'PasswordService', 'SubscriptionFactory', 'SUBSCRIPTION_CONFIG', 'OfflineClientsRepository', - function (topicConfig, topicRepository, topicMetrics, $scope, $location, $stateParams, $modal, $sce, confirmationModal, toaster, passwordService, - subscriptionFactory, subscriptionConfig, offlineClientsRepository) { - var groupName = $scope.groupName = $stateParams.groupName; - var topicName = $scope.topicName = $stateParams.topicName; - - $scope.subscriptionsFetching = true; - $scope.showMessageSchema = false; - $scope.showRawMessageSchema = false; - $scope.config = topicConfig; - $scope.showFixedHeaders = subscriptionConfig.showFixedHeaders; - $scope.showHeadersFilter = subscriptionConfig.showHeadersFilter; - $scope.offlineRetransmissionEnabled = topicConfig.offlineRetransmissionEnabled; - $scope.iframeSource = ""; - $scope.costs = { - enabled: window.config.costs.enabled, - iframeUrl: $sce.trustAsResourceUrl(resolveCostsUrl(window.config.costs.topicIframeUrl)), - detailsUrl: resolveCostsUrl(window.config.costs.topicDetailsUrl) - }; - - function resolveCostsUrl(template) { - if (template) { - return template.replace('{{topic_name}}', topicName); - } - return template; - } - - topicRepository.get(topicName).then(function(topicWithSchema) { - $scope.topic = topicWithSchema; - $scope.topic.shortName = $scope.topic.name.substring($scope.topic.name.lastIndexOf('.') + 1); - $scope.topic.labelValues = $scope.topic.labels.map(function(label) { return label.value; }); - if (topicWithSchema && topicWithSchema.createdAt && topicWithSchema.modifiedAt) { - var createdAt = new Date(0); - createdAt.setUTCSeconds(topicWithSchema.createdAt); - $scope.topic.createdAt = createdAt; - - var modifiedAt = new Date(0); - modifiedAt.setUTCSeconds(topicWithSchema.modifiedAt); - $scope.topic.modifiedAt = modifiedAt; - } - try { - $scope.messageSchema = topicWithSchema.schema ? JSON.stringify(JSON.parse(topicWithSchema.schema), null, 2) : null; - } catch (e) { - console.error('Could not parse topic schema: ', e); - $scope.messageSchema = '[schema parsing failure]'; - } - $scope.offlineRetransmissionEnabled = $scope.offlineRetransmissionEnabled && $scope.topic.offlineStorage.enabled; - }); - - $scope.metricsUrls = topicMetrics.metricsUrls(groupName, topicName); - topicMetrics.metrics(topicName).then(function(metrics) { $scope.metrics = metrics; }); - - function loadSubscriptions() { - topicRepository.listSubscriptionsWithDetails(topicName).then(function (subscriptions) { - $scope.subscriptions = subscriptions; - $scope.subscriptionsFetching = false; - }); - } - - function loadBlacklistStatus() { - topicRepository.blacklistStatus(topicName).then(function (blacklistStatus) { - $scope.isBlacklisted = blacklistStatus.blacklisted; - }); - } - - function loadIframeSource() { - offlineClientsRepository.getIframeSource(topicName).then(function (iframeSource) { - $scope.iframeSource = iframeSource.source; - }); - } - - loadSubscriptions(); - loadBlacklistStatus(); - if ($scope.config.offlineClientsEnabled) { - loadIframeSource(); - } - - topicRepository.preview(topicName).then(function(preview) { - $scope.preview = preview; - }); - - $scope.trustSrc = function(src) { - return $sce.trustAsResourceUrl(src); - }; - - $scope.edit = function () { - $modal.open({ - templateUrl: 'partials/modal/editTopic.html', - controller: 'TopicEditController', - size: 'lg', - backdrop: 'static', - resolve: { - operation: function () { - return 'EDIT'; - }, - topic: function () { - return $scope.topic; - }, - messageSchema: function() { - return $scope.messageSchema; - }, - groupName: function () { - return groupName; - } - } - }).result.then(function (result) { - $scope.topic = result.topic; - $scope.offlineRetransmissionEnabled = $scope.offlineRetransmissionEnabled && $scope.topic.offlineStorage.enabled; - $scope.messageSchema = result.messageSchema; - }); - }; - - $scope.clone = function() { - $modal.open({ - templateUrl: 'partials/modal/editTopic.html', - controller: 'TopicEditController', - size: 'lg', - backdrop: 'static', - resolve: { - operation: function () { - return 'ADD'; - }, - groupName: function () { - return groupName; - }, - topic: function () { - return $scope.topic; - }, - messageSchema: function() { - return $scope.messageSchema; - } - } - }).result.then(function(response){ - var topicName = response.topic.name; - $location.path('/groups/' + groupName + '/topics/' + topicName); - }); - }; - - $scope.copyClientsToClipboard = function () { - topicRepository.getTopicUsers(topicName) - .then(function (topicUsersFromRepository) { - var topicUsers = topicUsersFromRepository.join(", "); - var tempElement = document.createElement('textarea'); - tempElement.value = topicUsers; - document.body.appendChild(tempElement); - tempElement.select(); - document.execCommand('copy'); - document.body.removeChild(tempElement); - toaster.pop('info', 'Info', 'All topic users has been copied to clipboard'); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }); - }; - - $scope.remove = function () { - confirmationModal.open({ - action: 'Remove', - actionSubject: 'Topic ' + $scope.topic.name, - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function (result) { - $scope.disableRemoveButton = true; - passwordService.setRoot(result.password); - var topic = $scope.topic; - topicRepository.remove($scope.topic) - .then(function () { - toaster.pop('success', 'Success', 'Topic has been removed'); - if (!topicConfig.removeSchema && topic.contentType == 'AVRO') { - toaster.pop('warning', 'Topic schema was not removed', - 'Note that schema was not removed for this topic. Schema is persisted in an external registry ' + - 'and its removal is disabled in this environment. Before creating topic with the same name make sure ' + - 'it\'s manually removed by the schema registry operator.'); - } - $location.path('/groups/' + groupName).replace(); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - passwordService.reset(); - $scope.disableRemoveButton = false; - }); - }); - }; - - $scope.blacklist = function () { - confirmationModal.open({ - action: 'Blacklist', - actionSubject: 'Topic ' + $scope.topic.name, - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function () { - topicRepository.blacklist(topicName).$promise - .then(function () { - toaster.pop('success', 'Success', 'Topic has been blacklisted'); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - loadBlacklistStatus(); - }); - }); - }; - - $scope.unblacklist = function () { - confirmationModal.open({ - action: 'Unblacklist', - actionSubject: 'Topic ' + $scope.topic.name, - passwordLabel: 'Root password', - passwordHint: 'root password' - }).result.then(function () { - topicRepository.unblacklist(topicName).$promise - .then(function () { - toaster.pop('success', 'Success', 'Topic has been unblacklisted'); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - }) - .finally(function () { - loadBlacklistStatus(); - }); - }); - }; - - $scope.addSubscription = function () { - $modal.open({ - templateUrl: 'partials/modal/editSubscription.html', - controller: 'SubscriptionEditController', - size: 'lg', - backdrop: 'static', - resolve: { - operation: function () { - return 'ADD'; - }, - topicName: function () { - return topicName; - }, - subscription: function () { - return subscriptionFactory.create(topicName); - }, - endpointAddressResolverMetadataConfig: function() { - return subscriptionConfig.endpointAddressResolverMetadata; - }, - topicContentType: function () { - return $scope.topic.contentType; - }, - showFixedHeaders: function () { - return $scope.showFixedHeaders; - }, - showHeadersFilter: function () { - return $scope.showHeadersFilter; - } - } - }).result.then(function () { - loadSubscriptions(); - }); - }; - - $scope.copyToClipboard = function () { - var tempElement = document.createElement('textarea'); - tempElement.value = $scope.messageSchema; - document.body.appendChild(tempElement); - tempElement.select(); - document.execCommand('copy'); - document.body.removeChild(tempElement); - - toaster.pop('info', 'Info', 'Message schema has been copied to clipboard'); - }; - - $scope.retransmitOffline = function () { - $modal.open({ - templateUrl: 'partials/modal/offlineRetransmission.html', - controller: 'OfflineRetransmissionController', - size: 'md', - backdrop: 'static', - resolve: { - topic: function () { - return $scope.topic; - }, - topicConfig: function () { - return $scope.config; - } - } - }); - }; - - $scope.goToCostDetails = function () { - window.open($scope.costs.detailsUrl, '_blank'); - }; - }]); - -topics.controller('TopicEditController', ['TOPIC_CONFIG', 'TopicRepository', '$scope', '$uibModalInstance', 'PasswordService', - 'toaster', 'topic', 'messageSchema', 'groupName', 'operation', - function (topicConfig, topicRepository, $scope, $modal, passwordService, toaster, topic, messageSchema, groupName, operation) { - $scope.config = topicConfig; - $scope.topic = _(topic).clone(); - $scope.messageSchema = messageSchema; - $scope.groupName = groupName; - $scope.operation = operation; - - $scope.save = function () { - $scope.disableSaveButton = true; - var promise; - var originalTopicName = $scope.topic.name; - passwordService.setRoot($scope.rootPassword); - - var topic = _.cloneDeep($scope.topic); - delete topic.shortName; - - topic.labels = ($scope.topic.labelValues || []).map(function(labelValue) { return {value: labelValue};} ); - if (operation === 'ADD') { - topic.name = groupName + '.' + $scope.topic.shortName; - $scope.topic.name = topic.name; - promise = topicRepository.add(topic, $scope.messageSchema); - } - else { - promise = topicRepository.save(topic, $scope.messageSchema); - } - - promise - .then(function () { - toaster.pop('success', 'Success', 'Topic has been saved'); - $modal.close({topic: $scope.topic, messageSchema: $scope.messageSchema}); - }) - .catch(function (response) { - toaster.pop('error', 'Error ' + response.status, response.data.message); - $scope.topic.name = originalTopicName; - }) - .finally(function () { - passwordService.reset(); - $scope.disableSaveButton = false; - }); - }; - $scope.beautifyText = function (){ - const obj_message = JSON.parse($scope.messageSchema); - if (obj_message !== undefined) { - $scope.messageSchema = JSON.stringify(obj_message, null, 4); - } - }; - - }]); diff --git a/hermes-console/static/js/console/topic/TopicFactory.js b/hermes-console/static/js/console/topic/TopicFactory.js deleted file mode 100644 index 6d98f3b4ec..0000000000 --- a/hermes-console/static/js/console/topic/TopicFactory.js +++ /dev/null @@ -1,31 +0,0 @@ -var topics = angular.module('hermes.topic.factory', []); - -topics.factory('TopicFactory', ['TOPIC_CONFIG', - function(topicConfig) { - return { - create: function() { - var defaults = { - retentionTime: { - duration: 1, - retentionUnit: 'DAYS' - }, - contentType: 'JSON', - ack: 'LEADER', - maxMessageSize: 10240, - owner: { - id: '', - source: '' - }, - offlineStorage: { - enabled: false, - retentionTime: { - duration: 60 - } - } - }; - _.merge(defaults, topicConfig.defaults); - - return defaults; - } - }; - }]); diff --git a/hermes-console/static/js/console/topic/TopicMetrics.js b/hermes-console/static/js/console/topic/TopicMetrics.js deleted file mode 100644 index 8bd8440a0f..0000000000 --- a/hermes-console/static/js/console/topic/TopicMetrics.js +++ /dev/null @@ -1,23 +0,0 @@ -var metrics = angular.module('hermes.topic.metrics', ['hermes.metrics']); - -metrics.factory('TopicMetrics', ['DiscoveryService', '$resource', 'MetricStoreUrlResolver', - function(discovery, $resource, metricStoreUrlResolver) { - var metrics = $resource(discovery.resolve('/topics/:topicName/metrics')); - - return { - metrics: function (topicName) { - return metrics.get({topicName: topicName}) - .$promise.then(function(metrics) { - return { - published: metrics.published, - rate: parseFloat(metrics.rate), - deliveryRate: parseFloat(metrics.deliveryRate) - }; - }); - }, - metricsUrls: function(groupName, topicName) { - var topicWithoutGroup = topicName.substring(groupName.length + 1, topicName.length); - return metricStoreUrlResolver.topicMetrics(groupName, topicWithoutGroup); - } - }; - }]); diff --git a/hermes-console/static/js/console/topic/TopicRepository.js b/hermes-console/static/js/console/topic/TopicRepository.js deleted file mode 100644 index 6975ab387c..0000000000 --- a/hermes-console/static/js/console/topic/TopicRepository.js +++ /dev/null @@ -1,67 +0,0 @@ -var repository = angular.module('hermes.topic.repository', ['hermes.subscription.repository']); - -repository.factory('TopicRepository', ['DiscoveryService', '$resource', '$location', 'SubscriptionRepository', - function (discovery, $resource, $location, subscriptionRepository) { - - var repository = $resource(discovery.resolve('/topics/:name'), null, {update: {method: 'PUT'}}); - var previewRepository = $resource(discovery.resolve('/topics/:name/preview'), null); - var blacklistRepository = $resource(discovery.resolve('/blacklist/topics/:name'), null, - { blacklist: { method: 'POST', url: discovery.resolve('/blacklist/topics') } }); - var listing = $resource(discovery.resolve('/topics')); - var topicUsersRepository = $resource(discovery.resolve('/topics/:name/clients')); - - return { - list: listing.query, - get: function (name) { - return repository.get({name: name}).$promise; - }, - add: function (topic, schema) { - return repository.save({}, angular.extend({}, topic, {"schema": schema})).$promise; - }, - remove: function (topic) { - return repository.delete({name: topic.name}).$promise; - }, - save: function (topic, schema) { - return repository.update({name: topic.name}, angular.extend({}, topic, {"schema": schema})).$promise; - }, - listSubscriptions: function (topicName) { - return subscriptionRepository.list(topicName); - }, - listSubscriptionsWithDetails: function (topicName) { - return subscriptionRepository.list(topicName).$promise.then(function (subscriptions) { - return _.map(subscriptions, function (subscription) { - return { - name: subscription, - details: subscriptionRepository.get(topicName, subscription) - }; - }); - }); - }, - preview: function (topicName) { - return previewRepository.query({name: topicName}).$promise; - }, - blacklistStatus: function (topicName) { - return blacklistRepository.get({name: topicName}).$promise; - }, - blacklist: function (topicName) { - return blacklistRepository.blacklist([topicName]); - }, - unblacklist: function (topicName) { - return blacklistRepository.delete({name: topicName}); - }, - getTopicUsers: function (topicName) { - return topicUsersRepository.query({name: topicName}).$promise; - } - }; - }]); - -repository.factory('OfflineClientsRepository', ['DiscoveryService', '$resource', - function (discovery, $resource) { - var repository = $resource(discovery.resolve('/topics/:topic/offline-clients-source')); - - return { - getIframeSource: function (topic) { - return repository.get({topic: topic}).$promise; - } - }; - }]); diff --git a/hermes-console/static/js/directives/bindHtml.js b/hermes-console/static/js/directives/bindHtml.js deleted file mode 100644 index 7b5f0942a1..0000000000 --- a/hermes-console/static/js/directives/bindHtml.js +++ /dev/null @@ -1,15 +0,0 @@ -var directives = angular.module('hermes.directives', []); - -directives.directive('bindHtml', ['$compile', function ($compile) { - return { - restrict: 'A', - link: function (scope, element, attrs) { - scope.$watch(function () { - return scope.$eval(attrs.bindHtml); - }, function (value) { - element.html(value); - $compile(element.contents())(scope); - }); - } - }; -}]); diff --git a/hermes-console/static/js/directives/calendar.js b/hermes-console/static/js/directives/calendar.js deleted file mode 100644 index 4c9508f51e..0000000000 --- a/hermes-console/static/js/directives/calendar.js +++ /dev/null @@ -1,30 +0,0 @@ -var directives = angular.module('hermes.directives', []); - -directives.directive('calendar', [function () { - return { - link: function (scope, elem, attrs) { - scope.$watch(function () { - return scope.$eval(attrs.daysBack); - }, function (value) { - if (!value) { - return; - } - - const startDate = moment().subtract(parseInt(value), "days"); - const endDate = moment().add(1, "second"); - - let idSelector = `#${attrs.id}`; - $(idSelector).datetimepicker({ - format: "YYYY-MM-DDTHH:mm:ssZ", - ignoreReadonly: true, - useCurrent: true, - minDate: startDate, - maxDate: endDate, - sideBySide: true, - }).on('dp.change', function () { - $(idSelector).change(); - }); - }); - } - }; -}]); \ No newline at end of file diff --git a/hermes-console/static/js/directives/emptyToNull.js b/hermes-console/static/js/directives/emptyToNull.js deleted file mode 100644 index 64bc579380..0000000000 --- a/hermes-console/static/js/directives/emptyToNull.js +++ /dev/null @@ -1,16 +0,0 @@ -var directives = angular.module('hermes.directives', []); - -directives.directive('emptyToNull', function () { - return { - restrict: 'A', - require: 'ngModel', - link: function (scope, elem, attrs, ctrl) { - ctrl.$parsers.push(function(viewValue) { - if(viewValue === "") { - return null; - } - return viewValue; - }); - } - }; -}); diff --git a/hermes-console/static/js/directives/endpoint.js b/hermes-console/static/js/directives/endpoint.js deleted file mode 100644 index b9d491018a..0000000000 --- a/hermes-console/static/js/directives/endpoint.js +++ /dev/null @@ -1,36 +0,0 @@ -var directives = angular.module('hermes.directives', []); - -directives.directive('endpoint', function () { - return { - require: 'ngModel', - link: function (scope, element, attrs, ctrl) { - ctrl.$parsers.unshift(function (value) { - ctrl.$setValidity('endpoint',hasValidProtocol(value)); - return value; - }); - - var hasValidProtocol = function (value) { - var supportedProtocols = [ - "http", - "service", - "jms", - "googlepubsub", - "hdfs", - "zmq", - "ems" - ]; - - for (var i = 0; i < supportedProtocols.length; i++) { - if (beginsWith(supportedProtocols[i] + "://", value)) return true; - } - - return false; - }; - - var beginsWith = function (needle, haystack) { - return (haystack.substr(0, needle.length) === needle); - }; - } - }; - -}); \ No newline at end of file diff --git a/hermes-console/static/js/directives/hoverDelay.js b/hermes-console/static/js/directives/hoverDelay.js deleted file mode 100644 index 6f976387c9..0000000000 --- a/hermes-console/static/js/directives/hoverDelay.js +++ /dev/null @@ -1,30 +0,0 @@ -var directives = angular.module('hermes.directives', []); - -directives.directive('hoverDelay', ['$timeout', function($timeout) { - - return { - link: function(scope, element, attrs) { - var counting = false; - var alreadyRun = false; - var delay = parseInt(attrs.hoverDelayTime, 10) || 1000; - var repeat = attrs.hoverDelayRepeat || false; - - element.on('mouseover', function() { - if(!counting && (repeat || !alreadyRun)) { - counting = true; - $timeout(function() { - if(counting) { - scope.$eval(attrs.hoverDelay); - alreadyRun = true; - } - counting = false; - }, delay); - } - }); - - element.on('mouseleave', function() { - counting = false; - }); - } - }; -}]); diff --git a/hermes-console/static/partials/authPane.html b/hermes-console/static/partials/authPane.html deleted file mode 100644 index 8bdd41710f..0000000000 --- a/hermes-console/static/partials/authPane.html +++ /dev/null @@ -1,4 +0,0 @@ -
- - -
diff --git a/hermes-console/static/partials/avroViewerNode.html b/hermes-console/static/partials/avroViewerNode.html deleted file mode 100644 index 3d83fcf535..0000000000 --- a/hermes-console/static/partials/avroViewerNode.html +++ /dev/null @@ -1,12 +0,0 @@ -
-
-
- - {{name}} - {{types.join('|')}} - (only one type is shown) - {{doc}} - Default: {{field.default}} -
-
-
diff --git a/hermes-console/static/partials/consistency.html b/hermes-console/static/partials/consistency.html deleted file mode 100644 index e84296a788..0000000000 --- a/hermes-console/static/partials/consistency.html +++ /dev/null @@ -1,86 +0,0 @@ -
- - - -
- -
- -

Consistency

- -
-
-

- Click 'Check consistency' to detect inconsistencies between clusters. -

-
- Groups consistency check is in progress. - -
-
- Topics consistency check is in progress. - -
-
-
- - - {{processedGroupsPercent}}% - - -
-
-

All groups are consistent.

-
-
- -
-
-
-
-
- - -
-
-

Inconsistent groups

-
- - {{$index + 1}}            - {{group.name}} -
- -
-
-
-
- -
-
-
-
-
- - -
-
-

Topics existing on kafka cluster but not present in hermes

-
-
- {{$index + 1}}            - {{topic}} -
- -
-
-
-
-
diff --git a/hermes-console/static/partials/constraints.html b/hermes-console/static/partials/constraints.html deleted file mode 100644 index 0973fce681..0000000000 --- a/hermes-console/static/partials/constraints.html +++ /dev/null @@ -1,64 +0,0 @@ -
- - - -

Constraints:

- - - - - -
diff --git a/hermes-console/static/partials/diagnostics.html b/hermes-console/static/partials/diagnostics.html deleted file mode 100644 index aced79aa9d..0000000000 --- a/hermes-console/static/partials/diagnostics.html +++ /dev/null @@ -1,62 +0,0 @@ -
- - - -

- Group Id: {{consumerGroups[0].groupId}} -

- -
-
-
-
-

{{consumerGroup.clusterName}} ({{consumerGroup.state}})

-
- - - - - - - - - - - - - - - - - - - - -
TopicPartitionCurrent OffsetEnd OffsetLag
{{consumer.host}}
- - {{partition.partition}}{{partition.currentOffset}}{{partition.logEndOffset}}{{partition.lag}}
-
-
-
- -
diff --git a/hermes-console/static/partials/filter/filtersEditor.html b/hermes-console/static/partials/filter/filtersEditor.html deleted file mode 100644 index 7d6e22473f..0000000000 --- a/hermes-console/static/partials/filter/filtersEditor.html +++ /dev/null @@ -1,60 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - -
PathMatcherMatching strategy - -
- - - - - - - -
- - - - - - - -
-
diff --git a/hermes-console/static/partials/filter/httpHeaderFiltersEditor.html b/hermes-console/static/partials/filter/httpHeaderFiltersEditor.html deleted file mode 100644 index 62f910b5eb..0000000000 --- a/hermes-console/static/partials/filter/httpHeaderFiltersEditor.html +++ /dev/null @@ -1,41 +0,0 @@ -
- - - - - - - - - - - - - - - - -
Header nameMatcher
- - - - - -
- - - - -
- -
-
-
diff --git a/hermes-console/static/partials/group.html b/hermes-console/static/partials/group.html deleted file mode 100644 index bd3ac1fc32..0000000000 --- a/hermes-console/static/partials/group.html +++ /dev/null @@ -1,41 +0,0 @@ -
- - - -
- - -
- -

Group: {{group.groupName}}

- - -
diff --git a/hermes-console/static/partials/groupConsistency.html b/hermes-console/static/partials/groupConsistency.html deleted file mode 100644 index 7b9d6cb97e..0000000000 --- a/hermes-console/static/partials/groupConsistency.html +++ /dev/null @@ -1,67 +0,0 @@ -
- - - -

Group: {{groupName}}

- -
-
-
-

Inconsistent metadata

-
-
- - - - - - - - - - - -
- {{metadata.datacenter}} -
-
{{metadata.content | prettyJson}}
-
-
-
-
- -
-
-

Group metadata are consistent.

-
-
- - - -
-
-

All topics are consistent.

-
-
- -
diff --git a/hermes-console/static/partials/groups.html b/hermes-console/static/partials/groups.html deleted file mode 100644 index 624ac94256..0000000000 --- a/hermes-console/static/partials/groups.html +++ /dev/null @@ -1,42 +0,0 @@ -
- - - -

Groups

- -
In order to create a new group, please contact Hermes administrator
- -
-
-
- -
-
- - -
diff --git a/hermes-console/static/partials/home.html b/hermes-console/static/partials/home.html deleted file mode 100644 index 7d5a34fa2f..0000000000 --- a/hermes-console/static/partials/home.html +++ /dev/null @@ -1,62 +0,0 @@ -
- -
- Hermes -
- - - - - - - -
-
-
- - -
-
-
- -
diff --git a/hermes-console/static/partials/modal/addConstraints.html b/hermes-console/static/partials/modal/addConstraints.html deleted file mode 100644 index 505f8dc502..0000000000 --- a/hermes-console/static/partials/modal/addConstraints.html +++ /dev/null @@ -1,40 +0,0 @@ -
- - - -
diff --git a/hermes-console/static/partials/modal/confirm.html b/hermes-console/static/partials/modal/confirm.html deleted file mode 100644 index dfa4abf7a5..0000000000 --- a/hermes-console/static/partials/modal/confirm.html +++ /dev/null @@ -1,22 +0,0 @@ -
- - - - -
diff --git a/hermes-console/static/partials/modal/debugFilters.html b/hermes-console/static/partials/modal/debugFilters.html deleted file mode 100644 index 4e572981dc..0000000000 --- a/hermes-console/static/partials/modal/debugFilters.html +++ /dev/null @@ -1,37 +0,0 @@ -
- - -
diff --git a/hermes-console/static/partials/modal/editConstraints.html b/hermes-console/static/partials/modal/editConstraints.html deleted file mode 100644 index f881a2ad56..0000000000 --- a/hermes-console/static/partials/modal/editConstraints.html +++ /dev/null @@ -1,30 +0,0 @@ -
- - - -
diff --git a/hermes-console/static/partials/modal/editGroup.html b/hermes-console/static/partials/modal/editGroup.html deleted file mode 100644 index ed4bae3c0c..0000000000 --- a/hermes-console/static/partials/modal/editGroup.html +++ /dev/null @@ -1,29 +0,0 @@ -
- - - -
diff --git a/hermes-console/static/partials/modal/editSubscription.html b/hermes-console/static/partials/modal/editSubscription.html deleted file mode 100644 index d9636890ec..0000000000 --- a/hermes-console/static/partials/modal/editSubscription.html +++ /dev/null @@ -1,360 +0,0 @@ -
- - - -
diff --git a/hermes-console/static/partials/modal/editTopic.html b/hermes-console/static/partials/modal/editTopic.html deleted file mode 100644 index 9dba941c49..0000000000 --- a/hermes-console/static/partials/modal/editTopic.html +++ /dev/null @@ -1,204 +0,0 @@ -
- - - -
diff --git a/hermes-console/static/partials/modal/messagePreview.html b/hermes-console/static/partials/modal/messagePreview.html deleted file mode 100644 index 8fdd5a46a8..0000000000 --- a/hermes-console/static/partials/modal/messagePreview.html +++ /dev/null @@ -1,27 +0,0 @@ -
- - -
\ No newline at end of file diff --git a/hermes-console/static/partials/modal/offlineRetransmission.html b/hermes-console/static/partials/modal/offlineRetransmission.html deleted file mode 100644 index 102cf91f24..0000000000 --- a/hermes-console/static/partials/modal/offlineRetransmission.html +++ /dev/null @@ -1,44 +0,0 @@ -
- - - -
diff --git a/hermes-console/static/partials/modal/removeConstraints.html b/hermes-console/static/partials/modal/removeConstraints.html deleted file mode 100644 index 02a9af2bdf..0000000000 --- a/hermes-console/static/partials/modal/removeConstraints.html +++ /dev/null @@ -1,11 +0,0 @@ -
- - -
diff --git a/hermes-console/static/partials/ownerName.html b/hermes-console/static/partials/ownerName.html deleted file mode 100644 index 13bae1b364..0000000000 --- a/hermes-console/static/partials/ownerName.html +++ /dev/null @@ -1,2 +0,0 @@ -{{name}} -{{name}} diff --git a/hermes-console/static/partials/ownerSelector.html b/hermes-console/static/partials/ownerSelector.html deleted file mode 100644 index 535c8c7e29..0000000000 --- a/hermes-console/static/partials/ownerSelector.html +++ /dev/null @@ -1,19 +0,0 @@ -
- -
- -
-
-
- - -
- - -
-
diff --git a/hermes-console/static/partials/readiness.html b/hermes-console/static/partials/readiness.html deleted file mode 100644 index edadb59d8d..0000000000 --- a/hermes-console/static/partials/readiness.html +++ /dev/null @@ -1,37 +0,0 @@ -
- - - - - -

Datacenter readiness

-
-
-
- - - - - - - - - - - - -
#Datacenter
{{$index + 1}}{{item.datacenter}} - - -
Cannot obtain readiness status
-
-
-
-
-
diff --git a/hermes-console/static/partials/search.html b/hermes-console/static/partials/search.html deleted file mode 100644 index ab6d576558..0000000000 --- a/hermes-console/static/partials/search.html +++ /dev/null @@ -1,78 +0,0 @@ -
- - -
-

Search

-
- -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- -
-
-
- - -
- - -
- No items found -
- -
- Search for something -
- -
-

-
-
-
diff --git a/hermes-console/static/partials/stats.html b/hermes-console/static/partials/stats.html deleted file mode 100644 index a48d5e6b03..0000000000 --- a/hermes-console/static/partials/stats.html +++ /dev/null @@ -1,49 +0,0 @@ -
- -

Statistics

- -

Topics

-
-
-

Total

-

{{topics.total}}

-
- -
-

Ack ALL

-

{{topics.ackAll.count}} ({{topics.ackAll.ratio | number:1}}%)

-
- -
-

Tracking enabled

-

{{topics.tracked.count}} ({{topics.tracked.ratio | number:1}}%)

-
- -
-

Avro

-

{{topics.avro.count}} ({{topics.avro.ratio | number:1}}%)

-
-
- -

Subscriptions

-
- -
-
-

Total

-

{{subscriptions.total}}

-
-
- -
-

Tracking enabled

-

{{subscriptions.tracked.count}} ({{subscriptions.tracked.ratio | number:1}}%)

-
- -
-

Avro

-

{{subscriptions.avro.count}} ({{subscriptions.avro.ratio | number:1}}%)

-
-
- -
diff --git a/hermes-console/static/partials/subscription.html b/hermes-console/static/partials/subscription.html deleted file mode 100644 index 0f20569782..0000000000 --- a/hermes-console/static/partials/subscription.html +++ /dev/null @@ -1,450 +0,0 @@ -
- - - -
- - - - - - -
- -

Subscription: {{subscription.name}}

-

Endpoint: {{subscription.endpoint}}

-

Owner ({{subscription.owner.source}}):

-

{{subscription.description}}

- -
-
-

- {{subscription.state}} -

-
-
- -
-
-
-
-

Subscription health problems

-
-
-

- Subscription lag is growing. Examine output rate and service response codes, looks like it is - not consuming at full speed. -

-

- Consuming service returns a lot of 5xx codes. Looks like it might be malfunctioning or doesn't know - how to handle messages. Take a look at "Last undelivered message" for more information. -

-

- Consuming service returns a lot of 4xx codes. Maybe you are receiving some malformed messages? - If this is normal behavior, switch Retry on 4xx status flag to false. This way Hermes will - not try to resend malformed messages, reducing traffic. -

-

- Consuming service times out a lot. Hermes times out after 1 second, if you are not able to process - message during this time, connection is reset and delivery fails. -

-

- Unable to connect to consuming service instances. It is either network issue or your service instance - is down. -

-
-
-
-
- -
-
-
-
-

Subscription metrics

-
-
-

Delivery rate: {{metrics.rate | number:2}}

-

- Subscriber latency - -

-

Delivered: {{metrics.delivered}}

-

Discarded: {{metrics.discarded}}

-

- Lag: {{metrics.lag}} - -

-

- Output rate - -

-
-
-
-
-

Service response metrics

-
- -
- -
-
-
- -
-

Costs

-
-
- -
-
- -
-
-

Manage subscription messages

-
-
    -
  • -

    - Retransmit messages from the past: - -

    - -
    - -
    - - - - -
    - - - - -
    - -
  • -
  • -

    - Skip all messages: - -

    -
    -
    - - - - -
    -
    -
  • -
-
-
-
-
-
-

Properties

-
-
-

- Content type: {{subscription.contentType}} -

-

- Delivery type: {{subscription.deliveryType}} - -

-

- Mode: {{subscription.mode}} - -

-

- Rate limit: {{subscription.subscriptionPolicy.rate}} - -

-

- Batch size: {{subscription.subscriptionPolicy.batchSize}} messages - -

-

- Batch time window: {{subscription.subscriptionPolicy.batchTime}} milliseconds - -

-

- Batch volume: {{subscription.subscriptionPolicy.batchVolume}} bytes - -

-

- Request timeout: {{subscription.subscriptionPolicy.requestTimeout}} milliseconds - -

-

- Sending delay: {{subscription.subscriptionPolicy.sendingDelay}} milliseconds - -

-

- Message TTL: {{subscription.subscriptionPolicy.messageTtl}} seconds - -

-

- Request timeout: {{subscription.subscriptionPolicy.requestTimeout}} milliseconds - -

-

Message delivery tracking: {{ trackingModeName[subscription.trackingMode] }}

-
-

- Retry on 4xx status: {{subscription.subscriptionPolicy.retryClientErrors}} - -

-

- Retry backoff: {{subscription.subscriptionPolicy.messageBackoff}} milliseconds - -

-

- Retry backoff multiplier: {{subscription.subscriptionPolicy.backoffMultiplier}} - -

-

- Retry backoff max interval: {{subscription.subscriptionPolicy.backoffMaxIntervalInSec}} seconds - -

-
-

- Monitoring severity: {{subscription.monitoringDetails.severity}} - -

-

- Monitoring reaction: {{subscription.monitoringDetails.reaction}} - -

-

- Deliver using http/2: {{subscription.http2Enabled}} - -

-

- Attach subscription identity headers: {{subscription.subscriptionIdentityHeadersEnabled}} - -

-

- Automatically remove: {{subscription.autoDeleteWithTopicEnabled}} - -

-

- {{entry.title}}: - {{entry.options[subscription.endpointAddressResolverMetadata[key]] || subscription.endpointAddressResolverMetadata[key]}} - -

-

- {{key}}: {{value}} -

- -
-

- Creation date: {{subscription.createdAt | date:'yyyy-MM-dd HH:mm:ss'}} -

-

- Modification date: {{subscription.modifiedAt | date:'yyyy-MM-dd HH:mm:ss'}} -

-
-
-
-
- -
-
-
-
-

Last undelivered message

-
-
-

Time: {{lastUndelivered.timestamp | date:'yyyy-MM-dd HH:mm:ss'}}

-

Reason: {{lastUndelivered.reason}}

-

- Message: -

{{lastUndelivered.message}}
-                        
-

-
-
-
- -
-
-
-

Show event trace

-
-
-
-
- - -
-
- -
 
- - - - - - - - - - - - -
PhaseTimeStatus
{{trace.subscription ? 'SENDING' : 'RECEIVING'}}{{trace.timestamp | date:'yyyy-MM-dd HH:mm:ss.sss'}}{{trace.status}} {{trace.status != 'SUCCESS' ? trace.reason : ''}}
-

No matches found - is the id correct? Remember we keep traces for 14 days.

-
-
-
-
- -
- -
- -
- -
-
- -
-

Subscription message filters

-
- - - - - - - - - - - - - - - - - - - - -
#TypePath or Header namePathMatcherMatching strategy
{{$index + 1}}{{filter.type}}{{filter.path}}{{filter.header}}{{filter.matcher}}{{filter.matchingStrategy}}
- -
-
-
- -
-
-
-
-

Fixed HTTP headers

-
- - - - - - - - - - - - -
#NameValue
{{$index + 1}}{{header.name}}{{header.value}}
-
-
-
- -
- -
- -
- -
-

Last 100 undelivered messages

-
- - - - - - - - - - - - - - - - - - - - -
#MessageIdStatusReasonTimestamp
{{$index + 1}}{{msglog.messageId}}{{msglog.status}}{{msglog.reason}}{{msglog.timestamp | date:'yyyy-MM-dd HH:mm:ss'}}
- -
-
-
- -
-
-
-
-

Diagnostics

-
-
-

- - Consumer groups - - -

-
-
-
-
- -
diff --git a/hermes-console/static/partials/subscriptionOffsets.html b/hermes-console/static/partials/subscriptionOffsets.html deleted file mode 100644 index a2a96af6ac..0000000000 --- a/hermes-console/static/partials/subscriptionOffsets.html +++ /dev/null @@ -1,30 +0,0 @@ -
- - - - - -

Move subscription offsets to the end

-
-
-
-
-
-
- -
-
-
- -
-
-
-
-
diff --git a/hermes-console/static/partials/topic.html b/hermes-console/static/partials/topic.html deleted file mode 100644 index 0145b0242c..0000000000 --- a/hermes-console/static/partials/topic.html +++ /dev/null @@ -1,222 +0,0 @@ -
- - - -
- - - - - - - - -
- -

Topic: {{topic.name}}

- -
-
- Secured -
-
- Unauthenticated access allowed -
-
- Read only mode -
-
- -

Owner ({{topic.owner.source}}):

- -

{{topic.description}}

- - - -
-
-
-
-

Metrics

-
-
-

Rate: {{metrics.rate | number:2}}

-

Delivery rate: {{metrics.deliveryRate | number:2}}

-

Published: {{metrics.published}}

-

Latency

-

Message size

-
-
-
-
-
- -
-

Costs

-
-
- -
-
-
-
-
-
-

Properties

-
-
-

- Content type: {{topic.contentType}} -

-

- Labels: - - {{label}} - -

-

- Acknowlegment: {{topic.ack == 'ALL' ? 'all brokers' : 'leader only'}} - -

-

- Retention time: {{topic.retentionTime.duration}} {{topic.retentionTime.retentionUnit | toLowercase}} - -

-

Tracking enabled: {{topic.trackingEnabled}}

-

Max message size: {{topic.maxMessageSize | readableSize}}

-

SchemaId Serialization Enabled: {{topic.schemaIdAwareSerializationEnabled}}

- -
-
-

- Authorisation enabled: {{topic.auth.enabled}} -

-

- Authorised publishers: {{topic.auth.publishers.join(', ')}} - -

-

- Allow unauthenticated access: {{topic.auth.unauthenticatedAccessEnabled}} - -

-
-
-

- Restrict subscribing: {{topic.subscribingRestricted}} - -

- -
-

- Store offline: {{topic.offlineStorage.enabled}} - -

-

- Offline retention: {{topic.offlineStorage.retentionTime.infinite ? 'infinite' : topic.offlineStorage.retentionTime.duration + ' days'}} - -

- -
-

- Creation date: {{topic.createdAt | date:'yyyy-MM-dd HH:mm:ss'}} -

-

- Modification date: {{topic.modifiedAt | date:'yyyy-MM-dd HH:mm:ss'}} -

- -
-
-
-
- -
-
-
- - -
- -
-
-

Message schema

-
-
-
{{ messageSchema }}
- -
-
-
-
- -
-
-
- -
-

Topic messages preview

-
-
-
-
{{message.content}}
- (preview was too large and has been truncated) -
-
-
-
-
- -
-
-
-
- - - -
-

- Subscriptions -

-
- - {{$index + 1}}            - {{subscription.name}} -
- {{subscription.details.state}} - -
-
-
- -
-

-
-
- -
-
-
-

- Offline clients -

-
-
- -
-
-
- -
diff --git a/hermes-console/static/partials/topicConsistency.html b/hermes-console/static/partials/topicConsistency.html deleted file mode 100644 index 1a88e5ba23..0000000000 --- a/hermes-console/static/partials/topicConsistency.html +++ /dev/null @@ -1,82 +0,0 @@ -
- - - -

Topic: {{topic.name}}

- -
-
-
-

Inconsistent metadata

-
-
- - - - - - - - - - - -
{{metadata.datacenter}}
-
{{metadata.content | prettyJson}}
-
-
-
-
- -
-
-

Topic metadata are consistent.

-
-
- -
-
-
-

Inconsistent subscriptions

-
-
- - {{subscription.name}} -
- -
-
-
- - - - - - - - - - - -
- {{metadata.datacenter}} -
-
{{metadata.content | prettyJson}}
-
-
-
-
-
- -
-
-

All subscriptions are consistent.

-
-
- -
\ No newline at end of file diff --git a/hermes-console/test/fixture/config.js b/hermes-console/test/fixture/config.js deleted file mode 100644 index 3750f0e00b..0000000000 --- a/hermes-console/test/fixture/config.js +++ /dev/null @@ -1,31 +0,0 @@ -var config = { - "console": { - "title": "hermes console" - }, - "dashboard": { - "metrics": "", - "docs": "http://hermes-pubsub.rtfd.org" - }, - "hermes": { - "url": "http://hermes.allegro.tech" - }, - "metrics": { - "type": "graphite", - "graphite": { - "url": "localhost:8091", - "prefix": "hermes" - } - }, - "auth": { - "oauth": { - "enabled": false, - "url": "localhost:8092/auth", - "clientId": "hermes", - "scope": "hermes" - }, - "headers": { - "enabled": false, - "adminHeader": "Hermes-Admin-Password" - } - } -}; diff --git a/hermes-console/test/unit/AvroNodeControllerTest.js b/hermes-console/test/unit/AvroNodeControllerTest.js deleted file mode 100644 index b296e4c644..0000000000 --- a/hermes-console/test/unit/AvroNodeControllerTest.js +++ /dev/null @@ -1,429 +0,0 @@ -describe("AvroNodeController", function () { - - var $controller; - var $scope; - - beforeEach(module('hermes.topic.avroViewer')); - - beforeEach(inject(function ($rootScope, _$controller_) { - $controller = _$controller_; - $scope = $rootScope; - })); - - [ - { - name: "primitive", - avroType: "string", - expectedOutputType: ["string"] - }, - { - name: "nullable primitive", - avroType: ["string", "null"], - expectedOutputType: ["string?"] - }, - { - name: "record", - avroType: {"type": "record"}, - expectedOutputType: ["record"] - }, - { - name: "nullable record", - avroType: [{"type": "record"}, "null"], - expectedOutputType: ["record?"] - }, - { - name: "primitive map", - avroType: {"type": "map", "values": "int"}, - expectedOutputType: ["map[string]int"] - }, - { - name: "record map", - avroType: {"type": "map", "values": {"type": "record"}}, - expectedOutputType: ["map[string]record"] - }, - { - name: "nullable map", - avroType: [{"type": "map", "values": "int"}, "null"], - expectedOutputType: ["map[string]int?"] - }, - { - name: "enum", - avroType: {"type": "enum"}, - expectedOutputType: ["enum"] - }, - { - name: "primitive union", - avroType: ["int", "string"], - expectedOutputType: ["int", "string"] - }, - { - name: "nullable primitive union", - avroType: ["int", "string", "null"], - expectedOutputType: ["int?", "string?"] - }, - { - name: "primitive array", - avroType: {"type": "array", "items": "int"}, - expectedOutputType: ["[]int"] - }, - { - name: "record array", - avroType: {"type": "array", "items": {"type": "record"}}, - expectedOutputType: ["[]record"] - }, - { - name: "fixed", - avroType: {"type": "fixed", "size": 16}, - expectedOutputType: ["fixed(16B)"] - } - ].forEach(testCase => - it(`should read ${testCase.name} type correctly`, function () { - // given - $scope.field = { - type: testCase.avroType - }; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.types).toEqual(testCase.expectedOutputType); - }) - ); - - it("should find record's children", function () { - // given - $scope.field = { - "name": "test", - "type": { - "type": "record", - "name": "testType", - "fields": [ - { - "name": "field1", - "type": "int", - "doc": "Field 1" - }, - { - "name": "field2", - "type": "long", - "doc": "Field 2" - } - ] - } - }; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.isRecord).toBeTruthy(); - expect($scope.expandable).toBeTruthy(); - expect($scope.nestedType.fields.length).toBe(2); - expect($scope.nestedType.fields[0].name).toBe("field1"); - expect($scope.nestedType.fields[1].name).toBe("field2"); - }); - - it("should find only children of the first record in union", function () { - // given - $scope.field = { - "name": "test", - "type": [ - { - "type": "record", - "name": "testType", - "fields": [{"name": "field1", "type": "int"}] - }, - { - "type": "record", - "name": "testType", - "fields": [{"name": "field2", "type": "int"}] - } - ] - }; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.isRecord).toBeTruthy(); - expect($scope.nestedType.fields.length).toBe(1); - expect($scope.nestedType.fields[0].name).toBe("field1"); - }); - - [ - { - name: "enum", - field: { - "name": "test", - "type": { - "type": "enum", - "name": "testType", - "symbols": ["one", "two", "three"] - } - } - }, - { - name: "enum array", - field: { - "name": "test", - "type": { - "type": "array", - "items": { - "type": "enum", - "name": "testType", - "symbols": ["one", "two", "three"] - } - } - } - }, - { - name: "enum map", - field: { - "name": "test", - "type": { - "type": "map", - "values": { - "type": "enum", - "name": "testType", - "symbols": ["one", "two", "three"] - } - } - } - }, - { - name: "enum union", - field: { - "name": "test", - "type": [ - { - "type": "enum", - "name": "testType", - "symbols": ["one", "two", "three"] - }, - "int" - ] - } - } - ].forEach(testCase => - it(`should recognize ${testCase.name}`, function () { - // given - $scope.field = testCase.field; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.isEnum).toBeTruthy(); - expect($scope.expandable).toBeTruthy(); - expect($scope.enumSymbols).toEqual(["one", "two", "three"]); - }) - ); - - it("should toggle expansion", function () { - // given - $scope.field = { - "name": "test", - "type": { - "type": "record", - "name": "testType", - "fields": [{"name": "field1", "type": "int"}] - } - }; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.expanded).toBeTruthy(); - - // when - $scope.toggleExpansion(); - - // then - expect($scope.expanded).toBeFalsy(); - - // when - $scope.toggleExpansion(); - - // then - expect($scope.expanded).toBeTruthy(); - }); - - it("should broadcast a fold event when collapsing a node", function () { - // given - $scope.field = { - "name": "test", - "type": { - "type": "record", - "name": "testType", - "fields": [{"name": "field1", "type": "int"}] - } - }; - $controller('AvroNodeController', {$scope: $scope}); - spyOn($scope, '$broadcast'); - - // and - $scope.expanded = true; - - // when - $scope.toggleExpansion(); - - // then - expect($scope.$broadcast).toHaveBeenCalledWith("fold"); - }); - - it("should not broadcast an event when expanding a node", function () { - // given - $scope.field = { - "name": "test", - "type": { - "type": "record", - "name": "testType", - "fields": [{"name": "field1", "type": "int"}] - } - }; - $controller('AvroNodeController', {$scope: $scope}); - spyOn($scope, '$broadcast'); - - // and - $scope.expanded = false; - - // when - $scope.toggleExpansion(); - - // then - expect($scope.$broadcast).not.toHaveBeenCalled(); - }); - - [ - { - name: "union of primitive and record", - field: { - "name": "test", - "type": [ - { - "type": "record", - "name": "testType", - "fields": [{"name": "field1", "type": "int"}] - }, - "int" - ], - }, - expectedCount: 1 - }, - { - name: "union of primitive map and record", - field: { - "name": "test", - "type": [ - { - "type": "record", - "name": "testType", - "fields": [{"name": "field1", "type": "int"}] - }, - { - "type": "map", - "name": "testType2", - "values": "int" - } - ], - }, - expectedCount: 1 - }, - { - name: "union of records", - field: { - "name": "test", - "type": [ - { - "type": "record", - "name": "testType1", - "fields": [{"name": "field1", "type": "int"}] - }, - { - "type": "record", - "name": "testType2", - "fields": [{"name": "field1", "type": "int"}] - } - ], - }, - expectedCount: 2 - }, - { - name: "union of record and enum", - field: { - "name": "test", - "type": [ - { - "type": "record", - "name": "testType", - "fields": [{"name": "field1", "type": "int"}] - }, - { - "type": "enum", - "name": "testType", - "symbols": ["one", "two", "three"] - } - ] - }, - expectedCount: 2 - } - ].forEach(testCase => - it(`should count expandable types of ${testCase.name}`, function () { - // given - $scope.field = testCase.field; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.expandableTypesNumber).toBe(testCase.expectedCount); - }) - ); - - it("should format a doc field", function () { - // given - $scope.field = { - "name": "test", - "type": "int", - "doc": " some documentation " - }; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.doc).toBe("Some documentation."); - }); - - it("should not add a dot to documentation if there already is one", function () { - // given - $scope.field = { - "name": "test", - "type": "int", - "doc": "some documentation." - }; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.doc).toBe("Some documentation."); - }); - - it("should not add a dot to documentation if it ends with a non-letter character", function () { - // given - $scope.field = { - "name": "test", - "type": "int", - "doc": "some documentation!" - }; - - // when - $controller('AvroNodeController', {$scope: $scope}); - - // then - expect($scope.doc).toBe("Some documentation!"); - }); -}); diff --git a/hermes-console/test/unit/AvroNodeDirectiveTest.js b/hermes-console/test/unit/AvroNodeDirectiveTest.js deleted file mode 100644 index c1e4127eb5..0000000000 --- a/hermes-console/test/unit/AvroNodeDirectiveTest.js +++ /dev/null @@ -1,53 +0,0 @@ -describe("AvroNodeDirective", function () { - - var $compile; - var $rootScope; - - beforeEach(module('templates')); - beforeEach(module('hermes.topic.avroViewer')); - - beforeEach(inject(function (_$compile_, _$rootScope_) { - $compile = _$compile_; - $rootScope = _$rootScope_; - })); - - it("should properly render a simple field", function () { - // given - const element = $compile("")($rootScope); - const simpleField = { - "name": "test", - "type": "string", - "doc": "Test field.", - "default": "test" - }; - - // when - $rootScope.field = simpleField; - $rootScope.$digest(); - - // then - expect($(element).find("[data-ref='name']").text()).toBe("test:"); - expect($(element).find("[data-ref='type']").text()).toBe("string"); - expect($(element).find("[data-ref='doc']").text()).toBe("Test field."); - expect($(element).find("[data-ref='default']").text()).toBe("Default: test"); - }); - - it("should properly render a root field", function () { - // given - const element = $compile("")($rootScope); - const simpleField = { - "name": "test", - "type": {"type": "record", "fields": []}, - "doc": "Test field." - }; - - // when - $rootScope.field = simpleField; - $rootScope.$digest(); - - // then - expect($(element).find("[data-ref='name']").text()).toBe("test"); - expect($(element).find("[data-ref='type']").length).toBe(0); - expect($(element).find("[data-ref='doc']").text()).toBe("Test field."); - }); -}); diff --git a/hermes-console/test/unit/AvroViewerDirectiveTest.js b/hermes-console/test/unit/AvroViewerDirectiveTest.js deleted file mode 100644 index 0910564401..0000000000 --- a/hermes-console/test/unit/AvroViewerDirectiveTest.js +++ /dev/null @@ -1,63 +0,0 @@ -describe("AvroViewerDirective", function () { - - const schema = ` - { - "type": "record", - "name": "TestSchema", - "doc": "Test schema doc", - "namespace": "pl.allegro.test", - "fields": [ - { - "name": "__metadata", - "type": {"type": "map", "values": "string"} - }, - { - "name": "field1", - "type": "string" - }, - { - "name": "field2", - "type": "int" - } - ] - }`; - - var $compile; - var $rootScope; - - beforeEach(module('templates')); - beforeEach(module('hermes.topic.avroViewer')); - - beforeEach(inject(function (_$compile_, _$rootScope_) { - $compile = _$compile_; - $rootScope = _$rootScope_; - })); - - it("should create dummy field for top-level node", function () { - // given - const element = $compile("")($rootScope); - - // when - $rootScope.schema = schema; - $rootScope.$digest(); - - // then - const elementScope = element.isolateScope(); - expect(elementScope.rootField.name).toBe("TestSchema"); - expect(elementScope.rootField.doc).toBe("Test schema doc"); - expect(elementScope.rootField.type.type).toBe("record"); - }); - - it("should add top level nodes of the schema except for __metadata", function () { - // given - const element = $compile("")($rootScope); - - // when - $rootScope.schema = schema; - $rootScope.$digest(); - - // then - const elementScope = element.isolateScope(); - expect(elementScope.rootField.type.fields.length).toBe(2); - }); -}); diff --git a/hermes-console/test/unit/GroupControllerTest.js b/hermes-console/test/unit/GroupControllerTest.js deleted file mode 100644 index 69f910e67a..0000000000 --- a/hermes-console/test/unit/GroupControllerTest.js +++ /dev/null @@ -1,46 +0,0 @@ -describe("GroupController", function() { - - var $controller, $httpBackend; - - beforeEach(angular.mock.module('hermes.groups')); - beforeEach(angular.mock.module('ngResource')); - beforeEach(angular.mock.module(function($provide) { - $provide.constant('HERMES_URLS', ["hermes_url"]); - $provide.value("TOPIC_CONFIG", {}); - - })); - - beforeEach(inject(function(_$controller_, _$httpBackend_) { - $controller = _$controller_; - $httpBackend = _$httpBackend_; - })); - - afterEach(function() { - $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); - }); - - beforeEach(function () { - // given - - $scope = {}; - $stateParams = { - "groupName": "someGroup" - }; - controller = $controller('GroupController', {$scope: $scope, $stateParams: $stateParams}); - - }); - - it("should fetch group with all properties", function() { - // when - - $httpBackend.when('GET', 'hermes_url/groups/someGroup').respond("group"); - $httpBackend.when('GET', 'hermes_url/groups').respond(['someGroup']); - $httpBackend.when('GET', 'hermes_url/topics').respond([]); - - // then - $httpBackend.flush(); - expect($scope.fetching).toEqual(false); - expect($scope.groupName).toEqual($stateParams.groupName); - }); -}); diff --git a/hermes-console/test/unit/GroupEditControllerTest.js b/hermes-console/test/unit/GroupEditControllerTest.js deleted file mode 100644 index 51196dda5d..0000000000 --- a/hermes-console/test/unit/GroupEditControllerTest.js +++ /dev/null @@ -1,40 +0,0 @@ - -describe("GroupEditController", function() { - var $controller, $httpBackend; - - beforeEach(angular.mock.module('hermes.groups')); - beforeEach(angular.mock.module('ngResource')); - beforeEach(angular.mock.module(function($provide) { - $provide.constant('HERMES_URLS', ["hermes_url"]); - $provide.value("TOPIC_CONFIG", {}); - - })); - - beforeEach(inject(function(_$controller_, _$httpBackend_) { - $controller = _$controller_; - $httpBackend = _$httpBackend_; - })); - afterEach(function() { - $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); - }); - - it("should create group", function() { - // given - var group = { - "groupName": "someGroup" - }; - - $httpBackend.when('POST', 'hermes_url/groups', group).respond(201, true); - - // when - var $scope = {}; - $controller('GroupEditController', {$scope: $scope, group: group, operation: "ADD", $uibModalInstance: { close: function() {} }}); - $scope.save(); - - $httpBackend.flush(); - - // then part is in afterEach() - }); - -}); diff --git a/hermes-console/test/unit/GroupsControllerTest.js b/hermes-console/test/unit/GroupsControllerTest.js deleted file mode 100644 index f1282c4904..0000000000 --- a/hermes-console/test/unit/GroupsControllerTest.js +++ /dev/null @@ -1,59 +0,0 @@ -describe("GroupsController", function() { - - var $controller, $httpBackend; - - beforeEach(angular.mock.module('hermes.groups')); - beforeEach(angular.mock.module('ngResource')); - beforeEach(angular.mock.module(function($provide) { - $provide.constant('HERMES_URLS', ["hermes_url"]); - $provide.value("TOPIC_CONFIG", {}); - $provide.value("GROUP_CONFIG", {}); - })); - - beforeEach(inject(function(_$controller_, _$httpBackend_) { - $controller = _$controller_; - $httpBackend = _$httpBackend_; - })); - - afterEach(function() { - $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); - }); - - it("should fetch empty list of groups", function() { - // given - $httpBackend.when('GET', 'hermes_url/groups').respond([]); - $httpBackend.when('GET', 'hermes_url/topics').respond([]); - - // when - var $scope = {}; - $controller('GroupsController', {$scope: $scope}); - - $httpBackend.flush(); - - // then - expect($scope.groups.length).toEqual(0); - expect($scope.fetching).toEqual(false); - }); - - it("should fetch groups with corresponding topics", function() { - - // given - $httpBackend.when('GET', 'hermes_url/groups').respond(['g1', 'g2', 'g3', 'g12']); - $httpBackend.when('GET', 'hermes_url/topics').respond(['g1.t1', 'g1.t2', 'g3.t1', 'g12.t1']); - - - // when - var $scope = {}; - $controller('GroupsController', {$scope: $scope}); - $httpBackend.flush(); - - // then - expect($scope.groups).toEqual([{name: 'g1', topics: ['g1.t1', 'g1.t2']}, - {name: 'g2', topics: []}, - {name: 'g3', topics: ['g3.t1']}, - {name: 'g12', topics: ['g12.t1']}]); - expect($scope.fetching).toEqual(false); - - }); -}); diff --git a/hermes-console/test/unit/MessagePreviewControllerTest.js b/hermes-console/test/unit/MessagePreviewControllerTest.js deleted file mode 100644 index dad45ded96..0000000000 --- a/hermes-console/test/unit/MessagePreviewControllerTest.js +++ /dev/null @@ -1,25 +0,0 @@ -describe("MessagePreviewController", function() { - - beforeEach(module('hermes.messagePreview')); - - var $controller; - - beforeEach(inject(function(_$controller_) { - $controller = _$controller_; - })); - - it("set up all necessary $scope properties", function() { - var $scope = {}; - - $controller('MessagePreviewController', { $scope: $scope, - topicName: 'exampleTopicName', - partition: 778, - offset: 98798798, - previewedMessage: 'This is example message' }); - - expect($scope.topicName).toBe('exampleTopicName'); - expect($scope.partition).toBe(778); - expect($scope.offset).toBe(98798798); - expect($scope.previewedMessage).toBe('This is example message'); - }); -}); diff --git a/hermes-console/test/unit/subscription/SubscriptionEditControllerTest.js b/hermes-console/test/unit/subscription/SubscriptionEditControllerTest.js deleted file mode 100644 index 81b036f83a..0000000000 --- a/hermes-console/test/unit/subscription/SubscriptionEditControllerTest.js +++ /dev/null @@ -1,92 +0,0 @@ -describe("SubscriptionEditController", function() { - - var $controller, $httpBackend; - - beforeEach(angular.mock.module('hermes.subscription')); - beforeEach(angular.mock.module('hermes.discovery')); - beforeEach(angular.mock.module('toaster')); - beforeEach(angular.mock.module('ngResource')); - beforeEach(angular.mock.module(function($provide) { - $provide.constant('HERMES_URLS', ["hermes_url"]); - $provide.value("SUBSCRIPTION_CONFIG", {}); - })); - - beforeEach(inject(function(_$controller_, _$httpBackend_) { - $controller = _$controller_; - $httpBackend = _$httpBackend_; - })); - - afterEach(function() { - $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); - }); - - it("should edit subscription", function() { - // given - var subscription = { - name: 'subscription', - endpoint: "http://my-endpoint", - description: "Initial description" - }; - - var $scope = {}; - $controller('SubscriptionEditController', { - $scope: $scope, - subscription: subscription, - operation: "SAVE", - groupName: 'group', - topicName: 'topic', - endpointAddressResolverMetadataConfig: {}, - topicContentType: {}, - showHeadersFilter: {}, - showFixedHeaders:{}, - $uibModalInstance: { close: function() {} }} - ); - - // when - $scope.subscription.endpoint = "http://changed-endpoint"; - $scope.subscription.description = "Changed description"; - $httpBackend.expect('PUT', 'hermes_url/topics/topic/subscriptions/subscription', { - name: 'subscription', endpoint: "http://changed-endpoint", description: "Changed description" - }).respond(200, true); - $scope.save(); - $httpBackend.flush(); - - // then part is in afterEach() - }); - - it("should not send endpoint when it has not changed on save", function() { - // given - var subscription = { - name: 'subscription', - endpoint: "http://my-endpoint", - description: "Initial description" - }; - - var $scope = {}; - $controller('SubscriptionEditController', { - $scope: $scope, - subscription: subscription, - operation: "SAVE", - groupName: 'group', - topicName: 'topic', - endpointAddressResolverMetadataConfig: {}, - topicContentType: {}, - showHeadersFilter: {}, - showFixedHeaders:{}, - $uibModalInstance: { close: function() {} }} - ); - - // when - $scope.subscription.description = "Changed description"; - $httpBackend.expect('PUT', - 'hermes_url/topics/topic/subscriptions/subscription', - {name: 'subscription', description: "Changed description"}) - .respond(200, true); - $scope.save(); - $httpBackend.flush(); - - // then part is in afterEach() - }); - -}); diff --git a/hermes-console-vue/tsconfig.app.json b/hermes-console/tsconfig.app.json similarity index 100% rename from hermes-console-vue/tsconfig.app.json rename to hermes-console/tsconfig.app.json diff --git a/hermes-console-vue/tsconfig.config.json b/hermes-console/tsconfig.config.json similarity index 100% rename from hermes-console-vue/tsconfig.config.json rename to hermes-console/tsconfig.config.json diff --git a/hermes-console-vue/tsconfig.json b/hermes-console/tsconfig.json similarity index 100% rename from hermes-console-vue/tsconfig.json rename to hermes-console/tsconfig.json diff --git a/hermes-console-vue/tsconfig.vitest.json b/hermes-console/tsconfig.vitest.json similarity index 100% rename from hermes-console-vue/tsconfig.vitest.json rename to hermes-console/tsconfig.vitest.json diff --git a/hermes-console-vue/vite.config.ts b/hermes-console/vite.config.ts similarity index 100% rename from hermes-console-vue/vite.config.ts rename to hermes-console/vite.config.ts diff --git a/hermes-console-vue/vitest.config.ts b/hermes-console/vitest.config.ts similarity index 100% rename from hermes-console-vue/vitest.config.ts rename to hermes-console/vitest.config.ts diff --git a/hermes-console-vue/vitest.setup.ts b/hermes-console/vitest.setup.ts similarity index 100% rename from hermes-console-vue/vitest.setup.ts rename to hermes-console/vitest.setup.ts diff --git a/hermes-console-vue/yarn.lock b/hermes-console/yarn.lock similarity index 100% rename from hermes-console-vue/yarn.lock rename to hermes-console/yarn.lock diff --git a/hermes-management/build.gradle b/hermes-management/build.gradle index 33e6e67390..93215853a8 100644 --- a/hermes-management/build.gradle +++ b/hermes-management/build.gradle @@ -55,7 +55,7 @@ node { download = true workDir = file("${project.buildDir}/nodejs") npmWorkDir = file("${project.buildDir}/npm") - nodeModulesDir = file("${project.rootDir}/hermes-console-vue") + nodeModulesDir = file("${project.rootDir}/hermes-console") } yarnSetup.dependsOn(nodeSetup) @@ -66,7 +66,7 @@ task buildHermesConsole(type: YarnTask, dependsOn: yarn) { } task attachHermesConsole(type: Copy, dependsOn: 'buildHermesConsole') { - from '../hermes-console-vue/dist' + from '../hermes-console/dist' def staticDirectory = sourceSets.main.output.resourcesDir.path + '/static' // remove previous static dir if exists and start with clear setup delete staticDirectory diff --git a/integration/src/integration/java/pl/allegro/tech/hermes/integration/management/OfflineRetransmissionManagementTest.java b/integration/src/integration/java/pl/allegro/tech/hermes/integration/management/OfflineRetransmissionManagementTest.java index c9fd00cc0c..be0982e9e3 100644 --- a/integration/src/integration/java/pl/allegro/tech/hermes/integration/management/OfflineRetransmissionManagementTest.java +++ b/integration/src/integration/java/pl/allegro/tech/hermes/integration/management/OfflineRetransmissionManagementTest.java @@ -58,7 +58,6 @@ public void shouldCreateRetransmissionTask() { assertThat(allTasks.get(0).getCreatedAt()).isBefore(now); } - @Test public void shouldReturnEmptyListIfThereAreNoTasks() { // expect @@ -129,8 +128,8 @@ public void shouldReturnClientErrorWhenRequestingRetransmissionWithNegativeTimeR OfflineRetransmissionRequest request = new OfflineRetransmissionRequest( sourceTopic.getQualifiedName(), targetTopic.getQualifiedName(), - Instant.now(), - Instant.now().minusSeconds(1)); + Instant.now().toString(), + Instant.now().minusSeconds(1).toString()); Response response = management.offlineRetransmission().createRetransmissionTask(request); assertThat(response).containsMessage("End timestamp must be greater than start timestamp"); @@ -139,6 +138,28 @@ public void shouldReturnClientErrorWhenRequestingRetransmissionWithNegativeTimeR assertThat(response).hasStatus(Response.Status.BAD_REQUEST); } + @Test + public void shouldNotReturnClientErrorWhenRequestingRetransmissionWithoutSeconds() { + // given + Topic sourceTopic = createTopic(); + Topic targetTopic = createTopic(); + + operations.buildTopic(sourceTopic); + operations.buildTopic(targetTopic); + + // when + OfflineRetransmissionRequest request = new OfflineRetransmissionRequest( + sourceTopic.getQualifiedName(), + targetTopic.getQualifiedName(), + "2023-09-01T00:00Z", + "2023-09-02T00:00Z"); + + Response response = management.offlineRetransmission().createRetransmissionTask(request); + + // then + assertThat(response).hasStatus(Response.Status.CREATED); + } + @Test public void shouldReturnClientErrorWhenRequestingRetransmissionWithTargetTopicStoredOffline() { // given @@ -226,8 +247,8 @@ private OfflineRetransmissionRequest createRequest(String sourceTopic, String ta return new OfflineRetransmissionRequest( sourceTopic, targetTopic, - Instant.now().minusSeconds(1), - Instant.now() + Instant.now().minusSeconds(1).toString(), + Instant.now().toString() ); }