From 1cc91a1469c2e5abb1ef6f753c6f064737db4788 Mon Sep 17 00:00:00 2001 From: Murali Basani Date: Fri, 4 Nov 2022 09:26:04 +0100 Subject: [PATCH] Release 1.1.0 with multi maven modules 'core' and 'cluster-api' (#169) Release 1.1.0 with multi maven modules 'core' and 'cluster-api' Co-authored-by: muralibasani --- .gitignore | 1 + Makefile | 34 +- README.md | 21 +- ReleaseNotes.txt | 110 ---- cluster-api/pom.xml | 55 ++ .../KafkaClusterApiApplication.java | 12 + .../clusterapi/config/JwtRequestFilter.java | 133 +++++ .../clusterapi/config/SecurityConfig.java | 60 +++ .../clusterapi/config/SslContextConfig.java | 84 +++ .../controller/ClusterApiController.java | 252 +++++++++ .../controller/KafkaConnectController.java | 72 +++ .../controller/MetricsApiController.java | 27 + .../controller/TopicContentsController.java | 47 ++ .../clusterapi/models/AclIPPrincipleType.java | 7 + .../clusterapi/models/AclPatternType.java | 12 + .../aiven/klaw/clusterapi/models/AclType.java | 12 + .../clusterapi/models/AclsNativeType.java | 6 + .../clusterapi/models/AivenAclResponse.java | 11 + .../clusterapi/models/AivenAclStruct.java | 16 + .../klaw/clusterapi/models/ApiResponse.java | 28 + .../clusterapi/models/ApiResultStatus.java | 13 + .../clusterapi/models/ClusterAclRequest.java | 47 ++ .../models/ClusterConnectorRequest.java | 19 + .../models/ClusterSchemaRequest.java | 18 + .../klaw/clusterapi/models/ClusterStatus.java | 13 + .../models/ClusterTopicRequest.java | 21 + .../clusterapi/models/KafkaClustersType.java | 13 + .../models/KafkaSupportedProtocol.java | 25 + .../models/RequestOperationType.java | 13 + .../clusterapi/services/AivenApiService.java | 174 +++++++ .../services/ApacheKafkaAclService.java | 490 ++++++++++++++++++ .../services/ApacheKafkaTopicService.java | 214 ++++++++ .../services/JwtTokenUtilService.java | 70 +++ .../services/KafkaConnectService.java | 176 +++++++ .../services/MetricsApiService.java | 46 ++ .../services/MonitoringService.java | 94 ++++ .../clusterapi/services/SchemaService.java | 208 ++++++++ .../services/TopicContentsService.java | 112 ++++ .../services/UtilComponentsService.java | 76 +++ .../utils/AdminClientProperties.java | 34 ++ .../clusterapi/utils/ClusterApiUtils.java | 422 +++++++++++++++ .../klaw/clusterapi/utils/MetricsUtils.java | 51 ++ .../src/main/resources/application.properties | 68 +++ cluster-api/src/main/resources/banner.txt | 6 + .../AuthenticationIntegrationTest.java | 143 +++++ .../io/aiven/klaw/clusterapi/UtilMethods.java | 134 +++++ .../controller/ClusterApiControllerTest.java | 247 +++++++++ .../services/AivenApiServiceTest.java | 56 ++ .../services/UtilComponentsServiceTest.java | 405 +++++++++++++++ .../clusterapi/utils/GetAdminClientTest.java | 112 ++++ .../src/test/resources/application.properties | 51 ++ .../org.mockito.plugins.MockMaker | 4 + coral/Makefile | 26 + core/pom.xml | 156 ++++++ .../java/io/aiven/klaw/UiapiApplication.java | 0 .../auth/KwAuthenticationFailureHandler.java | 0 .../klaw/auth/KwAuthenticationService.java | 0 .../auth/KwAuthenticationSuccessHandler.java | 0 .../io/aiven/klaw/auth/KwRequestFilter.java | 0 .../io/aiven/klaw/config/CacheConfig.java | 0 .../aiven/klaw/config/DataSourceConfig.java | 0 .../io/aiven/klaw/config/EmailConfig.java | 0 .../io/aiven/klaw/config/Http2Config.java | 0 .../io/aiven/klaw/config/ManageDatabase.java | 0 .../klaw/config/SecurityConfigNoSSO.java | 0 .../aiven/klaw/config/SecurityConfigSSO.java | 0 .../java/io/aiven/klaw/config/WebConfig.java | 0 .../aiven/klaw/controller/AclController.java | 0 .../klaw/controller/AclSyncController.java | 0 .../klaw/controller/AnalyticsController.java | 0 .../klaw/controller/CoralController.java | 0 .../EnvsClustersTenantsController.java | 0 .../controller/KafkaConnectController.java | 0 .../KafkaConnectSyncController.java | 0 .../klaw/controller/MetricsController.java | 0 .../controller/ResourceClientController.java | 0 .../RolesPermissionsController.java | 0 .../controller/SchemaRegstryController.java | 0 .../controller/ServerConfigController.java | 0 .../controller/TemplateMapController.java | 0 .../klaw/controller/TopicController.java | 0 .../klaw/controller/TopicSyncController.java | 0 .../klaw/controller/UiConfigController.java | 0 .../klaw/controller/UsersTeamsController.java | 0 .../aiven/klaw/controller/UtilController.java | 0 .../src}/main/java/io/aiven/klaw/dao/Acl.java | 0 .../main/java/io/aiven/klaw/dao/AclID.java | 0 .../java/io/aiven/klaw/dao/AclRequestID.java | 0 .../java/io/aiven/klaw/dao/AclRequests.java | 0 .../java/io/aiven/klaw/dao/ActivityLog.java | 0 .../java/io/aiven/klaw/dao/ActivityLogID.java | 0 .../src}/main/java/io/aiven/klaw/dao/Env.java | 0 .../main/java/io/aiven/klaw/dao/EnvID.java | 0 .../aiven/klaw/dao/KafkaConnectorRequest.java | 0 .../klaw/dao/KafkaConnectorRequestID.java | 0 .../java/io/aiven/klaw/dao/KwClusterID.java | 0 .../java/io/aiven/klaw/dao/KwClusters.java | 0 .../io/aiven/klaw/dao/KwKafkaConnector.java | 0 .../io/aiven/klaw/dao/KwKafkaConnectorID.java | 0 .../java/io/aiven/klaw/dao/KwMetrics.java | 0 .../java/io/aiven/klaw/dao/KwProperties.java | 0 .../io/aiven/klaw/dao/KwPropertiesID.java | 0 .../io/aiven/klaw/dao/KwRolesPermissions.java | 0 .../aiven/klaw/dao/KwRolesPermissionsID.java | 0 .../java/io/aiven/klaw/dao/KwTenants.java | 0 .../java/io/aiven/klaw/dao/MessageSchema.java | 0 .../io/aiven/klaw/dao/MessageSchemaID.java | 0 .../io/aiven/klaw/dao/ProductDetails.java | 0 .../io/aiven/klaw/dao/RegisterUserInfo.java | 0 .../java/io/aiven/klaw/dao/SchemaRequest.java | 0 .../io/aiven/klaw/dao/SchemaRequestID.java | 0 .../main/java/io/aiven/klaw/dao/Team.java | 0 .../main/java/io/aiven/klaw/dao/TeamID.java | 0 .../main/java/io/aiven/klaw/dao/Topic.java | 0 .../main/java/io/aiven/klaw/dao/TopicID.java | 0 .../java/io/aiven/klaw/dao/TopicRequest.java | 0 .../io/aiven/klaw/dao/TopicRequestID.java | 0 .../main/java/io/aiven/klaw/dao/UserInfo.java | 0 .../io/aiven/klaw/error/KlawException.java | 0 .../klaw/error/KlawExceptionHandler.java | 0 .../aiven/klaw/helpers/HandleDbRequests.java | 0 .../klaw/helpers/db/rdbms/DeleteDataJdbc.java | 0 .../db/rdbms/HandleDbRequestsJdbc.java | 0 .../klaw/helpers/db/rdbms/InsertDataJdbc.java | 0 .../db/rdbms/JdbcDataSourceCondition.java | 0 .../klaw/helpers/db/rdbms/SelectDataJdbc.java | 0 .../klaw/helpers/db/rdbms/UpdateDataJdbc.java | 0 .../klaw/listeners/MetadataListener.java | 0 .../aiven/klaw/model/AclIPPrincipleType.java | 0 .../java/io/aiven/klaw/model/AclInfo.java | 0 .../io/aiven/klaw/model/AclPatternType.java | 0 .../aiven/klaw/model/AclPermissionType.java | 0 .../io/aiven/klaw/model/AclRequestsModel.java | 0 .../java/io/aiven/klaw/model/AclType.java | 0 .../io/aiven/klaw/model/AclsNativeType.java | 0 .../io/aiven/klaw/model/ActivityLogModel.java | 0 .../java/io/aiven/klaw/model/ApiResponse.java | 0 .../io/aiven/klaw/model/ApiResultStatus.java | 0 .../io/aiven/klaw/model/CaptchaResponse.java | 0 .../io/aiven/klaw/model/ClusterStatus.java | 0 .../aiven/klaw/model/ConnectorOverview.java | 0 .../java/io/aiven/klaw/model/EntityType.java | 0 .../java/io/aiven/klaw/model/EnvModel.java | 0 .../aiven/klaw/model/KafkaClustersType.java | 0 .../aiven/klaw/model/KafkaConnectorModel.java | 0 .../model/KafkaConnectorRequestModel.java | 0 .../io/aiven/klaw/model/KafkaFlavors.java | 0 .../klaw/model/KafkaSupportedProtocol.java | 0 .../io/aiven/klaw/model/KwClustersModel.java | 0 .../aiven/klaw/model/KwMetadataUpdates.java | 0 .../aiven/klaw/model/KwPropertiesModel.java | 0 .../klaw/model/KwRolesPermissionsModel.java | 0 .../aiven/klaw/model/KwTenantConfigModel.java | 0 .../io/aiven/klaw/model/KwTenantModel.java | 0 .../java/io/aiven/klaw/model/MailType.java | 0 .../klaw/model/MetadataOperationType.java | 0 .../io/aiven/klaw/model/PermissionType.java | 0 .../klaw/model/RegisterSaasUserInfoModel.java | 0 .../klaw/model/RegisterUserInfoModel.java | 0 .../klaw/model/RequestOperationType.java | 0 .../io/aiven/klaw/model/RequestStatus.java | 0 .../java/io/aiven/klaw/model/RolesType.java | 0 .../aiven/klaw/model/SchemaRequestModel.java | 0 .../klaw/model/ServerConfigProperties.java | 0 .../io/aiven/klaw/model/SyncAclUpdates.java | 0 .../io/aiven/klaw/model/SyncBackAcls.java | 0 .../io/aiven/klaw/model/SyncBackTopics.java | 0 .../klaw/model/SyncConnectorUpdates.java | 0 .../io/aiven/klaw/model/SyncTopicUpdates.java | 0 .../io/aiven/klaw/model/SyncTopicsBulk.java | 0 .../java/io/aiven/klaw/model/TeamModel.java | 0 .../io/aiven/klaw/model/TenantConfig.java | 0 .../io/aiven/klaw/model/TopicHistory.java | 0 .../java/io/aiven/klaw/model/TopicInfo.java | 0 .../io/aiven/klaw/model/TopicOverview.java | 0 .../aiven/klaw/model/TopicRequestModel.java | 0 .../aiven/klaw/model/TopicRequestTypes.java | 0 .../io/aiven/klaw/model/UserInfoModel.java | 0 .../klaw/model/charts/ChartsJsOverview.java | 0 .../aiven/klaw/model/charts/JmxOverview.java | 0 .../io/aiven/klaw/model/charts/Options.java | 0 .../io/aiven/klaw/model/charts/Scales.java | 0 .../aiven/klaw/model/charts/TeamOverview.java | 0 .../io/aiven/klaw/model/charts/Title.java | 0 .../java/io/aiven/klaw/model/charts/YAx.java | 0 .../klaw/model/cluster/ClusterAclRequest.java | 0 .../cluster/ClusterConnectorRequest.java | 0 .../model/cluster/ClusterSchemaRequest.java | 0 .../model/cluster/ClusterTopicRequest.java | 0 .../connectorconfig/ConnectorConfig.java | 0 .../io/aiven/klaw/perf/CreateBulkTests.java | 0 .../io/aiven/klaw/repository/AclRepo.java | 0 .../klaw/repository/AclRequestsRepo.java | 0 .../klaw/repository/ActivityLogRepo.java | 0 .../io/aiven/klaw/repository/EnvRepo.java | 0 .../aiven/klaw/repository/KwClusterRepo.java | 0 .../klaw/repository/KwKafkaConnectorRepo.java | 0 .../KwKafkaConnectorRequestsRepo.java | 0 .../aiven/klaw/repository/KwMetricsRepo.java | 0 .../klaw/repository/KwPropertiesRepo.java | 0 .../klaw/repository/KwRolesPermsRepo.java | 0 .../klaw/repository/MessageSchemaRepo.java | 0 .../klaw/repository/ProductDetailsRepo.java | 0 .../klaw/repository/RegisterInfoRepo.java | 0 .../klaw/repository/SchemaRequestRepo.java | 0 .../io/aiven/klaw/repository/TeamRepo.java | 0 .../io/aiven/klaw/repository/TenantRepo.java | 0 .../io/aiven/klaw/repository/TopicRepo.java | 0 .../klaw/repository/TopicRequestsRepo.java | 0 .../aiven/klaw/repository/UserInfoRepo.java | 0 .../klaw/service/AclControllerService.java | 12 +- .../service/AclSyncControllerService.java | 4 +- .../service/AnalyticsControllerService.java | 0 .../aiven/klaw/service/ClusterApiService.java | 0 .../klaw/service/CommonUtilsService.java | 0 .../klaw/service/DefaultDataService.java | 0 .../io/aiven/klaw/service/EmailService.java | 0 .../klaw/service/EnvControllerService.java | 0 .../EnvsClustersTenantsControllerService.java | 0 .../KafkaConnectControllerService.java | 0 .../KafkaConnectSyncControllerService.java | 0 .../io/aiven/klaw/service/KwConstants.java | 0 .../java/io/aiven/klaw/service/MailUtils.java | 0 .../service/MetricsControllerService.java | 0 .../RolesPermissionsControllerService.java | 0 .../io/aiven/klaw/service/SaasService.java | 0 .../SchemaRegstryControllerService.java | 0 .../klaw/service/ServerConfigService.java | 0 .../klaw/service/TopicControllerService.java | 4 +- .../service/TopicSyncControllerService.java | 0 .../service/UiConfigControllerService.java | 0 .../service/UiControllerLoginService.java | 0 .../service/UsersTeamsControllerService.java | 0 .../klaw/service/UtilControllerService.java | 0 .../klaw/service/ValidateCaptchaService.java | 0 .../io/aiven/klaw/uglify/UglifyFiles.java | 0 .../validation/KafkaClusterValidator.java | 0 .../validation/KafkaClusterValidatorImpl.java | 0 .../main/resources/application.properties | 2 +- {src => core/src}/main/resources/banner.txt | 0 .../resources/db/changelog/changelog.yaml | 0 .../src}/main/resources/openapi_spec.json | 0 .../scripts/base/rdbms/db-grants.sql | 0 .../resources/scripts/base/rdbms/ddl-jdbc.sql | 0 .../resources/scripts/base/rdbms/dropjdbc.sql | 0 .../resources/static/assets/css/animate.css | 0 .../static/assets/css/animate.min.css | 0 .../static/assets/css/colors/blue-dark.css | 0 .../static/assets/css/colors/blue.css | 0 .../static/assets/css/colors/default-dark.css | 0 .../static/assets/css/colors/default.css | 0 .../resources/static/assets/css/custom.css | 0 .../css/icons/flag-icon-css/flag-icon.min.css | 0 .../css/icons/flag-icon-css/flags/ad.svg | 0 .../css/icons/flag-icon-css/flags/ae.svg | 0 .../css/icons/flag-icon-css/flags/af.svg | 0 .../css/icons/flag-icon-css/flags/ag.svg | 0 .../css/icons/flag-icon-css/flags/ai.svg | 0 .../css/icons/flag-icon-css/flags/al.svg | 0 .../css/icons/flag-icon-css/flags/am.svg | 0 .../css/icons/flag-icon-css/flags/ao.svg | 0 .../css/icons/flag-icon-css/flags/aq.svg | 0 .../css/icons/flag-icon-css/flags/ar.svg | 0 .../css/icons/flag-icon-css/flags/as.svg | 0 .../css/icons/flag-icon-css/flags/at.svg | 0 .../css/icons/flag-icon-css/flags/au.svg | 0 .../css/icons/flag-icon-css/flags/aw.svg | 0 .../css/icons/flag-icon-css/flags/ax.svg | 0 .../css/icons/flag-icon-css/flags/az.svg | 0 .../css/icons/flag-icon-css/flags/ba.svg | 0 .../css/icons/flag-icon-css/flags/bb.svg | 0 .../css/icons/flag-icon-css/flags/bd.svg | 0 .../css/icons/flag-icon-css/flags/be.svg | 0 .../css/icons/flag-icon-css/flags/bf.svg | 0 .../css/icons/flag-icon-css/flags/bg.svg | 0 .../css/icons/flag-icon-css/flags/bh.svg | 0 .../css/icons/flag-icon-css/flags/bi.svg | 0 .../css/icons/flag-icon-css/flags/bj.svg | 0 .../css/icons/flag-icon-css/flags/bl.svg | 0 .../css/icons/flag-icon-css/flags/bm.svg | 0 .../css/icons/flag-icon-css/flags/bn.svg | 0 .../css/icons/flag-icon-css/flags/bo.svg | 0 .../css/icons/flag-icon-css/flags/bq.svg | 0 .../css/icons/flag-icon-css/flags/br.svg | 0 .../css/icons/flag-icon-css/flags/bs.svg | 0 .../css/icons/flag-icon-css/flags/bt.svg | 0 .../css/icons/flag-icon-css/flags/bv.svg | 0 .../css/icons/flag-icon-css/flags/bw.svg | 0 .../css/icons/flag-icon-css/flags/by.svg | 0 .../css/icons/flag-icon-css/flags/bz.svg | 0 .../css/icons/flag-icon-css/flags/ca.svg | 0 .../css/icons/flag-icon-css/flags/cc.svg | 0 .../css/icons/flag-icon-css/flags/cd.svg | 0 .../css/icons/flag-icon-css/flags/cf.svg | 0 .../css/icons/flag-icon-css/flags/cg.svg | 0 .../css/icons/flag-icon-css/flags/ch.svg | 0 .../css/icons/flag-icon-css/flags/ci.svg | 0 .../css/icons/flag-icon-css/flags/ck.svg | 0 .../css/icons/flag-icon-css/flags/cl.svg | 0 .../css/icons/flag-icon-css/flags/cm.svg | 0 .../css/icons/flag-icon-css/flags/cn.svg | 0 .../css/icons/flag-icon-css/flags/co.svg | 0 .../css/icons/flag-icon-css/flags/cr.svg | 0 .../css/icons/flag-icon-css/flags/cu.svg | 0 .../css/icons/flag-icon-css/flags/cv.svg | 0 .../css/icons/flag-icon-css/flags/cw.svg | 0 .../css/icons/flag-icon-css/flags/cx.svg | 0 .../css/icons/flag-icon-css/flags/cy.svg | 0 .../css/icons/flag-icon-css/flags/cz.svg | 0 .../css/icons/flag-icon-css/flags/de.svg | 0 .../css/icons/flag-icon-css/flags/dj.svg | 0 .../css/icons/flag-icon-css/flags/dk.svg | 0 .../css/icons/flag-icon-css/flags/dm.svg | 0 .../css/icons/flag-icon-css/flags/do.svg | 0 .../css/icons/flag-icon-css/flags/dz.svg | 0 .../css/icons/flag-icon-css/flags/ec.svg | 0 .../css/icons/flag-icon-css/flags/ee.svg | 0 .../css/icons/flag-icon-css/flags/eg.svg | 0 .../css/icons/flag-icon-css/flags/eh.svg | 0 .../css/icons/flag-icon-css/flags/er.svg | 0 .../css/icons/flag-icon-css/flags/es.svg | 0 .../css/icons/flag-icon-css/flags/et.svg | 0 .../css/icons/flag-icon-css/flags/fi.svg | 0 .../css/icons/flag-icon-css/flags/fj.svg | 0 .../css/icons/flag-icon-css/flags/fk.svg | 0 .../css/icons/flag-icon-css/flags/fm.svg | 0 .../css/icons/flag-icon-css/flags/fo.svg | 0 .../css/icons/flag-icon-css/flags/fr.svg | 0 .../css/icons/flag-icon-css/flags/ga.svg | 0 .../css/icons/flag-icon-css/flags/gb.svg | 0 .../css/icons/flag-icon-css/flags/gd.svg | 0 .../css/icons/flag-icon-css/flags/ge.svg | 0 .../css/icons/flag-icon-css/flags/gf.svg | 0 .../css/icons/flag-icon-css/flags/gg.svg | 0 .../css/icons/flag-icon-css/flags/gh.svg | 0 .../css/icons/flag-icon-css/flags/gi.svg | 0 .../css/icons/flag-icon-css/flags/gl.svg | 0 .../css/icons/flag-icon-css/flags/gm.svg | 0 .../css/icons/flag-icon-css/flags/gn.svg | 0 .../css/icons/flag-icon-css/flags/gp.svg | 0 .../css/icons/flag-icon-css/flags/gq.svg | 0 .../css/icons/flag-icon-css/flags/gr.svg | 0 .../css/icons/flag-icon-css/flags/gs.svg | 0 .../css/icons/flag-icon-css/flags/gt.svg | 0 .../css/icons/flag-icon-css/flags/gu.svg | 0 .../css/icons/flag-icon-css/flags/gw.svg | 0 .../css/icons/flag-icon-css/flags/gy.svg | 0 .../css/icons/flag-icon-css/flags/hk.svg | 0 .../css/icons/flag-icon-css/flags/hm.svg | 0 .../css/icons/flag-icon-css/flags/hn.svg | 0 .../css/icons/flag-icon-css/flags/hr.svg | 0 .../css/icons/flag-icon-css/flags/ht.svg | 0 .../css/icons/flag-icon-css/flags/hu.svg | 0 .../css/icons/flag-icon-css/flags/id.svg | 0 .../css/icons/flag-icon-css/flags/ie.svg | 0 .../css/icons/flag-icon-css/flags/il.svg | 0 .../css/icons/flag-icon-css/flags/im.svg | 0 .../css/icons/flag-icon-css/flags/in.svg | 0 .../css/icons/flag-icon-css/flags/io.svg | 0 .../css/icons/flag-icon-css/flags/iq.svg | 0 .../css/icons/flag-icon-css/flags/ir.svg | 0 .../css/icons/flag-icon-css/flags/is.svg | 0 .../css/icons/flag-icon-css/flags/it.svg | 0 .../css/icons/flag-icon-css/flags/je.svg | 0 .../css/icons/flag-icon-css/flags/jm.svg | 0 .../css/icons/flag-icon-css/flags/jo.svg | 0 .../css/icons/flag-icon-css/flags/jp.svg | 0 .../css/icons/flag-icon-css/flags/ke.svg | 0 .../css/icons/flag-icon-css/flags/kg.svg | 0 .../css/icons/flag-icon-css/flags/kh.svg | 0 .../css/icons/flag-icon-css/flags/ki.svg | 0 .../css/icons/flag-icon-css/flags/km.svg | 0 .../css/icons/flag-icon-css/flags/kn.svg | 0 .../css/icons/flag-icon-css/flags/kp.svg | 0 .../css/icons/flag-icon-css/flags/kr.svg | 0 .../css/icons/flag-icon-css/flags/kw.svg | 0 .../css/icons/flag-icon-css/flags/ky.svg | 0 .../css/icons/flag-icon-css/flags/kz.svg | 0 .../css/icons/flag-icon-css/flags/la.svg | 0 .../css/icons/flag-icon-css/flags/lb.svg | 0 .../css/icons/flag-icon-css/flags/lc.svg | 0 .../css/icons/flag-icon-css/flags/li.svg | 0 .../css/icons/flag-icon-css/flags/lk.svg | 0 .../css/icons/flag-icon-css/flags/lr.svg | 0 .../css/icons/flag-icon-css/flags/ls.svg | 0 .../css/icons/flag-icon-css/flags/lt.svg | 0 .../css/icons/flag-icon-css/flags/lu.svg | 0 .../css/icons/flag-icon-css/flags/lv.svg | 0 .../css/icons/flag-icon-css/flags/ly.svg | 0 .../css/icons/flag-icon-css/flags/ma.svg | 0 .../css/icons/flag-icon-css/flags/mc.svg | 0 .../css/icons/flag-icon-css/flags/md.svg | 0 .../css/icons/flag-icon-css/flags/me.svg | 0 .../css/icons/flag-icon-css/flags/mf.svg | 0 .../css/icons/flag-icon-css/flags/mg.svg | 0 .../css/icons/flag-icon-css/flags/mh.svg | 0 .../css/icons/flag-icon-css/flags/mk.svg | 0 .../css/icons/flag-icon-css/flags/ml.svg | 0 .../css/icons/flag-icon-css/flags/mm.svg | 0 .../css/icons/flag-icon-css/flags/mn.svg | 0 .../css/icons/flag-icon-css/flags/mo.svg | 0 .../css/icons/flag-icon-css/flags/mp.svg | 0 .../css/icons/flag-icon-css/flags/mq.svg | 0 .../css/icons/flag-icon-css/flags/mr.svg | 0 .../css/icons/flag-icon-css/flags/ms.svg | 0 .../css/icons/flag-icon-css/flags/mt.svg | 0 .../css/icons/flag-icon-css/flags/mu.svg | 0 .../css/icons/flag-icon-css/flags/mv.svg | 0 .../css/icons/flag-icon-css/flags/mw.svg | 0 .../css/icons/flag-icon-css/flags/mx.svg | 0 .../css/icons/flag-icon-css/flags/my.svg | 0 .../css/icons/flag-icon-css/flags/mz.svg | 0 .../css/icons/flag-icon-css/flags/na.svg | 0 .../css/icons/flag-icon-css/flags/nc.svg | 0 .../css/icons/flag-icon-css/flags/ne.svg | 0 .../css/icons/flag-icon-css/flags/nf.svg | 0 .../css/icons/flag-icon-css/flags/ng.svg | 0 .../css/icons/flag-icon-css/flags/ni.svg | 0 .../css/icons/flag-icon-css/flags/nl.svg | 0 .../css/icons/flag-icon-css/flags/no.svg | 0 .../css/icons/flag-icon-css/flags/np.svg | 0 .../css/icons/flag-icon-css/flags/nr.svg | 0 .../css/icons/flag-icon-css/flags/nu.svg | 0 .../css/icons/flag-icon-css/flags/nz.svg | 0 .../css/icons/flag-icon-css/flags/om.svg | 0 .../css/icons/flag-icon-css/flags/pa.svg | 0 .../css/icons/flag-icon-css/flags/pe.svg | 0 .../css/icons/flag-icon-css/flags/pf.svg | 0 .../css/icons/flag-icon-css/flags/pg.svg | 0 .../css/icons/flag-icon-css/flags/ph.svg | 0 .../css/icons/flag-icon-css/flags/pk.svg | 0 .../css/icons/flag-icon-css/flags/pl.svg | 0 .../css/icons/flag-icon-css/flags/pm.svg | 0 .../css/icons/flag-icon-css/flags/pn.svg | 0 .../css/icons/flag-icon-css/flags/pr.svg | 0 .../css/icons/flag-icon-css/flags/ps.svg | 0 .../css/icons/flag-icon-css/flags/pt.svg | 0 .../css/icons/flag-icon-css/flags/pw.svg | 0 .../css/icons/flag-icon-css/flags/py.svg | 0 .../css/icons/flag-icon-css/flags/qa.svg | 0 .../css/icons/flag-icon-css/flags/re.svg | 0 .../css/icons/flag-icon-css/flags/ro.svg | 0 .../css/icons/flag-icon-css/flags/rs.svg | 0 .../css/icons/flag-icon-css/flags/ru.svg | 0 .../css/icons/flag-icon-css/flags/rw.svg | 0 .../css/icons/flag-icon-css/flags/sa.svg | 0 .../css/icons/flag-icon-css/flags/sb.svg | 0 .../css/icons/flag-icon-css/flags/sc.svg | 0 .../css/icons/flag-icon-css/flags/sd.svg | 0 .../css/icons/flag-icon-css/flags/se.svg | 0 .../css/icons/flag-icon-css/flags/sg.svg | 0 .../css/icons/flag-icon-css/flags/sh.svg | 0 .../css/icons/flag-icon-css/flags/si.svg | 0 .../css/icons/flag-icon-css/flags/sj.svg | 0 .../css/icons/flag-icon-css/flags/sk.svg | 0 .../css/icons/flag-icon-css/flags/sl.svg | 0 .../css/icons/flag-icon-css/flags/sm.svg | 0 .../css/icons/flag-icon-css/flags/sn.svg | 0 .../css/icons/flag-icon-css/flags/so.svg | 0 .../css/icons/flag-icon-css/flags/sr.svg | 0 .../css/icons/flag-icon-css/flags/ss.svg | 0 .../css/icons/flag-icon-css/flags/st.svg | 0 .../css/icons/flag-icon-css/flags/sv.svg | 0 .../css/icons/flag-icon-css/flags/sx.svg | 0 .../css/icons/flag-icon-css/flags/sy.svg | 0 .../css/icons/flag-icon-css/flags/sz.svg | 0 .../css/icons/flag-icon-css/flags/tc.svg | 0 .../css/icons/flag-icon-css/flags/td.svg | 0 .../css/icons/flag-icon-css/flags/tf.svg | 0 .../css/icons/flag-icon-css/flags/tg.svg | 0 .../css/icons/flag-icon-css/flags/th.svg | 0 .../css/icons/flag-icon-css/flags/tj.svg | 0 .../css/icons/flag-icon-css/flags/tk.svg | 0 .../css/icons/flag-icon-css/flags/tl.svg | 0 .../css/icons/flag-icon-css/flags/tm.svg | 0 .../css/icons/flag-icon-css/flags/tn.svg | 0 .../css/icons/flag-icon-css/flags/to.svg | 0 .../css/icons/flag-icon-css/flags/tr.svg | 0 .../css/icons/flag-icon-css/flags/tt.svg | 0 .../css/icons/flag-icon-css/flags/tv.svg | 0 .../css/icons/flag-icon-css/flags/tw.svg | 0 .../css/icons/flag-icon-css/flags/tz.svg | 0 .../css/icons/flag-icon-css/flags/ua.svg | 0 .../css/icons/flag-icon-css/flags/ug.svg | 0 .../css/icons/flag-icon-css/flags/um.svg | 0 .../css/icons/flag-icon-css/flags/us.svg | 0 .../css/icons/flag-icon-css/flags/uy.svg | 0 .../css/icons/flag-icon-css/flags/uz.svg | 0 .../css/icons/flag-icon-css/flags/va.svg | 0 .../css/icons/flag-icon-css/flags/vc.svg | 0 .../css/icons/flag-icon-css/flags/ve.svg | 0 .../css/icons/flag-icon-css/flags/vg.svg | 0 .../css/icons/flag-icon-css/flags/vi.svg | 0 .../css/icons/flag-icon-css/flags/vn.svg | 0 .../css/icons/flag-icon-css/flags/vu.svg | 0 .../css/icons/flag-icon-css/flags/wf.svg | 0 .../css/icons/flag-icon-css/flags/ws.svg | 0 .../css/icons/flag-icon-css/flags/ye.svg | 0 .../css/icons/flag-icon-css/flags/yt.svg | 0 .../css/icons/flag-icon-css/flags/za.svg | 0 .../css/icons/flag-icon-css/flags/zm.svg | 0 .../css/icons/flag-icon-css/flags/zw.svg | 0 .../css/icons/font-awesome/css/fa-brands.css | 0 .../icons/font-awesome/css/fa-brands.min.css | 0 .../css/icons/font-awesome/css/fa-regular.css | 0 .../icons/font-awesome/css/fa-regular.min.css | 0 .../css/icons/font-awesome/css/fa-solid.css | 0 .../icons/font-awesome/css/fa-solid.min.css | 0 .../font-awesome/css/fontawesome-all.css | 0 .../font-awesome/css/fontawesome-all.min.css | 0 .../icons/font-awesome/css/fontawesome.css | 0 .../font-awesome/css/fontawesome.min.css | 0 .../icons/font-awesome/less/_animated.less | 0 .../font-awesome/less/_bordered-pulled.less | 0 .../css/icons/font-awesome/less/_core.less | 0 .../icons/font-awesome/less/_fixed-width.less | 0 .../css/icons/font-awesome/less/_icons.less | 0 .../css/icons/font-awesome/less/_larger.less | 0 .../css/icons/font-awesome/less/_list.less | 0 .../css/icons/font-awesome/less/_mixins.less | 0 .../font-awesome/less/_rotated-flipped.less | 0 .../font-awesome/less/_screen-reader.less | 0 .../css/icons/font-awesome/less/_stacked.less | 0 .../icons/font-awesome/less/_variables.less | 0 .../icons/font-awesome/less/fa-brands.less | 0 .../icons/font-awesome/less/fa-regular.less | 0 .../css/icons/font-awesome/less/fa-solid.less | 0 .../icons/font-awesome/less/fontawesome.less | 0 .../icons/font-awesome/scss/_animated.scss | 0 .../font-awesome/scss/_bordered-pulled.scss | 0 .../css/icons/font-awesome/scss/_core.scss | 0 .../icons/font-awesome/scss/_fixed-width.scss | 0 .../css/icons/font-awesome/scss/_icons.scss | 0 .../css/icons/font-awesome/scss/_larger.scss | 0 .../css/icons/font-awesome/scss/_list.scss | 0 .../css/icons/font-awesome/scss/_mixins.scss | 0 .../font-awesome/scss/_rotated-flipped.scss | 0 .../font-awesome/scss/_screen-reader.scss | 0 .../css/icons/font-awesome/scss/_stacked.scss | 0 .../icons/font-awesome/scss/_variables.scss | 0 .../icons/font-awesome/scss/fa-brands.scss | 0 .../icons/font-awesome/scss/fa-regular.scss | 0 .../css/icons/font-awesome/scss/fa-solid.scss | 0 .../icons/font-awesome/scss/fontawesome.scss | 0 .../font-awesome/webfonts/fa-brands-400.eot | Bin .../font-awesome/webfonts/fa-brands-400.svg | 0 .../font-awesome/webfonts/fa-brands-400.ttf | Bin .../font-awesome/webfonts/fa-brands-400.woff | Bin .../font-awesome/webfonts/fa-brands-400.woff2 | Bin .../font-awesome/webfonts/fa-regular-400.eot | Bin .../font-awesome/webfonts/fa-regular-400.svg | 0 .../font-awesome/webfonts/fa-regular-400.ttf | Bin .../font-awesome/webfonts/fa-regular-400.woff | Bin .../webfonts/fa-regular-400.woff2 | Bin .../font-awesome/webfonts/fa-solid-900.eot | Bin .../font-awesome/webfonts/fa-solid-900.svg | 0 .../font-awesome/webfonts/fa-solid-900.ttf | Bin .../font-awesome/webfonts/fa-solid-900.woff | Bin .../font-awesome/webfonts/fa-solid-900.woff2 | Bin .../css/material-design-iconic-font.css | 0 .../css/material-design-iconic-font.min.css | 0 .../css/materialdesignicons.min.css | 0 .../css/materialdesignicons.min.css.map | 0 .../fonts/Material-Design-Iconic-Font.eot | Bin .../fonts/Material-Design-Iconic-Font.svg | 0 .../fonts/Material-Design-Iconic-Font.ttf | Bin .../fonts/Material-Design-Iconic-Font.woff | Bin .../fonts/Material-Design-Iconic-Font.woff2 | Bin .../fonts/materialdesignicons-webfont.eot | Bin .../fonts/materialdesignicons-webfont.svg | 0 .../fonts/materialdesignicons-webfont.ttf | Bin .../fonts/materialdesignicons-webfont.woff | Bin .../fonts/materialdesignicons-webfont.woff2 | Bin .../css/icons/themify-icons/fonts/themify.eot | Bin .../css/icons/themify-icons/fonts/themify.svg | 0 .../css/icons/themify-icons/fonts/themify.ttf | Bin .../icons/themify-icons/fonts/themify.woff | Bin .../css/icons/themify-icons/ie7/ie7.css | 0 .../assets/css/icons/themify-icons/ie7/ie7.js | 0 .../css/icons/themify-icons/themify-icons.css | 0 .../icons/themify-icons/themify-icons.less | 0 .../resources/static/assets/css/popup.css | 0 .../resources/static/assets/css/spinners.css | 0 .../static/assets/css/spinners.min.css | 0 .../resources/static/assets/css/style.css | 0 .../resources/static/assets/css/style.min.css | 0 .../resources/static/assets/images/Thumbs.db | Bin .../static/assets/images/clients/logo.jpg | Bin .../static/assets/images/custom-select.png | Bin .../static/assets/images/favicon.png | Bin .../static/assets/images/icon/danger.svg | 0 .../static/assets/images/icon/success.svg | 0 .../static/assets/images/icon/warning.svg | 0 .../static/assets/images/klaw_logo.png | Bin .../static/assets/images/klaw_logo_dark.png | Bin .../static/assets/images/logged-user.png | Bin .../resources/static/assets/images/regbg.jpg | Bin .../resources/static/assets/images/regbg1.jpg | Bin .../static/assets/images/tooltip/Euclid.png | Bin .../static/assets/images/tooltip/shape1.svg | 0 .../static/assets/images/tooltip/shape2.svg | 0 .../static/assets/images/tooltip/shape3.svg | 0 .../static/assets/images/tooltip/tooltip1.svg | 0 .../static/assets/images/tooltip/tooltip2.svg | 0 .../static/assets/images/tooltip/tooltip3.svg | 0 .../static/assets/images/users/iconuser.png | Bin .../static/assets/images/users/user-32.png | Bin .../static/assets/js/bootstrap-table.init.js | 0 .../main/resources/static/assets/js/chat.js | 0 .../main/resources/static/assets/js/custom.js | 0 .../resources/static/assets/js/custom.min.js | 0 .../resources/static/assets/js/flot-data.js | 0 .../static/assets/js/footable-init.js | 0 .../static/assets/js/jasny-bootstrap.js | 0 .../static/assets/js/jquery.PrintArea.js | 0 .../static/assets/js/jquery.slimscroll.js | 0 .../resources/static/assets/js/jsgrid-init.js | 0 .../resources/static/assets/js/mask.init.js | 0 .../resources/static/assets/js/morris-data.js | 0 .../resources/static/assets/js/sidebarmenu.js | 0 .../main/resources/static/assets/js/toastr.js | 0 .../resources/static/assets/js/validation.js | 0 .../resources/static/assets/js/validator.js | 0 .../main/resources/static/assets/js/waves.js | 0 .../static/assets/js/widget-charts.js | 0 .../resources/static/assets/js/widget-data.js | 0 .../owl.carousel/owl.carousel - Shortcut.lnk | Bin .../assets/owl.carousel/owl.carousel.js | 0 .../assets/owl.carousel/owl.carousel.min.css | 0 .../assets/owl.carousel/owl.carousel.min.js | 0 .../static/assets/owl.carousel/owl.custom.js | 0 .../assets/owl.carousel/owl.theme.default.css | 0 .../plugins/bootstrap/css/bootstrap-grid.css | 0 .../bootstrap/css/bootstrap-grid.css.map | 0 .../bootstrap/css/bootstrap-grid.min.css | 0 .../bootstrap/css/bootstrap-grid.min.css.map | 0 .../bootstrap/css/bootstrap-reboot.css | 0 .../bootstrap/css/bootstrap-reboot.css.map | 0 .../bootstrap/css/bootstrap-reboot.min.css | 0 .../css/bootstrap-reboot.min.css.map | 0 .../plugins/bootstrap/css/bootstrap.css | 0 .../plugins/bootstrap/css/bootstrap.css.map | 0 .../plugins/bootstrap/css/bootstrap.min.css | 0 .../bootstrap/css/bootstrap.min.css.map | 0 .../plugins/bootstrap/js/bootstrap.bundle.js | 0 .../bootstrap/js/bootstrap.bundle.js.map | 0 .../bootstrap/js/bootstrap.bundle.min.js | 0 .../bootstrap/js/bootstrap.bundle.min.js.map | 0 .../assets/plugins/bootstrap/js/bootstrap.js | 0 .../plugins/bootstrap/js/bootstrap.js.map | 0 .../plugins/bootstrap/js/bootstrap.min.js | 0 .../plugins/bootstrap/js/bootstrap.min.js.map | 0 .../static/assets/plugins/gauge/gauge.min.js | 0 .../assets/plugins/jquery/jquery.min.js | 0 .../assets/plugins/popper/popper.min.js | 0 .../sparkline/jquery.charts-sparkline.js | 0 .../plugins/sparkline/jquery.sparkline.min.js | 0 .../sticky-kit-master/dist/sticky-kit.js | 0 .../sticky-kit-master/dist/sticky-kit.min.js | 0 .../styleswitcher/jQuery.style.switcher.js | 0 .../sweetalert/jquery.sweet-alert.custom.js | 0 .../assets/plugins/sweetalert/sweetalert.css | 0 .../plugins/sweetalert/sweetalert.min.js | 0 .../text-angular/textAngular-rangy.min.js | 0 .../text-angular/textAngular-sanitize.js | 0 .../plugins/text-angular/textAngular.css | 0 .../plugins/text-angular/textAngular.min.js | 0 .../assets/plugins/wizard/jquery.steps.min.js | 0 .../plugins/wizard/jquery.validate.min.js | 0 .../static/assets/plugins/wizard/steps.css | 0 .../static/assets/plugins/wizard/steps.js | 0 .../resources/static/assets/scss/_app.scss | 0 .../resources/static/assets/scss/_forms.scss | 0 .../static/assets/scss/_material.scss | 0 .../resources/static/assets/scss/_pages.scss | 0 .../static/assets/scss/_responsive.scss | 0 .../static/assets/scss/_sidebar.scss | 0 .../static/assets/scss/_variable.scss | 0 .../static/assets/scss/_widgets.scss | 0 .../static/assets/scss/bootstrap/_alert.scss | 0 .../static/assets/scss/bootstrap/_badge.scss | 0 .../assets/scss/bootstrap/_breadcrumb.scss | 0 .../assets/scss/bootstrap/_button-group.scss | 0 .../assets/scss/bootstrap/_buttons.scss | 0 .../static/assets/scss/bootstrap/_card.scss | 0 .../assets/scss/bootstrap/_carousel.scss | 0 .../static/assets/scss/bootstrap/_close.scss | 0 .../static/assets/scss/bootstrap/_code.scss | 0 .../assets/scss/bootstrap/_custom-forms.scss | 0 .../assets/scss/bootstrap/_dropdown.scss | 0 .../static/assets/scss/bootstrap/_forms.scss | 0 .../assets/scss/bootstrap/_functions.scss | 0 .../static/assets/scss/bootstrap/_grid.scss | 0 .../static/assets/scss/bootstrap/_images.scss | 0 .../assets/scss/bootstrap/_input-group.scss | 0 .../assets/scss/bootstrap/_jumbotron.scss | 0 .../assets/scss/bootstrap/_list-group.scss | 0 .../static/assets/scss/bootstrap/_media.scss | 0 .../static/assets/scss/bootstrap/_mixins.scss | 0 .../static/assets/scss/bootstrap/_modal.scss | 0 .../static/assets/scss/bootstrap/_nav.scss | 0 .../static/assets/scss/bootstrap/_navbar.scss | 0 .../assets/scss/bootstrap/_pagination.scss | 0 .../assets/scss/bootstrap/_popover.scss | 0 .../static/assets/scss/bootstrap/_print.scss | 0 .../assets/scss/bootstrap/_progress.scss | 0 .../static/assets/scss/bootstrap/_reboot.scss | 0 .../static/assets/scss/bootstrap/_root.scss | 0 .../assets/scss/bootstrap/_spinners.scss | 0 .../static/assets/scss/bootstrap/_tables.scss | 0 .../static/assets/scss/bootstrap/_toasts.scss | 0 .../assets/scss/bootstrap/_tooltip.scss | 0 .../assets/scss/bootstrap/_transitions.scss | 0 .../static/assets/scss/bootstrap/_type.scss | 0 .../assets/scss/bootstrap/_utilities.scss | 0 .../assets/scss/bootstrap/_variables.scss | 0 .../assets/scss/bootstrap/bootstrap-grid.scss | 0 .../scss/bootstrap/bootstrap-reboot.scss | 0 .../assets/scss/bootstrap/bootstrap.scss | 0 .../assets/scss/bootstrap/mixins/_alert.scss | 0 .../bootstrap/mixins/_background-variant.scss | 0 .../assets/scss/bootstrap/mixins/_badge.scss | 0 .../scss/bootstrap/mixins/_border-radius.scss | 0 .../scss/bootstrap/mixins/_box-shadow.scss | 0 .../scss/bootstrap/mixins/_breakpoints.scss | 0 .../scss/bootstrap/mixins/_buttons.scss | 0 .../assets/scss/bootstrap/mixins/_caret.scss | 0 .../scss/bootstrap/mixins/_clearfix.scss | 0 .../scss/bootstrap/mixins/_deprecate.scss | 0 .../assets/scss/bootstrap/mixins/_float.scss | 0 .../assets/scss/bootstrap/mixins/_forms.scss | 0 .../scss/bootstrap/mixins/_gradients.scss | 0 .../bootstrap/mixins/_grid-framework.scss | 0 .../assets/scss/bootstrap/mixins/_grid.scss | 0 .../assets/scss/bootstrap/mixins/_hover.scss | 0 .../assets/scss/bootstrap/mixins/_image.scss | 0 .../scss/bootstrap/mixins/_list-group.scss | 0 .../assets/scss/bootstrap/mixins/_lists.scss | 0 .../scss/bootstrap/mixins/_nav-divider.scss | 0 .../scss/bootstrap/mixins/_pagination.scss | 0 .../scss/bootstrap/mixins/_reset-text.scss | 0 .../assets/scss/bootstrap/mixins/_resize.scss | 0 .../scss/bootstrap/mixins/_screen-reader.scss | 0 .../assets/scss/bootstrap/mixins/_size.scss | 0 .../scss/bootstrap/mixins/_table-row.scss | 0 .../scss/bootstrap/mixins/_text-emphasis.scss | 0 .../scss/bootstrap/mixins/_text-hide.scss | 0 .../scss/bootstrap/mixins/_text-truncate.scss | 0 .../scss/bootstrap/mixins/_transition.scss | 0 .../scss/bootstrap/mixins/_visibility.scss | 0 .../scss/bootstrap/utilities/_align.scss | 0 .../scss/bootstrap/utilities/_background.scss | 0 .../scss/bootstrap/utilities/_borders.scss | 0 .../scss/bootstrap/utilities/_clearfix.scss | 0 .../scss/bootstrap/utilities/_display.scss | 0 .../scss/bootstrap/utilities/_embed.scss | 0 .../scss/bootstrap/utilities/_flex.scss | 0 .../scss/bootstrap/utilities/_float.scss | 0 .../scss/bootstrap/utilities/_overflow.scss | 0 .../scss/bootstrap/utilities/_position.scss | 0 .../bootstrap/utilities/_screenreaders.scss | 0 .../scss/bootstrap/utilities/_shadows.scss | 0 .../scss/bootstrap/utilities/_sizing.scss | 0 .../scss/bootstrap/utilities/_spacing.scss | 0 .../bootstrap/utilities/_stretched-link.scss | 0 .../scss/bootstrap/utilities/_text.scss | 0 .../scss/bootstrap/utilities/_visibility.scss | 0 .../assets/scss/bootstrap/vendor/_rfs.scss | 0 .../static/assets/scss/colors/blue-dark.scss | 0 .../static/assets/scss/colors/blue.scss | 0 .../assets/scss/colors/default-dark.scss | 0 .../static/assets/scss/colors/default.scss | 0 .../static/assets/scss/colors/green-dark.scss | 0 .../static/assets/scss/colors/green.scss | 0 .../static/assets/scss/colors/megna-dark.scss | 0 .../static/assets/scss/colors/megna.scss | 0 .../assets/scss/colors/purple-dark.scss | 0 .../static/assets/scss/colors/purple.scss | 0 .../static/assets/scss/colors/red-dark.scss | 0 .../static/assets/scss/colors/red.scss | 0 .../resources/static/assets/scss/style.scss | 0 .../assets/typed.js-master/dist/typed.min.js | 0 .../static/assets/typed.js-master/js/typed.js | 0 .../src}/main/resources/static/index.html | 0 .../main/resources/static/js/analytics.js | 0 .../static/js/angular-chart/angular-chart.js | 0 .../js/angular-chart/angular-chart.min.js | 0 .../js/angular-chart/angular-chart.min.js.map | 0 .../main/resources/static/js/browseAcls.js | 0 .../main/resources/static/js/browseTopics.js | 0 .../resources/static/js/connectorOverview.js | 0 .../resources/static/js/dist/Chart.bundle.js | 0 .../static/js/dist/Chart.bundle.min.js | 0 .../main/resources/static/js/dist/Chart.css | 0 .../main/resources/static/js/dist/Chart.js | 0 .../resources/static/js/dist/Chart.min.css | 0 .../resources/static/js/dist/Chart.min.js | 0 .../src}/main/resources/static/js/docs.js | 0 .../src}/main/resources/static/js/envs.js | 0 .../src}/main/resources/static/js/execAcls.js | 0 .../resources/static/js/execConnectors.js | 0 .../main/resources/static/js/execSchemas.js | 0 .../main/resources/static/js/execTopics.js | 0 .../resources/static/js/forgotPassword.js | 0 .../src}/main/resources/static/js/index.js | 0 .../main/resources/static/js/kafkaconnect.js | 0 .../main/resources/static/js/kwmetrics.js | 0 .../main/resources/static/js/loginSaas.js | 0 .../main/resources/static/js/manageUsers.js | 0 .../main/resources/static/js/modifyEnvs.js | 0 .../main/resources/static/js/modifyTeam.js | 0 .../main/resources/static/js/modifyUser.js | 0 .../main/resources/static/js/monitorEnvs.js | 0 .../main/resources/static/js/myRequests.js | 0 .../main/resources/static/js/registerUsers.js | 0 .../main/resources/static/js/requestAcls.js | 0 .../static/js/requestAvroSchemaUpload.js | 0 .../resources/static/js/requestConnector.js | 0 .../main/resources/static/js/requestTopics.js | 0 .../main/resources/static/js/rolesperms.js | 0 .../main/resources/static/js/serverConfig.js | 0 .../resources/static/js/showActivityLog.js | 0 .../main/resources/static/js/syncBackAcls.js | 0 .../resources/static/js/syncBackTopics.js | 0 .../resources/static/js/syncConnectors.js | 0 .../resources/static/js/synchronizeAcls.js | 0 .../resources/static/js/synchronizeTopics.js | 0 .../resources/static/lib/angular-cookies.js | 0 .../static/lib/angular-cookies.min.js | 0 .../static/lib/angular-cookies.min.js.map | 0 .../static/lib/angular-resource.min.js | 0 .../static/lib/angular-resource.min.js.map | 0 .../resources/static/lib/angular-route.min.js | 0 .../static/lib/angular-route.min.js.map | 0 .../main/resources/static/lib/angular-wm.js | 0 .../main/resources/static/lib/angular.min.js | 0 .../resources/static/lib/angular.min.js.map | 0 .../resources/static/lib/jquery-1.10.2.js | 0 .../resources/static/lib/jquery-2.1.1.min.js | 0 .../static/lib/jquery-ui-datepicker.min.js | 0 .../static/lib/jquery-ui-timepicker-addon.js | 0 .../main/resources/static/lib/jquery-ui.js | 0 .../main/resources/static/lib/moment.min.js | 0 .../main/resources/templates/activityLog.html | 0 .../main/resources/templates/addCluster.html | 2 +- .../src}/main/resources/templates/addEnv.html | 0 .../templates/addKafkaConnectEnv.html | 0 .../main/resources/templates/addRole.html | 0 .../resources/templates/addSchemaEnv.html | 0 .../main/resources/templates/addTeam.html | 0 .../main/resources/templates/addTenant.html | 0 .../main/resources/templates/addUser.html | 0 .../main/resources/templates/addUserLdap.html | 0 .../main/resources/templates/analytics.html | 0 .../main/resources/templates/browseAcls.html | 0 .../resources/templates/browseTopics.html | 0 .../main/resources/templates/changePwd.html | 0 .../main/resources/templates/clusters.html | 0 .../templates/connectorOverview.html | 0 .../src}/main/resources/templates/envs.html | 0 .../main/resources/templates/execAcls.html | 0 .../resources/templates/execConnectors.html | 0 .../templates/execRegisteredUsers.html | 0 .../main/resources/templates/execSchemas.html | 0 .../main/resources/templates/execTopics.html | 0 .../main/resources/templates/feedback.html | 0 .../resources/templates/forgotPassword.html | 0 .../main/resources/templates/helpwizard.html | 0 .../src}/main/resources/templates/index.html | 0 .../resources/templates/kafkaConnectors.html | 0 .../main/resources/templates/kwmetrics.html | 0 .../src}/main/resources/templates/login.html | 0 .../main/resources/templates/loginSaas.html | 0 .../resources/templates/modifyCluster.html | 0 .../main/resources/templates/modifyEnv.html | 0 .../main/resources/templates/modifyTeam.html | 0 .../main/resources/templates/modifyUser.html | 0 .../main/resources/templates/monitorEnvs.html | 0 .../resources/templates/myAclRequests.html | 0 .../templates/myConnectorRequests.html | 0 .../main/resources/templates/myProfile.html | 0 .../resources/templates/mySchemaRequests.html | 0 .../resources/templates/myTopicRequests.html | 0 .../main/resources/templates/newADUser.html | 0 .../main/resources/templates/oauthLogin.html | 0 .../main/resources/templates/permissions.html | 0 .../main/resources/templates/register.html | 0 .../resources/templates/registerLdap.html | 0 .../resources/templates/registerSaas.html | 0 .../templates/registrationReview.html | 0 .../templates/registrationReviewSaas.html | 0 .../main/resources/templates/requestAcls.html | 0 .../resources/templates/requestConnector.html | 0 .../resources/templates/requestSchema.html | 0 .../resources/templates/requestTopics.html | 0 .../src}/main/resources/templates/roles.html | 0 .../resources/templates/serverConfig.html | 0 .../main/resources/templates/showTeams.html | 0 .../main/resources/templates/showUsers.html | 0 .../resources/templates/syncBackAcls.html | 0 .../resources/templates/syncBackTopics.html | 0 .../resources/templates/synchronizeAcls.html | 0 .../templates/synchronizeConnectors.html | 0 .../templates/synchronizeTopics.html | 0 .../main/resources/templates/tenantInfo.html | 0 .../main/resources/templates/tenants.html | 0 .../src}/main/resources/templates/terms.html | 0 .../resources/templates/userActivation.html | 0 .../klaw/EnvsClustersTenantsControllerIT.java | 0 .../test/java/io/aiven/klaw/MockMethods.java | 0 .../klaw/RolesPermissionsControllerIT.java | 0 .../io/aiven/klaw/TopicAclControllerIT.java | 0 .../io/aiven/klaw/UsersTeamsControllerIT.java | 0 .../test/java/io/aiven/klaw/UtilMethods.java | 0 .../klaw/controller/AclControllerTest.java | 0 .../SchemaRegstryControllerTest.java | 0 .../ServerConfigControllerTest.java | 0 .../klaw/controller/TopicControllerTest.java | 0 .../controller/UiConfigControllerTest.java | 0 .../klaw/controller/UtilControllerTest.java | 0 .../helpers/db/rdbms/DeleteDataJdbcTest.java | 0 .../helpers/db/rdbms/InsertDataJdbcTest.java | 0 .../helpers/db/rdbms/SelectDataJdbcTest.java | 0 .../helpers/db/rdbms/UpdateDataJdbcTest.java | 0 .../io/aiven/klaw/model/ValidationTest.java | 0 .../service/AclControllerServiceTest.java | 0 .../klaw/service/ClusterApiServiceTest.java | 0 .../io/aiven/klaw/service/MailUtilsTest.java | 0 .../SchemaRegistryControllerServiceTest.java | 0 .../klaw/service/ServerConfigServiceTest.java | 0 .../service/TopicControllerServiceTest.java | 0 .../UiConfigControllerServiceTest.java | 0 .../test-application-rdbms.properties | 3 +- .../test-application-rdbms1.properties | 3 +- pom.xml | 215 ++------ 935 files changed, 4678 insertions(+), 324 deletions(-) delete mode 100644 ReleaseNotes.txt create mode 100644 cluster-api/pom.xml create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/KafkaClusterApiApplication.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/JwtRequestFilter.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SecurityConfig.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SslContextConfig.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/ClusterApiController.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/KafkaConnectController.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/MetricsApiController.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/TopicContentsController.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclIPPrincipleType.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclPatternType.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclType.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclsNativeType.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclResponse.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclStruct.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResponse.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResultStatus.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterAclRequest.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterConnectorRequest.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterSchemaRequest.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterStatus.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterTopicRequest.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaClustersType.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaSupportedProtocol.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/RequestOperationType.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/AivenApiService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaAclService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaTopicService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/JwtTokenUtilService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/KafkaConnectService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MetricsApiService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MonitoringService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/SchemaService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/TopicContentsService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/UtilComponentsService.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/AdminClientProperties.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/ClusterApiUtils.java create mode 100644 cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/MetricsUtils.java create mode 100644 cluster-api/src/main/resources/application.properties create mode 100644 cluster-api/src/main/resources/banner.txt create mode 100644 cluster-api/src/test/java/io/aiven/klaw/clusterapi/AuthenticationIntegrationTest.java create mode 100644 cluster-api/src/test/java/io/aiven/klaw/clusterapi/UtilMethods.java create mode 100644 cluster-api/src/test/java/io/aiven/klaw/clusterapi/controller/ClusterApiControllerTest.java create mode 100644 cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/AivenApiServiceTest.java create mode 100644 cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/UtilComponentsServiceTest.java create mode 100644 cluster-api/src/test/java/io/aiven/klaw/clusterapi/utils/GetAdminClientTest.java create mode 100644 cluster-api/src/test/resources/application.properties create mode 100644 cluster-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 coral/Makefile create mode 100644 core/pom.xml rename {src => core/src}/main/java/io/aiven/klaw/UiapiApplication.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/auth/KwAuthenticationFailureHandler.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/auth/KwAuthenticationService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/auth/KwAuthenticationSuccessHandler.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/auth/KwRequestFilter.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/CacheConfig.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/DataSourceConfig.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/EmailConfig.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/Http2Config.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/ManageDatabase.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/SecurityConfigNoSSO.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/SecurityConfigSSO.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/config/WebConfig.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/AclController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/AclSyncController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/AnalyticsController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/CoralController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/EnvsClustersTenantsController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/KafkaConnectController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/KafkaConnectSyncController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/MetricsController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/ResourceClientController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/RolesPermissionsController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/SchemaRegstryController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/ServerConfigController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/TemplateMapController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/TopicController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/TopicSyncController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/UiConfigController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/UsersTeamsController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/controller/UtilController.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/Acl.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/AclID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/AclRequestID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/AclRequests.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/ActivityLog.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/ActivityLogID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/Env.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/EnvID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KafkaConnectorRequest.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KafkaConnectorRequestID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwClusterID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwClusters.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwKafkaConnector.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwKafkaConnectorID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwMetrics.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwProperties.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwPropertiesID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwRolesPermissions.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwRolesPermissionsID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/KwTenants.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/MessageSchema.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/MessageSchemaID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/ProductDetails.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/RegisterUserInfo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/SchemaRequest.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/SchemaRequestID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/Team.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/TeamID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/Topic.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/TopicID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/TopicRequest.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/TopicRequestID.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/dao/UserInfo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/error/KlawException.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/error/KlawExceptionHandler.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/helpers/HandleDbRequests.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbc.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/helpers/db/rdbms/HandleDbRequestsJdbc.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/helpers/db/rdbms/JdbcDataSourceCondition.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbc.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/listeners/MetadataListener.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/AclIPPrincipleType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/AclInfo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/AclPatternType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/AclPermissionType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/AclRequestsModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/AclType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/AclsNativeType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/ActivityLogModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/ApiResponse.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/ApiResultStatus.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/CaptchaResponse.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/ClusterStatus.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/ConnectorOverview.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/EntityType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/EnvModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KafkaClustersType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KafkaConnectorModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KafkaConnectorRequestModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KafkaFlavors.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KafkaSupportedProtocol.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KwClustersModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KwMetadataUpdates.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KwPropertiesModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KwRolesPermissionsModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KwTenantConfigModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/KwTenantModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/MailType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/MetadataOperationType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/PermissionType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/RegisterSaasUserInfoModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/RegisterUserInfoModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/RequestOperationType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/RequestStatus.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/RolesType.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/SchemaRequestModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/ServerConfigProperties.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/SyncAclUpdates.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/SyncBackAcls.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/SyncBackTopics.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/SyncConnectorUpdates.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/SyncTopicUpdates.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/SyncTopicsBulk.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/TeamModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/TenantConfig.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/TopicHistory.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/TopicInfo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/TopicOverview.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/TopicRequestModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/TopicRequestTypes.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/UserInfoModel.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/charts/ChartsJsOverview.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/charts/JmxOverview.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/charts/Options.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/charts/Scales.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/charts/TeamOverview.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/charts/Title.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/charts/YAx.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/cluster/ClusterAclRequest.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/cluster/ClusterConnectorRequest.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/cluster/ClusterSchemaRequest.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/cluster/ClusterTopicRequest.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/model/connectorconfig/ConnectorConfig.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/perf/CreateBulkTests.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/AclRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/AclRequestsRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/ActivityLogRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/EnvRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/KwClusterRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/KwKafkaConnectorRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/KwKafkaConnectorRequestsRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/KwMetricsRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/KwPropertiesRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/KwRolesPermsRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/MessageSchemaRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/ProductDetailsRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/RegisterInfoRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/SchemaRequestRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/TeamRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/TenantRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/TopicRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/TopicRequestsRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/repository/UserInfoRepo.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/AclControllerService.java (99%) rename {src => core/src}/main/java/io/aiven/klaw/service/AclSyncControllerService.java (99%) rename {src => core/src}/main/java/io/aiven/klaw/service/AnalyticsControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/ClusterApiService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/CommonUtilsService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/DefaultDataService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/EmailService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/EnvControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/KwConstants.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/MailUtils.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/MetricsControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/SaasService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/SchemaRegstryControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/ServerConfigService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/TopicControllerService.java (99%) rename {src => core/src}/main/java/io/aiven/klaw/service/TopicSyncControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/UiConfigControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/UiControllerLoginService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/UtilControllerService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/service/ValidateCaptchaService.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/uglify/UglifyFiles.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/validation/KafkaClusterValidator.java (100%) rename {src => core/src}/main/java/io/aiven/klaw/validation/KafkaClusterValidatorImpl.java (100%) rename {src => core/src}/main/resources/application.properties (99%) rename {src => core/src}/main/resources/banner.txt (100%) rename {src => core/src}/main/resources/db/changelog/changelog.yaml (100%) rename {src => core/src}/main/resources/openapi_spec.json (100%) rename {src => core/src}/main/resources/scripts/base/rdbms/db-grants.sql (100%) rename {src => core/src}/main/resources/scripts/base/rdbms/ddl-jdbc.sql (100%) rename {src => core/src}/main/resources/scripts/base/rdbms/dropjdbc.sql (100%) rename {src => core/src}/main/resources/static/assets/css/animate.css (100%) rename {src => core/src}/main/resources/static/assets/css/animate.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/colors/blue-dark.css (100%) rename {src => core/src}/main/resources/static/assets/css/colors/blue.css (100%) rename {src => core/src}/main/resources/static/assets/css/colors/default-dark.css (100%) rename {src => core/src}/main/resources/static/assets/css/colors/default.css (100%) rename {src => core/src}/main/resources/static/assets/css/custom.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flag-icon.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ad.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ae.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/af.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ag.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ai.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/al.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/am.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ao.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/aq.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ar.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/as.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/at.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/au.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/aw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ax.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/az.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ba.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bb.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bd.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/be.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bh.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bi.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bj.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bl.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bo.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bq.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/br.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bs.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bt.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bv.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/by.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/bz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ca.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cc.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cd.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ch.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ci.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ck.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cl.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/co.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cu.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cv.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cx.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cy.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/cz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/de.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/dj.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/dk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/dm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/do.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/dz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ec.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ee.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/eg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/eh.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/er.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/es.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/et.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/fi.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/fj.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/fk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/fm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/fo.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/fr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ga.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gb.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gd.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ge.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gh.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gi.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gl.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gp.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gq.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gs.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gt.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gu.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/gy.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/hk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/hm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/hn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/hr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ht.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/hu.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/id.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ie.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/il.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/im.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/in.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/io.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/iq.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ir.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/is.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/it.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/je.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/jm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/jo.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/jp.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ke.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/kg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/kh.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ki.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/km.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/kn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/kp.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/kr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/kw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ky.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/kz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/la.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/lb.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/lc.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/li.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/lk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/lr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ls.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/lt.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/lu.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/lv.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ly.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ma.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mc.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/md.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/me.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mh.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ml.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mo.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mp.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mq.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ms.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mt.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mu.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mv.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mx.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/my.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/mz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/na.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/nc.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ne.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/nf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ng.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ni.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/nl.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/no.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/np.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/nr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/nu.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/nz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/om.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pa.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pe.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ph.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pl.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ps.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pt.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/pw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/py.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/qa.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/re.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ro.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/rs.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ru.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/rw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sa.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sb.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sc.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sd.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/se.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sh.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/si.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sj.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sl.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/so.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ss.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/st.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sv.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sx.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sy.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/sz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tc.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/td.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/th.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tj.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tk.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tl.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/to.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tr.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tt.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tv.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/tz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ua.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ug.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/um.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/us.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/uy.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/uz.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/va.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/vc.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ve.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/vg.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/vi.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/vn.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/vu.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/wf.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ws.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/ye.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/yt.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/za.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/zm.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/flag-icon-css/flags/zw.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_animated.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_bordered-pulled.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_core.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_fixed-width.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_icons.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_larger.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_list.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_mixins.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_rotated-flipped.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_screen-reader.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_stacked.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/_variables.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/fa-brands.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/fa-regular.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/fa-solid.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/less/fontawesome.less (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_animated.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_bordered-pulled.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_core.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_fixed-width.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_icons.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_larger.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_list.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_mixins.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_rotated-flipped.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_screen-reader.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_stacked.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/_variables.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/fa-brands.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/fa-regular.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/fa-solid.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/scss/fontawesome.scss (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.eot (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.ttf (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff2 (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.eot (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.ttf (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff2 (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.eot (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.ttf (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff (100%) rename {src => core/src}/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff2 (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css.map (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.eot (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.ttf (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff2 (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.eot (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.ttf (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff (100%) rename {src => core/src}/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff2 (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/fonts/themify.eot (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/fonts/themify.svg (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/fonts/themify.ttf (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/fonts/themify.woff (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.js (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/themify-icons.css (100%) rename {src => core/src}/main/resources/static/assets/css/icons/themify-icons/themify-icons.less (100%) rename {src => core/src}/main/resources/static/assets/css/popup.css (100%) rename {src => core/src}/main/resources/static/assets/css/spinners.css (100%) rename {src => core/src}/main/resources/static/assets/css/spinners.min.css (100%) rename {src => core/src}/main/resources/static/assets/css/style.css (100%) rename {src => core/src}/main/resources/static/assets/css/style.min.css (100%) rename {src => core/src}/main/resources/static/assets/images/Thumbs.db (100%) rename {src => core/src}/main/resources/static/assets/images/clients/logo.jpg (100%) rename {src => core/src}/main/resources/static/assets/images/custom-select.png (100%) rename {src => core/src}/main/resources/static/assets/images/favicon.png (100%) rename {src => core/src}/main/resources/static/assets/images/icon/danger.svg (100%) rename {src => core/src}/main/resources/static/assets/images/icon/success.svg (100%) rename {src => core/src}/main/resources/static/assets/images/icon/warning.svg (100%) rename {src => core/src}/main/resources/static/assets/images/klaw_logo.png (100%) rename {src => core/src}/main/resources/static/assets/images/klaw_logo_dark.png (100%) rename {src => core/src}/main/resources/static/assets/images/logged-user.png (100%) rename {src => core/src}/main/resources/static/assets/images/regbg.jpg (100%) rename {src => core/src}/main/resources/static/assets/images/regbg1.jpg (100%) rename {src => core/src}/main/resources/static/assets/images/tooltip/Euclid.png (100%) rename {src => core/src}/main/resources/static/assets/images/tooltip/shape1.svg (100%) rename {src => core/src}/main/resources/static/assets/images/tooltip/shape2.svg (100%) rename {src => core/src}/main/resources/static/assets/images/tooltip/shape3.svg (100%) rename {src => core/src}/main/resources/static/assets/images/tooltip/tooltip1.svg (100%) rename {src => core/src}/main/resources/static/assets/images/tooltip/tooltip2.svg (100%) rename {src => core/src}/main/resources/static/assets/images/tooltip/tooltip3.svg (100%) rename {src => core/src}/main/resources/static/assets/images/users/iconuser.png (100%) rename {src => core/src}/main/resources/static/assets/images/users/user-32.png (100%) rename {src => core/src}/main/resources/static/assets/js/bootstrap-table.init.js (100%) rename {src => core/src}/main/resources/static/assets/js/chat.js (100%) rename {src => core/src}/main/resources/static/assets/js/custom.js (100%) rename {src => core/src}/main/resources/static/assets/js/custom.min.js (100%) rename {src => core/src}/main/resources/static/assets/js/flot-data.js (100%) rename {src => core/src}/main/resources/static/assets/js/footable-init.js (100%) rename {src => core/src}/main/resources/static/assets/js/jasny-bootstrap.js (100%) rename {src => core/src}/main/resources/static/assets/js/jquery.PrintArea.js (100%) rename {src => core/src}/main/resources/static/assets/js/jquery.slimscroll.js (100%) rename {src => core/src}/main/resources/static/assets/js/jsgrid-init.js (100%) rename {src => core/src}/main/resources/static/assets/js/mask.init.js (100%) rename {src => core/src}/main/resources/static/assets/js/morris-data.js (100%) rename {src => core/src}/main/resources/static/assets/js/sidebarmenu.js (100%) rename {src => core/src}/main/resources/static/assets/js/toastr.js (100%) rename {src => core/src}/main/resources/static/assets/js/validation.js (100%) rename {src => core/src}/main/resources/static/assets/js/validator.js (100%) rename {src => core/src}/main/resources/static/assets/js/waves.js (100%) rename {src => core/src}/main/resources/static/assets/js/widget-charts.js (100%) rename {src => core/src}/main/resources/static/assets/js/widget-data.js (100%) rename {src => core/src}/main/resources/static/assets/owl.carousel/owl.carousel - Shortcut.lnk (100%) rename {src => core/src}/main/resources/static/assets/owl.carousel/owl.carousel.js (100%) rename {src => core/src}/main/resources/static/assets/owl.carousel/owl.carousel.min.css (100%) rename {src => core/src}/main/resources/static/assets/owl.carousel/owl.carousel.min.js (100%) rename {src => core/src}/main/resources/static/assets/owl.carousel/owl.custom.js (100%) rename {src => core/src}/main/resources/static/assets/owl.carousel/owl.theme.default.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js.map (100%) rename {src => core/src}/main/resources/static/assets/plugins/gauge/gauge.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/jquery/jquery.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/popper/popper.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/sparkline/jquery.charts-sparkline.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/sparkline/jquery.sparkline.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/styleswitcher/jQuery.style.switcher.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/sweetalert/jquery.sweet-alert.custom.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/sweetalert/sweetalert.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/sweetalert/sweetalert.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/text-angular/textAngular-rangy.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/text-angular/textAngular-sanitize.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/text-angular/textAngular.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/text-angular/textAngular.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/wizard/jquery.steps.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/wizard/jquery.validate.min.js (100%) rename {src => core/src}/main/resources/static/assets/plugins/wizard/steps.css (100%) rename {src => core/src}/main/resources/static/assets/plugins/wizard/steps.js (100%) rename {src => core/src}/main/resources/static/assets/scss/_app.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/_forms.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/_material.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/_pages.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/_responsive.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/_sidebar.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/_variable.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/_widgets.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_alert.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_badge.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_breadcrumb.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_button-group.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_buttons.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_card.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_carousel.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_close.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_code.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_custom-forms.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_dropdown.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_forms.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_functions.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_grid.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_images.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_input-group.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_jumbotron.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_list-group.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_media.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_mixins.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_modal.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_nav.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_navbar.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_pagination.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_popover.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_print.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_progress.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_reboot.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_root.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_spinners.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_tables.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_toasts.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_tooltip.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_transitions.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_type.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_utilities.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/_variables.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/bootstrap-grid.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/bootstrap-reboot.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/bootstrap.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_alert.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_background-variant.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_badge.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_border-radius.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_box-shadow.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_breakpoints.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_buttons.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_caret.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_clearfix.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_deprecate.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_float.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_forms.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_gradients.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_grid-framework.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_grid.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_hover.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_image.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_list-group.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_lists.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_nav-divider.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_pagination.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_reset-text.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_resize.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_screen-reader.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_size.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_table-row.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_text-emphasis.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_text-hide.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_text-truncate.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_transition.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/mixins/_visibility.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_align.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_background.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_borders.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_clearfix.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_display.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_embed.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_flex.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_float.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_overflow.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_position.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_screenreaders.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_shadows.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_sizing.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_spacing.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_stretched-link.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_text.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/utilities/_visibility.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/bootstrap/vendor/_rfs.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/blue-dark.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/blue.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/default-dark.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/default.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/green-dark.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/green.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/megna-dark.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/megna.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/purple-dark.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/purple.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/red-dark.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/colors/red.scss (100%) rename {src => core/src}/main/resources/static/assets/scss/style.scss (100%) rename {src => core/src}/main/resources/static/assets/typed.js-master/dist/typed.min.js (100%) rename {src => core/src}/main/resources/static/assets/typed.js-master/js/typed.js (100%) rename {src => core/src}/main/resources/static/index.html (100%) rename {src => core/src}/main/resources/static/js/analytics.js (100%) rename {src => core/src}/main/resources/static/js/angular-chart/angular-chart.js (100%) rename {src => core/src}/main/resources/static/js/angular-chart/angular-chart.min.js (100%) rename {src => core/src}/main/resources/static/js/angular-chart/angular-chart.min.js.map (100%) rename {src => core/src}/main/resources/static/js/browseAcls.js (100%) rename {src => core/src}/main/resources/static/js/browseTopics.js (100%) rename {src => core/src}/main/resources/static/js/connectorOverview.js (100%) rename {src => core/src}/main/resources/static/js/dist/Chart.bundle.js (100%) rename {src => core/src}/main/resources/static/js/dist/Chart.bundle.min.js (100%) rename {src => core/src}/main/resources/static/js/dist/Chart.css (100%) rename {src => core/src}/main/resources/static/js/dist/Chart.js (100%) rename {src => core/src}/main/resources/static/js/dist/Chart.min.css (100%) rename {src => core/src}/main/resources/static/js/dist/Chart.min.js (100%) rename {src => core/src}/main/resources/static/js/docs.js (100%) rename {src => core/src}/main/resources/static/js/envs.js (100%) rename {src => core/src}/main/resources/static/js/execAcls.js (100%) rename {src => core/src}/main/resources/static/js/execConnectors.js (100%) rename {src => core/src}/main/resources/static/js/execSchemas.js (100%) rename {src => core/src}/main/resources/static/js/execTopics.js (100%) rename {src => core/src}/main/resources/static/js/forgotPassword.js (100%) rename {src => core/src}/main/resources/static/js/index.js (100%) rename {src => core/src}/main/resources/static/js/kafkaconnect.js (100%) rename {src => core/src}/main/resources/static/js/kwmetrics.js (100%) rename {src => core/src}/main/resources/static/js/loginSaas.js (100%) rename {src => core/src}/main/resources/static/js/manageUsers.js (100%) rename {src => core/src}/main/resources/static/js/modifyEnvs.js (100%) rename {src => core/src}/main/resources/static/js/modifyTeam.js (100%) rename {src => core/src}/main/resources/static/js/modifyUser.js (100%) rename {src => core/src}/main/resources/static/js/monitorEnvs.js (100%) rename {src => core/src}/main/resources/static/js/myRequests.js (100%) rename {src => core/src}/main/resources/static/js/registerUsers.js (100%) rename {src => core/src}/main/resources/static/js/requestAcls.js (100%) rename {src => core/src}/main/resources/static/js/requestAvroSchemaUpload.js (100%) rename {src => core/src}/main/resources/static/js/requestConnector.js (100%) rename {src => core/src}/main/resources/static/js/requestTopics.js (100%) rename {src => core/src}/main/resources/static/js/rolesperms.js (100%) rename {src => core/src}/main/resources/static/js/serverConfig.js (100%) rename {src => core/src}/main/resources/static/js/showActivityLog.js (100%) rename {src => core/src}/main/resources/static/js/syncBackAcls.js (100%) rename {src => core/src}/main/resources/static/js/syncBackTopics.js (100%) rename {src => core/src}/main/resources/static/js/syncConnectors.js (100%) rename {src => core/src}/main/resources/static/js/synchronizeAcls.js (100%) rename {src => core/src}/main/resources/static/js/synchronizeTopics.js (100%) rename {src => core/src}/main/resources/static/lib/angular-cookies.js (100%) rename {src => core/src}/main/resources/static/lib/angular-cookies.min.js (100%) rename {src => core/src}/main/resources/static/lib/angular-cookies.min.js.map (100%) rename {src => core/src}/main/resources/static/lib/angular-resource.min.js (100%) rename {src => core/src}/main/resources/static/lib/angular-resource.min.js.map (100%) rename {src => core/src}/main/resources/static/lib/angular-route.min.js (100%) rename {src => core/src}/main/resources/static/lib/angular-route.min.js.map (100%) rename {src => core/src}/main/resources/static/lib/angular-wm.js (100%) rename {src => core/src}/main/resources/static/lib/angular.min.js (100%) rename {src => core/src}/main/resources/static/lib/angular.min.js.map (100%) rename {src => core/src}/main/resources/static/lib/jquery-1.10.2.js (100%) rename {src => core/src}/main/resources/static/lib/jquery-2.1.1.min.js (100%) rename {src => core/src}/main/resources/static/lib/jquery-ui-datepicker.min.js (100%) rename {src => core/src}/main/resources/static/lib/jquery-ui-timepicker-addon.js (100%) rename {src => core/src}/main/resources/static/lib/jquery-ui.js (100%) rename {src => core/src}/main/resources/static/lib/moment.min.js (100%) rename {src => core/src}/main/resources/templates/activityLog.html (100%) rename {src => core/src}/main/resources/templates/addCluster.html (99%) rename {src => core/src}/main/resources/templates/addEnv.html (100%) rename {src => core/src}/main/resources/templates/addKafkaConnectEnv.html (100%) rename {src => core/src}/main/resources/templates/addRole.html (100%) rename {src => core/src}/main/resources/templates/addSchemaEnv.html (100%) rename {src => core/src}/main/resources/templates/addTeam.html (100%) rename {src => core/src}/main/resources/templates/addTenant.html (100%) rename {src => core/src}/main/resources/templates/addUser.html (100%) rename {src => core/src}/main/resources/templates/addUserLdap.html (100%) rename {src => core/src}/main/resources/templates/analytics.html (100%) rename {src => core/src}/main/resources/templates/browseAcls.html (100%) rename {src => core/src}/main/resources/templates/browseTopics.html (100%) rename {src => core/src}/main/resources/templates/changePwd.html (100%) rename {src => core/src}/main/resources/templates/clusters.html (100%) rename {src => core/src}/main/resources/templates/connectorOverview.html (100%) rename {src => core/src}/main/resources/templates/envs.html (100%) rename {src => core/src}/main/resources/templates/execAcls.html (100%) rename {src => core/src}/main/resources/templates/execConnectors.html (100%) rename {src => core/src}/main/resources/templates/execRegisteredUsers.html (100%) rename {src => core/src}/main/resources/templates/execSchemas.html (100%) rename {src => core/src}/main/resources/templates/execTopics.html (100%) rename {src => core/src}/main/resources/templates/feedback.html (100%) rename {src => core/src}/main/resources/templates/forgotPassword.html (100%) rename {src => core/src}/main/resources/templates/helpwizard.html (100%) rename {src => core/src}/main/resources/templates/index.html (100%) rename {src => core/src}/main/resources/templates/kafkaConnectors.html (100%) rename {src => core/src}/main/resources/templates/kwmetrics.html (100%) rename {src => core/src}/main/resources/templates/login.html (100%) rename {src => core/src}/main/resources/templates/loginSaas.html (100%) rename {src => core/src}/main/resources/templates/modifyCluster.html (100%) rename {src => core/src}/main/resources/templates/modifyEnv.html (100%) rename {src => core/src}/main/resources/templates/modifyTeam.html (100%) rename {src => core/src}/main/resources/templates/modifyUser.html (100%) rename {src => core/src}/main/resources/templates/monitorEnvs.html (100%) rename {src => core/src}/main/resources/templates/myAclRequests.html (100%) rename {src => core/src}/main/resources/templates/myConnectorRequests.html (100%) rename {src => core/src}/main/resources/templates/myProfile.html (100%) rename {src => core/src}/main/resources/templates/mySchemaRequests.html (100%) rename {src => core/src}/main/resources/templates/myTopicRequests.html (100%) rename {src => core/src}/main/resources/templates/newADUser.html (100%) rename {src => core/src}/main/resources/templates/oauthLogin.html (100%) rename {src => core/src}/main/resources/templates/permissions.html (100%) rename {src => core/src}/main/resources/templates/register.html (100%) rename {src => core/src}/main/resources/templates/registerLdap.html (100%) rename {src => core/src}/main/resources/templates/registerSaas.html (100%) rename {src => core/src}/main/resources/templates/registrationReview.html (100%) rename {src => core/src}/main/resources/templates/registrationReviewSaas.html (100%) rename {src => core/src}/main/resources/templates/requestAcls.html (100%) rename {src => core/src}/main/resources/templates/requestConnector.html (100%) rename {src => core/src}/main/resources/templates/requestSchema.html (100%) rename {src => core/src}/main/resources/templates/requestTopics.html (100%) rename {src => core/src}/main/resources/templates/roles.html (100%) rename {src => core/src}/main/resources/templates/serverConfig.html (100%) rename {src => core/src}/main/resources/templates/showTeams.html (100%) rename {src => core/src}/main/resources/templates/showUsers.html (100%) rename {src => core/src}/main/resources/templates/syncBackAcls.html (100%) rename {src => core/src}/main/resources/templates/syncBackTopics.html (100%) rename {src => core/src}/main/resources/templates/synchronizeAcls.html (100%) rename {src => core/src}/main/resources/templates/synchronizeConnectors.html (100%) rename {src => core/src}/main/resources/templates/synchronizeTopics.html (100%) rename {src => core/src}/main/resources/templates/tenantInfo.html (100%) rename {src => core/src}/main/resources/templates/tenants.html (100%) rename {src => core/src}/main/resources/templates/terms.html (100%) rename {src => core/src}/main/resources/templates/userActivation.html (100%) rename {src => core/src}/test/java/io/aiven/klaw/EnvsClustersTenantsControllerIT.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/MockMethods.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/RolesPermissionsControllerIT.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/TopicAclControllerIT.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/UsersTeamsControllerIT.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/UtilMethods.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/controller/AclControllerTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/controller/SchemaRegstryControllerTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/controller/ServerConfigControllerTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/controller/TopicControllerTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/controller/UiConfigControllerTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/controller/UtilControllerTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbcTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbcTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbcTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/model/ValidationTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/service/AclControllerServiceTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/service/ClusterApiServiceTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/service/MailUtilsTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java (100%) rename {src => core/src}/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java (100%) rename {src => core/src}/test/resources/test-application-rdbms.properties (98%) rename {src => core/src}/test/resources/test-application-rdbms1.properties (98%) diff --git a/.gitignore b/.gitignore index 9704821dee..25f5e811f2 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ hs_err_pid* .idea target +logs # OS generated files .DS_Store diff --git a/Makefile b/Makefile index 3cac50be81..46a8a9714d 100644 --- a/Makefile +++ b/Makefile @@ -1,27 +1,21 @@ -CORAL_DIST_PATH = coral/dist +version = 1.1.0 -default: - @echo "TODO: ADD USAGE INSTRUCTIONS" +build_all: klaw_core cluster_api -$(CORAL_DIST_PATH): coral/index.html coral/src/* - pnpm --prefix coral build --assetsDir assets/coral --mode springboot +klaw_core: + cd core && mvn clean verify -src/main/resources/templates/coral/index.html: $(CORAL_DIST_PATH) - mkdir -p $(shell dirname $@) - cp -r $(CORAL_DIST_PATH)/index.html $@ +cluster_api: + cd cluster-api && mvn clean verify -src/main/resources/static/assets/coral: $(CORAL_DIST_PATH) - cp -r $(CORAL_DIST_PATH)/assets/* $@ +edit-core-config: + ${EDITOR} core/target/classes/application.properties -.PHONY: enable-coral-in-springboot -enable-coral-in-springboot: src/main/resources/templates/coral/index.html src/main/resources/static/assets/coral - sed -i "" 's/klaw\.coral\.enabled=false/klaw\.coral\.enabled=true/' src/main/resources/application.properties +edit-cluster-api-config: + ${EDITOR} cluster-api/target/classes/application.properties -.PHONY: disable-coral-in-springboot -disable-coral-in-springboot: - sed -i "" 's/klaw\.coral\.enabled=true/klaw\.coral\.enabled=false/' src/main/resources/application.properties - -clean: - rm -rf src/main/resources/templates/coral - rm -rf src/main/resources/static/assets/coral +run-core: + java -jar core/target/klaw-$(version).jar +run-cluster-api: + java -jar cluster-api/target/cluster-api-$(version).jar --spring.config.location=cluster-api/target/classes/application.properties \ No newline at end of file diff --git a/README.md b/README.md index a9bfe8d196..4d54576801 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,6 @@ For the versions available, see the [tags on this repository](https://github.com ![Architecture](https://github.com/aiven/klaw/blob/main/arch.png) -## Dependency project: - -### ClusterApi -https://github.com/aiven/klaw-cluster-api - ## Work in progress The directory `/coral` contains a React app. It's an ongoing rewrite of the existing Klaw frontend. The app Frontend app is not used in Klaw at the moment. @@ -106,9 +101,23 @@ The directory `/coral` contains a React app. It's an ongoing rewrite of the exis ## Install +### Manual mvn clean install -and follow steps defined at https://klaw-project.io/docs +Builds two artifacts core/target/klaw-.jar and cluster-api/target/cluster-api-.jar + +and follow steps defined at https://klaw-project.io/docs or run the binaries like below + +java -jar core/target/klaw-.jar + +java -jar cluster-api/target/cluster-api-.jar --spring.config.location=cluster-api/target/classes/application.properties + +### With `make` + +1. Clone this repo containing two maven modules (core and cluster-api) : `git clone git@github.com:aiven/klaw.git` +2. Run `make` to install dependencies and setup both Klaw Core and the Klaw-Cluster-Api +3. [Optional] edit any configs using `make edit-core-config` for Klaw Core or `make edit-cluster-api-config` for Klaw-Cluster-API +4. To run, you can use `make run-core` and `make run-cluster-api` in different terminal windows or you can run `make -j2 run-core run-cluster-api` to execute both (NOTE: this will mix output and make debugging harder) ## License diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt deleted file mode 100644 index aa17b50bc0..0000000000 --- a/ReleaseNotes.txt +++ /dev/null @@ -1,110 +0,0 @@ -Release Notes: - -- Klaw (formerly Kafkawize) Release 1.0.0 - -- This release is cloned from master branch of https://github.com/muralibasani/kafkawize -- Package renamed to io.aiven.klaw -- Introduced 'kafka flavor' in the configuration of clusters -- Changes to manage Aiven Acls -- All occurences of Kafkawize renamed to Klaw -- Synchronize Aiven kafka acls from cluster to Klaw (for existing Kafka clusters) -- Few code enhancements - ------------------------------------------------------------------------------------ - -- The below changes are part of release 5.0.3 - -- ACLs can be added based on Usernames (plain text principals). Ex : alice, john - On kafka cluster, Producer acls reflects like below for user 'alice' for a topic. - (principal=User:alice, host=*, operation=WRITE, permissionType=ALLOW) - (principal=User:alice, host=*, operation=WRITE, permissionType=ALLOW) - ------------------------------------------------------------------------------------ -- The below changes are part of release 5.0.2 - -- Introducing Liquibase for all database migrations -- Recaptcha validation can be disabled if running in saas mode - ------------------------------------------------------------------------------------ - -- The below changes are part of release 5.0.1 - -- Now users can request for multiple acls in one request. Earlier it was either one IP address or one principal in one request. -- Minor bug fix - ------------------------------------------------------------------------------------ - -The below changes are part of release Kafkawize 5.0.0 - -Total Kafkawize pro code is merged to Opensource version. Includes all the features. - -Features: - -Topics (approval): Create, Update, Delete, Promote -Acls (approval): Create -Connectors (approval): Create -Avro Schemas (approval): Create -Topic Overview : - Topic Config - Promote - Literal and Prefixed subscriptions - Topic documentation - Consumer offsets/ lag - View topic contents -View created, completed, declined, all Topic requests -View created, completed, declined, all Acl requests -View created, completed, declined, all Connector requests -View created, completed, declined, all Avro schema requests - -Synchronization from and to kafka clusters -Reconciliation and email notifications on differences between Kafkawize and Clusters -Restore configuration (topics, acls) - -Login : - Active directory integration - Single Sign-on (OAuth2) - -Clusters and Environments - Clusters can be created connecting to Kafka clusters. (Cluster Management Api should be configured) - Environments are wrappers over clusters, enforcing flexible configs like prefix, suffix etc - -Users, Teams & Authorizations - Configurable users, teams - More than 35 permissions - Configurable roles (Roles can be pulled from AD for authorization) - -Topic naming conventions - Enforce prefix and suffixes per environment - -Excel report (for your team and all teams, depending on the role) - Topics per cluster (for teams) - Partitions per cluster - Overall topics in all clusters - Acls per cluster (for teams) - Producer Acls (for teams) - Consumer Acls (for teams) - Consumer groups of all environments - Requests per day - -Analytics - View charts of topics, partitions, acls, requests - -Multi tenancy - Each tenant can manage their topics with their own teams in isolation. - Every tenant can have their own set of Kafka environments, and users - of one tenant cannot view/access topics, acls or any from other tenants. - It provides an isolation avoiding any security breach. - -Kafka Connectivity - PLAINTEXT, SSL, SASL - -Audit - All topic, acl, schema and connector requests - -Email notifications when - requests are created, approved, declined - users are created, approved - -Help Wizard to setup Kafkawize - -Documentation : https://klaw-project.io/docs diff --git a/cluster-api/pom.xml b/cluster-api/pom.xml new file mode 100644 index 0000000000..b0f1e359ff --- /dev/null +++ b/cluster-api/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + io.aiven + klaw-project + 1.1.0 + + + cluster-api + jar + Klaw Cluster Api + Aiven Klaw - Cluster Api with connectivity to kafka clusters + + + UTF-8 + UTF-8 + 11 + + 3.12.0 + 31.1-jre + 3.3.1 + + + + + org.apache.kafka + kafka-clients + ${kafka.client.version} + + + org.apache.commons + commons-lang3 + ${apache.commons.lang.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + true + + + + + + + \ No newline at end of file diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/KafkaClusterApiApplication.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/KafkaClusterApiApplication.java new file mode 100644 index 0000000000..668acca242 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/KafkaClusterApiApplication.java @@ -0,0 +1,12 @@ +package io.aiven.klaw.clusterapi; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class KafkaClusterApiApplication { + + public static void main(String[] args) { + SpringApplication.run(KafkaClusterApiApplication.class, args); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/JwtRequestFilter.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/JwtRequestFilter.java new file mode 100644 index 0000000000..feffa334f0 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/JwtRequestFilter.java @@ -0,0 +1,133 @@ +package io.aiven.klaw.clusterapi.config; + +import io.aiven.klaw.clusterapi.services.JwtTokenUtilService; +import io.jsonwebtoken.ExpiredJwtException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +@Component +@Slf4j +public class JwtRequestFilter extends OncePerRequestFilter { + + private static final String BEARER = "Bearer "; + private static final String USERNAME = "username"; + private static final String TOKEN = "token"; + private final JwtTokenUtilService jwtTokenUtil; + private final UserDetailsService userDetailsService; + + public JwtRequestFilter( + UserDetailsService userDetailsService, JwtTokenUtilService jwtTokenUtilService) { + this.userDetailsService = userDetailsService; + this.jwtTokenUtil = jwtTokenUtilService; + } + + @Override + protected void doFilterInternal( + HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + final Map userTokenMap = new HashMap<>(); + if (isUnAuthorizedRequest(request, response, userTokenMap)) return; + + validateToken(request, response, chain, userTokenMap); + } + + private boolean isUnAuthorizedRequest( + HttpServletRequest request, HttpServletResponse response, Map userTokenMap) + throws IOException { + final String requestTokenHeader = request.getHeader("Authorization"); + String jwtToken; + + // JWT Token is in the form "Bearer token". Remove Bearer word and get + // only the Token + if (requestTokenHeader != null && requestTokenHeader.startsWith(BEARER)) { + jwtToken = requestTokenHeader.substring(BEARER.length()); + userTokenMap.put(TOKEN, jwtToken); + return extractUsernameFromToken(response, userTokenMap, jwtToken); + } else { + if (requestTokenHeader != null) { + log.warn( + "Invalid JWT : {}", + requestTokenHeader.substring(0, Math.min(requestTokenHeader.length(), 10))); + } + + log.warn("JWT Token does not begin with Bearer String"); + } + return false; + } + + private boolean extractUsernameFromToken( + HttpServletResponse response, Map userTokenMap, String jwtToken) + throws IOException { + String username; + try { + username = jwtTokenUtil.getUsernameFromToken(jwtToken); + userTokenMap.put(USERNAME, username); + return false; + } catch (IllegalArgumentException e) { + log.info("Unable to get JWT Token ", e); + } catch (ExpiredJwtException e) { + log.info("JWT Token has expired", e); + } catch (Exception e) { + log.info("Token validation errors ", e); + } + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return true; + } + + // Once we get the token validate it. + private void validateToken( + HttpServletRequest request, + HttpServletResponse response, + FilterChain chain, + Map userTokenMap) + throws IOException, ServletException { + if (userTokenMap.containsKey(USERNAME) + && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails; + try { + userDetails = this.userDetailsService.loadUserByUsername(userTokenMap.get(USERNAME)); + } catch (UsernameNotFoundException e) { + throw new RuntimeException("User/subject not found !!", e); + } + validateTokenAndUserDetails(request, response, userTokenMap, userDetails); + } + chain.doFilter(request, response); + } + + private void validateTokenAndUserDetails( + HttpServletRequest request, + HttpServletResponse response, + Map userTokenMap, + UserDetails userDetails) + throws IOException { + // authentication + if (userDetails != null + && userTokenMap.containsKey(TOKEN) + && jwtTokenUtil.validateToken(userTokenMap.get(TOKEN))) { + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + usernamePasswordAuthenticationToken.setDetails( + new WebAuthenticationDetailsSource().buildDetails(request)); + // After setting the Authentication in the context, we specify + // that the current user is authenticated. So it passes the + // Spring Security Configurations successfully. + SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + } else { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + } + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SecurityConfig.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SecurityConfig.java new file mode 100644 index 0000000000..8916658546 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SecurityConfig.java @@ -0,0 +1,60 @@ +package io.aiven.klaw.clusterapi.config; + +import io.aiven.klaw.clusterapi.services.JwtTokenUtilService; +import java.util.Properties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Primary; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@EnableWebSecurity +@Slf4j +public class SecurityConfig { + @Value("${klaw.clusterapi.access.username:kwuser}") + private String clusterApiUser; + + @Lazy @Autowired private UserDetailsService userDetailsService; + + private final JwtTokenUtilService jwtTokenUtilService; + + public SecurityConfig(JwtTokenUtilService jwtTokenUtilService) { + this.jwtTokenUtilService = jwtTokenUtilService; + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf().disable(); + http.formLogin().disable(); + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + http.authorizeRequests().anyRequest().fullyAuthenticated(); + http.addFilterBefore( + new JwtRequestFilter(userDetailsService, jwtTokenUtilService), + UsernamePasswordAuthenticationFilter.class); + + return http.build(); + } + + @Bean + @Primary + public UserDetailsService getUserDetailsService() throws Exception { + final Properties globalUsers = new Properties(); + log.info("Loading user !!"); + try { + globalUsers.put(clusterApiUser, ",ADMIN,enabled"); + } catch (Exception e) { + log.error("Error : User not loaded {}.", clusterApiUser, e); + throw new Exception("Error : Cluster Api User not loaded. Exiting."); + } + + return new InMemoryUserDetailsManager(globalUsers); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SslContextConfig.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SslContextConfig.java new file mode 100644 index 0000000000..083381e620 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/config/SslContextConfig.java @@ -0,0 +1,84 @@ +package io.aiven.klaw.clusterapi.config; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import javax.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustStrategy; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.util.ResourceUtils; + +@Configuration +@Slf4j +public class SslContextConfig { + + @Value("${server.ssl.trust-store:null}") + private String trustStore; + + @Value("${server.ssl.trust-store-password:null}") + private String trustStorePwd; + + @Value("${server.ssl.key-store:null}") + private String keyStore; + + @Value("${server.ssl.key-store-password:null}") + private String keyStorePwd; + + @Value("${server.ssl.key-store-type:JKS}") + private String keyStoreType; + + public static HttpComponentsClientHttpRequestFactory requestFactory; + + @PostConstruct + public void setKwSSLContext() throws Exception { + if (keyStore != null && !keyStore.equals("null")) { + TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true; + javax.net.ssl.SSLContext sslContext = null; + try { + sslContext = + org.apache.http.ssl.SSLContexts.custom() + .loadKeyMaterial(getStore(keyStorePwd, keyStore), keyStorePwd.toCharArray()) + .loadTrustMaterial(null, acceptingTrustStrategy) + .build(); + } catch (NoSuchAlgorithmException + | KeyManagementException + | KeyStoreException + | CertificateException + | UnrecoverableKeyException + | IOException e) { + log.error("Exception:", e); + throw new Exception("Unable to load TLS certs"); + } + SSLConnectionSocketFactory csf; + if (sslContext != null) { + csf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); + CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build(); + requestFactory = new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); + } + } + } + + protected KeyStore getStore(String secret, String storeLoc) + throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { + + File key = ResourceUtils.getFile(storeLoc); + + final KeyStore store = KeyStore.getInstance(keyStoreType); + try (InputStream inputStream = new FileInputStream(key)) { + store.load(inputStream, secret.toCharArray()); + } + return store; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/ClusterApiController.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/ClusterApiController.java new file mode 100644 index 0000000000..02b77a4748 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/ClusterApiController.java @@ -0,0 +1,252 @@ +package io.aiven.klaw.clusterapi.controller; + +import io.aiven.klaw.clusterapi.models.AclType; +import io.aiven.klaw.clusterapi.models.AclsNativeType; +import io.aiven.klaw.clusterapi.models.ApiResponse; +import io.aiven.klaw.clusterapi.models.ClusterAclRequest; +import io.aiven.klaw.clusterapi.models.ClusterSchemaRequest; +import io.aiven.klaw.clusterapi.models.ClusterStatus; +import io.aiven.klaw.clusterapi.models.ClusterTopicRequest; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.services.AivenApiService; +import io.aiven.klaw.clusterapi.services.ApacheKafkaAclService; +import io.aiven.klaw.clusterapi.services.ApacheKafkaTopicService; +import io.aiven.klaw.clusterapi.services.MonitoringService; +import io.aiven.klaw.clusterapi.services.SchemaService; +import io.aiven.klaw.clusterapi.services.UtilComponentsService; +import java.util.*; +import javax.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/topics") +@Slf4j +@AllArgsConstructor +public class ClusterApiController { + + UtilComponentsService utilComponentsService; + + ApacheKafkaAclService apacheKafkaAclService; + + ApacheKafkaTopicService apacheKafkaTopicService; + + SchemaService schemaService; + + MonitoringService monitoringService; + + AivenApiService aivenApiService; + + @RequestMapping( + value = "/getApiStatus", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity getApiStatus() { + return new ResponseEntity<>(ClusterStatus.ONLINE, HttpStatus.OK); + } + + // @RequestMapping(value = "/reloadTruststore/{protocol}/{clusterName}", method = + // RequestMethod.GET,produces = {MediaType.APPLICATION_JSON_VALUE}) + // public ResponseEntity reloadTruststore(@PathVariable String protocol, + // @PathVariable String clusterName){ + // return new ResponseEntity<>(manageKafkaComponents.reloadTruststore(protocol, + // clusterName), HttpStatus.OK); + // } + + @RequestMapping( + value = "/getStatus/{bootstrapServers}/{protocol}/{clusterName}/{clusterType}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity getStatus( + @PathVariable String bootstrapServers, + @Valid @PathVariable KafkaSupportedProtocol protocol, + @PathVariable String clusterName, + @PathVariable String clusterType) { + return new ResponseEntity<>( + utilComponentsService.getStatus(bootstrapServers, protocol, clusterName, clusterType), + HttpStatus.OK); + } + + @RequestMapping( + value = "/getTopics/{bootstrapServers}/{protocol}/{clusterName}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity>> getTopics( + @PathVariable String bootstrapServers, + @Valid @PathVariable KafkaSupportedProtocol protocol, + @PathVariable String clusterName) + throws Exception { + Set> topics = + apacheKafkaTopicService.loadTopics(bootstrapServers, protocol, clusterName); + return new ResponseEntity<>(topics, HttpStatus.OK); + } + + @RequestMapping( + value = + "/getAcls/{bootstrapServers}/{aclsNativeType}/{protocol}/{clusterName}/{projectName}/{serviceName}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity>> getAcls( + @PathVariable String bootstrapServers, + @Valid @PathVariable KafkaSupportedProtocol protocol, + @PathVariable String clusterName, + @PathVariable String aclsNativeType, + @PathVariable String projectName, + @PathVariable String serviceName) + throws Exception { + Set> acls; + if (AclsNativeType.NATIVE.name().equals(aclsNativeType)) { + acls = apacheKafkaAclService.loadAcls(bootstrapServers, protocol, clusterName); + } else { + acls = aivenApiService.listAcls(projectName, serviceName); + } + return new ResponseEntity<>(acls, HttpStatus.OK); + } + + @RequestMapping( + value = "/getSchema/{bootstrapServers}/{protocol}/{clusterName}/{topicName}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity>> getSchema( + @PathVariable String bootstrapServers, + @Valid @PathVariable KafkaSupportedProtocol protocol, + @PathVariable String topicName, + @PathVariable String clusterName) { + Map> schema = + schemaService.getSchema(bootstrapServers, protocol, topicName); + return new ResponseEntity<>(schema, HttpStatus.OK); + } + + @RequestMapping( + value = + "/getConsumerOffsets/{bootstrapServers}/{protocol}/{clusterName}/{consumerGroupId}/{topicName}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity>> getConsumerOffsets( + @PathVariable String bootstrapServers, + @Valid @PathVariable KafkaSupportedProtocol protocol, + @PathVariable String clusterName, + @PathVariable String consumerGroupId, + @PathVariable String topicName) + throws Exception { + List> consumerOffsetDetails = + monitoringService.getConsumerGroupDetails( + consumerGroupId, topicName, bootstrapServers, protocol, clusterName); + + return new ResponseEntity<>(consumerOffsetDetails, HttpStatus.OK); + } + + @PostMapping(value = "/createTopics") + public ResponseEntity createTopics( + @RequestBody @Valid ClusterTopicRequest clusterTopicRequest) { + try { + log.info("createTopics clusterTopicRequest {}", clusterTopicRequest); + return new ResponseEntity<>( + apacheKafkaTopicService.createTopic(clusterTopicRequest), HttpStatus.OK); + } catch (Exception e) { + return handleException(e); + } + } + + @PostMapping(value = "/updateTopics") + public ResponseEntity updateTopics( + @RequestBody @Valid ClusterTopicRequest clusterTopicRequest) { + try { + log.info("updateTopics clusterTopicRequest {}", clusterTopicRequest); + return new ResponseEntity<>( + apacheKafkaTopicService.updateTopic(clusterTopicRequest), HttpStatus.OK); + } catch (Exception e) { + return handleException(e); + } + } + + @PostMapping(value = "/deleteTopics") + public ResponseEntity deleteTopics( + @RequestBody @Valid ClusterTopicRequest clusterTopicRequest) { + try { + return new ResponseEntity<>( + apacheKafkaTopicService.deleteTopic(clusterTopicRequest), HttpStatus.OK); + } catch (Exception e) { + return handleException(e); + } + } + + @PostMapping(value = "/createAcls") + public ResponseEntity createAcls( + @RequestBody @Valid ClusterAclRequest clusterAclRequest) { + + Map resultMap = new HashMap<>(); + String result; + try { + if (AclsNativeType.NATIVE.name().equals(clusterAclRequest.getAclNativeType())) { + if (AclType.PRODUCER.value.equals(clusterAclRequest.getAclType())) { + result = apacheKafkaAclService.updateProducerAcl(clusterAclRequest); + } else { + result = apacheKafkaAclService.updateConsumerAcl(clusterAclRequest); + } + return new ResponseEntity<>(ApiResponse.builder().result(result).build(), HttpStatus.OK); + } else if (AclsNativeType.AIVEN.name().equals(clusterAclRequest.getAclNativeType())) { + resultMap = aivenApiService.createAcls(clusterAclRequest); + return new ResponseEntity<>( + ApiResponse.builder().result(resultMap.get("result")).data(resultMap).build(), + HttpStatus.OK); + } + } catch (Exception e) { + resultMap.put("result", "failure " + e.getMessage()); + return new ResponseEntity<>( + ApiResponse.builder().result("failure " + e.getMessage()).build(), + HttpStatus.INTERNAL_SERVER_ERROR); + } + resultMap.put("result", "Not a valid request"); + return new ResponseEntity<>( + ApiResponse.builder().result("Not a valid request").build(), + HttpStatus.INTERNAL_SERVER_ERROR); + } + + @PostMapping(value = "/deleteAcls") + public ResponseEntity deleteAcls( + @RequestBody @Valid ClusterAclRequest clusterAclRequest) { + String result; + try { + if (AclsNativeType.NATIVE.name().equals(clusterAclRequest.getAclNativeType())) { + + if (AclType.PRODUCER.value.equals(clusterAclRequest.getAclType())) { + result = apacheKafkaAclService.updateProducerAcl(clusterAclRequest); + } else { + result = apacheKafkaAclService.updateConsumerAcl(clusterAclRequest); + } + + return new ResponseEntity<>(ApiResponse.builder().result(result).build(), HttpStatus.OK); + } else if (AclsNativeType.AIVEN.name().equals(clusterAclRequest.getAclNativeType())) { + result = aivenApiService.deleteAcls(clusterAclRequest); + + return new ResponseEntity<>(ApiResponse.builder().result(result).build(), HttpStatus.OK); + } + + } catch (Exception e) { + return handleException(e); + } + return new ResponseEntity<>( + ApiResponse.builder().result("Not a valid request").build(), + HttpStatus.INTERNAL_SERVER_ERROR); + } + + @PostMapping(value = "/postSchema") + public ResponseEntity postSchema( + @RequestBody @Valid ClusterSchemaRequest clusterSchemaRequest) { + try { + return new ResponseEntity<>( + schemaService.registerSchema(clusterSchemaRequest), HttpStatus.OK); + } catch (Exception e) { + return handleException(e); + } + } + + private static ResponseEntity handleException(Exception e) { + log.error("Exception:", e); + return new ResponseEntity<>( + ApiResponse.builder().result(e.getMessage()).build(), HttpStatus.INTERNAL_SERVER_ERROR); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/KafkaConnectController.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/KafkaConnectController.java new file mode 100644 index 0000000000..5e876ac6f8 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/KafkaConnectController.java @@ -0,0 +1,72 @@ +package io.aiven.klaw.clusterapi.controller; + +import io.aiven.klaw.clusterapi.models.ApiResponse; +import io.aiven.klaw.clusterapi.models.ClusterConnectorRequest; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.services.KafkaConnectService; +import java.util.*; +import javax.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/topics") +@Slf4j +public class KafkaConnectController { + + @Autowired KafkaConnectService kafkaConnectService; + + @RequestMapping( + value = "/getAllConnectors/{kafkaConnectHost}/{protocol}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity> getAllConnectors( + @PathVariable String kafkaConnectHost, @Valid @PathVariable KafkaSupportedProtocol protocol) { + return new ResponseEntity<>( + kafkaConnectService.getConnectors(kafkaConnectHost, protocol), HttpStatus.OK); + } + + @RequestMapping( + value = "/getConnectorDetails/{connectorName}/{kafkaConnectHost}/{protocol}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity> getConnectorDetails( + @PathVariable String connectorName, + @PathVariable String kafkaConnectHost, + @Valid @PathVariable KafkaSupportedProtocol protocol) { + return new ResponseEntity<>( + kafkaConnectService.getConnectorDetails(connectorName, kafkaConnectHost, protocol), + HttpStatus.OK); + } + + @PostMapping(value = "/postConnector") + public ResponseEntity postConnector( + @RequestBody @Valid ClusterConnectorRequest clusterConnectorRequest) { + try { + ApiResponse result = kafkaConnectService.postNewConnector(clusterConnectorRequest); + return new ResponseEntity<>(result, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>( + ApiResponse.builder().result("Unable to register connector").build(), + HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping(value = "/updateConnector") + public ResponseEntity> updateConnector( + @RequestBody @Valid ClusterConnectorRequest clusterConnectorRequest) { + return new ResponseEntity<>( + kafkaConnectService.updateConnector(clusterConnectorRequest), HttpStatus.OK); + } + + @PostMapping(value = "/deleteConnector") + public ResponseEntity> deleteConnector( + @RequestBody @Valid ClusterConnectorRequest clusterConnectorRequest) { + return new ResponseEntity<>( + kafkaConnectService.deleteConnector(clusterConnectorRequest), HttpStatus.OK); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/MetricsApiController.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/MetricsApiController.java new file mode 100644 index 0000000000..05a016c5cf --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/MetricsApiController.java @@ -0,0 +1,27 @@ +package io.aiven.klaw.clusterapi.controller; + +import io.aiven.klaw.clusterapi.services.MetricsApiService; +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/metrics") +public class MetricsApiController { + + // JMX_HOST is hardcoded here below as this is work in progress and not totally integrated. + public static final String JMX_HOST = "localhost:9996"; + @Autowired MetricsApiService metricsApiService; + + @PostMapping(value = "/getMetrics") + public ResponseEntity> getMetrics( + @RequestBody MultiValueMap metricsRequest) throws Exception { + String metricsObjectName = "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec"; + String jmxUrl = "service:jmx:rmi:///jndi/rmi://" + JMX_HOST + "/jmxrmi"; + return new ResponseEntity<>( + metricsApiService.getMetrics(jmxUrl, metricsObjectName), HttpStatus.OK); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/TopicContentsController.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/TopicContentsController.java new file mode 100644 index 0000000000..217b560c02 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/controller/TopicContentsController.java @@ -0,0 +1,47 @@ +package io.aiven.klaw.clusterapi.controller; + +import io.aiven.klaw.clusterapi.services.TopicContentsService; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/topics") +@Slf4j +public class TopicContentsController { + + @Autowired TopicContentsService topicContentsService; + + @RequestMapping( + value = + "/getTopicContents/{bootstrapServers}/{protocol}/{clusterName}/{consumerGroupId}/{topicName}/{offsetPosition}", + method = RequestMethod.GET, + produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity> getTopicContents( + @PathVariable String bootstrapServers, + @PathVariable String protocol, + @PathVariable String clusterName, + @PathVariable String consumerGroupId, + @PathVariable String topicName, + @PathVariable int offsetPosition) + throws Exception { + Map events = + topicContentsService.readEvents( + bootstrapServers, + protocol, + clusterName, + consumerGroupId, + topicName, + offsetPosition, + "OFFSET_ID"); + + return new ResponseEntity<>(events, HttpStatus.OK); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclIPPrincipleType.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclIPPrincipleType.java new file mode 100644 index 0000000000..0a9f352899 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclIPPrincipleType.java @@ -0,0 +1,7 @@ +package io.aiven.klaw.clusterapi.models; + +public enum AclIPPrincipleType { + IP_ADDRESS, + PRINCIPAL, + USERNAME +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclPatternType.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclPatternType.java new file mode 100644 index 0000000000..8a3d2ca4b3 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclPatternType.java @@ -0,0 +1,12 @@ +package io.aiven.klaw.clusterapi.models; + +public enum AclPatternType { + PREFIXED("PREFIXED"), + LITERAL("LITERAL"); + + public final String value; + + AclPatternType(String value) { + this.value = value; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclType.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclType.java new file mode 100644 index 0000000000..6f0bf8cac9 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclType.java @@ -0,0 +1,12 @@ +package io.aiven.klaw.clusterapi.models; + +public enum AclType { + PRODUCER("Producer"), + CONSUMER("Consumer"); + + public final String value; + + AclType(String value) { + this.value = value; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclsNativeType.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclsNativeType.java new file mode 100644 index 0000000000..2640518c3d --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AclsNativeType.java @@ -0,0 +1,6 @@ +package io.aiven.klaw.clusterapi.models; + +public enum AclsNativeType { + NATIVE, + AIVEN +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclResponse.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclResponse.java new file mode 100644 index 0000000000..4c0e2e9b7a --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclResponse.java @@ -0,0 +1,11 @@ +package io.aiven.klaw.clusterapi.models; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AivenAclResponse { + AivenAclStruct[] acl; + String message; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclStruct.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclStruct.java new file mode 100644 index 0000000000..0612cb2b4e --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/AivenAclStruct.java @@ -0,0 +1,16 @@ +package io.aiven.klaw.clusterapi.models; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AivenAclStruct { + private String id; + + private String permission; + + private String topic; + + private String username; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResponse.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResponse.java new file mode 100644 index 0000000000..0d38147277 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResponse.java @@ -0,0 +1,28 @@ +package io.aiven.klaw.clusterapi.models; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +@Builder +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ApiResponse { + private HttpStatus status; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss") + private LocalDateTime timestamp; + + private String message; + + private String debugMessage; + + private String result; + + private Object data; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResultStatus.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResultStatus.java new file mode 100644 index 0000000000..6acfd3b421 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ApiResultStatus.java @@ -0,0 +1,13 @@ +package io.aiven.klaw.clusterapi.models; + +public enum ApiResultStatus { + SUCCESS("success"), + ERROR("error"), + FAILURE("failure"); + + public final String value; + + private ApiResultStatus(String value) { + this.value = value; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterAclRequest.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterAclRequest.java new file mode 100644 index 0000000000..e1430510f5 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterAclRequest.java @@ -0,0 +1,47 @@ +package io.aiven.klaw.clusterapi.models; + +import java.io.Serializable; +import javax.validation.constraints.NotNull; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class ClusterAclRequest implements Serializable { + + @NotNull private String aclNativeType; + + @NotNull private RequestOperationType requestOperationType; + + @NotNull private String topicName; + + private String projectName; + + private String serviceName; + + private String username; + + private String permission; + + private String env; + + private KafkaSupportedProtocol protocol; + + private String clusterName; + + private String consumerGroup; + + private String aclType; + + private String aclIp; + + private String aclSsl; + + private String transactionalId; + + private String aclIpPrincipleType; + + private boolean isPrefixAcl; + + private String aivenAclKey; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterConnectorRequest.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterConnectorRequest.java new file mode 100644 index 0000000000..9cd4ed2f91 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterConnectorRequest.java @@ -0,0 +1,19 @@ +package io.aiven.klaw.clusterapi.models; + +import java.io.Serializable; +import javax.validation.constraints.NotNull; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class ClusterConnectorRequest implements Serializable { + + @NotNull private String env; + + @NotNull private KafkaSupportedProtocol protocol; + + @NotNull private String connectorConfig; + + @NotNull private String connectorName; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterSchemaRequest.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterSchemaRequest.java new file mode 100644 index 0000000000..c4bedcdbc5 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterSchemaRequest.java @@ -0,0 +1,18 @@ +package io.aiven.klaw.clusterapi.models; + +import java.io.Serializable; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class ClusterSchemaRequest implements Serializable { + + private String env; + + private KafkaSupportedProtocol protocol; + + private String topicName; + + private String fullSchema; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterStatus.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterStatus.java new file mode 100644 index 0000000000..8593ce3f11 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterStatus.java @@ -0,0 +1,13 @@ +package io.aiven.klaw.clusterapi.models; + +public enum ClusterStatus { + OFFLINE("OFFLINE"), + ONLINE("ONLINE"), + NOT_KNOWN("NOT_KNOWN"); + + public final String value; + + ClusterStatus(String value) { + this.value = value; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterTopicRequest.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterTopicRequest.java new file mode 100644 index 0000000000..e7d61dc089 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/ClusterTopicRequest.java @@ -0,0 +1,21 @@ +package io.aiven.klaw.clusterapi.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class ClusterTopicRequest { + @JsonProperty private String env; + + @JsonProperty private int partitions; + + @JsonProperty private short replicationFactor; + + @JsonProperty private KafkaSupportedProtocol protocol; + + @JsonProperty private String clusterName; + + @JsonProperty private String topicName; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaClustersType.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaClustersType.java new file mode 100644 index 0000000000..280c9439f3 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaClustersType.java @@ -0,0 +1,13 @@ +package io.aiven.klaw.clusterapi.models; + +public enum KafkaClustersType { + KAFKA("kafka"), + SCHEMA_REGISTRY("schemaregistry"), + KAFKA_CONNECT("kafkaconnect"); + + public final String value; + + private KafkaClustersType(String value) { + this.value = value; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaSupportedProtocol.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaSupportedProtocol.java new file mode 100644 index 0000000000..db6e10be66 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/KafkaSupportedProtocol.java @@ -0,0 +1,25 @@ +package io.aiven.klaw.clusterapi.models; + +public enum KafkaSupportedProtocol { + PLAINTEXT("PLAINTEXT"), + SSL("SSL"), + SASL_PLAIN("SASL_PLAIN"), + SASL_SSL_PLAIN_MECHANISM("SASL_SSL/PLAIN"), + SASL_SSL_GSSAPI_MECHANISM("SASL_SSL/GSSAPI"), + SASL_SSL_SCRAM_MECHANISM_256("SASL_SSL/SCRAM-SHA-256"), + SASL_SSL_SCRAM_MECHANISM_512("SASL_SSL/SCRAM-SHA-512"); + + public final String value; + + public String getName() { + return name(); + } + + public String getValue() { + return value; + } + + KafkaSupportedProtocol(String value) { + this.value = value; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/RequestOperationType.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/RequestOperationType.java new file mode 100644 index 0000000000..4c3d59709b --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/models/RequestOperationType.java @@ -0,0 +1,13 @@ +package io.aiven.klaw.clusterapi.models; + +public enum RequestOperationType { + CREATE("Create"), + UPDATE("Update"), + DELETE("Delete"); + + public final String value; + + RequestOperationType(String value) { + this.value = value; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/AivenApiService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/AivenApiService.java new file mode 100644 index 0000000000..b1d5032ab5 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/AivenApiService.java @@ -0,0 +1,174 @@ +package io.aiven.klaw.clusterapi.services; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.aiven.klaw.clusterapi.models.AivenAclResponse; +import io.aiven.klaw.clusterapi.models.AivenAclStruct; +import io.aiven.klaw.clusterapi.models.ApiResultStatus; +import io.aiven.klaw.clusterapi.models.ClusterAclRequest; +import java.util.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@Service +@Slf4j +public class AivenApiService { + + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + @Value("${klaw.clusters.accesstoken:accesstoken}") + private String clusterAccessToken; + + @Value("${klaw.clusters.listacls.api:api}") + private String listAclsApiEndpoint; + + @Value("${klaw.clusters.addacls.api:api}") + private String addAclsApiEndpoint; + + @Value("${klaw.clusters.deleteacls.api:api}") + private String deleteAclsApiEndpoint; + + public Map createAcls(ClusterAclRequest clusterAclRequest) { + Map resultMap = new HashMap<>(); + RestTemplate restTemplate = getRestTemplate(); + String projectName = clusterAclRequest.getProjectName(); + String serviceName = clusterAclRequest.getServiceName(); + + LinkedHashMap permissionsMap = new LinkedHashMap<>(); + permissionsMap.put("topic", clusterAclRequest.getTopicName()); + permissionsMap.put("permission", clusterAclRequest.getPermission()); + permissionsMap.put("username", clusterAclRequest.getUsername()); + + String uri = + addAclsApiEndpoint.replace("projectName", projectName).replace("serviceName", serviceName); + + HttpHeaders headers = getHttpHeaders(); + HttpEntity> request = new HttpEntity<>(permissionsMap, headers); + + try { + ResponseEntity response = restTemplate.postForEntity(uri, request, String.class); + AivenAclResponse aivenAclResponse = + OBJECT_MAPPER.readValue(response.getBody(), AivenAclResponse.class); + Optional aivenAclStructOptional = + Arrays.stream(aivenAclResponse.getAcl()) + .filter( + acl -> + acl.getUsername().equals(clusterAclRequest.getUsername()) + && acl.getTopic().equals(clusterAclRequest.getTopicName()) + && acl.getPermission().equals(clusterAclRequest.getPermission())) + .findFirst(); + aivenAclStructOptional.ifPresent( + aivenAclStruct -> resultMap.put("aivenaclid", aivenAclStruct.getId())); + + if (response.getStatusCode().equals(HttpStatus.OK)) { + resultMap.put("result", ApiResultStatus.SUCCESS.value); + } else { + resultMap.put("result", "Failure in adding acls" + response.getBody()); + } + + return resultMap; + } catch (Exception e) { + log.error("Exception:", e); + resultMap.put("result", "Failure in adding acls" + e.getMessage()); + return resultMap; + } + } + + public String deleteAcls(ClusterAclRequest clusterAclRequest) throws Exception { + RestTemplate restTemplate = getRestTemplate(); + + try { + String projectName = clusterAclRequest.getProjectName(); + String serviceName = clusterAclRequest.getServiceName(); + String aclId = clusterAclRequest.getAivenAclKey(); + + String uri = + deleteAclsApiEndpoint + .replace("projectName", projectName) + .replace("serviceName", serviceName) + .replace("aclId", aclId); + + HttpHeaders headers = getHttpHeaders(); + HttpEntity request = new HttpEntity<>(headers); + restTemplate.exchange(uri, HttpMethod.DELETE, request, Object.class); + } catch (Exception e) { + log.error("Exception:", e); + throw new Exception("Error in deleting acls " + e.getMessage()); + } + + return ApiResultStatus.SUCCESS.value; + } + + public Set> listAcls(String projectName, String serviceName) + throws Exception { + RestTemplate restTemplate = getRestTemplate(); + log.info("listAcls {} {}", projectName, serviceName); + Set> acls = new HashSet<>(); + + String uri = + listAclsApiEndpoint.replace("projectName", projectName).replace("serviceName", serviceName); + + HttpHeaders headers = getHttpHeaders(); + HttpEntity> request = new HttpEntity<>(headers); + + try { + ResponseEntity>>> responseEntity = + restTemplate.exchange( + uri, HttpMethod.GET, request, new ParameterizedTypeReference<>() {}); + + List> aclsList = + Objects.requireNonNull(responseEntity.getBody()).get("acl"); + List> aclsListUpdated = new ArrayList<>(); + for (Map aclsMap : aclsList) { + Map aclsMapUpdated = new HashMap<>(); + for (String keyAcls : aclsMap.keySet()) { + switch (keyAcls) { + case "id": + aclsMapUpdated.put("aivenaclid", aclsMap.get(keyAcls)); + break; + case "permission": + aclsMapUpdated.put("operation", aclsMap.get(keyAcls).toUpperCase()); + aclsMapUpdated.put("resourceType", "TOPIC"); + break; + case "topic": + aclsMapUpdated.put("resourceName", aclsMap.get(keyAcls)); + break; + case "username": + aclsMapUpdated.put("principle", aclsMap.get(keyAcls)); + break; + } + } + aclsMapUpdated.put("host", "*"); + aclsMapUpdated.put("permissionType", "ALLOW"); + if ("READ".equals(aclsMapUpdated.get("operation"))) { + Map newRGroupMap = new HashMap<>(aclsMapUpdated); + newRGroupMap.put("resourceType", "GROUP"); + newRGroupMap.put("resourceName", "-na-"); + aclsListUpdated.add(newRGroupMap); + } + if (!"ADMIN".equals(aclsMapUpdated.get("operation"))) { + aclsListUpdated.add(aclsMapUpdated); + } + } + + return new HashSet<>(aclsListUpdated); + } catch (RestClientException e) { + log.error("Exception:", e); + throw new Exception("Error in listing acls : " + e.getMessage()); + } + } + + private HttpHeaders getHttpHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer " + clusterAccessToken); + return headers; + } + + private RestTemplate getRestTemplate() { + return new RestTemplate(); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaAclService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaAclService.java new file mode 100644 index 0000000000..f4e39746f3 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaAclService.java @@ -0,0 +1,490 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.models.AclIPPrincipleType; +import io.aiven.klaw.clusterapi.models.AclPatternType; +import io.aiven.klaw.clusterapi.models.ApiResultStatus; +import io.aiven.klaw.clusterapi.models.ClusterAclRequest; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.models.RequestOperationType; +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.DescribeAclsResult; +import org.apache.kafka.common.acl.AccessControlEntry; +import org.apache.kafka.common.acl.AccessControlEntryFilter; +import org.apache.kafka.common.acl.AclBinding; +import org.apache.kafka.common.acl.AclBindingFilter; +import org.apache.kafka.common.acl.AclOperation; +import org.apache.kafka.common.acl.AclPermissionType; +import org.apache.kafka.common.resource.PatternType; +import org.apache.kafka.common.resource.ResourcePattern; +import org.apache.kafka.common.resource.ResourcePatternFilter; +import org.apache.kafka.common.resource.ResourceType; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class ApacheKafkaAclService { + + private static final long TIME_OUT_SECS_FOR_ACLS = 5; + + private Environment env; + + private ClusterApiUtils clusterApiUtils; + + public ApacheKafkaAclService(ClusterApiUtils clusterApiUtils) { + this.clusterApiUtils = clusterApiUtils; + } + + public ApacheKafkaAclService() {} + + public ApacheKafkaAclService(Environment env) { + this.env = env; + } + + public synchronized Set> loadAcls( + String environment, KafkaSupportedProtocol protocol, String clusterName) throws Exception { + log.info("loadAcls {} {}", environment, protocol); + Set> acls = new HashSet<>(); + + AdminClient client = clusterApiUtils.getAdminClient(environment, protocol, clusterName); + if (client == null) { + throw new Exception("Cannot connect to cluster."); + } + + try { + AclBindingFilter aclBindingFilter = AclBindingFilter.ANY; + DescribeAclsResult aclsResult = client.describeAcls(aclBindingFilter); + + aclsResult + .values() + .get(TIME_OUT_SECS_FOR_ACLS, TimeUnit.SECONDS) + .forEach( + aclBinding -> { + filterAndUpdateAclBindings(acls, aclBinding); + }); + } catch (Exception e) { + log.error("Exception: ", e); + } + + return acls; + } + + private static void filterAndUpdateAclBindings( + Set> acls, AclBinding aclBinding) { + if (aclBinding.pattern().patternType().name().equals(AclPatternType.LITERAL.value)) { + Map aclbindingMap = new HashMap<>(); + AccessControlEntry accessControlEntry = aclBinding.entry(); + aclbindingMap.put("host", accessControlEntry.host()); + aclbindingMap.put("principle", accessControlEntry.principal()); + aclbindingMap.put("operation", accessControlEntry.operation().toString()); + aclbindingMap.put("permissionType", accessControlEntry.permissionType().toString()); + aclbindingMap.put("resourceType", aclBinding.pattern().resourceType().toString()); + aclbindingMap.put("resourceName", aclBinding.pattern().name()); + + if (!aclBinding.pattern().resourceType().toString().equals("CLUSTER")) { + if (accessControlEntry.operation().toString().equals("WRITE") + || accessControlEntry.operation().toString().equals("READ")) { + acls.add(aclbindingMap); + } + } + } + } + + public synchronized String updateProducerAcl(ClusterAclRequest clusterAclRequest) { + log.info("updateProducerAclRequest {}", clusterAclRequest); + AdminClient client; + try { + PatternType patternType; + if (clusterAclRequest.isPrefixAcl()) { + patternType = PatternType.PREFIXED; + } else { + patternType = PatternType.LITERAL; + } + + client = + clusterApiUtils.getAdminClient( + clusterAclRequest.getEnv(), + clusterAclRequest.getProtocol(), + clusterAclRequest.getClusterName()); + if (client == null) { + return ApiResultStatus.FAILURE.value; + } + + String host, + principal, + aclSsl = clusterAclRequest.getAclSsl(), + aclIp = clusterAclRequest.getAclIp(); + if (clusterAclRequest.getAclSsl() != null + && clusterAclRequest.getAclSsl().trim().length() > 0) { + aclSsl = aclSsl.trim(); + if (AclIPPrincipleType.PRINCIPAL.name().equals(clusterAclRequest.getAclIpPrincipleType())) { + host = "*"; + principal = "User:" + aclSsl; + + if (RequestOperationType.CREATE.equals(clusterAclRequest.getRequestOperationType())) { + if (updateTopicProducerWriteAcls( + clusterAclRequest.getTopicName(), client, patternType, host, principal)) { + return "Acl already exists. success"; + } + } else { + processOtherRequests(clusterAclRequest, client, patternType, host, principal); + } + updateTransactionalIdAclsForProducer( + clusterAclRequest.getTransactionalId(), + client, + patternType, + host, + principal, + clusterAclRequest.getRequestOperationType().value); + } + } + + if (aclIp != null && aclIp.trim().length() > 0) { + aclIp = aclIp.trim(); + host = aclIp; + principal = "User:*"; + + if (clusterAclRequest.getRequestOperationType().equals(RequestOperationType.CREATE)) { + if (updateTopicProducerWriteAcls( + clusterAclRequest.getTopicName(), client, patternType, host, principal)) { + return "Acl already exists. success"; + } + } else { + processOtherRequests(clusterAclRequest, client, patternType, host, principal); + } + // Update transactional id acls + updateTransactionalIdAclsForProducer( + clusterAclRequest.getTransactionalId(), + client, + patternType, + host, + principal, + clusterAclRequest.getRequestOperationType().value); + } + + } catch (Exception e) { + log.error("Exception: ", e); + return ApiResultStatus.FAILURE.value; + } + + return ApiResultStatus.SUCCESS.value; + } + + private void processOtherRequests( + ClusterAclRequest clusterAclRequest, + AdminClient client, + PatternType patternType, + String host, + String principal) + throws InterruptedException, ExecutionException, TimeoutException { + List aclListArray = new ArrayList<>(); + + ResourcePatternFilter resourcePattern = + new ResourcePatternFilter( + ResourceType.TOPIC, clusterAclRequest.getTopicName(), patternType); + AccessControlEntryFilter aclEntry = + new AccessControlEntryFilter(principal, host, AclOperation.WRITE, AclPermissionType.ALLOW); + AclBindingFilter aclBinding1 = new AclBindingFilter(resourcePattern, aclEntry); + aclListArray.add(aclBinding1); + + aclEntry = + new AccessControlEntryFilter( + principal, host, AclOperation.DESCRIBE, AclPermissionType.ALLOW); + AclBindingFilter aclBinding2 = new AclBindingFilter(resourcePattern, aclEntry); + aclListArray.add(aclBinding2); + + client.deleteAcls(aclListArray).all().get(TIME_OUT_SECS_FOR_ACLS, TimeUnit.SECONDS); + } + + private boolean updateTopicProducerWriteAcls( + String topicName, AdminClient client, PatternType patternType, String host, String principal) + throws InterruptedException, ExecutionException, TimeoutException { + List aclListArray = new ArrayList<>(); + + ResourcePattern resourcePattern = + new ResourcePattern(ResourceType.TOPIC, topicName, patternType); + AccessControlEntry aclEntry = + new AccessControlEntry(principal, host, AclOperation.WRITE, AclPermissionType.ALLOW); + AclBinding aclBinding1 = new AclBinding(resourcePattern, aclEntry); + aclListArray.add(aclBinding1); + + boolean acl1Exists = aclExists(client, aclBinding1.toFilter()); + + aclEntry = + new AccessControlEntry(principal, host, AclOperation.DESCRIBE, AclPermissionType.ALLOW); + AclBinding aclBinding2 = new AclBinding(resourcePattern, aclEntry); + aclListArray.add(aclBinding2); + + boolean acl2Exists = aclExists(client, aclBinding2.toFilter()); + + if (acl1Exists && acl2Exists) { + return true; + } + client.createAcls(aclListArray).all().get(TIME_OUT_SECS_FOR_ACLS, TimeUnit.SECONDS); + return false; + } + + private boolean aclExists(AdminClient client, AclBindingFilter aclBindingFilter) { + DescribeAclsResult aclsResult = client.describeAcls(aclBindingFilter); + try { + if (aclsResult.values().get(TIME_OUT_SECS_FOR_ACLS, TimeUnit.SECONDS).size() == 1) { + return true; + } + } catch (InterruptedException | TimeoutException | ExecutionException e) { + log.error("Exception:", e); + } + return false; + } + + private void updateTransactionalIdAclsForProducer( + String transactionalId, + AdminClient client, + PatternType patternType, + String host, + String principal, + String aclOperation) + throws InterruptedException, ExecutionException, TimeoutException { + + List aclListArray = new ArrayList<>(); + // Adding transactional id acls + if (transactionalId != null) { + transactionalId = transactionalId.trim(); + } + + if (transactionalId != null && transactionalId.length() > 0) { + ResourcePattern resourcePatternTxn = + new ResourcePattern(ResourceType.TRANSACTIONAL_ID, transactionalId, patternType); + AccessControlEntry aclEntryTxn = + new AccessControlEntry(principal, host, AclOperation.WRITE, AclPermissionType.ALLOW); + AclBinding aclBinding1Txn = new AclBinding(resourcePatternTxn, aclEntryTxn); + aclListArray.add(aclBinding1Txn); + + if (aclOperation.equals("Create")) { + client.createAcls(aclListArray); + } else { + List aclListArrayDel = new ArrayList<>(); + + ResourcePatternFilter resourcePattern = + new ResourcePatternFilter(ResourceType.TRANSACTIONAL_ID, transactionalId, patternType); + AccessControlEntryFilter aclEntry = + new AccessControlEntryFilter( + principal, host, AclOperation.WRITE, AclPermissionType.ALLOW); + AclBindingFilter aclBinding1 = new AclBindingFilter(resourcePattern, aclEntry); + aclListArrayDel.add(aclBinding1); + client.deleteAcls(aclListArrayDel).all().get(TIME_OUT_SECS_FOR_ACLS, TimeUnit.SECONDS); + } + } + } + + public synchronized String updateConsumerAcl(ClusterAclRequest clusterAclRequest) { + log.info("updateConsumerAclRequest {} ", clusterAclRequest); + AdminClient client; + String resultStr = ""; + try { + PatternType patternType; + patternType = PatternType.LITERAL; + + client = + clusterApiUtils.getAdminClient( + clusterAclRequest.getEnv(), + clusterAclRequest.getProtocol(), + clusterAclRequest.getClusterName()); + if (client == null) { + return ApiResultStatus.FAILURE.value; + } + + String host = null, + principal = null, + aclSsl = clusterAclRequest.getAclSsl(), + aclIp = clusterAclRequest.getAclIp(); + boolean isValidParam = false; + + if (aclSsl != null && aclSsl.trim().length() > 0 && !aclSsl.equals("User:*")) { + aclSsl = aclSsl.trim(); + + if (AclIPPrincipleType.PRINCIPAL.name().equals(clusterAclRequest.getAclIpPrincipleType())) { + host = "*"; + principal = "User:" + aclSsl; + isValidParam = true; + } + + if (RequestOperationType.CREATE.equals(clusterAclRequest.getRequestOperationType()) + && isValidParam) { + List aclListArray = new ArrayList<>(); + + AccessControlEntry aclEntry = + new AccessControlEntry(principal, host, AclOperation.READ, AclPermissionType.ALLOW); + ResourcePattern resourcePattern = + new ResourcePattern( + ResourceType.TOPIC, clusterAclRequest.getTopicName(), patternType); + + resultStr = + processAclBindings( + clusterAclRequest, + client, + patternType, + host, + principal, + aclListArray, + aclEntry, + resourcePattern); + + } else if (isValidParam) { + List aclListArray = new ArrayList<>(); + + AccessControlEntryFilter aclEntry = + new AccessControlEntryFilter( + principal, host, AclOperation.READ, AclPermissionType.ALLOW); + ResourcePatternFilter resourcePattern = + new ResourcePatternFilter( + ResourceType.TOPIC, clusterAclRequest.getTopicName(), patternType); + + resultStr = + processOtherAclBindings( + clusterAclRequest, + client, + patternType, + host, + principal, + aclListArray, + aclEntry, + resourcePattern); + } + } + + if (aclIp != null && aclIp.trim().length() > 0) { + aclIp = aclIp.trim(); + host = aclIp; + principal = "User:*"; + + if (RequestOperationType.CREATE.equals(clusterAclRequest.getRequestOperationType())) { + List aclListArray = new ArrayList<>(); + + ResourcePattern resourcePattern = + new ResourcePattern( + ResourceType.TOPIC, clusterAclRequest.getTopicName(), patternType); + AccessControlEntry aclEntry = + new AccessControlEntry(principal, host, AclOperation.READ, AclPermissionType.ALLOW); + resultStr = + processAclBindings( + clusterAclRequest, + client, + patternType, + host, + principal, + aclListArray, + aclEntry, + resourcePattern); + + } else { + List aclListArray = new ArrayList<>(); + + ResourcePatternFilter resourcePattern = + new ResourcePatternFilter( + ResourceType.TOPIC, clusterAclRequest.getTopicName(), patternType); + AccessControlEntryFilter aclEntry = + new AccessControlEntryFilter( + principal, host, AclOperation.READ, AclPermissionType.ALLOW); + resultStr = + processOtherAclBindings( + clusterAclRequest, + client, + patternType, + host, + principal, + aclListArray, + aclEntry, + resourcePattern); + } + } + } catch (Exception e) { + log.error("Exception:", e); + return ApiResultStatus.FAILURE.value; + } + + return resultStr; + } + + private String processOtherAclBindings( + ClusterAclRequest clusterAclRequest, + AdminClient client, + PatternType patternType, + String host, + String principal, + List aclListArray, + AccessControlEntryFilter aclEntry, + ResourcePatternFilter resourcePattern) + throws InterruptedException, ExecutionException, TimeoutException { + String resultStr; + AclBindingFilter aclBinding1 = new AclBindingFilter(resourcePattern, aclEntry); + aclListArray.add(aclBinding1); + + aclEntry = + new AccessControlEntryFilter( + principal, host, AclOperation.DESCRIBE, AclPermissionType.ALLOW); + AclBindingFilter aclBinding2 = new AclBindingFilter(resourcePattern, aclEntry); + aclListArray.add(aclBinding2); + + resourcePattern = + new ResourcePatternFilter( + ResourceType.GROUP, clusterAclRequest.getConsumerGroup(), patternType); + aclEntry = + new AccessControlEntryFilter(principal, host, AclOperation.READ, AclPermissionType.ALLOW); + AclBindingFilter aclBinding3 = new AclBindingFilter(resourcePattern, aclEntry); + aclListArray.add(aclBinding3); + + client.deleteAcls(aclListArray).all().get(TIME_OUT_SECS_FOR_ACLS, TimeUnit.SECONDS); + resultStr = ApiResultStatus.SUCCESS.value; + return resultStr; + } + + private String processAclBindings( + ClusterAclRequest clusterAclRequest, + AdminClient client, + PatternType patternType, + String host, + String principal, + List aclListArray, + AccessControlEntry aclEntry, + ResourcePattern resourcePattern) + throws InterruptedException, ExecutionException, TimeoutException { + String resultStr; + AclBinding aclBinding1 = new AclBinding(resourcePattern, aclEntry); + aclListArray.add(aclBinding1); + + boolean acl1Exists = aclExists(client, aclBinding1.toFilter()); + + aclEntry = + new AccessControlEntry(principal, host, AclOperation.DESCRIBE, AclPermissionType.ALLOW); + AclBinding aclBinding2 = new AclBinding(resourcePattern, aclEntry); + aclListArray.add(aclBinding2); + + boolean acl2Exists = aclExists(client, aclBinding2.toFilter()); + + resourcePattern = + new ResourcePattern(ResourceType.GROUP, clusterAclRequest.getConsumerGroup(), patternType); + aclEntry = new AccessControlEntry(principal, host, AclOperation.READ, AclPermissionType.ALLOW); + AclBinding aclBinding3 = new AclBinding(resourcePattern, aclEntry); + aclListArray.add(aclBinding3); + + boolean acl3Exists = aclExists(client, aclBinding3.toFilter()); + if (acl1Exists && acl2Exists && acl3Exists) { + resultStr = "Acl already exists. success"; + } else { + client.createAcls(aclListArray).all().get(TIME_OUT_SECS_FOR_ACLS, TimeUnit.SECONDS); + resultStr = ApiResultStatus.SUCCESS.value; + } + return resultStr; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaTopicService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaTopicService.java new file mode 100644 index 0000000000..e4342f32af --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/ApacheKafkaTopicService.java @@ -0,0 +1,214 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.models.ApiResponse; +import io.aiven.klaw.clusterapi.models.ApiResultStatus; +import io.aiven.klaw.clusterapi.models.ClusterTopicRequest; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.CreateTopicsResult; +import org.apache.kafka.clients.admin.DeleteTopicsResult; +import org.apache.kafka.clients.admin.DescribeTopicsResult; +import org.apache.kafka.clients.admin.ListTopicsOptions; +import org.apache.kafka.clients.admin.ListTopicsResult; +import org.apache.kafka.clients.admin.NewPartitions; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.clients.admin.TopicDescription; +import org.apache.kafka.common.KafkaException; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class ApacheKafkaTopicService { + + private static final long TIME_OUT_SECS_FOR_TOPICS = 5; + + private final ClusterApiUtils clusterApiUtils; + + public ApacheKafkaTopicService(ClusterApiUtils clusterApiUtils) { + this.clusterApiUtils = clusterApiUtils; + } + + public synchronized Set> loadTopics( + String environment, KafkaSupportedProtocol protocol, String clusterName) throws Exception { + log.info("loadTopics {} {}", environment, protocol); + AdminClient client = clusterApiUtils.getAdminClient(environment, protocol, clusterName); + Set> topics = new HashSet<>(); + if (client == null) { + throw new Exception("Cannot connect to cluster."); + } + + ListTopicsOptions listTopicsOptions = new ListTopicsOptions(); + listTopicsOptions = listTopicsOptions.listInternal(false); + + ListTopicsResult topicsResult = client.listTopics(listTopicsOptions); + + try { + DescribeTopicsResult s = client.describeTopics(new ArrayList<>(topicsResult.names().get())); + Map topicDesc = + s.all().get(TIME_OUT_SECS_FOR_TOPICS, TimeUnit.SECONDS); + Set keySet = topicDesc.keySet(); + keySet.remove("_schemas"); + List lstK = new ArrayList<>(keySet); + Map hashMap; + for (String topicName : lstK) { + if (topicName.startsWith("_confluent")) { + continue; + } + hashMap = new HashMap<>(); + hashMap.put("topicName", topicName); + hashMap.put( + "replicationFactor", + "" + topicDesc.get(topicName).partitions().get(0).replicas().size()); + hashMap.put("partitions", "" + topicDesc.get(topicName).partitions().size()); + topics.add(hashMap); + } + + } catch (InterruptedException | ExecutionException | TimeoutException e) { + log.error("Exception:", e); + } + return topics; + } + + public synchronized ApiResponse createTopic(ClusterTopicRequest clusterTopicRequest) + throws Exception { + log.info("createTopic {}", clusterTopicRequest); + AdminClient client; + try { + client = + clusterApiUtils.getAdminClient( + clusterTopicRequest.getEnv(), + clusterTopicRequest.getProtocol(), + clusterTopicRequest.getClusterName()); + if (client == null) { + throw new Exception("Cannot connect to cluster."); + } + + NewTopic topic = + new NewTopic( + clusterTopicRequest.getTopicName(), + clusterTopicRequest.getPartitions(), + clusterTopicRequest.getReplicationFactor()); + + CreateTopicsResult result = client.createTopics(Collections.singletonList(topic)); + result + .values() + .get(clusterTopicRequest.getTopicName()) + .get(TIME_OUT_SECS_FOR_TOPICS, TimeUnit.SECONDS); + } catch (KafkaException e) { + String errorMessage = "Invalid properties: "; + log.error(errorMessage, e); + throw e; + } catch (NumberFormatException e) { + String errorMessage = "Invalid replica assignment string"; + log.error(errorMessage, e); + throw e; + } catch (ExecutionException | InterruptedException e) { + String errorMessage; + if (e instanceof ExecutionException) { + errorMessage = e.getCause().getMessage(); + } else { + Thread.currentThread().interrupt(); + errorMessage = e.getMessage(); + } + log.error("Unable to create topic {}, {}", clusterTopicRequest.getTopicName(), errorMessage); + throw e; + } catch (Exception e) { + log.error("Exception:", e); + throw e; + } + + return ApiResponse.builder().result(ApiResultStatus.SUCCESS.value).build(); + } + + public synchronized ApiResponse updateTopic(ClusterTopicRequest clusterTopicRequest) + throws Exception { + log.info("updateTopic Name: {}", clusterTopicRequest); + + AdminClient client = + clusterApiUtils.getAdminClient( + clusterTopicRequest.getEnv(), + clusterTopicRequest.getProtocol(), + clusterTopicRequest.getClusterName()); + + if (client == null) { + throw new Exception("Cannot connect to cluster."); + } + + DescribeTopicsResult describeTopicsResult = + client.describeTopics(Collections.singleton(clusterTopicRequest.getTopicName())); + TopicDescription result = + describeTopicsResult + .all() + .get(TIME_OUT_SECS_FOR_TOPICS, TimeUnit.SECONDS) + .get(clusterTopicRequest.getTopicName()); + + if (result.partitions().size() > clusterTopicRequest.getPartitions()) { + // delete topic and recreate + deleteTopic(clusterTopicRequest); + createTopic(clusterTopicRequest); + } else { + Map newPartitionSet = new HashMap<>(); + newPartitionSet.put( + clusterTopicRequest.getTopicName(), + NewPartitions.increaseTo(clusterTopicRequest.getPartitions())); + + client.createPartitions(newPartitionSet); + } + + return ApiResponse.builder().result(ApiResultStatus.SUCCESS.value).build(); + } + + public synchronized ApiResponse deleteTopic(ClusterTopicRequest clusterTopicRequest) + throws Exception { + log.info("deleteTopic Topic {}", clusterTopicRequest); + + AdminClient client; + try { + client = + clusterApiUtils.getAdminClient( + clusterTopicRequest.getEnv(), + clusterTopicRequest.getProtocol(), + clusterTopicRequest.getClusterName()); + if (client == null) { + throw new Exception("Cannot connect to cluster."); + } + + DeleteTopicsResult result = + client.deleteTopics(Collections.singletonList(clusterTopicRequest.getTopicName())); + result + .values() + .get(clusterTopicRequest.getTopicName()) + .get(TIME_OUT_SECS_FOR_TOPICS, TimeUnit.SECONDS); + return ApiResponse.builder().result(ApiResultStatus.SUCCESS.value).build(); + } catch (KafkaException e) { + String errorMessage = "Invalid properties: "; + log.error(errorMessage, e); + throw e; + } catch (ExecutionException | InterruptedException e) { + String errorMessage; + if (e instanceof ExecutionException) { + errorMessage = e.getCause().getMessage(); + } else { + Thread.currentThread().interrupt(); + errorMessage = e.getMessage(); + } + log.error("Unable to delete topic {}, {}", clusterTopicRequest.getTopicName(), errorMessage); + throw e; + } catch (Exception e) { + log.error("Exception:", e); + throw e; + } + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/JwtTokenUtilService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/JwtTokenUtilService.java new file mode 100644 index 0000000000..89710b9bb1 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/JwtTokenUtilService.java @@ -0,0 +1,70 @@ +package io.aiven.klaw.clusterapi.services; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import java.security.Key; +import java.util.Date; +import java.util.function.Function; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.codec.binary.Base64; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class JwtTokenUtilService implements InitializingBean { + @Value("${klaw.clusterapi.access.base64.secret}") + private String clusterApiSecret; + + private static byte[] decodedSecret; + + // retrieve username from jwt token + public String getUsernameFromToken(String token) { + return getClaimFromToken(token, Claims::getSubject); + } + + // retrieve expiration date from jwt token + private Date getExpirationDateFromToken(String token) { + return getClaimFromToken(token, Claims::getExpiration); + } + + private T getClaimFromToken(String token, Function claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); + } + + // for retrieving any information from token we will need the secret key + private Claims getAllClaimsFromToken(String token) { + Key hmacKey = new SecretKeySpec(decodedSecret, SignatureAlgorithm.HS256.getJcaName()); + Jws jwt = Jwts.parserBuilder().setSigningKey(hmacKey).build().parseClaimsJws(token); + return jwt.getBody(); + } + + // check if the token has expired + private Boolean isTokenExpired(String token) { + final Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date()); + } + + // validate token + public Boolean validateToken(String token) { + return !isTokenExpired(token); + } + + // validate secret during app initialization + @Override + public void afterPropertiesSet() throws Exception { + if (clusterApiSecret != null && !clusterApiSecret.trim().equals("")) { + try { + decodedSecret = Base64.decodeBase64(clusterApiSecret.getBytes()); + return; + } catch (Exception e) { + throw new Exception( + "Invalid Base64 value configured. klaw.clusterapi.access.base64.secret"); + } + } + throw new Exception("Property not configured. klaw.clusterapi.access.base64.secret"); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/KafkaConnectService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/KafkaConnectService.java new file mode 100644 index 0000000000..3d98de1d00 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/KafkaConnectService.java @@ -0,0 +1,176 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.models.ApiResponse; +import io.aiven.klaw.clusterapi.models.ApiResultStatus; +import io.aiven.klaw.clusterapi.models.ClusterConnectorRequest; +import io.aiven.klaw.clusterapi.models.ClusterStatus; +import io.aiven.klaw.clusterapi.models.KafkaClustersType; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import java.util.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@Service +@Slf4j +public class KafkaConnectService { + + final ClusterApiUtils clusterApiUtils; + + public KafkaConnectService(ClusterApiUtils clusterApiUtils) { + this.clusterApiUtils = clusterApiUtils; + } + + public Map deleteConnector(ClusterConnectorRequest clusterConnectorRequest) { + log.info("Into deleteConnector {}", clusterConnectorRequest); + Map result = new HashMap<>(); + + String suffixUrl = + clusterConnectorRequest.getEnv() + + "/connectors/" + + clusterConnectorRequest.getConnectorName(); + Pair reqDetails = + clusterApiUtils.getRequestDetails( + suffixUrl, clusterConnectorRequest.getProtocol(), KafkaClustersType.KAFKA_CONNECT); + + try { + reqDetails.getRight().delete(reqDetails.getLeft(), String.class); + } catch (RestClientException e) { + log.error("Error in deleting connector " + e.toString()); + result.put("result", ApiResultStatus.ERROR.value); + result.put("errorText", e.toString().replaceAll("\"", "")); + return result; + } + result.put("result", ApiResultStatus.SUCCESS.value); + return result; + } + + public Map updateConnector(ClusterConnectorRequest clusterConnectorRequest) { + log.info("Into updateConnector {}", clusterConnectorRequest); + Map result = new HashMap<>(); + + String suffixUrl = + clusterConnectorRequest.getEnv() + + "/connectors/" + + clusterConnectorRequest.getConnectorName() + + "/config"; + Pair reqDetails = + clusterApiUtils.getRequestDetails( + suffixUrl, clusterConnectorRequest.getProtocol(), KafkaClustersType.KAFKA_CONNECT); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", "application/json"); + + HttpEntity request = + new HttpEntity<>(clusterConnectorRequest.getConnectorConfig(), headers); + + try { + reqDetails.getRight().put(reqDetails.getLeft(), request, String.class); + } catch (RestClientException e) { + log.error("Error in updating connector " + e.toString()); + result.put("result", ApiResultStatus.ERROR.value); + result.put("errorText", e.toString().replaceAll("\"", "")); + return result; + } + result.put("result", ApiResultStatus.SUCCESS.value); + + return result; + } + + public ApiResponse postNewConnector(ClusterConnectorRequest clusterConnectorRequest) + throws Exception { + log.info("Into postNewConnector clusterConnectorRequest {} ", clusterConnectorRequest); + + String suffixUrl = clusterConnectorRequest.getEnv() + "/connectors"; + Pair reqDetails = + clusterApiUtils.getRequestDetails( + suffixUrl, clusterConnectorRequest.getProtocol(), KafkaClustersType.KAFKA_CONNECT); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", "application/json"); + + HttpEntity request = + new HttpEntity<>(clusterConnectorRequest.getConnectorConfig(), headers); + ResponseEntity responseNew; + try { + responseNew = + reqDetails.getRight().postForEntity(reqDetails.getLeft(), request, String.class); + } catch (RestClientException e) { + log.error("Error in registering new connector ", e); + throw new Exception(e.toString()); + } + if (responseNew.getStatusCodeValue() == 201) { + return ApiResponse.builder().result(ApiResultStatus.SUCCESS.value).build(); + } else { + return ApiResponse.builder().result(ApiResultStatus.FAILURE.value).build(); + } + } + + public List getConnectors(String environmentVal, KafkaSupportedProtocol protocol) { + try { + log.info("Into getConnectors {} {}", environmentVal, protocol); + if (environmentVal == null) { + return null; + } + + String suffixUrl = environmentVal + "/connectors"; + Pair reqDetails = + clusterApiUtils.getRequestDetails(suffixUrl, protocol, KafkaClustersType.KAFKA_CONNECT); + + Map params = new HashMap<>(); + ResponseEntity responseList = + reqDetails.getRight().getForEntity(reqDetails.getLeft(), List.class, params); + + log.info("connectors list " + responseList); + return responseList.getBody(); + } catch (Exception e) { + log.error("Error in getting connectors " + e); + return new ArrayList<>(); + } + } + + public LinkedHashMap getConnectorDetails( + String connector, String environmentVal, KafkaSupportedProtocol protocol) { + try { + log.info("Into getConnectorDetails {} {}", environmentVal, protocol); + if (environmentVal == null) { + return null; + } + + String suffixUrl = environmentVal + "/connectors" + "/" + connector; + Pair reqDetails = + clusterApiUtils.getRequestDetails(suffixUrl, protocol, KafkaClustersType.KAFKA_CONNECT); + + Map params = new HashMap<>(); + + ResponseEntity responseList = + reqDetails.getRight().getForEntity(reqDetails.getLeft(), LinkedHashMap.class, params); + log.info("connectors list " + responseList); + + return responseList.getBody(); + } catch (Exception e) { + log.error("Error in getting connector detail ", e); + return new LinkedHashMap<>(); + } + } + + protected ClusterStatus getKafkaConnectStatus( + String environment, KafkaSupportedProtocol protocol) { + String suffixUrl = environment + "/connectors"; + Pair reqDetails = + clusterApiUtils.getRequestDetails(suffixUrl, protocol, KafkaClustersType.KAFKA_CONNECT); + Map params = new HashMap(); + + try { + reqDetails.getRight().getForEntity(reqDetails.getLeft(), Object.class, params); + return ClusterStatus.ONLINE; + } catch (RestClientException e) { + log.error("Exception:", e); + return ClusterStatus.OFFLINE; + } + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MetricsApiService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MetricsApiService.java new file mode 100644 index 0000000000..60512e7efb --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MetricsApiService.java @@ -0,0 +1,46 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.utils.MetricsUtils; +import java.util.HashMap; +import java.util.Map; +import javax.management.*; +import javax.management.remote.JMXConnector; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class MetricsApiService { + + @Autowired MetricsUtils metricsUtils; + + // public void getMetrics(){ + // getMetrics("service:jmx:rmi:///jndi/rmi://localhost:9996/jmxrmi", + // "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec"); + // } + + public Map getMetrics(String jmxUrl, String objectName) throws Exception { + Map metricsMap = new HashMap<>(); + try { + JMXConnector jmxc = metricsUtils.getJmxConnector(jmxUrl); + MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); + + // String[] domains = mbsc.getDomains(); + // System.out.println(Arrays.toString(domains)); + + // kafka.server:name=MessagesInPerSec,topic=topicName,type=BrokerTopicMetrics + ObjectName mxbeanName = new ObjectName(objectName); + MBeanAttributeInfo[] attributes = mbsc.getMBeanInfo(mxbeanName).getAttributes(); + + for (MBeanAttributeInfo attr : attributes) { + metricsMap.put(attr.getName(), "" + mbsc.getAttribute(mxbeanName, attr.getName())); + log.debug(attr.getName() + " " + mbsc.getAttribute(mxbeanName, attr.getName())); + } + } catch (Exception e) { + log.error("Error ", e); + throw e; + } + return metricsMap; + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MonitoringService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MonitoringService.java new file mode 100644 index 0000000000..ead37fa826 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/MonitoringService.java @@ -0,0 +1,94 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import java.util.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.admin.*; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.TopicPartitionInfo; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class MonitoringService { + + final ClusterApiUtils clusterApiUtils; + + private static final long timeOutSecsForAcls = 5; + + public MonitoringService(ClusterApiUtils clusterApiUtils) { + this.clusterApiUtils = clusterApiUtils; + } + + public List> getConsumerGroupDetails( + String consumerGroupId, + String topicName, + String environment, + KafkaSupportedProtocol protocol, + String clusterName) + throws Exception { + log.info( + "getConsumerGroupDetails topicName {} consumerGroupId {} environment {} protocol {} clusterName {}", + topicName, + consumerGroupId, + environment, + protocol, + clusterName); + + AdminClient adminClient = clusterApiUtils.getAdminClient(environment, protocol, clusterName); + + List> consumerGroupOffsetList = new ArrayList<>(); + Map offsetDetails; + try { + DescribeTopicsResult describeTopicsResult = + adminClient.describeTopics(Collections.singletonList(topicName)); + List topicPartitions = + describeTopicsResult.values().get(topicName).get().partitions(); + + TopicPartition topicPartition; + Map topicPartitionOffsetSpecMap = new HashMap<>(); + topicPartitionOffsetSpecMap = new HashMap<>(); + + for (TopicPartitionInfo topicPartitionInfo : topicPartitions) { + topicPartition = new TopicPartition(topicName, topicPartitionInfo.partition()); + topicPartitionOffsetSpecMap.put(topicPartition, OffsetSpec.earliest()); + } + ListOffsetsResult listOffsetsEarliestResult = + adminClient.listOffsets(topicPartitionOffsetSpecMap); + + topicPartitionOffsetSpecMap = new HashMap<>(); + for (TopicPartitionInfo topicPartitionInfo : topicPartitions) { + topicPartition = new TopicPartition(topicName, topicPartitionInfo.partition()); + topicPartitionOffsetSpecMap.put(topicPartition, OffsetSpec.latest()); + } + + ListOffsetsResult listOffsetsLatestResult = + adminClient.listOffsets(topicPartitionOffsetSpecMap); + + for (TopicPartitionInfo topicPartitionInfo : topicPartitions) { + topicPartition = new TopicPartition(topicName, topicPartitionInfo.partition()); + + offsetDetails = new HashMap<>(); + long earliestOffset = + listOffsetsEarliestResult.partitionResult(topicPartition).get().offset(); + long latestOffset = listOffsetsLatestResult.partitionResult(topicPartition).get().offset(); + long lag = latestOffset - earliestOffset; + + offsetDetails.put("topicPartitionId", topicPartition.partition() + ""); + offsetDetails.put("currentOffset", earliestOffset + ""); + offsetDetails.put("endOffset", latestOffset + ""); + offsetDetails.put("lag", lag + ""); + consumerGroupOffsetList.add(offsetDetails); + } + return consumerGroupOffsetList; + } catch (Exception exception) { + log.error( + "Cannot retrieve consumer offset details topicName: {} groupid: {} Error: {}", + topicName, + consumerGroupId, + exception); + return consumerGroupOffsetList; + } + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/SchemaService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/SchemaService.java new file mode 100644 index 0000000000..68923efb5f --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/SchemaService.java @@ -0,0 +1,208 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.models.ApiResponse; +import io.aiven.klaw.clusterapi.models.ClusterSchemaRequest; +import io.aiven.klaw.clusterapi.models.ClusterStatus; +import io.aiven.klaw.clusterapi.models.KafkaClustersType; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import java.util.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@Service +@Slf4j +public class SchemaService { + public static final String SCHEMA_REGISTRY_CONTENT_TYPE = + "application/vnd.schemaregistry.v1+json"; + + @Value("${klaw.schemaregistry.compatibility.default:BACKWARD}") + private String defaultSchemaCompatibility; + + final ClusterApiUtils clusterApiUtils; + + public SchemaService(ClusterApiUtils clusterApiUtils) { + this.clusterApiUtils = clusterApiUtils; + } + + public synchronized ApiResponse registerSchema(ClusterSchemaRequest clusterSchemaRequest) { + try { + log.info("Into register schema request {}", clusterSchemaRequest); + // set default compatibility + // setSchemaCompatibility(environmentVal, topicName, false, protocol); + String suffixUrl = + clusterSchemaRequest.getEnv() + + "/subjects/" + + clusterSchemaRequest.getTopicName() + + "-value/versions"; + Pair reqDetails = + clusterApiUtils.getRequestDetails( + suffixUrl, clusterSchemaRequest.getProtocol(), KafkaClustersType.SCHEMA_REGISTRY); + + Map params = new HashMap<>(); + params.put("schema", clusterSchemaRequest.getFullSchema()); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", SCHEMA_REGISTRY_CONTENT_TYPE); + HttpEntity> request = new HttpEntity<>(params, headers); + ResponseEntity responseNew = + reqDetails.getRight().postForEntity(reqDetails.getLeft(), request, String.class); + + String updateTopicReqStatus = responseNew.getBody(); + log.info(responseNew.getBody()); + + return ApiResponse.builder().result(updateTopicReqStatus).build(); + } catch (Exception e) { + log.error("Exception:", e); + if (((HttpClientErrorException.Conflict) e).getStatusCode().value() == 409) { + return ApiResponse.builder() + .result("Schema being registered is incompatible with an earlier schema") + .build(); + } + return ApiResponse.builder().result("Failure in registering schema.").build(); + } + } + + public Map> getSchema( + String environmentVal, KafkaSupportedProtocol protocol, String topicName) { + try { + log.info("Into getSchema request {} {} {}", topicName, environmentVal, protocol); + if (environmentVal == null) { + return null; + } + + List versionsList = getSchemaVersions(environmentVal, topicName, protocol); + String schemaCompatibility = getSchemaCompatibility(environmentVal, topicName, protocol); + Map> allSchemaObjects = new TreeMap<>(); + + if (versionsList != null) { + for (Integer schemaVersion : versionsList) { + String suffixUrl = + environmentVal + "/subjects/" + topicName + "-value/versions/" + schemaVersion; + Pair reqDetails = + clusterApiUtils.getRequestDetails( + suffixUrl, protocol, KafkaClustersType.SCHEMA_REGISTRY); + + Map params = new HashMap<>(); + + ResponseEntity responseNew = + reqDetails.getRight().getForEntity(reqDetails.getLeft(), HashMap.class, params); + Map schemaResponse = responseNew.getBody(); + if (schemaResponse != null) { + schemaResponse.put("compatibility", schemaCompatibility); + } + + log.info(Objects.requireNonNull(responseNew.getBody()).toString()); + allSchemaObjects.put(schemaVersion, schemaResponse); + } + } + + return allSchemaObjects; + } catch (Exception e) { + log.error("Error from getSchema : ", e); + return new TreeMap<>(); + } + } + + private List getSchemaVersions( + String environmentVal, String topicName, KafkaSupportedProtocol protocol) { + try { + log.info("Into getSchema versions {} {}", topicName, environmentVal); + if (environmentVal == null) { + return null; + } + + String suffixUrl = environmentVal + "/subjects/" + topicName + "-value/versions"; + Pair reqDetails = + clusterApiUtils.getRequestDetails(suffixUrl, protocol, KafkaClustersType.SCHEMA_REGISTRY); + + Map params = new HashMap<>(); + + ResponseEntity responseList = + reqDetails.getRight().getForEntity(reqDetails.getLeft(), ArrayList.class, params); + log.info("Schema versions " + responseList); + return responseList.getBody(); + } catch (Exception e) { + log.error("Error in getting versions ", e); + return new ArrayList<>(); + } + } + + private String getSchemaCompatibility( + String environmentVal, String topicName, KafkaSupportedProtocol protocol) { + try { + log.info("Into getSchema compatibility {} {}", topicName, environmentVal); + if (environmentVal == null) { + return null; + } + + String suffixUrl = environmentVal + "/config/" + topicName + "-value"; + Pair reqDetails = + clusterApiUtils.getRequestDetails(suffixUrl, protocol, KafkaClustersType.SCHEMA_REGISTRY); + + Map params = new HashMap<>(); + + ResponseEntity responseList = + reqDetails.getRight().getForEntity(reqDetails.getLeft(), HashMap.class, params); + log.info("Schema compatibility " + responseList); + return (String) responseList.getBody().get("compatibilityLevel"); + } catch (Exception e) { + log.error("Error in getting schema compatibility ", e); + return "NOT SET"; + } + } + + private boolean setSchemaCompatibility( + String environmentVal, String topicName, boolean isForce, KafkaSupportedProtocol protocol) { + try { + log.info("Into setSchema compatibility {} {}", topicName, environmentVal); + if (environmentVal == null) { + return false; + } + + String suffixUrl = environmentVal + "/config/" + topicName + "-value"; + Pair reqDetails = + clusterApiUtils.getRequestDetails(suffixUrl, protocol, KafkaClustersType.SCHEMA_REGISTRY); + + Map params = new HashMap<>(); + if (isForce) { + params.put("compatibility", "NONE"); + } else params.put("compatibility", defaultSchemaCompatibility); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", SCHEMA_REGISTRY_CONTENT_TYPE); + HttpEntity> request = new HttpEntity<>(params, headers); + reqDetails.getRight().put(reqDetails.getLeft(), request, String.class); + return true; + } catch (Exception e) { + log.error("Error in setting schema compatibility ", e); + return false; + } + } + + protected ClusterStatus getSchemaRegistryStatus( + String environmentVal, KafkaSupportedProtocol protocol) { + + String suffixUrl = environmentVal + "/subjects"; + Pair reqDetails = + clusterApiUtils.getRequestDetails(suffixUrl, protocol, KafkaClustersType.SCHEMA_REGISTRY); + + Map params = new HashMap<>(); + + try { + reqDetails.getRight().getForEntity(reqDetails.getLeft(), Object.class, params); + return ClusterStatus.ONLINE; + } catch (RestClientException e) { + log.error("Exception:", e); + return ClusterStatus.OFFLINE; + } + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/TopicContentsService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/TopicContentsService.java new file mode 100644 index 0000000000..23e8aa7e98 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/TopicContentsService.java @@ -0,0 +1,112 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import java.time.Duration; +import java.util.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.CommonClientConfigs; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class TopicContentsService { + + final ClusterApiUtils clusterApiUtils; + + @Value("${klaw.topiccontents.consumergroup.id:notdefined}") + private String kwGenericConsumerGroupId; + + @Value("${klaw.topiccontents.consumer.poll.interval.ms:2000}") + private long defaultPollInterval; + + public TopicContentsService(ClusterApiUtils clusterApiUtils) { + this.clusterApiUtils = clusterApiUtils; + } + + public Map readEvents( + String bootStrapServers, + String protocol, + String clusterName, + String consumerGroupId, + String topicName, + int offsetPosition, + String readMessagesType) { + log.info( + "readEvents bootStrapServers {}, protocol {}, clusterName {}, consumerGroupId {}, topicName {},\n" + + " offsetPosition {}, readMessagesType {}", + bootStrapServers, + protocol, + clusterName, + consumerGroupId, + topicName, + offsetPosition, + readMessagesType); + + Map eventMap = new TreeMap<>(); + KafkaConsumer consumer; + + if (consumerGroupId.equals("notdefined")) { + consumer = getKafkaConsumer(kwGenericConsumerGroupId, bootStrapServers, protocol); + } else { + consumer = getKafkaConsumer(consumerGroupId, bootStrapServers, protocol); + } + + consumer.subscribe(Collections.singleton(topicName)); + consumer.poll(Duration.ofMillis(defaultPollInterval)); + Set assignment = consumer.assignment(); + + consumer.seekToBeginning(assignment); + Map endOffsets = consumer.endOffsets(assignment); + long newOffset; + if (readMessagesType.equals("OFFSET_ID")) { + for (TopicPartition tp : assignment) { + long beginningOffset = consumer.position(tp); + long endOffset = endOffsets.get(tp); + newOffset = endOffset - offsetPosition; + if (newOffset < beginningOffset) { + newOffset = beginningOffset; + } + + consumer.seek(tp, newOffset); + } + } + + int i = 0; + int numOfEventsToRead = 5; + do { + ConsumerRecords consumerRecords = consumer.poll(Duration.ofMillis(500)); + consumerRecords.forEach( + record -> { + eventMap.put(record.offset(), record.value()); + }); + i++; + } while (i != numOfEventsToRead); + + consumer.commitAsync(); + consumer.close(); + return eventMap; + } + + public KafkaConsumer getKafkaConsumer( + String groupId, String bootstrapServers, String protocol) { + Properties props = new Properties(); + + if (protocol.equals("SSL")) { + props = clusterApiUtils.getSslConfig(""); + props.put("security.protocol", "SSL"); + } + props.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); + props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + props.put(ConsumerConfig.CLIENT_ID_CONFIG, "KLAW_TMP_GROUP_CLIENT" + groupId); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + return new KafkaConsumer<>(props); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/UtilComponentsService.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/UtilComponentsService.java new file mode 100644 index 0000000000..94a080a044 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/services/UtilComponentsService.java @@ -0,0 +1,76 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.models.ClusterStatus; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.admin.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class UtilComponentsService { + + Environment env; + + ClusterApiUtils clusterApiUtils; + + SchemaService schemaService; + + KafkaConnectService kafkaConnectService; + + public UtilComponentsService() {} + + public UtilComponentsService(Environment env, ClusterApiUtils clusterApiUtils) { + this.env = env; + this.clusterApiUtils = clusterApiUtils; + } + + @Autowired + public UtilComponentsService( + Environment env, + ClusterApiUtils clusterApiUtils, + SchemaService schemaService, + KafkaConnectService kafkaConnectService) { + this.env = env; + this.clusterApiUtils = clusterApiUtils; + this.schemaService = schemaService; + this.kafkaConnectService = kafkaConnectService; + } + + // public String reloadTruststore(String protocol, String clusterName){ + // getAdminClient.removeSSLElementFromAdminClientMap(protocol, clusterName); + // return ApiResultStatus.SUCCESS.value; + // } + + public ClusterStatus getStatus( + String environment, KafkaSupportedProtocol protocol, String clusterName, String clusterType) { + log.info("getStatus {} {}", environment, protocol); + switch (clusterType) { + case "kafka": + return getStatusKafka(environment, protocol, clusterName); + case "schemaregistry": + return schemaService.getSchemaRegistryStatus(environment, protocol); + case "kafkaconnect": + return kafkaConnectService.getKafkaConnectStatus(environment, protocol); + default: + return ClusterStatus.OFFLINE; + } + } + + private ClusterStatus getStatusKafka( + String environment, KafkaSupportedProtocol protocol, String clusterName) { + try { + AdminClient client = clusterApiUtils.getAdminClient(environment, protocol, clusterName); + if (client != null) { + return ClusterStatus.ONLINE; + } else return ClusterStatus.OFFLINE; + + } catch (Exception e) { + log.error("Exception:", e); + return ClusterStatus.OFFLINE; + } + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/AdminClientProperties.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/AdminClientProperties.java new file mode 100644 index 0000000000..1e23e66244 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/AdminClientProperties.java @@ -0,0 +1,34 @@ +package io.aiven.klaw.clusterapi.utils; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Usually one should consider using {@link ConfigurationProperties}, which may mean to define a few + * inner classes. To avoid this effort and to keep things simple (without changing too much of the + * sources without aligning with the dev lead first), I prefer to keep it simple and arguably a bit + * dirty. + * + *

This class is introduced in order to improve the testability. + */ +@Getter +@Component +class AdminClientProperties { + + @Value("${klaw.request.timeout.ms:15000}") + private String requestTimeOutMs; + + @Value("${klaw.retries.config:25}") + private String retriesConfig; + + @Value("${klaw.retry.backoff.ms:15000}") + private String retryBackOffMsConfig; + + @Value("${klaw.aiven.kafkaconnect.credentials:credentials}") + private String connectCredentials; + + @Value("${klaw.aiven.karapace.credentials}") + private String schemaRegistryCredentials; +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/ClusterApiUtils.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/ClusterApiUtils.java new file mode 100644 index 0000000000..36cb2c3593 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/ClusterApiUtils.java @@ -0,0 +1,422 @@ +package io.aiven.klaw.clusterapi.utils; + +import static io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol.PLAINTEXT; +import static io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol.SSL; + +import com.google.common.base.Strings; +import io.aiven.klaw.clusterapi.config.SslContextConfig; +import io.aiven.klaw.clusterapi.models.KafkaClustersType; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.kafka.clients.CommonClientConfigs; +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.common.config.SaslConfigs; +import org.apache.kafka.common.config.SslConfigs; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +@Slf4j +public class ClusterApiUtils { + + public static final String HTTPS_PREFIX = "https://"; + public static final String HTTP_PREFIX = "http://"; + public static final String SHA_256 = "SHA_256"; + public static final String SHA_512 = "SHA_512"; + private static MessageDigest messageDigest; + + static { + try { + messageDigest = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + log.error("Error ", e); + } + } + + private final Environment env; + private final Map adminClientsMap; + + private final AdminClientProperties adminClientProperties; + + @Autowired + public ClusterApiUtils(Environment env, AdminClientProperties adminClientProperties) { + this(env, adminClientProperties, new HashMap<>()); + } + + ClusterApiUtils( + Environment env, + AdminClientProperties adminClientProperties, + Map adminClientsMap) { + this.env = env; + this.adminClientsMap = adminClientsMap; + this.adminClientProperties = adminClientProperties; + } + + // public void removeSSLElementFromAdminClientMap(String protocol, String clusterName){ + // log.info("Into removeSSLElementFromAdminClientMap"); + // String adminClientKeyReq = protocol + clusterName; + // List sslKeys = adminClientsMap.keySet().stream() + // .filter(adminClientKey -> adminClientKey.equals(adminClientKeyReq)) + // .collect(Collectors.toList()); + // sslKeys.forEach(adminClientsMap::remove); + // } + + private String getHash(String envHost) { + return new String(Base64.getEncoder().encode(messageDigest.digest(envHost.getBytes()))); + } + + public AdminClient getAdminClient( + String envHost, KafkaSupportedProtocol protocol, String clusterIdentification) + throws Exception { + log.info( + "Host : {} Protocol {} clusterIdentification {}", envHost, protocol, clusterIdentification); + + AdminClient adminClient = null; + String adminClientKey = protocol + clusterIdentification + getHash(envHost); + + try { + switch (protocol) { + case PLAINTEXT: + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClient = AdminClient.create(getPlainProperties(envHost)); + } else { + adminClient = adminClientsMap.get(adminClientKey); + } + break; + + case SSL: + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClient = AdminClient.create(getSslProperties(envHost, clusterIdentification)); + } else { + adminClient = adminClientsMap.get(adminClientKey); + } + break; + + case SASL_PLAIN: + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClient = + AdminClient.create(getSaslPlainProperties(envHost, clusterIdentification)); + } else { + adminClient = adminClientsMap.get(adminClientKey); + } + break; + + case SASL_SSL_PLAIN_MECHANISM: + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClient = + AdminClient.create( + getSaslSsl_PlainMechanismProperties(envHost, clusterIdentification)); + } else { + adminClient = adminClientsMap.get(adminClientKey); + } + + break; + + case SASL_SSL_SCRAM_MECHANISM_256: + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClient = + AdminClient.create( + getSaslSsl_ScramMechanismProperties(envHost, clusterIdentification, SHA_256)); + } else { + adminClient = adminClientsMap.get(adminClientKey); + } + + break; + + case SASL_SSL_SCRAM_MECHANISM_512: + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClient = + AdminClient.create( + getSaslSsl_ScramMechanismProperties(envHost, clusterIdentification, SHA_512)); + } else { + adminClient = adminClientsMap.get(adminClientKey); + } + + break; + + case SASL_SSL_GSSAPI_MECHANISM: + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClient = + AdminClient.create( + getSaslSsl_GSSAPIMechanismProperties(envHost, clusterIdentification)); + } else { + adminClient = adminClientsMap.get(adminClientKey); + } + break; + } + } catch (Exception exception) { + log.error("Unable to create Admin client ", exception); + exception.printStackTrace(); + throw new Exception("Cannot connect to cluster. Please contact Administrator."); + } + + if (adminClient == null) { + log.error("Cannot create Admin Client {} {}", envHost, protocol); + throw new Exception("Cannot connect to cluster. Please contact Administrator."); + } + + try { + adminClient.listTopics().names().get(); + if (!adminClientsMap.containsKey(adminClientKey)) { + adminClientsMap.put(adminClientKey, adminClient); + } + return adminClient; + } catch (Exception e) { + adminClientsMap.remove(adminClientKey); + adminClient.close(); + log.error("Cannot create Admin Client {} {} {}", envHost, protocol, clusterIdentification, e); + throw new Exception("Cannot connect to cluster. Please contact Administrator."); + } + } + + public Properties getPlainProperties(String environment) { + Properties props = new Properties(); + + props.put("bootstrap.servers", environment); + setOtherConfig(props); + + return props; + } + + public Properties getSslProperties(String environment, String clusterIdentification) { + Properties props = getSslConfig(clusterIdentification); + + props.put("bootstrap.servers", environment); + props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); + props.put(AdminClientConfig.CLIENT_ID_CONFIG, "klawclientssl"); + setOtherConfig(props); + + return props; + } + + public Properties getSaslPlainProperties(String environment, String clusterIdentification) { + Properties props = new Properties(); + + props.put("bootstrap.servers", environment); + + try { + props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_PLAINTEXT"); + props.put(AdminClientConfig.CLIENT_ID_CONFIG, "klawclientsaslplain"); + setOtherConfig(props); + + if (!Strings.isNullOrEmpty(env.getProperty("kafkasasl.saslmechanism.plain"))) { + props.put(SaslConfigs.SASL_MECHANISM, env.getProperty("kafkasasl.saslmechanism.plain")); + } + + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.plain"))) { + props.put( + SaslConfigs.SASL_JAAS_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.plain")); + } + + } catch (Exception exception) { + log.error("Error : Cannot set SASL PLAIN Config properties.", exception); + } + + return props; + } + + public Properties getSaslSsl_PlainMechanismProperties( + String environment, String clusterIdentification) { + Properties props = getSslConfig(clusterIdentification); + + try { + props.put("bootstrap.servers", environment); + props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL"); + props.put(AdminClientConfig.CLIENT_ID_CONFIG, "klawclientsaslsslplain"); + setOtherConfig(props); + + if (!Strings.isNullOrEmpty(env.getProperty("kafkasasl.saslmechanism.plain"))) { + props.put(SaslConfigs.SASL_MECHANISM, env.getProperty("kafkasasl.saslmechanism.plain")); + } + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.plain"))) { + props.put( + SaslConfigs.SASL_JAAS_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.plain")); + } + } catch (Exception exception) { + log.error("Error : Cannot set SASL SSL PLAIN Config properties.", exception); + } + + return props; + } + + public Properties getSaslSsl_ScramMechanismProperties( + String environment, String clusterIdentification, String algorithm) { + Properties props = getSslConfig(clusterIdentification); + + try { + props.put("bootstrap.servers", environment); + props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL"); + props.put(AdminClientConfig.CLIENT_ID_CONFIG, "klawclientsaslsslscram"); + setOtherConfig(props); + + if (SHA_256.equals(algorithm)) { + if (!Strings.isNullOrEmpty(env.getProperty("kafkasasl.saslmechanism.scram.256"))) { + props.put( + SaslConfigs.SASL_MECHANISM, env.getProperty("kafkasasl.saslmechanism.scram.256")); + } + } else if (SHA_512.equals(algorithm)) { + if (!Strings.isNullOrEmpty(env.getProperty("kafkasasl.saslmechanism.scram.512"))) { + props.put( + SaslConfigs.SASL_MECHANISM, env.getProperty("kafkasasl.saslmechanism.scram.512")); + } + } + + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.scram"))) { + props.put( + SaslConfigs.SASL_JAAS_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.scram")); + } + } catch (Exception exception) { + log.error("Error : Cannot set SASL SSL SCRAM Config properties.", exception); + } + + return props; + } + + public Properties getSaslSsl_GSSAPIMechanismProperties( + String environment, String clusterIdentification) { + Properties props = getSslConfig(clusterIdentification); + + try { + props.put("bootstrap.servers", environment); + props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL"); + props.put(AdminClientConfig.CLIENT_ID_CONFIG, "klawclientsaslsslgssapi"); + setOtherConfig(props); + + if (!Strings.isNullOrEmpty(env.getProperty("kafkasasl.saslmechanism.gssapi"))) { + props.put(SaslConfigs.SASL_MECHANISM, env.getProperty("kafkasasl.saslmechanism.gssapi")); + } + + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.gssapi"))) { + props.put( + SaslConfigs.SASL_JAAS_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkasasl.jaasconfig.gssapi")); + } + + if (!Strings.isNullOrEmpty( + env.getProperty( + clusterIdentification.toLowerCase() + + ".kafkasasl.saslmechanism.gssapi.servicename"))) { + props.put( + SaslConfigs.SASL_KERBEROS_SERVICE_NAME, + env.getProperty( + clusterIdentification.toLowerCase() + + ".kafkasasl.saslmechanism.gssapi.servicename")); + } + } catch (Exception exception) { + log.error("Error : Cannot set SASL SSL GSSAPI Config properties.", exception); + } + + return props; + } + + public Properties getSslConfig(String clusterIdentification) { + Properties props = new Properties(); + + try { + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.keystore.location"))) { + props.put( + SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.keystore.location")); + } + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.keystore.pwd"))) { + props.put( + SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.keystore.pwd")); + } + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.key.pwd"))) { + props.put( + SslConfigs.SSL_KEY_PASSWORD_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.key.pwd")); + } + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.keystore.type"))) { + props.put( + SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.keystore.type")); + } else { + props.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, "JKS"); + } + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.truststore.type"))) { + props.put( + SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.truststore.type")); + } else { + props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "JKS"); + } + + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.truststore.location"))) { + props.put( + SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.truststore.location")); + } + + if (!Strings.isNullOrEmpty( + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.truststore.pwd"))) { + props.put( + SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, + env.getProperty(clusterIdentification.toLowerCase() + ".kafkassl.truststore.pwd")); + } + + props.put("ssl.enabled.protocols", "TLSv1.2,TLSv1.1"); + props.put("ssl.endpoint.identification.algorithm", ""); + } catch (Exception exception) { + log.error("Error : Cannot set SSL Config properties.", exception); + } + + return props; + } + + void setOtherConfig(Properties props) { + props.put(AdminClientConfig.RETRIES_CONFIG, adminClientProperties.getRetriesConfig()); + props.put( + AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, adminClientProperties.getRequestTimeOutMs()); + props.put( + AdminClientConfig.RETRY_BACKOFF_MS_CONFIG, adminClientProperties.getRetryBackOffMsConfig()); + } + + public Pair getRequestDetails( + String suffixUrl, KafkaSupportedProtocol protocol, KafkaClustersType kafkaClustersType) { + RestTemplate restTemplate; + String connectorsUrl = ""; + + if (PLAINTEXT == protocol) { + connectorsUrl = HTTP_PREFIX + suffixUrl; + restTemplate = new RestTemplate(); + } else if (SSL == protocol) { + if (KafkaClustersType.KAFKA_CONNECT.equals(kafkaClustersType)) { + connectorsUrl = + HTTPS_PREFIX + adminClientProperties.getConnectCredentials() + "@" + suffixUrl; + } else if (KafkaClustersType.SCHEMA_REGISTRY.equals(kafkaClustersType)) { + connectorsUrl = + HTTPS_PREFIX + adminClientProperties.getSchemaRegistryCredentials() + "@" + suffixUrl; + } + restTemplate = new RestTemplate(SslContextConfig.requestFactory); + } else { + restTemplate = new RestTemplate(); + } + + return Pair.of(connectorsUrl, restTemplate); + } +} diff --git a/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/MetricsUtils.java b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/MetricsUtils.java new file mode 100644 index 0000000000..af1c58e2d9 --- /dev/null +++ b/cluster-api/src/main/java/io/aiven/klaw/clusterapi/utils/MetricsUtils.java @@ -0,0 +1,51 @@ +package io.aiven.klaw.clusterapi.utils; + +import java.util.HashMap; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class MetricsUtils { + + private final HashMap metricsClientsMap = new HashMap<>(); + + public JMXConnector getJmxConnector(String jmxUrl) throws Exception { + + JMXConnector jmxConnector; + + try { + if (!metricsClientsMap.containsKey(jmxUrl)) { + JMXServiceURL url; + log.info("Creating JMX connection {}", jmxUrl); + url = new JMXServiceURL(jmxUrl); + jmxConnector = JMXConnectorFactory.connect(url, null); + } else { + jmxConnector = metricsClientsMap.get(jmxUrl); + } + } catch (Exception exception) { + log.error("Unable to create JMX Connector " + exception.getMessage(), exception); + throw new Exception("Cannot connect to JMX Host. Please contact Administrator."); + } + + if (jmxConnector == null) { + log.error("Cannot create JMX Connector {}", jmxUrl); + throw new Exception("Cannot connect to JMX host. Please contact Administrator."); + } + + try { + if (!metricsClientsMap.containsKey(jmxUrl)) { + metricsClientsMap.put(jmxUrl, jmxConnector); + } + return jmxConnector; + } catch (Exception e) { + metricsClientsMap.remove(jmxUrl); + jmxConnector.close(); + log.error("Cannot create JMX Connector {}", jmxUrl, e); + throw new Exception("Cannot connect to JMX host. Please contact Administrator."); + } + } +} diff --git a/cluster-api/src/main/resources/application.properties b/cluster-api/src/main/resources/application.properties new file mode 100644 index 0000000000..ba955dd637 --- /dev/null +++ b/cluster-api/src/main/resources/application.properties @@ -0,0 +1,68 @@ +server.port=9343 + +# SSL/Https Properties +#server.ssl.key-store=client.keystore.p12 +#server.ssl.trust-store=client.truststore.jks +#server.ssl.key-store-password=klaw1234 +#server.ssl.key-password=klaw1234 +#server.ssl.trust-store-password=klaw1234 +#server.ssl.key-store-type=pkcs12 + +# SSL properties to connect to Kafka clusters + +klawssl.kafkassl.keystore.location=client.keystore.p12 +klawssl.kafkassl.keystore.pwd=klaw1234 +klawssl.kafkassl.key.pwd=klaw1234 +klawssl.kafkassl.truststore.location=client.truststore.jks +klawssl.kafkassl.truststore.pwd=klaw1234 +klawssl.kafkassl.keystore.type=pkcs12 +klawssl.kafkassl.truststore.type=JKS + +# SASL properties to connect to Kafka clusters +#acc1.kafkasasl.jaasconfig.plain=org.apache.kafka.common.security.plain.PlainLoginModule required username='kwuser' password='kwuser-secret'; +#acc1.kafkasasl.jaasconfig.scram=org.apache.kafka.common.security.scram.ScramLoginModule required username='kwuser' password='kwuser-secret'; +#acc1.kafkasasl.saslmechanism.gssapi.servicename=kafka +#acc1.kafkasasl.jaasconfig.gssapi=com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/location/kafka_client.keytab" principal="kafkaclient1@EXAMPLE.COM"; + +kafkasasl.saslmechanism.plain=PLAIN +kafkasasl.saslmechanism.gssapi=GSSAPI +kafkasasl.saslmechanism.scram.256=SCRAM-SHA-256 +kafkasasl.saslmechanism.scram.512=SCRAM-SHA-512 + +# User for accessing Cluster api +klaw.clusterapi.access.username=kwclusterapiuser +# Provide a base 64 encoded string below. The same secret should be configured in Klaw Api. Change to a new one. Ex : dGhpcyBpcyBhIHNlY3JldCB0byBhY2Nlc3MgY2x1c3RlcmFwaQ== +klaw.clusterapi.access.base64.secret= + +# this property is required to avoid default password printing to console. +spring.security.user.password=avoid_default_pwd_logging + +#kafka consumer group id to read topic contents +#klaw.topiccontents.consumergroup.id=kwgenericconsumergroup +klaw.topiccontents.consumer.poll.interval.ms=2000 + +klaw.retries.config=10 +klaw.retry.backoff.ms=5000 +klaw.request.timeout.ms=15000 + +# swagger documentation path parser +spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER + +spring.banner.location=classpath:banner.txt + +# custom acls api endpoints +klaw.clusters.listacls.api=https://api.aiven.io/v1/project/projectName/service/serviceName/acl +klaw.clusters.addacls.api=https://api.aiven.io/v1/project/projectName/service/serviceName/acl +klaw.clusters.deleteacls.api=https://api.aiven.io/v1/project/projectName/service/serviceName/acl/aclId + +# access token for https requests +klaw.clusters.accesstoken= + +#aiven schema security +klaw.aiven.karapace.credentials= +klaw.aiven.kafkaconnect.credentials= + +# log file settings +logging.level.root=info +logging.file.name=./../logs/kw-clusterapi.log +spring.mvc.log-resolved-exception=true \ No newline at end of file diff --git a/cluster-api/src/main/resources/banner.txt b/cluster-api/src/main/resources/banner.txt new file mode 100644 index 0000000000..f1dd779f7c --- /dev/null +++ b/cluster-api/src/main/resources/banner.txt @@ -0,0 +1,6 @@ +,--. ,--. ,--. ,-----. ,--. ,--. ,---. ,--. +| .' / | | ,--,--. ,--. ,--. ' .--./ | | ,--.,--. ,---. ,-' '-. ,---. ,--.--. / O \ ,---. `--' +| . ' | | ' ,-. | | |.'.| | | | | | | || | ( .-' '-. .-' | .-. : | .--' | .-. | | .-. | ,--. +| |\ \ | | \ '-' | | .'. | ' '--'\ | | ' '' ' .-' `) | | \ --. | | | | | | | '-' ' | | +`--' '--' `--' `--`--' '--' '--' `-----' `--' `----' `----' `--' `----' `--' `--' `--' | |-' `--' + `--' \ No newline at end of file diff --git a/cluster-api/src/test/java/io/aiven/klaw/clusterapi/AuthenticationIntegrationTest.java b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/AuthenticationIntegrationTest.java new file mode 100644 index 0000000000..0cea307d27 --- /dev/null +++ b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/AuthenticationIntegrationTest.java @@ -0,0 +1,143 @@ +package io.aiven.klaw.clusterapi; + +import static io.aiven.klaw.clusterapi.models.ClusterStatus.ONLINE; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.aiven.klaw.clusterapi.models.ClusterStatus; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import java.security.Key; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.UUID; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.codec.binary.Base64; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +@SpringBootTest( + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = KafkaClusterApiApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +@TestMethodOrder(OrderAnnotation.class) +@DirtiesContext +public class AuthenticationIntegrationTest { + + public static final String KWCLUSTERAPIUSER = "kwclusterapiuser"; + public static final String AUTHORIZATION = "Authorization"; + public static final String BEARER_PREFIX = "Bearer "; + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + @Value("${klaw.clusterapi.access.base64.secret}") + private String clusterAccessSecret; + + @Autowired private MockMvc mvc; + + @Test + @Order(1) + public void getApiStatus_Success() throws Exception { + MockHttpServletResponse response = + mvc.perform( + MockMvcRequestBuilders.get("/topics/getApiStatus") + .contentType(MediaType.APPLICATION_JSON) + .header( + AUTHORIZATION, + BEARER_PREFIX + generateToken(KWCLUSTERAPIUSER, clusterAccessSecret, 3L)) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse(); + + ClusterStatus clusterStatus = + OBJECT_MAPPER.readValue(response.getContentAsString(), ClusterStatus.class); + assertThat(clusterStatus).isEqualTo(ONLINE); + } + + @Test + @Order(2) + public void getApiStatus_InValidSubjectRequest() { + RuntimeException thrown = + Assertions.assertThrows( + RuntimeException.class, + () -> { + mvc.perform( + MockMvcRequestBuilders.get("/topics/getApiStatus") + .contentType(MediaType.APPLICATION_JSON) + .header( + AUTHORIZATION, + BEARER_PREFIX + + generateToken("notExistingUser", clusterAccessSecret, 3L)) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isUnauthorized()) + .andReturn() + .getResponse(); + }); + assertThat(thrown.getMessage()).isEqualTo("User/subject not found !!"); + } + + @Test + @Order(3) + public void getApiStatus_InValidSecretRequest() throws Exception { + String invalidSecret = "this is an invalid secret for the test"; + String base64EncodedSecret = Base64.encodeBase64String(invalidSecret.getBytes()); + mvc.perform( + MockMvcRequestBuilders.get("/topics/getApiStatus") + .contentType(MediaType.APPLICATION_JSON) + .header( + AUTHORIZATION, + BEARER_PREFIX + generateToken(KWCLUSTERAPIUSER, base64EncodedSecret, 3L)) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isUnauthorized()) + .andReturn() + .getResponse(); + } + + @Test + @Order(4) + public void getApiStatus_ExpiredToken() throws Exception { + mvc.perform( + MockMvcRequestBuilders.get("/topics/getApiStatus") + .contentType(MediaType.APPLICATION_JSON) + .header( + AUTHORIZATION, + BEARER_PREFIX + generateToken(KWCLUSTERAPIUSER, clusterAccessSecret, -3L)) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isUnauthorized()) + .andReturn() + .getResponse(); + } + + private String generateToken( + String clusterApiUser, String clusterAccessSecret, long expirationTime) { + Key hmacKey = + new SecretKeySpec( + Base64.decodeBase64(clusterAccessSecret), SignatureAlgorithm.HS256.getJcaName()); + Instant now = Instant.now(); + + return Jwts.builder() + .claim("name", clusterApiUser) + .setSubject(clusterApiUser) + .setId(UUID.randomUUID().toString()) + .setIssuedAt(Date.from(now)) + .setExpiration(Date.from(now.plus(expirationTime, ChronoUnit.MINUTES))) + .signWith(hmacKey) + .compact(); + } +} diff --git a/cluster-api/src/test/java/io/aiven/klaw/clusterapi/UtilMethods.java b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/UtilMethods.java new file mode 100644 index 0000000000..f3f48e3294 --- /dev/null +++ b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/UtilMethods.java @@ -0,0 +1,134 @@ +package io.aiven.klaw.clusterapi; + +import io.aiven.klaw.clusterapi.models.AclIPPrincipleType; +import io.aiven.klaw.clusterapi.models.AclsNativeType; +import io.aiven.klaw.clusterapi.models.ClusterAclRequest; +import io.aiven.klaw.clusterapi.models.ClusterSchemaRequest; +import io.aiven.klaw.clusterapi.models.ClusterTopicRequest; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.models.RequestOperationType; +import java.util.*; +import org.apache.kafka.common.acl.AccessControlEntry; +import org.apache.kafka.common.acl.AclBinding; +import org.apache.kafka.common.resource.PatternType; +import org.apache.kafka.common.resource.ResourcePattern; +import org.apache.kafka.common.resource.ResourceType; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +public class UtilMethods { + public List getListAclBindings(AccessControlEntry accessControlEntry) { + List listAclBinding = new ArrayList<>(); + AclBinding aclBinding = + new AclBinding( + new ResourcePattern(ResourceType.GROUP, "consgroup1", PatternType.LITERAL), + accessControlEntry); + listAclBinding.add(aclBinding); + + return listAclBinding; + } + + public Set> getAcls() { + Set> aclsSet = new HashSet<>(); + Map hMap = new HashMap<>(); + hMap.put("host", "12.11.124.11"); + hMap.put("principle", "User:*"); + hMap.put("operation", "READ"); + hMap.put("permissionType", "ALLOW"); + hMap.put("resourceType", "GROUP"); + hMap.put("resourceName", "consumergroup1"); + + aclsSet.add(hMap); + + hMap = new HashMap<>(); + hMap.put("host", "12.15.124.12"); + hMap.put("principle", "User:*"); + hMap.put("operation", "READ"); + hMap.put("permissionType", "ALLOW"); + hMap.put("resourceType", "TOPIC"); + hMap.put("resourceName", "testtopic"); + aclsSet.add(hMap); + + return aclsSet; + } + + public Set> getTopics() { + Set> topicsSet = new HashSet<>(); + Map hashMap = new HashMap<>(); + hashMap.put("topicName", "testtopic1"); + + hashMap.put("partitions", "2"); + hashMap.put("replicationFactor", "1"); + topicsSet.add(hashMap); + return topicsSet; + } + + public MultiValueMap getMappedValuesTopic() { + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("env", "localhost"); + params.add("protocol", "PLAINTEXT"); + params.add("topicName", "testtopic"); + params.add("partitions", "2"); + params.add("rf", "1"); + + return params; + } + + public ClusterTopicRequest getTopicRequest() { + return ClusterTopicRequest.builder() + .env("localhost") + .protocol(KafkaSupportedProtocol.PLAINTEXT) + .topicName("testtopic") + .partitions(2) + .replicationFactor(Short.parseShort("1")) + .build(); + } + + public MultiValueMap getMappedValuesAcls(String aclType) { + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("env", "localhost"); + params.add("protocol", "PLAINTEXT"); + params.add("topicName", "testtopic"); + params.add("consumerGroup", "congroup1"); + params.add("aclType", aclType); + params.add("acl_ip", "11.12.33.122"); + params.add("acl_ssl", null); + + return params; + } + + public MultiValueMap getMappedValuesSchema() { + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("env", "localhost"); + params.add("protocol", "PLAINTEXT"); + params.add("topicName", "testtopic"); + params.add("fullSchema", "{type:string}"); + + return params; + } + + public ClusterSchemaRequest getSchema() { + return ClusterSchemaRequest.builder() + .env("localhost") + .fullSchema("{type:string}") + .protocol(KafkaSupportedProtocol.PLAINTEXT) + .topicName("testtopic") + .build(); + } + + public ClusterAclRequest getAclRequest(String aclType) { + return ClusterAclRequest.builder() + .env("localhost") + .topicName("testtopic") + .protocol(KafkaSupportedProtocol.PLAINTEXT) + .consumerGroup("congroup1") + .clusterName("clusterName") + .aclType(aclType) + .aclIp("11.12.33.122") + .aclSsl(null) + .requestOperationType(RequestOperationType.CREATE) + .aclNativeType(AclsNativeType.NATIVE.name()) + .aclIpPrincipleType(AclIPPrincipleType.PRINCIPAL.name()) + .build(); + } +} diff --git a/cluster-api/src/test/java/io/aiven/klaw/clusterapi/controller/ClusterApiControllerTest.java b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/controller/ClusterApiControllerTest.java new file mode 100644 index 0000000000..27a57bf41d --- /dev/null +++ b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/controller/ClusterApiControllerTest.java @@ -0,0 +1,247 @@ +package io.aiven.klaw.clusterapi.controller; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.aiven.klaw.clusterapi.UtilMethods; +import io.aiven.klaw.clusterapi.config.JwtRequestFilter; +import io.aiven.klaw.clusterapi.models.AclType; +import io.aiven.klaw.clusterapi.models.AclsNativeType; +import io.aiven.klaw.clusterapi.models.ApiResponse; +import io.aiven.klaw.clusterapi.models.ApiResultStatus; +import io.aiven.klaw.clusterapi.models.ClusterAclRequest; +import io.aiven.klaw.clusterapi.models.ClusterSchemaRequest; +import io.aiven.klaw.clusterapi.models.ClusterStatus; +import io.aiven.klaw.clusterapi.models.ClusterTopicRequest; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.services.AivenApiService; +import io.aiven.klaw.clusterapi.services.ApacheKafkaAclService; +import io.aiven.klaw.clusterapi.services.ApacheKafkaTopicService; +import io.aiven.klaw.clusterapi.services.MonitoringService; +import io.aiven.klaw.clusterapi.services.SchemaService; +import io.aiven.klaw.clusterapi.services.UtilComponentsService; +import java.nio.charset.StandardCharsets; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +@WebMvcTest(controllers = ClusterApiController.class) +@AutoConfigureMockMvc(addFilters = false) +public class ClusterApiControllerTest { + + @MockBean private UtilComponentsService utilComponentsService; + @MockBean private ApacheKafkaAclService apacheKafkaAclService; + @MockBean private ApacheKafkaTopicService apacheKafkaTopicService; + @MockBean private SchemaService schemaService; + @MockBean private MonitoringService monitoringService; + @MockBean private AivenApiService aivenApiService; + @MockBean private JwtRequestFilter jwtRequestFilter; + + @Autowired private MockMvc mvc; + + private UtilMethods utilMethods; + + @BeforeEach + public void setUp() throws Exception { + utilMethods = new UtilMethods(); + } + + @Test + public void getApiStatus() throws Exception { + mvc.perform(get("/topics/getApiStatus")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(content().json("\"ONLINE\"")); + } + + @Test + public void getStatus() throws Exception { + String clusterName = "testCluster"; + String clusterType = "sampleType"; + String bootstrapServers = "localhost:9092"; + + when(utilComponentsService.getStatus( + bootstrapServers, KafkaSupportedProtocol.PLAINTEXT, clusterName, clusterType)) + .thenReturn(ClusterStatus.ONLINE); + + String urlTemplate = + String.join( + "/", + "/topics", + "getStatus", + bootstrapServers, + KafkaSupportedProtocol.PLAINTEXT.getValue(), + clusterName, + clusterType); + mvc.perform( + MockMvcRequestBuilders.get(urlTemplate) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(content().json("\"ONLINE\"")); + } + + @Test + public void getTopics() throws Exception { + String clusterName = "testCluster"; + String bootstrapServers = "localhost:9092"; + + when(apacheKafkaTopicService.loadTopics( + bootstrapServers, KafkaSupportedProtocol.PLAINTEXT, clusterName)) + .thenReturn(utilMethods.getTopics()); + + String urlTemplate = + String.join( + "/", + "/topics", + "getTopics", + bootstrapServers, + KafkaSupportedProtocol.PLAINTEXT.getValue(), + clusterName); + mvc.perform(get(urlTemplate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(1))); + } + + @Test + public void getAcls() throws Exception { + String clusterName = "testCluster"; + String bootstrapServers = "localhost:9092"; + String aclsNativeType = AclsNativeType.NATIVE.name(); + String projectName = "projectName"; + String serviceName = "serviceName"; + + when(apacheKafkaAclService.loadAcls( + bootstrapServers, KafkaSupportedProtocol.PLAINTEXT, clusterName)) + .thenReturn(utilMethods.getAcls()); + + String urlTemplate = + String.join( + "/", + "/topics", + "getAcls", + bootstrapServers, + aclsNativeType, + KafkaSupportedProtocol.PLAINTEXT.getValue(), + clusterName, + projectName, + serviceName); + mvc.perform(get(urlTemplate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(2))); + } + + @Test + public void createTopics() throws Exception { + String jsonReq = new ObjectMapper().writer().writeValueAsString(utilMethods.getTopicRequest()); + ApiResponse apiResponse = ApiResponse.builder().result(ApiResultStatus.SUCCESS.value).build(); + + when(apacheKafkaTopicService.createTopic(any(ClusterTopicRequest.class))) + .thenReturn(apiResponse); + + mvc.perform( + post("/topics/createTopics") + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(content().string(containsString(ApiResultStatus.SUCCESS.value))); + } + + @Test + public void createAclsProducer() throws Exception { + ClusterAclRequest clusterAclRequest = utilMethods.getAclRequest(AclType.PRODUCER.value); + String jsonReq = new ObjectMapper().writer().writeValueAsString(clusterAclRequest); + + when(apacheKafkaAclService.updateProducerAcl(any(ClusterAclRequest.class))) + .thenReturn(ApiResultStatus.SUCCESS.value); + + mvc.perform( + post("/topics/createAcls") + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(content().string(containsString(ApiResultStatus.SUCCESS.value))); + } + + @Test + public void createAclsConsumer() throws Exception { + ClusterAclRequest clusterAclRequest = utilMethods.getAclRequest(AclType.CONSUMER.value); + String jsonReq = new ObjectMapper().writer().writeValueAsString(clusterAclRequest); + + when(apacheKafkaAclService.updateConsumerAcl(any(ClusterAclRequest.class))) + .thenReturn("success1"); + + mvc.perform( + post("/topics/createAcls") + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(content().string(containsString(ApiResultStatus.SUCCESS.value))); + } + + @Test + public void createAclsConsumerFail() throws Exception { + ClusterAclRequest clusterAclRequest = utilMethods.getAclRequest(AclType.CONSUMER.value); + String jsonReq = new ObjectMapper().writer().writeValueAsString(clusterAclRequest); + + when(apacheKafkaAclService.updateConsumerAcl(any(ClusterAclRequest.class))) + .thenThrow(new RuntimeException("Error creating acls")); + + mvc.perform(post("/topics/createAcls").content(jsonReq).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().is5xxServerError()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.result", containsString("Error creating acls"))); + } + + @Test + public void postSchema() throws Exception { + String jsonReq = new ObjectMapper().writer().writeValueAsString(utilMethods.getSchema()); + ApiResponse apiResponse = ApiResponse.builder().result(ApiResultStatus.SUCCESS.value).build(); + when(schemaService.registerSchema(any(ClusterSchemaRequest.class))).thenReturn(apiResponse); + + mvc.perform( + post("/topics/postSchema") + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(content().string(containsString(ApiResultStatus.SUCCESS.value))); + } + + @Test + public void postSchemaFail() throws Exception { + String jsonReq = new ObjectMapper().writer().writeValueAsString(utilMethods.getSchema()); + + when(schemaService.registerSchema(any(ClusterSchemaRequest.class))) + .thenThrow(new RuntimeException("Error registering schema")); + + mvc.perform( + post("/topics/postSchema") + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().is5xxServerError()); + } +} diff --git a/cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/AivenApiServiceTest.java b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/AivenApiServiceTest.java new file mode 100644 index 0000000000..9160741260 --- /dev/null +++ b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/AivenApiServiceTest.java @@ -0,0 +1,56 @@ +package io.aiven.klaw.clusterapi.services; + +import io.aiven.klaw.clusterapi.models.ClusterAclRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class AivenApiServiceTest { + + AivenApiService aivenApiService; + + @BeforeEach + public void setUp() { + aivenApiService = new AivenApiService(); + } + + @Test + @Disabled + public void getAclsListTest() throws Exception { + // TODO when, asserts + aivenApiService.listAcls("dev-sandbox", "kafka-acls-kw"); + } + + @Disabled + @Test + public void createAclsTest() throws Exception { + // TODO when, asserts + ClusterAclRequest clusterAclRequest = + ClusterAclRequest.builder() + .permission("read") + .topicName("testtopic") + .username("avnadmin") + .projectName("testproject") + .serviceName("serviceName") + .build(); + + aivenApiService.createAcls(clusterAclRequest); + } + + @Disabled + @Test + public void deleteAclsTest() throws Exception { + // TODO when, asserts + ClusterAclRequest clusterAclRequest = + ClusterAclRequest.builder() + .aivenAclKey("4322342") + .projectName("testproject") + .serviceName("serviceName") + .build(); + + aivenApiService.deleteAcls(clusterAclRequest); + } +} diff --git a/cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/UtilComponentsServiceTest.java b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/UtilComponentsServiceTest.java new file mode 100644 index 0000000000..49428df89d --- /dev/null +++ b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/services/UtilComponentsServiceTest.java @@ -0,0 +1,405 @@ +package io.aiven.klaw.clusterapi.services; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; + +import io.aiven.klaw.clusterapi.UtilMethods; +import io.aiven.klaw.clusterapi.models.AclType; +import io.aiven.klaw.clusterapi.models.ApiResponse; +import io.aiven.klaw.clusterapi.models.ApiResultStatus; +import io.aiven.klaw.clusterapi.models.ClusterAclRequest; +import io.aiven.klaw.clusterapi.models.ClusterSchemaRequest; +import io.aiven.klaw.clusterapi.models.ClusterStatus; +import io.aiven.klaw.clusterapi.models.ClusterTopicRequest; +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import io.aiven.klaw.clusterapi.utils.ClusterApiUtils; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.CreateAclsResult; +import org.apache.kafka.clients.admin.CreateTopicsResult; +import org.apache.kafka.clients.admin.DescribeAclsResult; +import org.apache.kafka.clients.admin.DescribeTopicsResult; +import org.apache.kafka.clients.admin.ListTopicsResult; +import org.apache.kafka.clients.admin.TopicDescription; +import org.apache.kafka.common.KafkaFuture; +import org.apache.kafka.common.Node; +import org.apache.kafka.common.TopicPartitionInfo; +import org.apache.kafka.common.acl.AccessControlEntry; +import org.apache.kafka.common.acl.AclBinding; +import org.apache.kafka.common.acl.AclBindingFilter; +import org.apache.kafka.common.acl.AclOperation; +import org.apache.kafka.common.acl.AclPermissionType; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +// TODO From my humble point of view more work is require dto fix the test setup. +// Maybe it is also worth considering redesigning some classes involved to better adhere to shallow +// depth of test principle. +@ExtendWith(MockitoExtension.class) +public class UtilComponentsServiceTest { + + @Mock private ClusterApiUtils getAdminClient; + + @Mock private Environment env; + + @Mock private AdminClient adminClient; + + @Mock private ListTopicsResult listTopicsResult; + + @Mock private KafkaFuture> kafkaFuture; + + @Mock private KafkaFuture> kafkaFutureTopicdesc; + + @Mock private KafkaFuture> kafkaFutureCollection; + + @Mock private DescribeTopicsResult describeTopicsResult; + + @Mock private DescribeAclsResult describeAclsResult; + + @Mock private AccessControlEntry accessControlEntry; + + @Mock private CreateTopicsResult createTopicsResult; + + @Mock private CreateAclsResult createAclsResult; + + @Mock private Map> futureTocpiCreateResult; + + @Mock private KafkaFuture kFutureVoid; + + @Mock private RestTemplate restTemplate; + + private UtilMethods utilMethods; + + private UtilComponentsService utilComponentsService; + + private ApacheKafkaAclService apacheKafkaAclService; + + private ApacheKafkaTopicService apacheKafkaTopicService; + + private SchemaService schemaService; + + @BeforeEach + public void setUp() { + utilComponentsService = new UtilComponentsService(env, getAdminClient); + apacheKafkaAclService = new ApacheKafkaAclService(getAdminClient); + apacheKafkaTopicService = new ApacheKafkaTopicService(getAdminClient); + schemaService = new SchemaService(getAdminClient); + utilMethods = new UtilMethods(); + } + + // If no cluster type is defined, return + @Test + public void getStatusOnline() throws Exception { + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + ClusterStatus result = + utilComponentsService.getStatus("localhost", KafkaSupportedProtocol.PLAINTEXT, "", "kafka"); + assertThat(result).isSameAs(ClusterStatus.ONLINE); + } + + @Test + public void getStatusOffline1() { + + ClusterStatus result = + utilComponentsService.getStatus("localhost", KafkaSupportedProtocol.PLAINTEXT, "", ""); + assertThat(result).isSameAs(ClusterStatus.OFFLINE); + } + + @Test + public void getStatusOffline2() { + + ClusterStatus result = + utilComponentsService.getStatus("localhost", KafkaSupportedProtocol.PLAINTEXT, "", ""); + assertThat(result).isSameAs(ClusterStatus.OFFLINE); + } + + @Test + public void loadAcls1() throws Exception { + List listAclBindings = utilMethods.getListAclBindings(accessControlEntry); + + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.describeAcls(any(AclBindingFilter.class))).thenReturn(describeAclsResult); + when(describeAclsResult.values()).thenReturn(kafkaFutureCollection); + when(kafkaFutureCollection.get(anyLong(), any(TimeUnit.class))).thenReturn(listAclBindings); + when(accessControlEntry.host()).thenReturn("11.12.33.456"); + when(accessControlEntry.operation()).thenReturn(AclOperation.READ); + when(accessControlEntry.permissionType()).thenReturn(AclPermissionType.ALLOW); + + Set> result = + apacheKafkaAclService.loadAcls("localhost", KafkaSupportedProtocol.PLAINTEXT, ""); + assertThat(result).hasSize(1); + } + + @Test + public void loadAcls2() throws Exception { + List listAclBindings = utilMethods.getListAclBindings(accessControlEntry); + + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.describeAcls(any(AclBindingFilter.class))).thenReturn(describeAclsResult); + when(describeAclsResult.values()).thenReturn(kafkaFutureCollection); + when(kafkaFutureCollection.get(anyLong(), any(TimeUnit.class))).thenReturn(listAclBindings); + when(accessControlEntry.host()).thenReturn("11.12.33.456"); + when(accessControlEntry.operation()).thenReturn(AclOperation.CREATE); + when(accessControlEntry.permissionType()).thenReturn(AclPermissionType.ALLOW); + + Set> result = + apacheKafkaAclService.loadAcls("localhost", KafkaSupportedProtocol.PLAINTEXT, ""); + assertThat(result).isEmpty(); + } + + @Test + public void loadAcls3() throws Exception { + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.describeAcls(any())).thenThrow(new RuntimeException("Describe Acls Error")); + + Set> result = + apacheKafkaAclService.loadAcls("localhost", KafkaSupportedProtocol.PLAINTEXT, ""); + assertThat(result).isEmpty(); + } + + @Test + public void loadTopics() throws Exception { + Set list = new HashSet<>(); + when(getAdminClient.getAdminClient( + anyString(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.listTopics(any())).thenReturn(listTopicsResult); + when(listTopicsResult.names()).thenReturn(kafkaFuture); + when(kafkaFuture.get()).thenReturn(list); + + // Mockito seems to have trouble with stubbing default methods. + when(adminClient.describeTopics(anyCollection())).thenReturn(describeTopicsResult); + when(describeTopicsResult.all()).thenReturn(kafkaFutureTopicdesc); + when(kafkaFutureTopicdesc.get(anyLong(), any(TimeUnit.class))).thenReturn(getTopicDescs()); + + Set> result = + apacheKafkaTopicService.loadTopics("localhost", KafkaSupportedProtocol.PLAINTEXT, ""); + + Map hashMap = new HashMap<>(); + hashMap.put("partitions", "2"); + hashMap.put("replicationFactor", "1"); + hashMap.put("topicName", "testtopic2"); + + Map hashMap1 = new HashMap<>(); + hashMap1.put("partitions", "2"); + hashMap1.put("replicationFactor", "1"); + hashMap1.put("topicName", "testtopic1"); + + assertThat(result).hasSize(2); + assertThat(hashMap).isEqualTo(new ArrayList<>(result).get(0)); + assertThat(hashMap1).isEqualTo(new ArrayList<>(result).get(1)); + } + + @Test + public void createTopicSuccess() throws Exception { + ClusterTopicRequest clusterTopicRequest = + ClusterTopicRequest.builder() + .env("localhost") + .protocol(KafkaSupportedProtocol.PLAINTEXT) + .topicName("testtopic") + .partitions(1) + .replicationFactor(Short.parseShort("1")) + .clusterName("") + .build(); + + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.createTopics(any())).thenReturn(createTopicsResult); + when(createTopicsResult.values()).thenReturn(futureTocpiCreateResult); + when(futureTocpiCreateResult.get(anyString())).thenReturn(kFutureVoid); + + ApiResponse result = apacheKafkaTopicService.createTopic(clusterTopicRequest); + assertThat(result.getResult()).isEqualTo(ApiResultStatus.SUCCESS.value); + } + + // TODO review test configuration, since an NPE is thrown, which is most likely not intended here. + @Test + public void createTopicFailure1() throws Exception { + assertThatThrownBy( + () -> { + ClusterTopicRequest clusterTopicRequest = + ClusterTopicRequest.builder() + .env("localhost") + .protocol(KafkaSupportedProtocol.PLAINTEXT) + .topicName("testtopic") + .partitions(1) + .replicationFactor(Short.parseShort("1")) + .clusterName("") + .build(); + apacheKafkaTopicService.createTopic(clusterTopicRequest); + }) + .isInstanceOf(Exception.class); + } + + @Test + public void createTopicFailure2() throws Exception { + assertThatThrownBy( + () -> { + ClusterTopicRequest clusterTopicRequest = + ClusterTopicRequest.builder() + .env("localhost") + .protocol(KafkaSupportedProtocol.PLAINTEXT) + .topicName("testtopic") + .partitions(1) + .replicationFactor(Short.parseShort("1aa")) + .clusterName("") + .build(); + when(getAdminClient.getAdminClient( + any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + apacheKafkaTopicService.createTopic(clusterTopicRequest); + }) + .isInstanceOf(NumberFormatException.class); + } + + // TODO review test configuration, since an NPE is thrown, which is most likely not intended here. + @Test + public void createTopicFailure4() throws Exception { + assertThatThrownBy( + () -> { + ClusterTopicRequest clusterTopicRequest = + ClusterTopicRequest.builder() + .env("localhost") + .protocol(KafkaSupportedProtocol.PLAINTEXT) + .topicName("testtopic1") + .partitions(1) + .replicationFactor(Short.parseShort("1aa")) + .clusterName("") + .build(); + apacheKafkaTopicService.createTopic(clusterTopicRequest); + }) + .isInstanceOf(RuntimeException.class); + } + + @Test + public void createProducerAcl1() throws Exception { + ClusterAclRequest clusterAclRequest = utilMethods.getAclRequest(AclType.CONSUMER.value); + when(getAdminClient.getAdminClient( + anyString(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.createAcls(any())).thenReturn(createAclsResult); + when(createAclsResult.all()).thenReturn(kFutureVoid); + when(adminClient.describeAcls(any(AclBindingFilter.class))).thenReturn(describeAclsResult); + when(describeAclsResult.values()).thenReturn(kafkaFutureCollection); + when(kafkaFutureCollection.get(anyLong(), any(TimeUnit.class))) + .thenReturn(Collections.emptyList()); + String result = apacheKafkaAclService.updateProducerAcl(clusterAclRequest); + + assertThat(result).isEqualTo(ApiResultStatus.SUCCESS.value); + } + + @Test + public void createProducerAcl2() throws Exception { + ClusterAclRequest clusterAclRequest = utilMethods.getAclRequest(AclType.CONSUMER.value); + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.createAcls(any())).thenReturn(createAclsResult); + when(createAclsResult.all()).thenReturn(kFutureVoid); + when(adminClient.describeAcls(any(AclBindingFilter.class))).thenReturn(describeAclsResult); + when(describeAclsResult.values()).thenReturn(kafkaFutureCollection); + when(kafkaFutureCollection.get(anyLong(), any(TimeUnit.class))) + .thenReturn(Collections.emptyList()); + + String result = apacheKafkaAclService.updateProducerAcl(clusterAclRequest); + assertThat(result).isEqualTo(ApiResultStatus.SUCCESS.value); + } + + @Test + public void createConsumerAcl1() throws Exception { + ClusterAclRequest clusterAclRequest = utilMethods.getAclRequest(AclType.CONSUMER.value); + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.createAcls(any())).thenReturn(createAclsResult); + when(createAclsResult.all()).thenReturn(kFutureVoid); + when(adminClient.describeAcls(any(AclBindingFilter.class))).thenReturn(describeAclsResult); + when(describeAclsResult.values()).thenReturn(kafkaFutureCollection); + when(kafkaFutureCollection.get(anyLong(), any(TimeUnit.class))) + .thenReturn(Collections.emptyList()); + String result = apacheKafkaAclService.updateConsumerAcl(clusterAclRequest); + assertThat(result).isEqualTo(ApiResultStatus.SUCCESS.value); + } + + @Test + public void createConsumerAcl2() throws Exception { + ClusterAclRequest clusterAclRequest = utilMethods.getAclRequest(AclType.CONSUMER.value); + when(getAdminClient.getAdminClient(any(), eq(KafkaSupportedProtocol.PLAINTEXT), anyString())) + .thenReturn(adminClient); + when(adminClient.createAcls(any())).thenReturn(createAclsResult); + when(createAclsResult.all()).thenReturn(kFutureVoid); + when(adminClient.describeAcls(any(AclBindingFilter.class))).thenReturn(describeAclsResult); + when(describeAclsResult.values()).thenReturn(kafkaFutureCollection); + when(kafkaFutureCollection.get(anyLong(), any(TimeUnit.class))) + .thenReturn(Collections.emptyList()); + + String result = apacheKafkaAclService.updateConsumerAcl(clusterAclRequest); + assertThat(result).isEqualTo(ApiResultStatus.SUCCESS.value); + } + + @Test + public void postSchema1() { + ClusterSchemaRequest clusterSchemaRequest = utilMethods.getSchema(); + ApiResponse apiResponse = ApiResponse.builder().result("Schema created id : 101").build(); + ResponseEntity response = new ResponseEntity<>(apiResponse, HttpStatus.OK); + when(getAdminClient.getRequestDetails(any(), any(), any())) + .thenReturn(Pair.of("", restTemplate)); + when(restTemplate.postForEntity(anyString(), any(), eq(String.class))) + .thenReturn(new ResponseEntity<>("Schema created id : 101", HttpStatus.OK)); + + ApiResponse resultResp = schemaService.registerSchema(clusterSchemaRequest); + assertThat(resultResp.getResult()).isEqualTo("Schema created id : 101"); + } + + @Test + public void postSchema2() { + ClusterSchemaRequest clusterSchemaRequest = utilMethods.getSchema(); + when(getAdminClient.getRequestDetails(any(), any(), any())) + .thenReturn(Pair.of("", restTemplate)); + when(restTemplate.postForEntity(anyString(), any(), eq(String.class))) + .thenReturn( + new ResponseEntity<>( + "Cannot retrieve SchemaRegistry Url", HttpStatus.INTERNAL_SERVER_ERROR)); + ApiResponse resultResp = schemaService.registerSchema(clusterSchemaRequest); + assertThat(resultResp.getResult()).isEqualTo("Cannot retrieve SchemaRegistry Url"); + } + + private Map getTopicDescs() { + Node node = new Node(1, "localhost", 1); + + TopicPartitionInfo topicPartitionInfo = + new TopicPartitionInfo(2, node, List.of(node), List.of(node)); + TopicDescription tDesc = + new TopicDescription( + "testtopic", true, Arrays.asList(topicPartitionInfo, topicPartitionInfo)); + Map mapResults = new HashMap<>(); + mapResults.put("testtopic1", tDesc); + + tDesc = + new TopicDescription( + "testtopic2", true, Arrays.asList(topicPartitionInfo, topicPartitionInfo)); + mapResults.put("testtopic2", tDesc); + + return mapResults; + } +} diff --git a/cluster-api/src/test/java/io/aiven/klaw/clusterapi/utils/GetAdminClientTest.java b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/utils/GetAdminClientTest.java new file mode 100644 index 0000000000..ca042e677d --- /dev/null +++ b/cluster-api/src/test/java/io/aiven/klaw/clusterapi/utils/GetAdminClientTest.java @@ -0,0 +1,112 @@ +package io.aiven.klaw.clusterapi.utils; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +import io.aiven.klaw.clusterapi.models.KafkaSupportedProtocol; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.ListTopicsResult; +import org.apache.kafka.common.KafkaFuture; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.env.Environment; + +@ExtendWith(MockitoExtension.class) +public class GetAdminClientTest { + + public static final String LOCALHOST_9092 = "localhost:9092"; + public static final String LOCALHOST_9093 = "localhost:9093"; + public static final String LOCALHOST = "localhost"; + @Mock Environment env; + + @Mock AdminClient adminClient; + ClusterApiUtils getAdminClient; + @Mock private ListTopicsResult listTopicsResult; + @Mock private KafkaFuture> kafkaFuture; + @Mock private HashMap adminClientsMap; + @Mock private AdminClientProperties adminClientProperties; + + @BeforeEach + public void setUp() throws Exception { + getAdminClient = new ClusterApiUtils(env, adminClientProperties, adminClientsMap); + when(adminClientProperties.getRetriesConfig()).thenReturn("3"); + when(adminClientProperties.getRequestTimeOutMs()).thenReturn("15000"); + when(adminClientProperties.getRetryBackOffMsConfig()).thenReturn("15000"); + } + + @Test + public void getAdminClient1() throws Exception { + try (MockedStatic mocked = mockStatic(AdminClient.class)) { + mocked.when(() -> AdminClient.create(any(Properties.class))).thenReturn(adminClient); + // Commented out to avoid UnnecessaryStubbingException + // when(env.getProperty(any())).thenReturn("null"); + when(adminClient.listTopics()).thenReturn(listTopicsResult); + when(listTopicsResult.names()).thenReturn(kafkaFuture); + Set setStr = new HashSet<>(); + when(kafkaFuture.get()).thenReturn(setStr); + + AdminClient result = + getAdminClient.getAdminClient(LOCALHOST_9092, KafkaSupportedProtocol.PLAINTEXT, ""); + assertThat(result).isNotNull(); + } + } + + @Test + @Disabled + public void getAdminClient2() throws Exception { + try (MockedStatic mocked = mockStatic(AdminClient.class)) { + mocked.when(() -> AdminClient.create(any(Properties.class))).thenReturn(adminClient); + // Commented out to avoid UnnecessaryStubbingException + // when(env.getProperty(any())).thenReturn("true"); + when(adminClient.listTopics()).thenReturn(listTopicsResult); + when(listTopicsResult.names()).thenReturn(kafkaFuture); + Set setStr = new HashSet<>(); + when(kafkaFuture.get()).thenReturn(setStr); + + AdminClient result = + getAdminClient.getAdminClient(LOCALHOST_9092, KafkaSupportedProtocol.PLAINTEXT, ""); + assertThat(result).isNotNull(); + } + } + + @Test + @Disabled + public void getAdminClient3() throws Exception { + try (MockedStatic mocked = mockStatic(AdminClient.class)) { + mocked.when(() -> AdminClient.create(any(Properties.class))).thenReturn(adminClient); + // Commented out to avoid UnnecessaryStubbingException + when(env.getProperty(any())).thenReturn("false"); + when(adminClient.listTopics()).thenReturn(listTopicsResult); + when(listTopicsResult.names()).thenReturn(kafkaFuture); + Set setStr = new HashSet<>(); + when(kafkaFuture.get()).thenReturn(setStr); + + AdminClient result = + getAdminClient.getAdminClient(LOCALHOST_9092, KafkaSupportedProtocol.PLAINTEXT, ""); + assertThat(result).isNotNull(); + } + } + + @Test + public void getPlainProperties() { + Properties props = getAdminClient.getPlainProperties(LOCALHOST); + assertThat(props.getProperty("bootstrap.servers")).isEqualTo(LOCALHOST); + } + + @Test + public void getSslProperties() { + Properties props = getAdminClient.getSslProperties(LOCALHOST_9093, ""); + assertThat(props.getProperty("bootstrap.servers")).isEqualTo(LOCALHOST_9093); + } +} diff --git a/cluster-api/src/test/resources/application.properties b/cluster-api/src/test/resources/application.properties new file mode 100644 index 0000000000..570d8375a4 --- /dev/null +++ b/cluster-api/src/test/resources/application.properties @@ -0,0 +1,51 @@ +server.port=9343 + +# SSL properties to connect to Kafka clusters + +klawssl.kafkassl.keystore.location=client.keystore.p12 +klawssl.kafkassl.keystore.pwd=pwd +klawssl.kafkassl.key.pwd=pwd +klawssl.kafkassl.truststore.location=client.truststore.jks +klawssl.kafkassl.truststore.pwd=pwd +klawssl.kafkassl.keystore.type=pkcs12 +klawssl.kafkassl.truststore.type=JKS + +kafkasasl.saslmechanism.plain=PLAIN +kafkasasl.saslmechanism.gssapi=GSSAPI +kafkasasl.saslmechanism.scram.256=SCRAM-SHA-256 +kafkasasl.saslmechanism.scram.512=SCRAM-SHA-512 + +# User for accessing Cluster api +klaw.clusterapi.access.username=kwclusterapiuser +# Provide a base 64 encoded string below. The same secret should be configured in Klaw Api. Change to a new one. Ex : dGhpcyBpcyBhIHNlY3JldCB0byBhY2Nlc3MgY2x1c3RlcmFwaQ== +klaw.clusterapi.access.base64.secret=dGhpcyBpcyBhIHNlY3JldCB0byBhY2Nlc3MgY2x1c3RlcmFwaQ== + +# this property is required to avoid default password printing to console. +spring.security.user.password=avoid_default_pwd_logging + +#kafka consumer group id to read topic contents +#klaw.topiccontents.consumergroup.id=kwgenericconsumergroup +klaw.topiccontents.consumer.poll.interval.ms=2000 + +klaw.retries.config=10 +klaw.retry.backoff.ms=5000 +klaw.request.timeout.ms=15000 + +spring.banner.location=classpath:banner.txt + +# aiven acls config +klaw.aiven.listacls.api=https://api.aiven.io/v1/project/projectName/service/serviceName/acl +klaw.aiven.addacls.api=https://api.aiven.io/v1/project/projectName/service/serviceName/acl +klaw.aiven.deleteacls.api=https://api.aiven.io/v1/project/projectName/service/serviceName/acl/aclId +klaw.aiven.accesstoken=accesstoken + +# access token for https requests +klaw.clusters.accesstoken= + +#aiven schema security +klaw.aiven.karapace.credentials= +klaw.aiven.kafkaconnect.credentials= + +# log file settings +#logging.level.root=info +logging.file.name=./../logs/kw-clusterapi.log \ No newline at end of file diff --git a/cluster-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/cluster-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 0000000000..10d907ec28 --- /dev/null +++ b/cluster-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1,4 @@ +# Details: https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2#unmockable +# When this feature is enabled, some features that are usually only available when using PowerMockito can be used. +# This is considered a quick fix and it might be a good idea to review the design of some of the classes in this project. +mock-maker-inline \ No newline at end of file diff --git a/coral/Makefile b/coral/Makefile new file mode 100644 index 0000000000..405d6c4947 --- /dev/null +++ b/coral/Makefile @@ -0,0 +1,26 @@ +CORAL_DIST_PATH = coral/dist + +default: + @echo "TODO: ADD USAGE INSTRUCTIONS" + +$(CORAL_DIST_PATH): coral/index.html coral/src/* + pnpm --prefix coral build --assetsDir assets/coral --mode springboot + +src/main/resources/templates/coral/index.html: $(CORAL_DIST_PATH) + mkdir -p $(shell dirname $@) + cp -r $(CORAL_DIST_PATH)/index.html $@ + +src/main/resources/static/assets/coral: $(CORAL_DIST_PATH) + cp -r $(CORAL_DIST_PATH)/assets/* $@ + +.PHONY: enable-coral-in-springboot +enable-coral-in-springboot: src/main/resources/templates/coral/index.html src/main/resources/static/assets/coral + sed -i "" 's/klaw\.coral\.enabled=false/klaw\.coral\.enabled=true/' src/main/resources/application.properties + +.PHONY: disable-coral-in-springboot +disable-coral-in-springboot: + sed -i "" 's/klaw\.coral\.enabled=true/klaw\.coral\.enabled=false/' src/main/resources/application.properties + +clean: + rm -rf src/main/resources/templates/coral + rm -rf src/main/resources/static/assets/coral diff --git a/core/pom.xml b/core/pom.xml new file mode 100644 index 0000000000..baee48f408 --- /dev/null +++ b/core/pom.xml @@ -0,0 +1,156 @@ + + + 4.0.0 + + + io.aiven + klaw-project + 1.1.0 + + + klaw + jar + Klaw Core + Aiven Klaw - Core Api with user interface and cluster-api connectivity + + + 11 + UTF-8 + UTF-8 + + 2.11.0 + 5.2.3 + 1.10.0 + 3.1.0 + 2.1.214 + 3.0.4 + 4.1.80.Final + 1.33 + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.ldap + spring-ldap-core + + + org.springframework.security + spring-security-ldap + + + org.springframework.boot + spring-boot-starter-oauth2-client + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + + + org.springframework + spring-webflux + + + org.springframework.boot + spring-boot-starter-cache + + + com.mysql + mysql-connector-j + + + com.google.code.gson + gson + + + org.apache.commons + commons-text + ${commons-text.version} + + + org.apache.poi + poi + ${apachepoi.version} + + + org.apache.poi + poi-ooxml + ${apachepoi.version} + + + commons-io + commons-io + ${apachecommons.version} + + + com.h2database + h2 + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + ${jasyptencrypt.version} + + + com.zaxxer + HikariCP + + + io.projectreactor.netty + reactor-netty + + + com.github.ben-manes.caffeine + caffeine + + + org.liquibase + liquibase-core + + + javax.mail + javax.mail-api + + + org.springframework.security + spring-security-test + test + + + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + uglifyjs-files + + java + + test + + io.aiven.klaw.uglify.UglifyFiles + + + + + + + + \ No newline at end of file diff --git a/src/main/java/io/aiven/klaw/UiapiApplication.java b/core/src/main/java/io/aiven/klaw/UiapiApplication.java similarity index 100% rename from src/main/java/io/aiven/klaw/UiapiApplication.java rename to core/src/main/java/io/aiven/klaw/UiapiApplication.java diff --git a/src/main/java/io/aiven/klaw/auth/KwAuthenticationFailureHandler.java b/core/src/main/java/io/aiven/klaw/auth/KwAuthenticationFailureHandler.java similarity index 100% rename from src/main/java/io/aiven/klaw/auth/KwAuthenticationFailureHandler.java rename to core/src/main/java/io/aiven/klaw/auth/KwAuthenticationFailureHandler.java diff --git a/src/main/java/io/aiven/klaw/auth/KwAuthenticationService.java b/core/src/main/java/io/aiven/klaw/auth/KwAuthenticationService.java similarity index 100% rename from src/main/java/io/aiven/klaw/auth/KwAuthenticationService.java rename to core/src/main/java/io/aiven/klaw/auth/KwAuthenticationService.java diff --git a/src/main/java/io/aiven/klaw/auth/KwAuthenticationSuccessHandler.java b/core/src/main/java/io/aiven/klaw/auth/KwAuthenticationSuccessHandler.java similarity index 100% rename from src/main/java/io/aiven/klaw/auth/KwAuthenticationSuccessHandler.java rename to core/src/main/java/io/aiven/klaw/auth/KwAuthenticationSuccessHandler.java diff --git a/src/main/java/io/aiven/klaw/auth/KwRequestFilter.java b/core/src/main/java/io/aiven/klaw/auth/KwRequestFilter.java similarity index 100% rename from src/main/java/io/aiven/klaw/auth/KwRequestFilter.java rename to core/src/main/java/io/aiven/klaw/auth/KwRequestFilter.java diff --git a/src/main/java/io/aiven/klaw/config/CacheConfig.java b/core/src/main/java/io/aiven/klaw/config/CacheConfig.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/CacheConfig.java rename to core/src/main/java/io/aiven/klaw/config/CacheConfig.java diff --git a/src/main/java/io/aiven/klaw/config/DataSourceConfig.java b/core/src/main/java/io/aiven/klaw/config/DataSourceConfig.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/DataSourceConfig.java rename to core/src/main/java/io/aiven/klaw/config/DataSourceConfig.java diff --git a/src/main/java/io/aiven/klaw/config/EmailConfig.java b/core/src/main/java/io/aiven/klaw/config/EmailConfig.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/EmailConfig.java rename to core/src/main/java/io/aiven/klaw/config/EmailConfig.java diff --git a/src/main/java/io/aiven/klaw/config/Http2Config.java b/core/src/main/java/io/aiven/klaw/config/Http2Config.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/Http2Config.java rename to core/src/main/java/io/aiven/klaw/config/Http2Config.java diff --git a/src/main/java/io/aiven/klaw/config/ManageDatabase.java b/core/src/main/java/io/aiven/klaw/config/ManageDatabase.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/ManageDatabase.java rename to core/src/main/java/io/aiven/klaw/config/ManageDatabase.java diff --git a/src/main/java/io/aiven/klaw/config/SecurityConfigNoSSO.java b/core/src/main/java/io/aiven/klaw/config/SecurityConfigNoSSO.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/SecurityConfigNoSSO.java rename to core/src/main/java/io/aiven/klaw/config/SecurityConfigNoSSO.java diff --git a/src/main/java/io/aiven/klaw/config/SecurityConfigSSO.java b/core/src/main/java/io/aiven/klaw/config/SecurityConfigSSO.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/SecurityConfigSSO.java rename to core/src/main/java/io/aiven/klaw/config/SecurityConfigSSO.java diff --git a/src/main/java/io/aiven/klaw/config/WebConfig.java b/core/src/main/java/io/aiven/klaw/config/WebConfig.java similarity index 100% rename from src/main/java/io/aiven/klaw/config/WebConfig.java rename to core/src/main/java/io/aiven/klaw/config/WebConfig.java diff --git a/src/main/java/io/aiven/klaw/controller/AclController.java b/core/src/main/java/io/aiven/klaw/controller/AclController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/AclController.java rename to core/src/main/java/io/aiven/klaw/controller/AclController.java diff --git a/src/main/java/io/aiven/klaw/controller/AclSyncController.java b/core/src/main/java/io/aiven/klaw/controller/AclSyncController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/AclSyncController.java rename to core/src/main/java/io/aiven/klaw/controller/AclSyncController.java diff --git a/src/main/java/io/aiven/klaw/controller/AnalyticsController.java b/core/src/main/java/io/aiven/klaw/controller/AnalyticsController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/AnalyticsController.java rename to core/src/main/java/io/aiven/klaw/controller/AnalyticsController.java diff --git a/src/main/java/io/aiven/klaw/controller/CoralController.java b/core/src/main/java/io/aiven/klaw/controller/CoralController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/CoralController.java rename to core/src/main/java/io/aiven/klaw/controller/CoralController.java diff --git a/src/main/java/io/aiven/klaw/controller/EnvsClustersTenantsController.java b/core/src/main/java/io/aiven/klaw/controller/EnvsClustersTenantsController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/EnvsClustersTenantsController.java rename to core/src/main/java/io/aiven/klaw/controller/EnvsClustersTenantsController.java diff --git a/src/main/java/io/aiven/klaw/controller/KafkaConnectController.java b/core/src/main/java/io/aiven/klaw/controller/KafkaConnectController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/KafkaConnectController.java rename to core/src/main/java/io/aiven/klaw/controller/KafkaConnectController.java diff --git a/src/main/java/io/aiven/klaw/controller/KafkaConnectSyncController.java b/core/src/main/java/io/aiven/klaw/controller/KafkaConnectSyncController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/KafkaConnectSyncController.java rename to core/src/main/java/io/aiven/klaw/controller/KafkaConnectSyncController.java diff --git a/src/main/java/io/aiven/klaw/controller/MetricsController.java b/core/src/main/java/io/aiven/klaw/controller/MetricsController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/MetricsController.java rename to core/src/main/java/io/aiven/klaw/controller/MetricsController.java diff --git a/src/main/java/io/aiven/klaw/controller/ResourceClientController.java b/core/src/main/java/io/aiven/klaw/controller/ResourceClientController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/ResourceClientController.java rename to core/src/main/java/io/aiven/klaw/controller/ResourceClientController.java diff --git a/src/main/java/io/aiven/klaw/controller/RolesPermissionsController.java b/core/src/main/java/io/aiven/klaw/controller/RolesPermissionsController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/RolesPermissionsController.java rename to core/src/main/java/io/aiven/klaw/controller/RolesPermissionsController.java diff --git a/src/main/java/io/aiven/klaw/controller/SchemaRegstryController.java b/core/src/main/java/io/aiven/klaw/controller/SchemaRegstryController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/SchemaRegstryController.java rename to core/src/main/java/io/aiven/klaw/controller/SchemaRegstryController.java diff --git a/src/main/java/io/aiven/klaw/controller/ServerConfigController.java b/core/src/main/java/io/aiven/klaw/controller/ServerConfigController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/ServerConfigController.java rename to core/src/main/java/io/aiven/klaw/controller/ServerConfigController.java diff --git a/src/main/java/io/aiven/klaw/controller/TemplateMapController.java b/core/src/main/java/io/aiven/klaw/controller/TemplateMapController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/TemplateMapController.java rename to core/src/main/java/io/aiven/klaw/controller/TemplateMapController.java diff --git a/src/main/java/io/aiven/klaw/controller/TopicController.java b/core/src/main/java/io/aiven/klaw/controller/TopicController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/TopicController.java rename to core/src/main/java/io/aiven/klaw/controller/TopicController.java diff --git a/src/main/java/io/aiven/klaw/controller/TopicSyncController.java b/core/src/main/java/io/aiven/klaw/controller/TopicSyncController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/TopicSyncController.java rename to core/src/main/java/io/aiven/klaw/controller/TopicSyncController.java diff --git a/src/main/java/io/aiven/klaw/controller/UiConfigController.java b/core/src/main/java/io/aiven/klaw/controller/UiConfigController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/UiConfigController.java rename to core/src/main/java/io/aiven/klaw/controller/UiConfigController.java diff --git a/src/main/java/io/aiven/klaw/controller/UsersTeamsController.java b/core/src/main/java/io/aiven/klaw/controller/UsersTeamsController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/UsersTeamsController.java rename to core/src/main/java/io/aiven/klaw/controller/UsersTeamsController.java diff --git a/src/main/java/io/aiven/klaw/controller/UtilController.java b/core/src/main/java/io/aiven/klaw/controller/UtilController.java similarity index 100% rename from src/main/java/io/aiven/klaw/controller/UtilController.java rename to core/src/main/java/io/aiven/klaw/controller/UtilController.java diff --git a/src/main/java/io/aiven/klaw/dao/Acl.java b/core/src/main/java/io/aiven/klaw/dao/Acl.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/Acl.java rename to core/src/main/java/io/aiven/klaw/dao/Acl.java diff --git a/src/main/java/io/aiven/klaw/dao/AclID.java b/core/src/main/java/io/aiven/klaw/dao/AclID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/AclID.java rename to core/src/main/java/io/aiven/klaw/dao/AclID.java diff --git a/src/main/java/io/aiven/klaw/dao/AclRequestID.java b/core/src/main/java/io/aiven/klaw/dao/AclRequestID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/AclRequestID.java rename to core/src/main/java/io/aiven/klaw/dao/AclRequestID.java diff --git a/src/main/java/io/aiven/klaw/dao/AclRequests.java b/core/src/main/java/io/aiven/klaw/dao/AclRequests.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/AclRequests.java rename to core/src/main/java/io/aiven/klaw/dao/AclRequests.java diff --git a/src/main/java/io/aiven/klaw/dao/ActivityLog.java b/core/src/main/java/io/aiven/klaw/dao/ActivityLog.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/ActivityLog.java rename to core/src/main/java/io/aiven/klaw/dao/ActivityLog.java diff --git a/src/main/java/io/aiven/klaw/dao/ActivityLogID.java b/core/src/main/java/io/aiven/klaw/dao/ActivityLogID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/ActivityLogID.java rename to core/src/main/java/io/aiven/klaw/dao/ActivityLogID.java diff --git a/src/main/java/io/aiven/klaw/dao/Env.java b/core/src/main/java/io/aiven/klaw/dao/Env.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/Env.java rename to core/src/main/java/io/aiven/klaw/dao/Env.java diff --git a/src/main/java/io/aiven/klaw/dao/EnvID.java b/core/src/main/java/io/aiven/klaw/dao/EnvID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/EnvID.java rename to core/src/main/java/io/aiven/klaw/dao/EnvID.java diff --git a/src/main/java/io/aiven/klaw/dao/KafkaConnectorRequest.java b/core/src/main/java/io/aiven/klaw/dao/KafkaConnectorRequest.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KafkaConnectorRequest.java rename to core/src/main/java/io/aiven/klaw/dao/KafkaConnectorRequest.java diff --git a/src/main/java/io/aiven/klaw/dao/KafkaConnectorRequestID.java b/core/src/main/java/io/aiven/klaw/dao/KafkaConnectorRequestID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KafkaConnectorRequestID.java rename to core/src/main/java/io/aiven/klaw/dao/KafkaConnectorRequestID.java diff --git a/src/main/java/io/aiven/klaw/dao/KwClusterID.java b/core/src/main/java/io/aiven/klaw/dao/KwClusterID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwClusterID.java rename to core/src/main/java/io/aiven/klaw/dao/KwClusterID.java diff --git a/src/main/java/io/aiven/klaw/dao/KwClusters.java b/core/src/main/java/io/aiven/klaw/dao/KwClusters.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwClusters.java rename to core/src/main/java/io/aiven/klaw/dao/KwClusters.java diff --git a/src/main/java/io/aiven/klaw/dao/KwKafkaConnector.java b/core/src/main/java/io/aiven/klaw/dao/KwKafkaConnector.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwKafkaConnector.java rename to core/src/main/java/io/aiven/klaw/dao/KwKafkaConnector.java diff --git a/src/main/java/io/aiven/klaw/dao/KwKafkaConnectorID.java b/core/src/main/java/io/aiven/klaw/dao/KwKafkaConnectorID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwKafkaConnectorID.java rename to core/src/main/java/io/aiven/klaw/dao/KwKafkaConnectorID.java diff --git a/src/main/java/io/aiven/klaw/dao/KwMetrics.java b/core/src/main/java/io/aiven/klaw/dao/KwMetrics.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwMetrics.java rename to core/src/main/java/io/aiven/klaw/dao/KwMetrics.java diff --git a/src/main/java/io/aiven/klaw/dao/KwProperties.java b/core/src/main/java/io/aiven/klaw/dao/KwProperties.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwProperties.java rename to core/src/main/java/io/aiven/klaw/dao/KwProperties.java diff --git a/src/main/java/io/aiven/klaw/dao/KwPropertiesID.java b/core/src/main/java/io/aiven/klaw/dao/KwPropertiesID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwPropertiesID.java rename to core/src/main/java/io/aiven/klaw/dao/KwPropertiesID.java diff --git a/src/main/java/io/aiven/klaw/dao/KwRolesPermissions.java b/core/src/main/java/io/aiven/klaw/dao/KwRolesPermissions.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwRolesPermissions.java rename to core/src/main/java/io/aiven/klaw/dao/KwRolesPermissions.java diff --git a/src/main/java/io/aiven/klaw/dao/KwRolesPermissionsID.java b/core/src/main/java/io/aiven/klaw/dao/KwRolesPermissionsID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwRolesPermissionsID.java rename to core/src/main/java/io/aiven/klaw/dao/KwRolesPermissionsID.java diff --git a/src/main/java/io/aiven/klaw/dao/KwTenants.java b/core/src/main/java/io/aiven/klaw/dao/KwTenants.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/KwTenants.java rename to core/src/main/java/io/aiven/klaw/dao/KwTenants.java diff --git a/src/main/java/io/aiven/klaw/dao/MessageSchema.java b/core/src/main/java/io/aiven/klaw/dao/MessageSchema.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/MessageSchema.java rename to core/src/main/java/io/aiven/klaw/dao/MessageSchema.java diff --git a/src/main/java/io/aiven/klaw/dao/MessageSchemaID.java b/core/src/main/java/io/aiven/klaw/dao/MessageSchemaID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/MessageSchemaID.java rename to core/src/main/java/io/aiven/klaw/dao/MessageSchemaID.java diff --git a/src/main/java/io/aiven/klaw/dao/ProductDetails.java b/core/src/main/java/io/aiven/klaw/dao/ProductDetails.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/ProductDetails.java rename to core/src/main/java/io/aiven/klaw/dao/ProductDetails.java diff --git a/src/main/java/io/aiven/klaw/dao/RegisterUserInfo.java b/core/src/main/java/io/aiven/klaw/dao/RegisterUserInfo.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/RegisterUserInfo.java rename to core/src/main/java/io/aiven/klaw/dao/RegisterUserInfo.java diff --git a/src/main/java/io/aiven/klaw/dao/SchemaRequest.java b/core/src/main/java/io/aiven/klaw/dao/SchemaRequest.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/SchemaRequest.java rename to core/src/main/java/io/aiven/klaw/dao/SchemaRequest.java diff --git a/src/main/java/io/aiven/klaw/dao/SchemaRequestID.java b/core/src/main/java/io/aiven/klaw/dao/SchemaRequestID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/SchemaRequestID.java rename to core/src/main/java/io/aiven/klaw/dao/SchemaRequestID.java diff --git a/src/main/java/io/aiven/klaw/dao/Team.java b/core/src/main/java/io/aiven/klaw/dao/Team.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/Team.java rename to core/src/main/java/io/aiven/klaw/dao/Team.java diff --git a/src/main/java/io/aiven/klaw/dao/TeamID.java b/core/src/main/java/io/aiven/klaw/dao/TeamID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/TeamID.java rename to core/src/main/java/io/aiven/klaw/dao/TeamID.java diff --git a/src/main/java/io/aiven/klaw/dao/Topic.java b/core/src/main/java/io/aiven/klaw/dao/Topic.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/Topic.java rename to core/src/main/java/io/aiven/klaw/dao/Topic.java diff --git a/src/main/java/io/aiven/klaw/dao/TopicID.java b/core/src/main/java/io/aiven/klaw/dao/TopicID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/TopicID.java rename to core/src/main/java/io/aiven/klaw/dao/TopicID.java diff --git a/src/main/java/io/aiven/klaw/dao/TopicRequest.java b/core/src/main/java/io/aiven/klaw/dao/TopicRequest.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/TopicRequest.java rename to core/src/main/java/io/aiven/klaw/dao/TopicRequest.java diff --git a/src/main/java/io/aiven/klaw/dao/TopicRequestID.java b/core/src/main/java/io/aiven/klaw/dao/TopicRequestID.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/TopicRequestID.java rename to core/src/main/java/io/aiven/klaw/dao/TopicRequestID.java diff --git a/src/main/java/io/aiven/klaw/dao/UserInfo.java b/core/src/main/java/io/aiven/klaw/dao/UserInfo.java similarity index 100% rename from src/main/java/io/aiven/klaw/dao/UserInfo.java rename to core/src/main/java/io/aiven/klaw/dao/UserInfo.java diff --git a/src/main/java/io/aiven/klaw/error/KlawException.java b/core/src/main/java/io/aiven/klaw/error/KlawException.java similarity index 100% rename from src/main/java/io/aiven/klaw/error/KlawException.java rename to core/src/main/java/io/aiven/klaw/error/KlawException.java diff --git a/src/main/java/io/aiven/klaw/error/KlawExceptionHandler.java b/core/src/main/java/io/aiven/klaw/error/KlawExceptionHandler.java similarity index 100% rename from src/main/java/io/aiven/klaw/error/KlawExceptionHandler.java rename to core/src/main/java/io/aiven/klaw/error/KlawExceptionHandler.java diff --git a/src/main/java/io/aiven/klaw/helpers/HandleDbRequests.java b/core/src/main/java/io/aiven/klaw/helpers/HandleDbRequests.java similarity index 100% rename from src/main/java/io/aiven/klaw/helpers/HandleDbRequests.java rename to core/src/main/java/io/aiven/klaw/helpers/HandleDbRequests.java diff --git a/src/main/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbc.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbc.java similarity index 100% rename from src/main/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbc.java rename to core/src/main/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbc.java diff --git a/src/main/java/io/aiven/klaw/helpers/db/rdbms/HandleDbRequestsJdbc.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/HandleDbRequestsJdbc.java similarity index 100% rename from src/main/java/io/aiven/klaw/helpers/db/rdbms/HandleDbRequestsJdbc.java rename to core/src/main/java/io/aiven/klaw/helpers/db/rdbms/HandleDbRequestsJdbc.java diff --git a/src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java similarity index 100% rename from src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java rename to core/src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java diff --git a/src/main/java/io/aiven/klaw/helpers/db/rdbms/JdbcDataSourceCondition.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/JdbcDataSourceCondition.java similarity index 100% rename from src/main/java/io/aiven/klaw/helpers/db/rdbms/JdbcDataSourceCondition.java rename to core/src/main/java/io/aiven/klaw/helpers/db/rdbms/JdbcDataSourceCondition.java diff --git a/src/main/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbc.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbc.java similarity index 100% rename from src/main/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbc.java rename to core/src/main/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbc.java diff --git a/src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java similarity index 100% rename from src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java rename to core/src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java diff --git a/src/main/java/io/aiven/klaw/listeners/MetadataListener.java b/core/src/main/java/io/aiven/klaw/listeners/MetadataListener.java similarity index 100% rename from src/main/java/io/aiven/klaw/listeners/MetadataListener.java rename to core/src/main/java/io/aiven/klaw/listeners/MetadataListener.java diff --git a/src/main/java/io/aiven/klaw/model/AclIPPrincipleType.java b/core/src/main/java/io/aiven/klaw/model/AclIPPrincipleType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/AclIPPrincipleType.java rename to core/src/main/java/io/aiven/klaw/model/AclIPPrincipleType.java diff --git a/src/main/java/io/aiven/klaw/model/AclInfo.java b/core/src/main/java/io/aiven/klaw/model/AclInfo.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/AclInfo.java rename to core/src/main/java/io/aiven/klaw/model/AclInfo.java diff --git a/src/main/java/io/aiven/klaw/model/AclPatternType.java b/core/src/main/java/io/aiven/klaw/model/AclPatternType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/AclPatternType.java rename to core/src/main/java/io/aiven/klaw/model/AclPatternType.java diff --git a/src/main/java/io/aiven/klaw/model/AclPermissionType.java b/core/src/main/java/io/aiven/klaw/model/AclPermissionType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/AclPermissionType.java rename to core/src/main/java/io/aiven/klaw/model/AclPermissionType.java diff --git a/src/main/java/io/aiven/klaw/model/AclRequestsModel.java b/core/src/main/java/io/aiven/klaw/model/AclRequestsModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/AclRequestsModel.java rename to core/src/main/java/io/aiven/klaw/model/AclRequestsModel.java diff --git a/src/main/java/io/aiven/klaw/model/AclType.java b/core/src/main/java/io/aiven/klaw/model/AclType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/AclType.java rename to core/src/main/java/io/aiven/klaw/model/AclType.java diff --git a/src/main/java/io/aiven/klaw/model/AclsNativeType.java b/core/src/main/java/io/aiven/klaw/model/AclsNativeType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/AclsNativeType.java rename to core/src/main/java/io/aiven/klaw/model/AclsNativeType.java diff --git a/src/main/java/io/aiven/klaw/model/ActivityLogModel.java b/core/src/main/java/io/aiven/klaw/model/ActivityLogModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/ActivityLogModel.java rename to core/src/main/java/io/aiven/klaw/model/ActivityLogModel.java diff --git a/src/main/java/io/aiven/klaw/model/ApiResponse.java b/core/src/main/java/io/aiven/klaw/model/ApiResponse.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/ApiResponse.java rename to core/src/main/java/io/aiven/klaw/model/ApiResponse.java diff --git a/src/main/java/io/aiven/klaw/model/ApiResultStatus.java b/core/src/main/java/io/aiven/klaw/model/ApiResultStatus.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/ApiResultStatus.java rename to core/src/main/java/io/aiven/klaw/model/ApiResultStatus.java diff --git a/src/main/java/io/aiven/klaw/model/CaptchaResponse.java b/core/src/main/java/io/aiven/klaw/model/CaptchaResponse.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/CaptchaResponse.java rename to core/src/main/java/io/aiven/klaw/model/CaptchaResponse.java diff --git a/src/main/java/io/aiven/klaw/model/ClusterStatus.java b/core/src/main/java/io/aiven/klaw/model/ClusterStatus.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/ClusterStatus.java rename to core/src/main/java/io/aiven/klaw/model/ClusterStatus.java diff --git a/src/main/java/io/aiven/klaw/model/ConnectorOverview.java b/core/src/main/java/io/aiven/klaw/model/ConnectorOverview.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/ConnectorOverview.java rename to core/src/main/java/io/aiven/klaw/model/ConnectorOverview.java diff --git a/src/main/java/io/aiven/klaw/model/EntityType.java b/core/src/main/java/io/aiven/klaw/model/EntityType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/EntityType.java rename to core/src/main/java/io/aiven/klaw/model/EntityType.java diff --git a/src/main/java/io/aiven/klaw/model/EnvModel.java b/core/src/main/java/io/aiven/klaw/model/EnvModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/EnvModel.java rename to core/src/main/java/io/aiven/klaw/model/EnvModel.java diff --git a/src/main/java/io/aiven/klaw/model/KafkaClustersType.java b/core/src/main/java/io/aiven/klaw/model/KafkaClustersType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KafkaClustersType.java rename to core/src/main/java/io/aiven/klaw/model/KafkaClustersType.java diff --git a/src/main/java/io/aiven/klaw/model/KafkaConnectorModel.java b/core/src/main/java/io/aiven/klaw/model/KafkaConnectorModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KafkaConnectorModel.java rename to core/src/main/java/io/aiven/klaw/model/KafkaConnectorModel.java diff --git a/src/main/java/io/aiven/klaw/model/KafkaConnectorRequestModel.java b/core/src/main/java/io/aiven/klaw/model/KafkaConnectorRequestModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KafkaConnectorRequestModel.java rename to core/src/main/java/io/aiven/klaw/model/KafkaConnectorRequestModel.java diff --git a/src/main/java/io/aiven/klaw/model/KafkaFlavors.java b/core/src/main/java/io/aiven/klaw/model/KafkaFlavors.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KafkaFlavors.java rename to core/src/main/java/io/aiven/klaw/model/KafkaFlavors.java diff --git a/src/main/java/io/aiven/klaw/model/KafkaSupportedProtocol.java b/core/src/main/java/io/aiven/klaw/model/KafkaSupportedProtocol.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KafkaSupportedProtocol.java rename to core/src/main/java/io/aiven/klaw/model/KafkaSupportedProtocol.java diff --git a/src/main/java/io/aiven/klaw/model/KwClustersModel.java b/core/src/main/java/io/aiven/klaw/model/KwClustersModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KwClustersModel.java rename to core/src/main/java/io/aiven/klaw/model/KwClustersModel.java diff --git a/src/main/java/io/aiven/klaw/model/KwMetadataUpdates.java b/core/src/main/java/io/aiven/klaw/model/KwMetadataUpdates.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KwMetadataUpdates.java rename to core/src/main/java/io/aiven/klaw/model/KwMetadataUpdates.java diff --git a/src/main/java/io/aiven/klaw/model/KwPropertiesModel.java b/core/src/main/java/io/aiven/klaw/model/KwPropertiesModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KwPropertiesModel.java rename to core/src/main/java/io/aiven/klaw/model/KwPropertiesModel.java diff --git a/src/main/java/io/aiven/klaw/model/KwRolesPermissionsModel.java b/core/src/main/java/io/aiven/klaw/model/KwRolesPermissionsModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KwRolesPermissionsModel.java rename to core/src/main/java/io/aiven/klaw/model/KwRolesPermissionsModel.java diff --git a/src/main/java/io/aiven/klaw/model/KwTenantConfigModel.java b/core/src/main/java/io/aiven/klaw/model/KwTenantConfigModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KwTenantConfigModel.java rename to core/src/main/java/io/aiven/klaw/model/KwTenantConfigModel.java diff --git a/src/main/java/io/aiven/klaw/model/KwTenantModel.java b/core/src/main/java/io/aiven/klaw/model/KwTenantModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/KwTenantModel.java rename to core/src/main/java/io/aiven/klaw/model/KwTenantModel.java diff --git a/src/main/java/io/aiven/klaw/model/MailType.java b/core/src/main/java/io/aiven/klaw/model/MailType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/MailType.java rename to core/src/main/java/io/aiven/klaw/model/MailType.java diff --git a/src/main/java/io/aiven/klaw/model/MetadataOperationType.java b/core/src/main/java/io/aiven/klaw/model/MetadataOperationType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/MetadataOperationType.java rename to core/src/main/java/io/aiven/klaw/model/MetadataOperationType.java diff --git a/src/main/java/io/aiven/klaw/model/PermissionType.java b/core/src/main/java/io/aiven/klaw/model/PermissionType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/PermissionType.java rename to core/src/main/java/io/aiven/klaw/model/PermissionType.java diff --git a/src/main/java/io/aiven/klaw/model/RegisterSaasUserInfoModel.java b/core/src/main/java/io/aiven/klaw/model/RegisterSaasUserInfoModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/RegisterSaasUserInfoModel.java rename to core/src/main/java/io/aiven/klaw/model/RegisterSaasUserInfoModel.java diff --git a/src/main/java/io/aiven/klaw/model/RegisterUserInfoModel.java b/core/src/main/java/io/aiven/klaw/model/RegisterUserInfoModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/RegisterUserInfoModel.java rename to core/src/main/java/io/aiven/klaw/model/RegisterUserInfoModel.java diff --git a/src/main/java/io/aiven/klaw/model/RequestOperationType.java b/core/src/main/java/io/aiven/klaw/model/RequestOperationType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/RequestOperationType.java rename to core/src/main/java/io/aiven/klaw/model/RequestOperationType.java diff --git a/src/main/java/io/aiven/klaw/model/RequestStatus.java b/core/src/main/java/io/aiven/klaw/model/RequestStatus.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/RequestStatus.java rename to core/src/main/java/io/aiven/klaw/model/RequestStatus.java diff --git a/src/main/java/io/aiven/klaw/model/RolesType.java b/core/src/main/java/io/aiven/klaw/model/RolesType.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/RolesType.java rename to core/src/main/java/io/aiven/klaw/model/RolesType.java diff --git a/src/main/java/io/aiven/klaw/model/SchemaRequestModel.java b/core/src/main/java/io/aiven/klaw/model/SchemaRequestModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/SchemaRequestModel.java rename to core/src/main/java/io/aiven/klaw/model/SchemaRequestModel.java diff --git a/src/main/java/io/aiven/klaw/model/ServerConfigProperties.java b/core/src/main/java/io/aiven/klaw/model/ServerConfigProperties.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/ServerConfigProperties.java rename to core/src/main/java/io/aiven/klaw/model/ServerConfigProperties.java diff --git a/src/main/java/io/aiven/klaw/model/SyncAclUpdates.java b/core/src/main/java/io/aiven/klaw/model/SyncAclUpdates.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/SyncAclUpdates.java rename to core/src/main/java/io/aiven/klaw/model/SyncAclUpdates.java diff --git a/src/main/java/io/aiven/klaw/model/SyncBackAcls.java b/core/src/main/java/io/aiven/klaw/model/SyncBackAcls.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/SyncBackAcls.java rename to core/src/main/java/io/aiven/klaw/model/SyncBackAcls.java diff --git a/src/main/java/io/aiven/klaw/model/SyncBackTopics.java b/core/src/main/java/io/aiven/klaw/model/SyncBackTopics.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/SyncBackTopics.java rename to core/src/main/java/io/aiven/klaw/model/SyncBackTopics.java diff --git a/src/main/java/io/aiven/klaw/model/SyncConnectorUpdates.java b/core/src/main/java/io/aiven/klaw/model/SyncConnectorUpdates.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/SyncConnectorUpdates.java rename to core/src/main/java/io/aiven/klaw/model/SyncConnectorUpdates.java diff --git a/src/main/java/io/aiven/klaw/model/SyncTopicUpdates.java b/core/src/main/java/io/aiven/klaw/model/SyncTopicUpdates.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/SyncTopicUpdates.java rename to core/src/main/java/io/aiven/klaw/model/SyncTopicUpdates.java diff --git a/src/main/java/io/aiven/klaw/model/SyncTopicsBulk.java b/core/src/main/java/io/aiven/klaw/model/SyncTopicsBulk.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/SyncTopicsBulk.java rename to core/src/main/java/io/aiven/klaw/model/SyncTopicsBulk.java diff --git a/src/main/java/io/aiven/klaw/model/TeamModel.java b/core/src/main/java/io/aiven/klaw/model/TeamModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/TeamModel.java rename to core/src/main/java/io/aiven/klaw/model/TeamModel.java diff --git a/src/main/java/io/aiven/klaw/model/TenantConfig.java b/core/src/main/java/io/aiven/klaw/model/TenantConfig.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/TenantConfig.java rename to core/src/main/java/io/aiven/klaw/model/TenantConfig.java diff --git a/src/main/java/io/aiven/klaw/model/TopicHistory.java b/core/src/main/java/io/aiven/klaw/model/TopicHistory.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/TopicHistory.java rename to core/src/main/java/io/aiven/klaw/model/TopicHistory.java diff --git a/src/main/java/io/aiven/klaw/model/TopicInfo.java b/core/src/main/java/io/aiven/klaw/model/TopicInfo.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/TopicInfo.java rename to core/src/main/java/io/aiven/klaw/model/TopicInfo.java diff --git a/src/main/java/io/aiven/klaw/model/TopicOverview.java b/core/src/main/java/io/aiven/klaw/model/TopicOverview.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/TopicOverview.java rename to core/src/main/java/io/aiven/klaw/model/TopicOverview.java diff --git a/src/main/java/io/aiven/klaw/model/TopicRequestModel.java b/core/src/main/java/io/aiven/klaw/model/TopicRequestModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/TopicRequestModel.java rename to core/src/main/java/io/aiven/klaw/model/TopicRequestModel.java diff --git a/src/main/java/io/aiven/klaw/model/TopicRequestTypes.java b/core/src/main/java/io/aiven/klaw/model/TopicRequestTypes.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/TopicRequestTypes.java rename to core/src/main/java/io/aiven/klaw/model/TopicRequestTypes.java diff --git a/src/main/java/io/aiven/klaw/model/UserInfoModel.java b/core/src/main/java/io/aiven/klaw/model/UserInfoModel.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/UserInfoModel.java rename to core/src/main/java/io/aiven/klaw/model/UserInfoModel.java diff --git a/src/main/java/io/aiven/klaw/model/charts/ChartsJsOverview.java b/core/src/main/java/io/aiven/klaw/model/charts/ChartsJsOverview.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/charts/ChartsJsOverview.java rename to core/src/main/java/io/aiven/klaw/model/charts/ChartsJsOverview.java diff --git a/src/main/java/io/aiven/klaw/model/charts/JmxOverview.java b/core/src/main/java/io/aiven/klaw/model/charts/JmxOverview.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/charts/JmxOverview.java rename to core/src/main/java/io/aiven/klaw/model/charts/JmxOverview.java diff --git a/src/main/java/io/aiven/klaw/model/charts/Options.java b/core/src/main/java/io/aiven/klaw/model/charts/Options.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/charts/Options.java rename to core/src/main/java/io/aiven/klaw/model/charts/Options.java diff --git a/src/main/java/io/aiven/klaw/model/charts/Scales.java b/core/src/main/java/io/aiven/klaw/model/charts/Scales.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/charts/Scales.java rename to core/src/main/java/io/aiven/klaw/model/charts/Scales.java diff --git a/src/main/java/io/aiven/klaw/model/charts/TeamOverview.java b/core/src/main/java/io/aiven/klaw/model/charts/TeamOverview.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/charts/TeamOverview.java rename to core/src/main/java/io/aiven/klaw/model/charts/TeamOverview.java diff --git a/src/main/java/io/aiven/klaw/model/charts/Title.java b/core/src/main/java/io/aiven/klaw/model/charts/Title.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/charts/Title.java rename to core/src/main/java/io/aiven/klaw/model/charts/Title.java diff --git a/src/main/java/io/aiven/klaw/model/charts/YAx.java b/core/src/main/java/io/aiven/klaw/model/charts/YAx.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/charts/YAx.java rename to core/src/main/java/io/aiven/klaw/model/charts/YAx.java diff --git a/src/main/java/io/aiven/klaw/model/cluster/ClusterAclRequest.java b/core/src/main/java/io/aiven/klaw/model/cluster/ClusterAclRequest.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/cluster/ClusterAclRequest.java rename to core/src/main/java/io/aiven/klaw/model/cluster/ClusterAclRequest.java diff --git a/src/main/java/io/aiven/klaw/model/cluster/ClusterConnectorRequest.java b/core/src/main/java/io/aiven/klaw/model/cluster/ClusterConnectorRequest.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/cluster/ClusterConnectorRequest.java rename to core/src/main/java/io/aiven/klaw/model/cluster/ClusterConnectorRequest.java diff --git a/src/main/java/io/aiven/klaw/model/cluster/ClusterSchemaRequest.java b/core/src/main/java/io/aiven/klaw/model/cluster/ClusterSchemaRequest.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/cluster/ClusterSchemaRequest.java rename to core/src/main/java/io/aiven/klaw/model/cluster/ClusterSchemaRequest.java diff --git a/src/main/java/io/aiven/klaw/model/cluster/ClusterTopicRequest.java b/core/src/main/java/io/aiven/klaw/model/cluster/ClusterTopicRequest.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/cluster/ClusterTopicRequest.java rename to core/src/main/java/io/aiven/klaw/model/cluster/ClusterTopicRequest.java diff --git a/src/main/java/io/aiven/klaw/model/connectorconfig/ConnectorConfig.java b/core/src/main/java/io/aiven/klaw/model/connectorconfig/ConnectorConfig.java similarity index 100% rename from src/main/java/io/aiven/klaw/model/connectorconfig/ConnectorConfig.java rename to core/src/main/java/io/aiven/klaw/model/connectorconfig/ConnectorConfig.java diff --git a/src/main/java/io/aiven/klaw/perf/CreateBulkTests.java b/core/src/main/java/io/aiven/klaw/perf/CreateBulkTests.java similarity index 100% rename from src/main/java/io/aiven/klaw/perf/CreateBulkTests.java rename to core/src/main/java/io/aiven/klaw/perf/CreateBulkTests.java diff --git a/src/main/java/io/aiven/klaw/repository/AclRepo.java b/core/src/main/java/io/aiven/klaw/repository/AclRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/AclRepo.java rename to core/src/main/java/io/aiven/klaw/repository/AclRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/AclRequestsRepo.java b/core/src/main/java/io/aiven/klaw/repository/AclRequestsRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/AclRequestsRepo.java rename to core/src/main/java/io/aiven/klaw/repository/AclRequestsRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/ActivityLogRepo.java b/core/src/main/java/io/aiven/klaw/repository/ActivityLogRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/ActivityLogRepo.java rename to core/src/main/java/io/aiven/klaw/repository/ActivityLogRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/EnvRepo.java b/core/src/main/java/io/aiven/klaw/repository/EnvRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/EnvRepo.java rename to core/src/main/java/io/aiven/klaw/repository/EnvRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/KwClusterRepo.java b/core/src/main/java/io/aiven/klaw/repository/KwClusterRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/KwClusterRepo.java rename to core/src/main/java/io/aiven/klaw/repository/KwClusterRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRepo.java b/core/src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRepo.java rename to core/src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRequestsRepo.java b/core/src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRequestsRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRequestsRepo.java rename to core/src/main/java/io/aiven/klaw/repository/KwKafkaConnectorRequestsRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/KwMetricsRepo.java b/core/src/main/java/io/aiven/klaw/repository/KwMetricsRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/KwMetricsRepo.java rename to core/src/main/java/io/aiven/klaw/repository/KwMetricsRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/KwPropertiesRepo.java b/core/src/main/java/io/aiven/klaw/repository/KwPropertiesRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/KwPropertiesRepo.java rename to core/src/main/java/io/aiven/klaw/repository/KwPropertiesRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/KwRolesPermsRepo.java b/core/src/main/java/io/aiven/klaw/repository/KwRolesPermsRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/KwRolesPermsRepo.java rename to core/src/main/java/io/aiven/klaw/repository/KwRolesPermsRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/MessageSchemaRepo.java b/core/src/main/java/io/aiven/klaw/repository/MessageSchemaRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/MessageSchemaRepo.java rename to core/src/main/java/io/aiven/klaw/repository/MessageSchemaRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/ProductDetailsRepo.java b/core/src/main/java/io/aiven/klaw/repository/ProductDetailsRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/ProductDetailsRepo.java rename to core/src/main/java/io/aiven/klaw/repository/ProductDetailsRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/RegisterInfoRepo.java b/core/src/main/java/io/aiven/klaw/repository/RegisterInfoRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/RegisterInfoRepo.java rename to core/src/main/java/io/aiven/klaw/repository/RegisterInfoRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/SchemaRequestRepo.java b/core/src/main/java/io/aiven/klaw/repository/SchemaRequestRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/SchemaRequestRepo.java rename to core/src/main/java/io/aiven/klaw/repository/SchemaRequestRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/TeamRepo.java b/core/src/main/java/io/aiven/klaw/repository/TeamRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/TeamRepo.java rename to core/src/main/java/io/aiven/klaw/repository/TeamRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/TenantRepo.java b/core/src/main/java/io/aiven/klaw/repository/TenantRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/TenantRepo.java rename to core/src/main/java/io/aiven/klaw/repository/TenantRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/TopicRepo.java b/core/src/main/java/io/aiven/klaw/repository/TopicRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/TopicRepo.java rename to core/src/main/java/io/aiven/klaw/repository/TopicRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/TopicRequestsRepo.java b/core/src/main/java/io/aiven/klaw/repository/TopicRequestsRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/TopicRequestsRepo.java rename to core/src/main/java/io/aiven/klaw/repository/TopicRequestsRepo.java diff --git a/src/main/java/io/aiven/klaw/repository/UserInfoRepo.java b/core/src/main/java/io/aiven/klaw/repository/UserInfoRepo.java similarity index 100% rename from src/main/java/io/aiven/klaw/repository/UserInfoRepo.java rename to core/src/main/java/io/aiven/klaw/repository/UserInfoRepo.java diff --git a/src/main/java/io/aiven/klaw/service/AclControllerService.java b/core/src/main/java/io/aiven/klaw/service/AclControllerService.java similarity index 99% rename from src/main/java/io/aiven/klaw/service/AclControllerService.java rename to core/src/main/java/io/aiven/klaw/service/AclControllerService.java index f9c10bf591..a8fc519399 100644 --- a/src/main/java/io/aiven/klaw/service/AclControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/AclControllerService.java @@ -572,7 +572,7 @@ public ApiResponse declineAclRequests(String req_no, String reasonToDecline) return ApiResponse.builder().result(updateAclReqStatus).build(); } catch (Exception e) { - log.error(e.getMessage()); + log.error("Error ", e); throw new KlawException(e.getMessage()); } } else { @@ -639,7 +639,7 @@ private Map getTopicPromotionEnv( return hashMap; } } catch (Exception e) { - log.error("getTopicPromotionEnv {}", e.getMessage()); + log.error("getTopicPromotionEnv error ", e); hashMap.put("status", ApiResultStatus.FAILURE.value); hashMap.put("error", "Topic does not exist in any environment."); } @@ -658,7 +658,7 @@ private List getFilteredTopicsForTenant(List topicsFromSOT) { .collect(Collectors.toList()); } } catch (Exception exception) { - log.error("No environments/clusters found."); + log.error("No environments/clusters found.", exception); return new ArrayList<>(); } return topicsFromSOT; @@ -709,7 +709,7 @@ public TopicOverview getAcls(String topicNameSearch) { reqTopicsEnvs = requestTopicsEnvs.split(","); reqTopicsEnvsList = new ArrayList<>(Arrays.asList(reqTopicsEnvs)); } catch (Exception exception) { - log.error("Error in getting req topic envs"); + log.error("Error in getting req topic envs", exception); } List topicInfoList = new ArrayList<>(); @@ -735,7 +735,7 @@ public TopicOverview getAcls(String topicNameSearch) { OBJECT_MAPPER.readValue(topic.getHistory(), new TypeReference<>() {}); topicHistoryList.addAll(topicHistoryFromTopic); } catch (JsonProcessingException e) { - log.error("Unable to parse topicHistory"); + log.error("Unable to parse topicHistory ", e); } } @@ -945,7 +945,7 @@ private void updateAvroSchema( topicOverview.setSchemaExists(true); log.info("Getting schema " + topicNameSearch); } catch (Exception e) { - log.error(e.getMessage()); + log.error("Error ", e); } } if (topicOverview.isSchemaExists()) topicOverview.setSchemaDetails(schemaDetails); diff --git a/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java b/core/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java similarity index 99% rename from src/main/java/io/aiven/klaw/service/AclSyncControllerService.java rename to core/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java index 8c2fe4ab1d..54f994cc39 100644 --- a/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java @@ -159,7 +159,7 @@ public ApiResponse updateSyncBackAcls(SyncBackAcls syncBackAcls) throws KlawExce } } } catch (Exception e) { - log.error(e.getMessage()); + log.error("Error ", e); throw new KlawException(e.getMessage()); } @@ -212,7 +212,7 @@ private void approveSyncBackAcls( } } } catch (KlawException e) { - log.error("Error in creating acl {} {}", e.getMessage(), aclFound); + log.error("Error in creating acl {}", aclFound, e); List resultStatus = new ArrayList<>(); resultStatus.add("Error :" + e.getMessage()); resultMap.put("result", resultStatus); diff --git a/src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java b/core/src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java rename to core/src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/ClusterApiService.java b/core/src/main/java/io/aiven/klaw/service/ClusterApiService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/ClusterApiService.java rename to core/src/main/java/io/aiven/klaw/service/ClusterApiService.java diff --git a/src/main/java/io/aiven/klaw/service/CommonUtilsService.java b/core/src/main/java/io/aiven/klaw/service/CommonUtilsService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/CommonUtilsService.java rename to core/src/main/java/io/aiven/klaw/service/CommonUtilsService.java diff --git a/src/main/java/io/aiven/klaw/service/DefaultDataService.java b/core/src/main/java/io/aiven/klaw/service/DefaultDataService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/DefaultDataService.java rename to core/src/main/java/io/aiven/klaw/service/DefaultDataService.java diff --git a/src/main/java/io/aiven/klaw/service/EmailService.java b/core/src/main/java/io/aiven/klaw/service/EmailService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/EmailService.java rename to core/src/main/java/io/aiven/klaw/service/EmailService.java diff --git a/src/main/java/io/aiven/klaw/service/EnvControllerService.java b/core/src/main/java/io/aiven/klaw/service/EnvControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/EnvControllerService.java rename to core/src/main/java/io/aiven/klaw/service/EnvControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java b/core/src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java rename to core/src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java b/core/src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java rename to core/src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java b/core/src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java rename to core/src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/KwConstants.java b/core/src/main/java/io/aiven/klaw/service/KwConstants.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/KwConstants.java rename to core/src/main/java/io/aiven/klaw/service/KwConstants.java diff --git a/src/main/java/io/aiven/klaw/service/MailUtils.java b/core/src/main/java/io/aiven/klaw/service/MailUtils.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/MailUtils.java rename to core/src/main/java/io/aiven/klaw/service/MailUtils.java diff --git a/src/main/java/io/aiven/klaw/service/MetricsControllerService.java b/core/src/main/java/io/aiven/klaw/service/MetricsControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/MetricsControllerService.java rename to core/src/main/java/io/aiven/klaw/service/MetricsControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java b/core/src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java rename to core/src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/SaasService.java b/core/src/main/java/io/aiven/klaw/service/SaasService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/SaasService.java rename to core/src/main/java/io/aiven/klaw/service/SaasService.java diff --git a/src/main/java/io/aiven/klaw/service/SchemaRegstryControllerService.java b/core/src/main/java/io/aiven/klaw/service/SchemaRegstryControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/SchemaRegstryControllerService.java rename to core/src/main/java/io/aiven/klaw/service/SchemaRegstryControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/ServerConfigService.java b/core/src/main/java/io/aiven/klaw/service/ServerConfigService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/ServerConfigService.java rename to core/src/main/java/io/aiven/klaw/service/ServerConfigService.java diff --git a/src/main/java/io/aiven/klaw/service/TopicControllerService.java b/core/src/main/java/io/aiven/klaw/service/TopicControllerService.java similarity index 99% rename from src/main/java/io/aiven/klaw/service/TopicControllerService.java rename to core/src/main/java/io/aiven/klaw/service/TopicControllerService.java index b8014aa869..3b26c38fae 100644 --- a/src/main/java/io/aiven/klaw/service/TopicControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/TopicControllerService.java @@ -355,7 +355,7 @@ public ApiResponse createTopicDeleteRequest(String topicName, String envId) thro manageDatabase.getHandleDbRequests().requestForTopic(topicRequestReq).get("result"); return ApiResponse.builder().result(result).build(); } catch (Exception e) { - log.error(e.getMessage()); + log.error("Error ", e); throw new KlawException(e.getMessage()); } } else { @@ -430,7 +430,7 @@ public ApiResponse createClaimTopicRequest(String topicName, String env) throws manageDatabase.getHandleDbRequests().requestForTopic(topicRequestReq).get("result"); return ApiResponse.builder().result(result).build(); } catch (Exception e) { - log.error(e.getMessage()); + log.error("Error ", e); throw new KlawException(e.getMessage()); } } diff --git a/src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java b/core/src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java rename to core/src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/UiConfigControllerService.java b/core/src/main/java/io/aiven/klaw/service/UiConfigControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/UiConfigControllerService.java rename to core/src/main/java/io/aiven/klaw/service/UiConfigControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/UiControllerLoginService.java b/core/src/main/java/io/aiven/klaw/service/UiControllerLoginService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/UiControllerLoginService.java rename to core/src/main/java/io/aiven/klaw/service/UiControllerLoginService.java diff --git a/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java b/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java rename to core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/UtilControllerService.java b/core/src/main/java/io/aiven/klaw/service/UtilControllerService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/UtilControllerService.java rename to core/src/main/java/io/aiven/klaw/service/UtilControllerService.java diff --git a/src/main/java/io/aiven/klaw/service/ValidateCaptchaService.java b/core/src/main/java/io/aiven/klaw/service/ValidateCaptchaService.java similarity index 100% rename from src/main/java/io/aiven/klaw/service/ValidateCaptchaService.java rename to core/src/main/java/io/aiven/klaw/service/ValidateCaptchaService.java diff --git a/src/main/java/io/aiven/klaw/uglify/UglifyFiles.java b/core/src/main/java/io/aiven/klaw/uglify/UglifyFiles.java similarity index 100% rename from src/main/java/io/aiven/klaw/uglify/UglifyFiles.java rename to core/src/main/java/io/aiven/klaw/uglify/UglifyFiles.java diff --git a/src/main/java/io/aiven/klaw/validation/KafkaClusterValidator.java b/core/src/main/java/io/aiven/klaw/validation/KafkaClusterValidator.java similarity index 100% rename from src/main/java/io/aiven/klaw/validation/KafkaClusterValidator.java rename to core/src/main/java/io/aiven/klaw/validation/KafkaClusterValidator.java diff --git a/src/main/java/io/aiven/klaw/validation/KafkaClusterValidatorImpl.java b/core/src/main/java/io/aiven/klaw/validation/KafkaClusterValidatorImpl.java similarity index 100% rename from src/main/java/io/aiven/klaw/validation/KafkaClusterValidatorImpl.java rename to core/src/main/java/io/aiven/klaw/validation/KafkaClusterValidatorImpl.java diff --git a/src/main/resources/application.properties b/core/src/main/resources/application.properties similarity index 99% rename from src/main/resources/application.properties rename to core/src/main/resources/application.properties index 418d2d5bf5..bfac8a14bf 100644 --- a/src/main/resources/application.properties +++ b/core/src/main/resources/application.properties @@ -34,7 +34,7 @@ klaw.request.topics.envs=DEV,TST # Org info klaw.org.name=MyOrganization -klaw.version=1.0.0 +klaw.version=1.1.0 # Spring JPA properties mysql #spring.datasource.url=jdbc:mysql://localhost:3306/kafkametadbpro?autoReconnect=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true&verifyServerCertificate=false&useSSL=false&requireSSL=false&allowPublicKeyRetrieval=true diff --git a/src/main/resources/banner.txt b/core/src/main/resources/banner.txt similarity index 100% rename from src/main/resources/banner.txt rename to core/src/main/resources/banner.txt diff --git a/src/main/resources/db/changelog/changelog.yaml b/core/src/main/resources/db/changelog/changelog.yaml similarity index 100% rename from src/main/resources/db/changelog/changelog.yaml rename to core/src/main/resources/db/changelog/changelog.yaml diff --git a/src/main/resources/openapi_spec.json b/core/src/main/resources/openapi_spec.json similarity index 100% rename from src/main/resources/openapi_spec.json rename to core/src/main/resources/openapi_spec.json diff --git a/src/main/resources/scripts/base/rdbms/db-grants.sql b/core/src/main/resources/scripts/base/rdbms/db-grants.sql similarity index 100% rename from src/main/resources/scripts/base/rdbms/db-grants.sql rename to core/src/main/resources/scripts/base/rdbms/db-grants.sql diff --git a/src/main/resources/scripts/base/rdbms/ddl-jdbc.sql b/core/src/main/resources/scripts/base/rdbms/ddl-jdbc.sql similarity index 100% rename from src/main/resources/scripts/base/rdbms/ddl-jdbc.sql rename to core/src/main/resources/scripts/base/rdbms/ddl-jdbc.sql diff --git a/src/main/resources/scripts/base/rdbms/dropjdbc.sql b/core/src/main/resources/scripts/base/rdbms/dropjdbc.sql similarity index 100% rename from src/main/resources/scripts/base/rdbms/dropjdbc.sql rename to core/src/main/resources/scripts/base/rdbms/dropjdbc.sql diff --git a/src/main/resources/static/assets/css/animate.css b/core/src/main/resources/static/assets/css/animate.css similarity index 100% rename from src/main/resources/static/assets/css/animate.css rename to core/src/main/resources/static/assets/css/animate.css diff --git a/src/main/resources/static/assets/css/animate.min.css b/core/src/main/resources/static/assets/css/animate.min.css similarity index 100% rename from src/main/resources/static/assets/css/animate.min.css rename to core/src/main/resources/static/assets/css/animate.min.css diff --git a/src/main/resources/static/assets/css/colors/blue-dark.css b/core/src/main/resources/static/assets/css/colors/blue-dark.css similarity index 100% rename from src/main/resources/static/assets/css/colors/blue-dark.css rename to core/src/main/resources/static/assets/css/colors/blue-dark.css diff --git a/src/main/resources/static/assets/css/colors/blue.css b/core/src/main/resources/static/assets/css/colors/blue.css similarity index 100% rename from src/main/resources/static/assets/css/colors/blue.css rename to core/src/main/resources/static/assets/css/colors/blue.css diff --git a/src/main/resources/static/assets/css/colors/default-dark.css b/core/src/main/resources/static/assets/css/colors/default-dark.css similarity index 100% rename from src/main/resources/static/assets/css/colors/default-dark.css rename to core/src/main/resources/static/assets/css/colors/default-dark.css diff --git a/src/main/resources/static/assets/css/colors/default.css b/core/src/main/resources/static/assets/css/colors/default.css similarity index 100% rename from src/main/resources/static/assets/css/colors/default.css rename to core/src/main/resources/static/assets/css/colors/default.css diff --git a/src/main/resources/static/assets/css/custom.css b/core/src/main/resources/static/assets/css/custom.css similarity index 100% rename from src/main/resources/static/assets/css/custom.css rename to core/src/main/resources/static/assets/css/custom.css diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flag-icon.min.css b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flag-icon.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flag-icon.min.css rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flag-icon.min.css diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ad.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ad.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ad.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ad.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ae.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ae.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ae.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ae.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/af.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/af.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/af.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/af.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ag.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ag.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ag.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ag.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ai.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ai.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ai.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ai.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/al.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/al.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/al.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/al.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/am.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/am.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/am.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/am.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ao.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ao.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ao.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ao.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/aq.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/aq.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/aq.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/aq.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ar.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ar.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ar.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ar.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/as.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/as.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/as.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/as.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/at.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/at.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/at.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/at.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/au.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/au.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/au.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/au.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/aw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/aw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/aw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/aw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ax.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ax.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ax.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ax.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/az.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/az.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/az.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/az.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ba.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ba.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ba.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ba.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bb.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bb.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bb.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bb.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bd.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bd.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bd.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bd.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/be.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/be.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/be.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/be.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bh.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bh.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bh.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bh.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bi.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bi.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bi.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bi.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bj.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bj.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bj.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bj.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bl.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bl.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bl.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bl.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bo.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bo.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bo.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bo.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bq.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bq.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bq.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bq.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/br.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/br.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/br.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/br.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bs.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bs.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bs.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bs.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bt.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bt.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bt.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bt.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bv.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bv.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bv.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bv.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/by.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/by.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/by.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/by.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/bz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/bz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ca.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ca.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ca.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ca.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cc.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cc.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cc.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cc.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cd.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cd.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cd.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cd.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ch.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ch.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ch.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ch.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ci.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ci.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ci.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ci.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ck.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ck.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ck.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ck.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cl.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cl.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cl.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cl.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/co.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/co.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/co.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/co.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cu.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cu.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cu.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cu.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cv.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cv.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cv.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cv.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cx.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cx.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cx.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cx.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cy.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cy.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cy.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cy.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/cz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/cz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/de.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/de.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/de.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/de.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dj.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dj.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/dj.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dj.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/dk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/dm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/do.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/do.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/do.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/do.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/dz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/dz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ec.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ec.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ec.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ec.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ee.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ee.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ee.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ee.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/eg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/eg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/eg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/eg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/eh.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/eh.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/eh.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/eh.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/er.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/er.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/er.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/er.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/es.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/es.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/es.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/es.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/et.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/et.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/et.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/et.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fi.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fi.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/fi.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fi.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fj.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fj.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/fj.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fj.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/fk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/fm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fo.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fo.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/fo.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fo.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/fr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/fr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ga.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ga.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ga.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ga.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gb.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gb.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gb.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gb.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gd.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gd.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gd.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gd.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ge.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ge.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ge.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ge.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gh.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gh.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gh.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gh.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gi.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gi.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gi.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gi.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gl.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gl.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gl.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gl.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gp.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gp.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gp.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gp.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gq.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gq.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gq.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gq.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gs.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gs.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gs.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gs.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gt.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gt.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gt.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gt.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gu.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gu.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gu.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gu.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gy.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gy.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/gy.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/gy.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/hk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/hm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/hn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/hr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ht.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ht.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ht.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ht.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hu.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hu.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/hu.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/hu.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/id.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/id.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/id.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/id.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ie.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ie.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ie.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ie.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/il.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/il.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/il.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/il.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/im.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/im.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/im.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/im.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/in.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/in.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/in.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/in.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/io.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/io.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/io.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/io.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/iq.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/iq.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/iq.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/iq.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ir.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ir.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ir.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ir.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/is.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/is.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/is.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/is.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/it.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/it.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/it.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/it.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/je.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/je.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/je.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/je.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/jm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jo.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jo.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/jo.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jo.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jp.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jp.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/jp.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/jp.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ke.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ke.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ke.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ke.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/kg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kh.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kh.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/kh.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kh.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ki.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ki.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ki.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ki.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/km.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/km.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/km.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/km.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/kn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kp.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kp.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/kp.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kp.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/kr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/kw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ky.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ky.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ky.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ky.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/kz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/kz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/la.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/la.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/la.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/la.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lb.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lb.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/lb.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lb.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lc.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lc.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/lc.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lc.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/li.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/li.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/li.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/li.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/lk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/lr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ls.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ls.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ls.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ls.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lt.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lt.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/lt.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lt.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lu.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lu.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/lu.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lu.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lv.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lv.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/lv.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/lv.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ly.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ly.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ly.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ly.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ma.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ma.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ma.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ma.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mc.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mc.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mc.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mc.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/md.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/md.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/md.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/md.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/me.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/me.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/me.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/me.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mh.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mh.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mh.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mh.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ml.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ml.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ml.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ml.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mo.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mo.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mo.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mo.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mp.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mp.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mp.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mp.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mq.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mq.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mq.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mq.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ms.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ms.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ms.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ms.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mt.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mt.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mt.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mt.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mu.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mu.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mu.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mu.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mv.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mv.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mv.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mv.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mx.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mx.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mx.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mx.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/my.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/my.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/my.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/my.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/mz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/mz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/na.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/na.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/na.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/na.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nc.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nc.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/nc.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nc.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ne.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ne.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ne.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ne.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/nf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ng.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ng.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ng.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ng.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ni.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ni.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ni.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ni.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nl.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nl.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/nl.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nl.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/no.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/no.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/no.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/no.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/np.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/np.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/np.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/np.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/nr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nu.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nu.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/nu.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nu.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/nz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/nz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/om.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/om.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/om.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/om.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pa.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pa.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pa.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pa.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pe.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pe.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pe.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pe.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ph.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ph.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ph.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ph.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pl.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pl.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pl.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pl.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ps.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ps.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ps.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ps.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pt.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pt.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pt.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pt.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/pw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/pw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/py.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/py.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/py.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/py.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/qa.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/qa.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/qa.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/qa.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/re.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/re.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/re.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/re.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ro.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ro.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ro.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ro.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/rs.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/rs.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/rs.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/rs.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ru.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ru.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ru.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ru.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/rw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/rw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/rw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/rw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sa.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sa.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sa.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sa.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sb.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sb.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sb.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sb.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sc.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sc.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sc.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sc.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sd.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sd.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sd.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sd.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/se.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/se.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/se.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/se.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sh.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sh.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sh.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sh.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/si.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/si.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/si.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/si.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sj.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sj.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sj.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sj.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sl.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sl.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sl.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sl.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/so.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/so.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/so.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/so.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ss.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ss.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ss.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ss.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/st.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/st.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/st.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/st.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sv.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sv.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sv.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sv.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sx.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sx.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sx.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sx.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sy.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sy.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sy.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sy.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/sz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/sz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tc.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tc.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tc.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tc.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/td.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/td.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/td.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/td.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/th.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/th.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/th.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/th.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tj.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tj.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tj.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tj.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tk.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tk.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tk.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tk.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tl.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tl.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tl.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tl.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/to.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/to.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/to.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/to.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tr.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tr.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tr.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tr.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tt.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tt.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tt.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tt.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tv.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tv.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tv.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tv.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tw.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/tz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/tz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ua.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ua.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ua.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ua.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ug.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ug.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ug.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ug.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/um.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/um.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/um.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/um.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/us.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/us.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/us.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/us.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/uy.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/uy.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/uy.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/uy.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/uz.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/uz.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/uz.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/uz.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/va.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/va.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/va.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/va.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vc.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vc.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/vc.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vc.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ve.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ve.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ve.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ve.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vg.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vg.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/vg.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vg.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vi.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vi.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/vi.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vi.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vn.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vn.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/vn.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vn.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vu.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vu.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/vu.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/vu.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/wf.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/wf.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/wf.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/wf.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ws.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ws.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ws.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ws.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ye.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ye.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/ye.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/ye.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/yt.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/yt.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/yt.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/yt.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/za.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/za.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/za.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/za.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/zm.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/zm.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/zm.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/zm.svg diff --git a/src/main/resources/static/assets/css/icons/flag-icon-css/flags/zw.svg b/core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/zw.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/flag-icon-css/flags/zw.svg rename to core/src/main/resources/static/assets/css/icons/flag-icon-css/flags/zw.svg diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.min.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.min.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-brands.min.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.min.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.min.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-regular.min.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.min.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.min.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fa-solid.min.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.min.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.min.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome-all.min.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.min.css b/core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.min.css rename to core/src/main/resources/static/assets/css/icons/font-awesome/css/fontawesome.min.css diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_animated.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_animated.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_animated.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_animated.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_bordered-pulled.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_bordered-pulled.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_bordered-pulled.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_bordered-pulled.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_core.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_core.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_core.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_core.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_fixed-width.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_fixed-width.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_fixed-width.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_fixed-width.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_icons.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_icons.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_icons.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_icons.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_larger.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_larger.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_larger.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_larger.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_list.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_list.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_list.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_list.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_mixins.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_mixins.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_mixins.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_mixins.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_rotated-flipped.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_rotated-flipped.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_rotated-flipped.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_rotated-flipped.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_screen-reader.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_screen-reader.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_screen-reader.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_screen-reader.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_stacked.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_stacked.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_stacked.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_stacked.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/_variables.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/_variables.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/_variables.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/_variables.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/fa-brands.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/fa-brands.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/fa-brands.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/fa-brands.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/fa-regular.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/fa-regular.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/fa-regular.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/fa-regular.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/fa-solid.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/fa-solid.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/fa-solid.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/fa-solid.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/less/fontawesome.less b/core/src/main/resources/static/assets/css/icons/font-awesome/less/fontawesome.less similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/less/fontawesome.less rename to core/src/main/resources/static/assets/css/icons/font-awesome/less/fontawesome.less diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_animated.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_animated.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_animated.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_animated.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_bordered-pulled.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_bordered-pulled.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_bordered-pulled.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_bordered-pulled.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_core.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_core.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_core.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_core.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_fixed-width.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_fixed-width.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_fixed-width.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_fixed-width.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_icons.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_icons.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_icons.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_icons.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_larger.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_larger.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_larger.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_larger.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_list.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_list.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_list.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_list.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_mixins.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_mixins.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_mixins.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_mixins.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_rotated-flipped.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_rotated-flipped.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_rotated-flipped.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_rotated-flipped.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_screen-reader.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_screen-reader.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_screen-reader.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_screen-reader.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_stacked.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_stacked.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_stacked.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_stacked.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/_variables.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/_variables.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/_variables.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/_variables.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-brands.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-brands.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/fa-brands.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-brands.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-regular.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-regular.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/fa-regular.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-regular.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-solid.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-solid.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/fa-solid.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/fa-solid.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/scss/fontawesome.scss b/core/src/main/resources/static/assets/css/icons/font-awesome/scss/fontawesome.scss similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/scss/fontawesome.scss rename to core/src/main/resources/static/assets/css/icons/font-awesome/scss/fontawesome.scss diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.eot b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.eot similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.eot rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.eot diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.svg b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.svg rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.svg diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.ttf b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.ttf similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.ttf rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.ttf diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff2 b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff2 similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff2 rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-brands-400.woff2 diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.eot b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.eot similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.eot rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.eot diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.svg b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.svg rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.svg diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.ttf b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.ttf similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.ttf rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.ttf diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff2 b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff2 similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff2 rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-regular-400.woff2 diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.eot b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.eot similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.eot rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.eot diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.svg b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.svg rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.svg diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.ttf b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.ttf similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.ttf rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.ttf diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff diff --git a/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff2 b/core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff2 similarity index 100% rename from src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff2 rename to core/src/main/resources/static/assets/css/icons/font-awesome/webfonts/fa-solid-900.woff2 diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.css b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.css similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.css rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.css diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.min.css b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.min.css rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/material-design-iconic-font.min.css diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css.map b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css.map similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css.map rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/css/materialdesignicons.min.css.map diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.eot b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.eot similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.eot rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.eot diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.svg b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.svg rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.svg diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.ttf b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.ttf similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.ttf rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.ttf diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff2 b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff2 similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff2 rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/Material-Design-Iconic-Font.woff2 diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.eot b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.eot similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.eot rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.eot diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.svg b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.svg rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.svg diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.ttf b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.ttf similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.ttf rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.ttf diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff diff --git a/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff2 b/core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff2 similarity index 100% rename from src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff2 rename to core/src/main/resources/static/assets/css/icons/material-design-iconic-font/fonts/materialdesignicons-webfont.woff2 diff --git a/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.eot b/core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.eot similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.eot rename to core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.eot diff --git a/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.svg b/core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.svg similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.svg rename to core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.svg diff --git a/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.ttf b/core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.ttf similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.ttf rename to core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.ttf diff --git a/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.woff b/core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.woff similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.woff rename to core/src/main/resources/static/assets/css/icons/themify-icons/fonts/themify.woff diff --git a/src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.css b/core/src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.css similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.css rename to core/src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.css diff --git a/src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.js b/core/src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.js similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.js rename to core/src/main/resources/static/assets/css/icons/themify-icons/ie7/ie7.js diff --git a/src/main/resources/static/assets/css/icons/themify-icons/themify-icons.css b/core/src/main/resources/static/assets/css/icons/themify-icons/themify-icons.css similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/themify-icons.css rename to core/src/main/resources/static/assets/css/icons/themify-icons/themify-icons.css diff --git a/src/main/resources/static/assets/css/icons/themify-icons/themify-icons.less b/core/src/main/resources/static/assets/css/icons/themify-icons/themify-icons.less similarity index 100% rename from src/main/resources/static/assets/css/icons/themify-icons/themify-icons.less rename to core/src/main/resources/static/assets/css/icons/themify-icons/themify-icons.less diff --git a/src/main/resources/static/assets/css/popup.css b/core/src/main/resources/static/assets/css/popup.css similarity index 100% rename from src/main/resources/static/assets/css/popup.css rename to core/src/main/resources/static/assets/css/popup.css diff --git a/src/main/resources/static/assets/css/spinners.css b/core/src/main/resources/static/assets/css/spinners.css similarity index 100% rename from src/main/resources/static/assets/css/spinners.css rename to core/src/main/resources/static/assets/css/spinners.css diff --git a/src/main/resources/static/assets/css/spinners.min.css b/core/src/main/resources/static/assets/css/spinners.min.css similarity index 100% rename from src/main/resources/static/assets/css/spinners.min.css rename to core/src/main/resources/static/assets/css/spinners.min.css diff --git a/src/main/resources/static/assets/css/style.css b/core/src/main/resources/static/assets/css/style.css similarity index 100% rename from src/main/resources/static/assets/css/style.css rename to core/src/main/resources/static/assets/css/style.css diff --git a/src/main/resources/static/assets/css/style.min.css b/core/src/main/resources/static/assets/css/style.min.css similarity index 100% rename from src/main/resources/static/assets/css/style.min.css rename to core/src/main/resources/static/assets/css/style.min.css diff --git a/src/main/resources/static/assets/images/Thumbs.db b/core/src/main/resources/static/assets/images/Thumbs.db similarity index 100% rename from src/main/resources/static/assets/images/Thumbs.db rename to core/src/main/resources/static/assets/images/Thumbs.db diff --git a/src/main/resources/static/assets/images/clients/logo.jpg b/core/src/main/resources/static/assets/images/clients/logo.jpg similarity index 100% rename from src/main/resources/static/assets/images/clients/logo.jpg rename to core/src/main/resources/static/assets/images/clients/logo.jpg diff --git a/src/main/resources/static/assets/images/custom-select.png b/core/src/main/resources/static/assets/images/custom-select.png similarity index 100% rename from src/main/resources/static/assets/images/custom-select.png rename to core/src/main/resources/static/assets/images/custom-select.png diff --git a/src/main/resources/static/assets/images/favicon.png b/core/src/main/resources/static/assets/images/favicon.png similarity index 100% rename from src/main/resources/static/assets/images/favicon.png rename to core/src/main/resources/static/assets/images/favicon.png diff --git a/src/main/resources/static/assets/images/icon/danger.svg b/core/src/main/resources/static/assets/images/icon/danger.svg similarity index 100% rename from src/main/resources/static/assets/images/icon/danger.svg rename to core/src/main/resources/static/assets/images/icon/danger.svg diff --git a/src/main/resources/static/assets/images/icon/success.svg b/core/src/main/resources/static/assets/images/icon/success.svg similarity index 100% rename from src/main/resources/static/assets/images/icon/success.svg rename to core/src/main/resources/static/assets/images/icon/success.svg diff --git a/src/main/resources/static/assets/images/icon/warning.svg b/core/src/main/resources/static/assets/images/icon/warning.svg similarity index 100% rename from src/main/resources/static/assets/images/icon/warning.svg rename to core/src/main/resources/static/assets/images/icon/warning.svg diff --git a/src/main/resources/static/assets/images/klaw_logo.png b/core/src/main/resources/static/assets/images/klaw_logo.png similarity index 100% rename from src/main/resources/static/assets/images/klaw_logo.png rename to core/src/main/resources/static/assets/images/klaw_logo.png diff --git a/src/main/resources/static/assets/images/klaw_logo_dark.png b/core/src/main/resources/static/assets/images/klaw_logo_dark.png similarity index 100% rename from src/main/resources/static/assets/images/klaw_logo_dark.png rename to core/src/main/resources/static/assets/images/klaw_logo_dark.png diff --git a/src/main/resources/static/assets/images/logged-user.png b/core/src/main/resources/static/assets/images/logged-user.png similarity index 100% rename from src/main/resources/static/assets/images/logged-user.png rename to core/src/main/resources/static/assets/images/logged-user.png diff --git a/src/main/resources/static/assets/images/regbg.jpg b/core/src/main/resources/static/assets/images/regbg.jpg similarity index 100% rename from src/main/resources/static/assets/images/regbg.jpg rename to core/src/main/resources/static/assets/images/regbg.jpg diff --git a/src/main/resources/static/assets/images/regbg1.jpg b/core/src/main/resources/static/assets/images/regbg1.jpg similarity index 100% rename from src/main/resources/static/assets/images/regbg1.jpg rename to core/src/main/resources/static/assets/images/regbg1.jpg diff --git a/src/main/resources/static/assets/images/tooltip/Euclid.png b/core/src/main/resources/static/assets/images/tooltip/Euclid.png similarity index 100% rename from src/main/resources/static/assets/images/tooltip/Euclid.png rename to core/src/main/resources/static/assets/images/tooltip/Euclid.png diff --git a/src/main/resources/static/assets/images/tooltip/shape1.svg b/core/src/main/resources/static/assets/images/tooltip/shape1.svg similarity index 100% rename from src/main/resources/static/assets/images/tooltip/shape1.svg rename to core/src/main/resources/static/assets/images/tooltip/shape1.svg diff --git a/src/main/resources/static/assets/images/tooltip/shape2.svg b/core/src/main/resources/static/assets/images/tooltip/shape2.svg similarity index 100% rename from src/main/resources/static/assets/images/tooltip/shape2.svg rename to core/src/main/resources/static/assets/images/tooltip/shape2.svg diff --git a/src/main/resources/static/assets/images/tooltip/shape3.svg b/core/src/main/resources/static/assets/images/tooltip/shape3.svg similarity index 100% rename from src/main/resources/static/assets/images/tooltip/shape3.svg rename to core/src/main/resources/static/assets/images/tooltip/shape3.svg diff --git a/src/main/resources/static/assets/images/tooltip/tooltip1.svg b/core/src/main/resources/static/assets/images/tooltip/tooltip1.svg similarity index 100% rename from src/main/resources/static/assets/images/tooltip/tooltip1.svg rename to core/src/main/resources/static/assets/images/tooltip/tooltip1.svg diff --git a/src/main/resources/static/assets/images/tooltip/tooltip2.svg b/core/src/main/resources/static/assets/images/tooltip/tooltip2.svg similarity index 100% rename from src/main/resources/static/assets/images/tooltip/tooltip2.svg rename to core/src/main/resources/static/assets/images/tooltip/tooltip2.svg diff --git a/src/main/resources/static/assets/images/tooltip/tooltip3.svg b/core/src/main/resources/static/assets/images/tooltip/tooltip3.svg similarity index 100% rename from src/main/resources/static/assets/images/tooltip/tooltip3.svg rename to core/src/main/resources/static/assets/images/tooltip/tooltip3.svg diff --git a/src/main/resources/static/assets/images/users/iconuser.png b/core/src/main/resources/static/assets/images/users/iconuser.png similarity index 100% rename from src/main/resources/static/assets/images/users/iconuser.png rename to core/src/main/resources/static/assets/images/users/iconuser.png diff --git a/src/main/resources/static/assets/images/users/user-32.png b/core/src/main/resources/static/assets/images/users/user-32.png similarity index 100% rename from src/main/resources/static/assets/images/users/user-32.png rename to core/src/main/resources/static/assets/images/users/user-32.png diff --git a/src/main/resources/static/assets/js/bootstrap-table.init.js b/core/src/main/resources/static/assets/js/bootstrap-table.init.js similarity index 100% rename from src/main/resources/static/assets/js/bootstrap-table.init.js rename to core/src/main/resources/static/assets/js/bootstrap-table.init.js diff --git a/src/main/resources/static/assets/js/chat.js b/core/src/main/resources/static/assets/js/chat.js similarity index 100% rename from src/main/resources/static/assets/js/chat.js rename to core/src/main/resources/static/assets/js/chat.js diff --git a/src/main/resources/static/assets/js/custom.js b/core/src/main/resources/static/assets/js/custom.js similarity index 100% rename from src/main/resources/static/assets/js/custom.js rename to core/src/main/resources/static/assets/js/custom.js diff --git a/src/main/resources/static/assets/js/custom.min.js b/core/src/main/resources/static/assets/js/custom.min.js similarity index 100% rename from src/main/resources/static/assets/js/custom.min.js rename to core/src/main/resources/static/assets/js/custom.min.js diff --git a/src/main/resources/static/assets/js/flot-data.js b/core/src/main/resources/static/assets/js/flot-data.js similarity index 100% rename from src/main/resources/static/assets/js/flot-data.js rename to core/src/main/resources/static/assets/js/flot-data.js diff --git a/src/main/resources/static/assets/js/footable-init.js b/core/src/main/resources/static/assets/js/footable-init.js similarity index 100% rename from src/main/resources/static/assets/js/footable-init.js rename to core/src/main/resources/static/assets/js/footable-init.js diff --git a/src/main/resources/static/assets/js/jasny-bootstrap.js b/core/src/main/resources/static/assets/js/jasny-bootstrap.js similarity index 100% rename from src/main/resources/static/assets/js/jasny-bootstrap.js rename to core/src/main/resources/static/assets/js/jasny-bootstrap.js diff --git a/src/main/resources/static/assets/js/jquery.PrintArea.js b/core/src/main/resources/static/assets/js/jquery.PrintArea.js similarity index 100% rename from src/main/resources/static/assets/js/jquery.PrintArea.js rename to core/src/main/resources/static/assets/js/jquery.PrintArea.js diff --git a/src/main/resources/static/assets/js/jquery.slimscroll.js b/core/src/main/resources/static/assets/js/jquery.slimscroll.js similarity index 100% rename from src/main/resources/static/assets/js/jquery.slimscroll.js rename to core/src/main/resources/static/assets/js/jquery.slimscroll.js diff --git a/src/main/resources/static/assets/js/jsgrid-init.js b/core/src/main/resources/static/assets/js/jsgrid-init.js similarity index 100% rename from src/main/resources/static/assets/js/jsgrid-init.js rename to core/src/main/resources/static/assets/js/jsgrid-init.js diff --git a/src/main/resources/static/assets/js/mask.init.js b/core/src/main/resources/static/assets/js/mask.init.js similarity index 100% rename from src/main/resources/static/assets/js/mask.init.js rename to core/src/main/resources/static/assets/js/mask.init.js diff --git a/src/main/resources/static/assets/js/morris-data.js b/core/src/main/resources/static/assets/js/morris-data.js similarity index 100% rename from src/main/resources/static/assets/js/morris-data.js rename to core/src/main/resources/static/assets/js/morris-data.js diff --git a/src/main/resources/static/assets/js/sidebarmenu.js b/core/src/main/resources/static/assets/js/sidebarmenu.js similarity index 100% rename from src/main/resources/static/assets/js/sidebarmenu.js rename to core/src/main/resources/static/assets/js/sidebarmenu.js diff --git a/src/main/resources/static/assets/js/toastr.js b/core/src/main/resources/static/assets/js/toastr.js similarity index 100% rename from src/main/resources/static/assets/js/toastr.js rename to core/src/main/resources/static/assets/js/toastr.js diff --git a/src/main/resources/static/assets/js/validation.js b/core/src/main/resources/static/assets/js/validation.js similarity index 100% rename from src/main/resources/static/assets/js/validation.js rename to core/src/main/resources/static/assets/js/validation.js diff --git a/src/main/resources/static/assets/js/validator.js b/core/src/main/resources/static/assets/js/validator.js similarity index 100% rename from src/main/resources/static/assets/js/validator.js rename to core/src/main/resources/static/assets/js/validator.js diff --git a/src/main/resources/static/assets/js/waves.js b/core/src/main/resources/static/assets/js/waves.js similarity index 100% rename from src/main/resources/static/assets/js/waves.js rename to core/src/main/resources/static/assets/js/waves.js diff --git a/src/main/resources/static/assets/js/widget-charts.js b/core/src/main/resources/static/assets/js/widget-charts.js similarity index 100% rename from src/main/resources/static/assets/js/widget-charts.js rename to core/src/main/resources/static/assets/js/widget-charts.js diff --git a/src/main/resources/static/assets/js/widget-data.js b/core/src/main/resources/static/assets/js/widget-data.js similarity index 100% rename from src/main/resources/static/assets/js/widget-data.js rename to core/src/main/resources/static/assets/js/widget-data.js diff --git a/src/main/resources/static/assets/owl.carousel/owl.carousel - Shortcut.lnk b/core/src/main/resources/static/assets/owl.carousel/owl.carousel - Shortcut.lnk similarity index 100% rename from src/main/resources/static/assets/owl.carousel/owl.carousel - Shortcut.lnk rename to core/src/main/resources/static/assets/owl.carousel/owl.carousel - Shortcut.lnk diff --git a/src/main/resources/static/assets/owl.carousel/owl.carousel.js b/core/src/main/resources/static/assets/owl.carousel/owl.carousel.js similarity index 100% rename from src/main/resources/static/assets/owl.carousel/owl.carousel.js rename to core/src/main/resources/static/assets/owl.carousel/owl.carousel.js diff --git a/src/main/resources/static/assets/owl.carousel/owl.carousel.min.css b/core/src/main/resources/static/assets/owl.carousel/owl.carousel.min.css similarity index 100% rename from src/main/resources/static/assets/owl.carousel/owl.carousel.min.css rename to core/src/main/resources/static/assets/owl.carousel/owl.carousel.min.css diff --git a/src/main/resources/static/assets/owl.carousel/owl.carousel.min.js b/core/src/main/resources/static/assets/owl.carousel/owl.carousel.min.js similarity index 100% rename from src/main/resources/static/assets/owl.carousel/owl.carousel.min.js rename to core/src/main/resources/static/assets/owl.carousel/owl.carousel.min.js diff --git a/src/main/resources/static/assets/owl.carousel/owl.custom.js b/core/src/main/resources/static/assets/owl.carousel/owl.custom.js similarity index 100% rename from src/main/resources/static/assets/owl.carousel/owl.custom.js rename to core/src/main/resources/static/assets/owl.carousel/owl.custom.js diff --git a/src/main/resources/static/assets/owl.carousel/owl.theme.default.css b/core/src/main/resources/static/assets/owl.carousel/owl.theme.default.css similarity index 100% rename from src/main/resources/static/assets/owl.carousel/owl.theme.default.css rename to core/src/main/resources/static/assets/owl.carousel/owl.theme.default.css diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css.map b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css.map rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.css.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css.map b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css.map rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-grid.min.css.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css.map b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css.map rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.css.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css.map b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css.map rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap-reboot.min.css.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css.map b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css.map rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.css.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css diff --git a/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css.map b/core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css.map rename to core/src/main/resources/static/assets/plugins/bootstrap/css/bootstrap.min.css.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js.map b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js.map rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.js.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js.map b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js.map rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.bundle.min.js.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js.map b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js.map rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.js.map diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js diff --git a/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js.map b/core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js.map similarity index 100% rename from src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js.map rename to core/src/main/resources/static/assets/plugins/bootstrap/js/bootstrap.min.js.map diff --git a/src/main/resources/static/assets/plugins/gauge/gauge.min.js b/core/src/main/resources/static/assets/plugins/gauge/gauge.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/gauge/gauge.min.js rename to core/src/main/resources/static/assets/plugins/gauge/gauge.min.js diff --git a/src/main/resources/static/assets/plugins/jquery/jquery.min.js b/core/src/main/resources/static/assets/plugins/jquery/jquery.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/jquery/jquery.min.js rename to core/src/main/resources/static/assets/plugins/jquery/jquery.min.js diff --git a/src/main/resources/static/assets/plugins/popper/popper.min.js b/core/src/main/resources/static/assets/plugins/popper/popper.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/popper/popper.min.js rename to core/src/main/resources/static/assets/plugins/popper/popper.min.js diff --git a/src/main/resources/static/assets/plugins/sparkline/jquery.charts-sparkline.js b/core/src/main/resources/static/assets/plugins/sparkline/jquery.charts-sparkline.js similarity index 100% rename from src/main/resources/static/assets/plugins/sparkline/jquery.charts-sparkline.js rename to core/src/main/resources/static/assets/plugins/sparkline/jquery.charts-sparkline.js diff --git a/src/main/resources/static/assets/plugins/sparkline/jquery.sparkline.min.js b/core/src/main/resources/static/assets/plugins/sparkline/jquery.sparkline.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/sparkline/jquery.sparkline.min.js rename to core/src/main/resources/static/assets/plugins/sparkline/jquery.sparkline.min.js diff --git a/src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.js b/core/src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.js similarity index 100% rename from src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.js rename to core/src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.js diff --git a/src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.min.js b/core/src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.min.js rename to core/src/main/resources/static/assets/plugins/sticky-kit-master/dist/sticky-kit.min.js diff --git a/src/main/resources/static/assets/plugins/styleswitcher/jQuery.style.switcher.js b/core/src/main/resources/static/assets/plugins/styleswitcher/jQuery.style.switcher.js similarity index 100% rename from src/main/resources/static/assets/plugins/styleswitcher/jQuery.style.switcher.js rename to core/src/main/resources/static/assets/plugins/styleswitcher/jQuery.style.switcher.js diff --git a/src/main/resources/static/assets/plugins/sweetalert/jquery.sweet-alert.custom.js b/core/src/main/resources/static/assets/plugins/sweetalert/jquery.sweet-alert.custom.js similarity index 100% rename from src/main/resources/static/assets/plugins/sweetalert/jquery.sweet-alert.custom.js rename to core/src/main/resources/static/assets/plugins/sweetalert/jquery.sweet-alert.custom.js diff --git a/src/main/resources/static/assets/plugins/sweetalert/sweetalert.css b/core/src/main/resources/static/assets/plugins/sweetalert/sweetalert.css similarity index 100% rename from src/main/resources/static/assets/plugins/sweetalert/sweetalert.css rename to core/src/main/resources/static/assets/plugins/sweetalert/sweetalert.css diff --git a/src/main/resources/static/assets/plugins/sweetalert/sweetalert.min.js b/core/src/main/resources/static/assets/plugins/sweetalert/sweetalert.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/sweetalert/sweetalert.min.js rename to core/src/main/resources/static/assets/plugins/sweetalert/sweetalert.min.js diff --git a/src/main/resources/static/assets/plugins/text-angular/textAngular-rangy.min.js b/core/src/main/resources/static/assets/plugins/text-angular/textAngular-rangy.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/text-angular/textAngular-rangy.min.js rename to core/src/main/resources/static/assets/plugins/text-angular/textAngular-rangy.min.js diff --git a/src/main/resources/static/assets/plugins/text-angular/textAngular-sanitize.js b/core/src/main/resources/static/assets/plugins/text-angular/textAngular-sanitize.js similarity index 100% rename from src/main/resources/static/assets/plugins/text-angular/textAngular-sanitize.js rename to core/src/main/resources/static/assets/plugins/text-angular/textAngular-sanitize.js diff --git a/src/main/resources/static/assets/plugins/text-angular/textAngular.css b/core/src/main/resources/static/assets/plugins/text-angular/textAngular.css similarity index 100% rename from src/main/resources/static/assets/plugins/text-angular/textAngular.css rename to core/src/main/resources/static/assets/plugins/text-angular/textAngular.css diff --git a/src/main/resources/static/assets/plugins/text-angular/textAngular.min.js b/core/src/main/resources/static/assets/plugins/text-angular/textAngular.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/text-angular/textAngular.min.js rename to core/src/main/resources/static/assets/plugins/text-angular/textAngular.min.js diff --git a/src/main/resources/static/assets/plugins/wizard/jquery.steps.min.js b/core/src/main/resources/static/assets/plugins/wizard/jquery.steps.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/wizard/jquery.steps.min.js rename to core/src/main/resources/static/assets/plugins/wizard/jquery.steps.min.js diff --git a/src/main/resources/static/assets/plugins/wizard/jquery.validate.min.js b/core/src/main/resources/static/assets/plugins/wizard/jquery.validate.min.js similarity index 100% rename from src/main/resources/static/assets/plugins/wizard/jquery.validate.min.js rename to core/src/main/resources/static/assets/plugins/wizard/jquery.validate.min.js diff --git a/src/main/resources/static/assets/plugins/wizard/steps.css b/core/src/main/resources/static/assets/plugins/wizard/steps.css similarity index 100% rename from src/main/resources/static/assets/plugins/wizard/steps.css rename to core/src/main/resources/static/assets/plugins/wizard/steps.css diff --git a/src/main/resources/static/assets/plugins/wizard/steps.js b/core/src/main/resources/static/assets/plugins/wizard/steps.js similarity index 100% rename from src/main/resources/static/assets/plugins/wizard/steps.js rename to core/src/main/resources/static/assets/plugins/wizard/steps.js diff --git a/src/main/resources/static/assets/scss/_app.scss b/core/src/main/resources/static/assets/scss/_app.scss similarity index 100% rename from src/main/resources/static/assets/scss/_app.scss rename to core/src/main/resources/static/assets/scss/_app.scss diff --git a/src/main/resources/static/assets/scss/_forms.scss b/core/src/main/resources/static/assets/scss/_forms.scss similarity index 100% rename from src/main/resources/static/assets/scss/_forms.scss rename to core/src/main/resources/static/assets/scss/_forms.scss diff --git a/src/main/resources/static/assets/scss/_material.scss b/core/src/main/resources/static/assets/scss/_material.scss similarity index 100% rename from src/main/resources/static/assets/scss/_material.scss rename to core/src/main/resources/static/assets/scss/_material.scss diff --git a/src/main/resources/static/assets/scss/_pages.scss b/core/src/main/resources/static/assets/scss/_pages.scss similarity index 100% rename from src/main/resources/static/assets/scss/_pages.scss rename to core/src/main/resources/static/assets/scss/_pages.scss diff --git a/src/main/resources/static/assets/scss/_responsive.scss b/core/src/main/resources/static/assets/scss/_responsive.scss similarity index 100% rename from src/main/resources/static/assets/scss/_responsive.scss rename to core/src/main/resources/static/assets/scss/_responsive.scss diff --git a/src/main/resources/static/assets/scss/_sidebar.scss b/core/src/main/resources/static/assets/scss/_sidebar.scss similarity index 100% rename from src/main/resources/static/assets/scss/_sidebar.scss rename to core/src/main/resources/static/assets/scss/_sidebar.scss diff --git a/src/main/resources/static/assets/scss/_variable.scss b/core/src/main/resources/static/assets/scss/_variable.scss similarity index 100% rename from src/main/resources/static/assets/scss/_variable.scss rename to core/src/main/resources/static/assets/scss/_variable.scss diff --git a/src/main/resources/static/assets/scss/_widgets.scss b/core/src/main/resources/static/assets/scss/_widgets.scss similarity index 100% rename from src/main/resources/static/assets/scss/_widgets.scss rename to core/src/main/resources/static/assets/scss/_widgets.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_alert.scss b/core/src/main/resources/static/assets/scss/bootstrap/_alert.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_alert.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_alert.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_badge.scss b/core/src/main/resources/static/assets/scss/bootstrap/_badge.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_badge.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_badge.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_breadcrumb.scss b/core/src/main/resources/static/assets/scss/bootstrap/_breadcrumb.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_breadcrumb.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_breadcrumb.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_button-group.scss b/core/src/main/resources/static/assets/scss/bootstrap/_button-group.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_button-group.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_button-group.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_buttons.scss b/core/src/main/resources/static/assets/scss/bootstrap/_buttons.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_buttons.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_buttons.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_card.scss b/core/src/main/resources/static/assets/scss/bootstrap/_card.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_card.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_card.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_carousel.scss b/core/src/main/resources/static/assets/scss/bootstrap/_carousel.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_carousel.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_carousel.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_close.scss b/core/src/main/resources/static/assets/scss/bootstrap/_close.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_close.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_close.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_code.scss b/core/src/main/resources/static/assets/scss/bootstrap/_code.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_code.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_code.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_custom-forms.scss b/core/src/main/resources/static/assets/scss/bootstrap/_custom-forms.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_custom-forms.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_custom-forms.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_dropdown.scss b/core/src/main/resources/static/assets/scss/bootstrap/_dropdown.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_dropdown.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_dropdown.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_forms.scss b/core/src/main/resources/static/assets/scss/bootstrap/_forms.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_forms.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_forms.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_functions.scss b/core/src/main/resources/static/assets/scss/bootstrap/_functions.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_functions.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_functions.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_grid.scss b/core/src/main/resources/static/assets/scss/bootstrap/_grid.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_grid.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_grid.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_images.scss b/core/src/main/resources/static/assets/scss/bootstrap/_images.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_images.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_images.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_input-group.scss b/core/src/main/resources/static/assets/scss/bootstrap/_input-group.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_input-group.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_input-group.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_jumbotron.scss b/core/src/main/resources/static/assets/scss/bootstrap/_jumbotron.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_jumbotron.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_jumbotron.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_list-group.scss b/core/src/main/resources/static/assets/scss/bootstrap/_list-group.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_list-group.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_list-group.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_media.scss b/core/src/main/resources/static/assets/scss/bootstrap/_media.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_media.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_media.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_mixins.scss b/core/src/main/resources/static/assets/scss/bootstrap/_mixins.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_mixins.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_mixins.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_modal.scss b/core/src/main/resources/static/assets/scss/bootstrap/_modal.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_modal.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_modal.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_nav.scss b/core/src/main/resources/static/assets/scss/bootstrap/_nav.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_nav.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_nav.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_navbar.scss b/core/src/main/resources/static/assets/scss/bootstrap/_navbar.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_navbar.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_navbar.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_pagination.scss b/core/src/main/resources/static/assets/scss/bootstrap/_pagination.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_pagination.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_pagination.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_popover.scss b/core/src/main/resources/static/assets/scss/bootstrap/_popover.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_popover.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_popover.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_print.scss b/core/src/main/resources/static/assets/scss/bootstrap/_print.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_print.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_print.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_progress.scss b/core/src/main/resources/static/assets/scss/bootstrap/_progress.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_progress.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_progress.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_reboot.scss b/core/src/main/resources/static/assets/scss/bootstrap/_reboot.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_reboot.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_reboot.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_root.scss b/core/src/main/resources/static/assets/scss/bootstrap/_root.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_root.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_root.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_spinners.scss b/core/src/main/resources/static/assets/scss/bootstrap/_spinners.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_spinners.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_spinners.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_tables.scss b/core/src/main/resources/static/assets/scss/bootstrap/_tables.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_tables.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_tables.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_toasts.scss b/core/src/main/resources/static/assets/scss/bootstrap/_toasts.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_toasts.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_toasts.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_tooltip.scss b/core/src/main/resources/static/assets/scss/bootstrap/_tooltip.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_tooltip.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_tooltip.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_transitions.scss b/core/src/main/resources/static/assets/scss/bootstrap/_transitions.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_transitions.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_transitions.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_type.scss b/core/src/main/resources/static/assets/scss/bootstrap/_type.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_type.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_type.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_utilities.scss b/core/src/main/resources/static/assets/scss/bootstrap/_utilities.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_utilities.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_utilities.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/_variables.scss b/core/src/main/resources/static/assets/scss/bootstrap/_variables.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/_variables.scss rename to core/src/main/resources/static/assets/scss/bootstrap/_variables.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/bootstrap-grid.scss b/core/src/main/resources/static/assets/scss/bootstrap/bootstrap-grid.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/bootstrap-grid.scss rename to core/src/main/resources/static/assets/scss/bootstrap/bootstrap-grid.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/bootstrap-reboot.scss b/core/src/main/resources/static/assets/scss/bootstrap/bootstrap-reboot.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/bootstrap-reboot.scss rename to core/src/main/resources/static/assets/scss/bootstrap/bootstrap-reboot.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/bootstrap.scss b/core/src/main/resources/static/assets/scss/bootstrap/bootstrap.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/bootstrap.scss rename to core/src/main/resources/static/assets/scss/bootstrap/bootstrap.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_alert.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_alert.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_alert.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_alert.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_background-variant.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_background-variant.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_background-variant.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_background-variant.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_badge.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_badge.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_badge.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_badge.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_border-radius.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_border-radius.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_border-radius.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_border-radius.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_box-shadow.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_box-shadow.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_box-shadow.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_box-shadow.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_breakpoints.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_breakpoints.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_breakpoints.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_breakpoints.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_buttons.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_buttons.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_buttons.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_buttons.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_caret.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_caret.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_caret.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_caret.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_clearfix.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_clearfix.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_clearfix.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_clearfix.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_deprecate.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_deprecate.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_deprecate.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_deprecate.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_float.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_float.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_float.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_float.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_forms.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_forms.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_forms.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_forms.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_gradients.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_gradients.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_gradients.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_gradients.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_grid-framework.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_grid-framework.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_grid-framework.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_grid-framework.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_grid.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_grid.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_grid.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_grid.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_hover.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_hover.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_hover.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_hover.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_image.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_image.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_image.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_image.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_list-group.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_list-group.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_list-group.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_list-group.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_lists.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_lists.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_lists.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_lists.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_nav-divider.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_nav-divider.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_nav-divider.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_nav-divider.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_pagination.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_pagination.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_pagination.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_pagination.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_reset-text.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_reset-text.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_reset-text.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_reset-text.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_resize.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_resize.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_resize.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_resize.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_screen-reader.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_screen-reader.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_screen-reader.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_screen-reader.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_size.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_size.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_size.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_size.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_table-row.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_table-row.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_table-row.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_table-row.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_text-emphasis.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_text-emphasis.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_text-emphasis.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_text-emphasis.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_text-hide.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_text-hide.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_text-hide.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_text-hide.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_text-truncate.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_text-truncate.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_text-truncate.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_text-truncate.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_transition.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_transition.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_transition.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_transition.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/mixins/_visibility.scss b/core/src/main/resources/static/assets/scss/bootstrap/mixins/_visibility.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/mixins/_visibility.scss rename to core/src/main/resources/static/assets/scss/bootstrap/mixins/_visibility.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_align.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_align.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_align.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_align.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_background.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_background.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_background.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_background.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_borders.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_borders.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_borders.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_borders.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_clearfix.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_clearfix.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_clearfix.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_clearfix.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_display.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_display.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_display.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_display.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_embed.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_embed.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_embed.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_embed.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_flex.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_flex.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_flex.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_flex.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_float.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_float.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_float.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_float.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_overflow.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_overflow.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_overflow.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_overflow.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_position.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_position.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_position.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_position.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_screenreaders.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_screenreaders.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_screenreaders.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_screenreaders.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_shadows.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_shadows.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_shadows.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_shadows.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_sizing.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_sizing.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_sizing.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_sizing.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_spacing.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_spacing.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_spacing.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_spacing.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_stretched-link.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_stretched-link.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_stretched-link.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_stretched-link.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_text.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_text.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_text.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_text.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/utilities/_visibility.scss b/core/src/main/resources/static/assets/scss/bootstrap/utilities/_visibility.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/utilities/_visibility.scss rename to core/src/main/resources/static/assets/scss/bootstrap/utilities/_visibility.scss diff --git a/src/main/resources/static/assets/scss/bootstrap/vendor/_rfs.scss b/core/src/main/resources/static/assets/scss/bootstrap/vendor/_rfs.scss similarity index 100% rename from src/main/resources/static/assets/scss/bootstrap/vendor/_rfs.scss rename to core/src/main/resources/static/assets/scss/bootstrap/vendor/_rfs.scss diff --git a/src/main/resources/static/assets/scss/colors/blue-dark.scss b/core/src/main/resources/static/assets/scss/colors/blue-dark.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/blue-dark.scss rename to core/src/main/resources/static/assets/scss/colors/blue-dark.scss diff --git a/src/main/resources/static/assets/scss/colors/blue.scss b/core/src/main/resources/static/assets/scss/colors/blue.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/blue.scss rename to core/src/main/resources/static/assets/scss/colors/blue.scss diff --git a/src/main/resources/static/assets/scss/colors/default-dark.scss b/core/src/main/resources/static/assets/scss/colors/default-dark.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/default-dark.scss rename to core/src/main/resources/static/assets/scss/colors/default-dark.scss diff --git a/src/main/resources/static/assets/scss/colors/default.scss b/core/src/main/resources/static/assets/scss/colors/default.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/default.scss rename to core/src/main/resources/static/assets/scss/colors/default.scss diff --git a/src/main/resources/static/assets/scss/colors/green-dark.scss b/core/src/main/resources/static/assets/scss/colors/green-dark.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/green-dark.scss rename to core/src/main/resources/static/assets/scss/colors/green-dark.scss diff --git a/src/main/resources/static/assets/scss/colors/green.scss b/core/src/main/resources/static/assets/scss/colors/green.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/green.scss rename to core/src/main/resources/static/assets/scss/colors/green.scss diff --git a/src/main/resources/static/assets/scss/colors/megna-dark.scss b/core/src/main/resources/static/assets/scss/colors/megna-dark.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/megna-dark.scss rename to core/src/main/resources/static/assets/scss/colors/megna-dark.scss diff --git a/src/main/resources/static/assets/scss/colors/megna.scss b/core/src/main/resources/static/assets/scss/colors/megna.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/megna.scss rename to core/src/main/resources/static/assets/scss/colors/megna.scss diff --git a/src/main/resources/static/assets/scss/colors/purple-dark.scss b/core/src/main/resources/static/assets/scss/colors/purple-dark.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/purple-dark.scss rename to core/src/main/resources/static/assets/scss/colors/purple-dark.scss diff --git a/src/main/resources/static/assets/scss/colors/purple.scss b/core/src/main/resources/static/assets/scss/colors/purple.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/purple.scss rename to core/src/main/resources/static/assets/scss/colors/purple.scss diff --git a/src/main/resources/static/assets/scss/colors/red-dark.scss b/core/src/main/resources/static/assets/scss/colors/red-dark.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/red-dark.scss rename to core/src/main/resources/static/assets/scss/colors/red-dark.scss diff --git a/src/main/resources/static/assets/scss/colors/red.scss b/core/src/main/resources/static/assets/scss/colors/red.scss similarity index 100% rename from src/main/resources/static/assets/scss/colors/red.scss rename to core/src/main/resources/static/assets/scss/colors/red.scss diff --git a/src/main/resources/static/assets/scss/style.scss b/core/src/main/resources/static/assets/scss/style.scss similarity index 100% rename from src/main/resources/static/assets/scss/style.scss rename to core/src/main/resources/static/assets/scss/style.scss diff --git a/src/main/resources/static/assets/typed.js-master/dist/typed.min.js b/core/src/main/resources/static/assets/typed.js-master/dist/typed.min.js similarity index 100% rename from src/main/resources/static/assets/typed.js-master/dist/typed.min.js rename to core/src/main/resources/static/assets/typed.js-master/dist/typed.min.js diff --git a/src/main/resources/static/assets/typed.js-master/js/typed.js b/core/src/main/resources/static/assets/typed.js-master/js/typed.js similarity index 100% rename from src/main/resources/static/assets/typed.js-master/js/typed.js rename to core/src/main/resources/static/assets/typed.js-master/js/typed.js diff --git a/src/main/resources/static/index.html b/core/src/main/resources/static/index.html similarity index 100% rename from src/main/resources/static/index.html rename to core/src/main/resources/static/index.html diff --git a/src/main/resources/static/js/analytics.js b/core/src/main/resources/static/js/analytics.js similarity index 100% rename from src/main/resources/static/js/analytics.js rename to core/src/main/resources/static/js/analytics.js diff --git a/src/main/resources/static/js/angular-chart/angular-chart.js b/core/src/main/resources/static/js/angular-chart/angular-chart.js similarity index 100% rename from src/main/resources/static/js/angular-chart/angular-chart.js rename to core/src/main/resources/static/js/angular-chart/angular-chart.js diff --git a/src/main/resources/static/js/angular-chart/angular-chart.min.js b/core/src/main/resources/static/js/angular-chart/angular-chart.min.js similarity index 100% rename from src/main/resources/static/js/angular-chart/angular-chart.min.js rename to core/src/main/resources/static/js/angular-chart/angular-chart.min.js diff --git a/src/main/resources/static/js/angular-chart/angular-chart.min.js.map b/core/src/main/resources/static/js/angular-chart/angular-chart.min.js.map similarity index 100% rename from src/main/resources/static/js/angular-chart/angular-chart.min.js.map rename to core/src/main/resources/static/js/angular-chart/angular-chart.min.js.map diff --git a/src/main/resources/static/js/browseAcls.js b/core/src/main/resources/static/js/browseAcls.js similarity index 100% rename from src/main/resources/static/js/browseAcls.js rename to core/src/main/resources/static/js/browseAcls.js diff --git a/src/main/resources/static/js/browseTopics.js b/core/src/main/resources/static/js/browseTopics.js similarity index 100% rename from src/main/resources/static/js/browseTopics.js rename to core/src/main/resources/static/js/browseTopics.js diff --git a/src/main/resources/static/js/connectorOverview.js b/core/src/main/resources/static/js/connectorOverview.js similarity index 100% rename from src/main/resources/static/js/connectorOverview.js rename to core/src/main/resources/static/js/connectorOverview.js diff --git a/src/main/resources/static/js/dist/Chart.bundle.js b/core/src/main/resources/static/js/dist/Chart.bundle.js similarity index 100% rename from src/main/resources/static/js/dist/Chart.bundle.js rename to core/src/main/resources/static/js/dist/Chart.bundle.js diff --git a/src/main/resources/static/js/dist/Chart.bundle.min.js b/core/src/main/resources/static/js/dist/Chart.bundle.min.js similarity index 100% rename from src/main/resources/static/js/dist/Chart.bundle.min.js rename to core/src/main/resources/static/js/dist/Chart.bundle.min.js diff --git a/src/main/resources/static/js/dist/Chart.css b/core/src/main/resources/static/js/dist/Chart.css similarity index 100% rename from src/main/resources/static/js/dist/Chart.css rename to core/src/main/resources/static/js/dist/Chart.css diff --git a/src/main/resources/static/js/dist/Chart.js b/core/src/main/resources/static/js/dist/Chart.js similarity index 100% rename from src/main/resources/static/js/dist/Chart.js rename to core/src/main/resources/static/js/dist/Chart.js diff --git a/src/main/resources/static/js/dist/Chart.min.css b/core/src/main/resources/static/js/dist/Chart.min.css similarity index 100% rename from src/main/resources/static/js/dist/Chart.min.css rename to core/src/main/resources/static/js/dist/Chart.min.css diff --git a/src/main/resources/static/js/dist/Chart.min.js b/core/src/main/resources/static/js/dist/Chart.min.js similarity index 100% rename from src/main/resources/static/js/dist/Chart.min.js rename to core/src/main/resources/static/js/dist/Chart.min.js diff --git a/src/main/resources/static/js/docs.js b/core/src/main/resources/static/js/docs.js similarity index 100% rename from src/main/resources/static/js/docs.js rename to core/src/main/resources/static/js/docs.js diff --git a/src/main/resources/static/js/envs.js b/core/src/main/resources/static/js/envs.js similarity index 100% rename from src/main/resources/static/js/envs.js rename to core/src/main/resources/static/js/envs.js diff --git a/src/main/resources/static/js/execAcls.js b/core/src/main/resources/static/js/execAcls.js similarity index 100% rename from src/main/resources/static/js/execAcls.js rename to core/src/main/resources/static/js/execAcls.js diff --git a/src/main/resources/static/js/execConnectors.js b/core/src/main/resources/static/js/execConnectors.js similarity index 100% rename from src/main/resources/static/js/execConnectors.js rename to core/src/main/resources/static/js/execConnectors.js diff --git a/src/main/resources/static/js/execSchemas.js b/core/src/main/resources/static/js/execSchemas.js similarity index 100% rename from src/main/resources/static/js/execSchemas.js rename to core/src/main/resources/static/js/execSchemas.js diff --git a/src/main/resources/static/js/execTopics.js b/core/src/main/resources/static/js/execTopics.js similarity index 100% rename from src/main/resources/static/js/execTopics.js rename to core/src/main/resources/static/js/execTopics.js diff --git a/src/main/resources/static/js/forgotPassword.js b/core/src/main/resources/static/js/forgotPassword.js similarity index 100% rename from src/main/resources/static/js/forgotPassword.js rename to core/src/main/resources/static/js/forgotPassword.js diff --git a/src/main/resources/static/js/index.js b/core/src/main/resources/static/js/index.js similarity index 100% rename from src/main/resources/static/js/index.js rename to core/src/main/resources/static/js/index.js diff --git a/src/main/resources/static/js/kafkaconnect.js b/core/src/main/resources/static/js/kafkaconnect.js similarity index 100% rename from src/main/resources/static/js/kafkaconnect.js rename to core/src/main/resources/static/js/kafkaconnect.js diff --git a/src/main/resources/static/js/kwmetrics.js b/core/src/main/resources/static/js/kwmetrics.js similarity index 100% rename from src/main/resources/static/js/kwmetrics.js rename to core/src/main/resources/static/js/kwmetrics.js diff --git a/src/main/resources/static/js/loginSaas.js b/core/src/main/resources/static/js/loginSaas.js similarity index 100% rename from src/main/resources/static/js/loginSaas.js rename to core/src/main/resources/static/js/loginSaas.js diff --git a/src/main/resources/static/js/manageUsers.js b/core/src/main/resources/static/js/manageUsers.js similarity index 100% rename from src/main/resources/static/js/manageUsers.js rename to core/src/main/resources/static/js/manageUsers.js diff --git a/src/main/resources/static/js/modifyEnvs.js b/core/src/main/resources/static/js/modifyEnvs.js similarity index 100% rename from src/main/resources/static/js/modifyEnvs.js rename to core/src/main/resources/static/js/modifyEnvs.js diff --git a/src/main/resources/static/js/modifyTeam.js b/core/src/main/resources/static/js/modifyTeam.js similarity index 100% rename from src/main/resources/static/js/modifyTeam.js rename to core/src/main/resources/static/js/modifyTeam.js diff --git a/src/main/resources/static/js/modifyUser.js b/core/src/main/resources/static/js/modifyUser.js similarity index 100% rename from src/main/resources/static/js/modifyUser.js rename to core/src/main/resources/static/js/modifyUser.js diff --git a/src/main/resources/static/js/monitorEnvs.js b/core/src/main/resources/static/js/monitorEnvs.js similarity index 100% rename from src/main/resources/static/js/monitorEnvs.js rename to core/src/main/resources/static/js/monitorEnvs.js diff --git a/src/main/resources/static/js/myRequests.js b/core/src/main/resources/static/js/myRequests.js similarity index 100% rename from src/main/resources/static/js/myRequests.js rename to core/src/main/resources/static/js/myRequests.js diff --git a/src/main/resources/static/js/registerUsers.js b/core/src/main/resources/static/js/registerUsers.js similarity index 100% rename from src/main/resources/static/js/registerUsers.js rename to core/src/main/resources/static/js/registerUsers.js diff --git a/src/main/resources/static/js/requestAcls.js b/core/src/main/resources/static/js/requestAcls.js similarity index 100% rename from src/main/resources/static/js/requestAcls.js rename to core/src/main/resources/static/js/requestAcls.js diff --git a/src/main/resources/static/js/requestAvroSchemaUpload.js b/core/src/main/resources/static/js/requestAvroSchemaUpload.js similarity index 100% rename from src/main/resources/static/js/requestAvroSchemaUpload.js rename to core/src/main/resources/static/js/requestAvroSchemaUpload.js diff --git a/src/main/resources/static/js/requestConnector.js b/core/src/main/resources/static/js/requestConnector.js similarity index 100% rename from src/main/resources/static/js/requestConnector.js rename to core/src/main/resources/static/js/requestConnector.js diff --git a/src/main/resources/static/js/requestTopics.js b/core/src/main/resources/static/js/requestTopics.js similarity index 100% rename from src/main/resources/static/js/requestTopics.js rename to core/src/main/resources/static/js/requestTopics.js diff --git a/src/main/resources/static/js/rolesperms.js b/core/src/main/resources/static/js/rolesperms.js similarity index 100% rename from src/main/resources/static/js/rolesperms.js rename to core/src/main/resources/static/js/rolesperms.js diff --git a/src/main/resources/static/js/serverConfig.js b/core/src/main/resources/static/js/serverConfig.js similarity index 100% rename from src/main/resources/static/js/serverConfig.js rename to core/src/main/resources/static/js/serverConfig.js diff --git a/src/main/resources/static/js/showActivityLog.js b/core/src/main/resources/static/js/showActivityLog.js similarity index 100% rename from src/main/resources/static/js/showActivityLog.js rename to core/src/main/resources/static/js/showActivityLog.js diff --git a/src/main/resources/static/js/syncBackAcls.js b/core/src/main/resources/static/js/syncBackAcls.js similarity index 100% rename from src/main/resources/static/js/syncBackAcls.js rename to core/src/main/resources/static/js/syncBackAcls.js diff --git a/src/main/resources/static/js/syncBackTopics.js b/core/src/main/resources/static/js/syncBackTopics.js similarity index 100% rename from src/main/resources/static/js/syncBackTopics.js rename to core/src/main/resources/static/js/syncBackTopics.js diff --git a/src/main/resources/static/js/syncConnectors.js b/core/src/main/resources/static/js/syncConnectors.js similarity index 100% rename from src/main/resources/static/js/syncConnectors.js rename to core/src/main/resources/static/js/syncConnectors.js diff --git a/src/main/resources/static/js/synchronizeAcls.js b/core/src/main/resources/static/js/synchronizeAcls.js similarity index 100% rename from src/main/resources/static/js/synchronizeAcls.js rename to core/src/main/resources/static/js/synchronizeAcls.js diff --git a/src/main/resources/static/js/synchronizeTopics.js b/core/src/main/resources/static/js/synchronizeTopics.js similarity index 100% rename from src/main/resources/static/js/synchronizeTopics.js rename to core/src/main/resources/static/js/synchronizeTopics.js diff --git a/src/main/resources/static/lib/angular-cookies.js b/core/src/main/resources/static/lib/angular-cookies.js similarity index 100% rename from src/main/resources/static/lib/angular-cookies.js rename to core/src/main/resources/static/lib/angular-cookies.js diff --git a/src/main/resources/static/lib/angular-cookies.min.js b/core/src/main/resources/static/lib/angular-cookies.min.js similarity index 100% rename from src/main/resources/static/lib/angular-cookies.min.js rename to core/src/main/resources/static/lib/angular-cookies.min.js diff --git a/src/main/resources/static/lib/angular-cookies.min.js.map b/core/src/main/resources/static/lib/angular-cookies.min.js.map similarity index 100% rename from src/main/resources/static/lib/angular-cookies.min.js.map rename to core/src/main/resources/static/lib/angular-cookies.min.js.map diff --git a/src/main/resources/static/lib/angular-resource.min.js b/core/src/main/resources/static/lib/angular-resource.min.js similarity index 100% rename from src/main/resources/static/lib/angular-resource.min.js rename to core/src/main/resources/static/lib/angular-resource.min.js diff --git a/src/main/resources/static/lib/angular-resource.min.js.map b/core/src/main/resources/static/lib/angular-resource.min.js.map similarity index 100% rename from src/main/resources/static/lib/angular-resource.min.js.map rename to core/src/main/resources/static/lib/angular-resource.min.js.map diff --git a/src/main/resources/static/lib/angular-route.min.js b/core/src/main/resources/static/lib/angular-route.min.js similarity index 100% rename from src/main/resources/static/lib/angular-route.min.js rename to core/src/main/resources/static/lib/angular-route.min.js diff --git a/src/main/resources/static/lib/angular-route.min.js.map b/core/src/main/resources/static/lib/angular-route.min.js.map similarity index 100% rename from src/main/resources/static/lib/angular-route.min.js.map rename to core/src/main/resources/static/lib/angular-route.min.js.map diff --git a/src/main/resources/static/lib/angular-wm.js b/core/src/main/resources/static/lib/angular-wm.js similarity index 100% rename from src/main/resources/static/lib/angular-wm.js rename to core/src/main/resources/static/lib/angular-wm.js diff --git a/src/main/resources/static/lib/angular.min.js b/core/src/main/resources/static/lib/angular.min.js similarity index 100% rename from src/main/resources/static/lib/angular.min.js rename to core/src/main/resources/static/lib/angular.min.js diff --git a/src/main/resources/static/lib/angular.min.js.map b/core/src/main/resources/static/lib/angular.min.js.map similarity index 100% rename from src/main/resources/static/lib/angular.min.js.map rename to core/src/main/resources/static/lib/angular.min.js.map diff --git a/src/main/resources/static/lib/jquery-1.10.2.js b/core/src/main/resources/static/lib/jquery-1.10.2.js similarity index 100% rename from src/main/resources/static/lib/jquery-1.10.2.js rename to core/src/main/resources/static/lib/jquery-1.10.2.js diff --git a/src/main/resources/static/lib/jquery-2.1.1.min.js b/core/src/main/resources/static/lib/jquery-2.1.1.min.js similarity index 100% rename from src/main/resources/static/lib/jquery-2.1.1.min.js rename to core/src/main/resources/static/lib/jquery-2.1.1.min.js diff --git a/src/main/resources/static/lib/jquery-ui-datepicker.min.js b/core/src/main/resources/static/lib/jquery-ui-datepicker.min.js similarity index 100% rename from src/main/resources/static/lib/jquery-ui-datepicker.min.js rename to core/src/main/resources/static/lib/jquery-ui-datepicker.min.js diff --git a/src/main/resources/static/lib/jquery-ui-timepicker-addon.js b/core/src/main/resources/static/lib/jquery-ui-timepicker-addon.js similarity index 100% rename from src/main/resources/static/lib/jquery-ui-timepicker-addon.js rename to core/src/main/resources/static/lib/jquery-ui-timepicker-addon.js diff --git a/src/main/resources/static/lib/jquery-ui.js b/core/src/main/resources/static/lib/jquery-ui.js similarity index 100% rename from src/main/resources/static/lib/jquery-ui.js rename to core/src/main/resources/static/lib/jquery-ui.js diff --git a/src/main/resources/static/lib/moment.min.js b/core/src/main/resources/static/lib/moment.min.js similarity index 100% rename from src/main/resources/static/lib/moment.min.js rename to core/src/main/resources/static/lib/moment.min.js diff --git a/src/main/resources/templates/activityLog.html b/core/src/main/resources/templates/activityLog.html similarity index 100% rename from src/main/resources/templates/activityLog.html rename to core/src/main/resources/templates/activityLog.html diff --git a/src/main/resources/templates/addCluster.html b/core/src/main/resources/templates/addCluster.html similarity index 99% rename from src/main/resources/templates/addCluster.html rename to core/src/main/resources/templates/addCluster.html index 259e7c8d92..5d89b090bf 100644 --- a/src/main/resources/templates/addCluster.html +++ b/core/src/main/resources/templates/addCluster.html @@ -578,7 +578,7 @@

Shortcuts

-
+

diff --git a/src/main/resources/templates/addEnv.html b/core/src/main/resources/templates/addEnv.html similarity index 100% rename from src/main/resources/templates/addEnv.html rename to core/src/main/resources/templates/addEnv.html diff --git a/src/main/resources/templates/addKafkaConnectEnv.html b/core/src/main/resources/templates/addKafkaConnectEnv.html similarity index 100% rename from src/main/resources/templates/addKafkaConnectEnv.html rename to core/src/main/resources/templates/addKafkaConnectEnv.html diff --git a/src/main/resources/templates/addRole.html b/core/src/main/resources/templates/addRole.html similarity index 100% rename from src/main/resources/templates/addRole.html rename to core/src/main/resources/templates/addRole.html diff --git a/src/main/resources/templates/addSchemaEnv.html b/core/src/main/resources/templates/addSchemaEnv.html similarity index 100% rename from src/main/resources/templates/addSchemaEnv.html rename to core/src/main/resources/templates/addSchemaEnv.html diff --git a/src/main/resources/templates/addTeam.html b/core/src/main/resources/templates/addTeam.html similarity index 100% rename from src/main/resources/templates/addTeam.html rename to core/src/main/resources/templates/addTeam.html diff --git a/src/main/resources/templates/addTenant.html b/core/src/main/resources/templates/addTenant.html similarity index 100% rename from src/main/resources/templates/addTenant.html rename to core/src/main/resources/templates/addTenant.html diff --git a/src/main/resources/templates/addUser.html b/core/src/main/resources/templates/addUser.html similarity index 100% rename from src/main/resources/templates/addUser.html rename to core/src/main/resources/templates/addUser.html diff --git a/src/main/resources/templates/addUserLdap.html b/core/src/main/resources/templates/addUserLdap.html similarity index 100% rename from src/main/resources/templates/addUserLdap.html rename to core/src/main/resources/templates/addUserLdap.html diff --git a/src/main/resources/templates/analytics.html b/core/src/main/resources/templates/analytics.html similarity index 100% rename from src/main/resources/templates/analytics.html rename to core/src/main/resources/templates/analytics.html diff --git a/src/main/resources/templates/browseAcls.html b/core/src/main/resources/templates/browseAcls.html similarity index 100% rename from src/main/resources/templates/browseAcls.html rename to core/src/main/resources/templates/browseAcls.html diff --git a/src/main/resources/templates/browseTopics.html b/core/src/main/resources/templates/browseTopics.html similarity index 100% rename from src/main/resources/templates/browseTopics.html rename to core/src/main/resources/templates/browseTopics.html diff --git a/src/main/resources/templates/changePwd.html b/core/src/main/resources/templates/changePwd.html similarity index 100% rename from src/main/resources/templates/changePwd.html rename to core/src/main/resources/templates/changePwd.html diff --git a/src/main/resources/templates/clusters.html b/core/src/main/resources/templates/clusters.html similarity index 100% rename from src/main/resources/templates/clusters.html rename to core/src/main/resources/templates/clusters.html diff --git a/src/main/resources/templates/connectorOverview.html b/core/src/main/resources/templates/connectorOverview.html similarity index 100% rename from src/main/resources/templates/connectorOverview.html rename to core/src/main/resources/templates/connectorOverview.html diff --git a/src/main/resources/templates/envs.html b/core/src/main/resources/templates/envs.html similarity index 100% rename from src/main/resources/templates/envs.html rename to core/src/main/resources/templates/envs.html diff --git a/src/main/resources/templates/execAcls.html b/core/src/main/resources/templates/execAcls.html similarity index 100% rename from src/main/resources/templates/execAcls.html rename to core/src/main/resources/templates/execAcls.html diff --git a/src/main/resources/templates/execConnectors.html b/core/src/main/resources/templates/execConnectors.html similarity index 100% rename from src/main/resources/templates/execConnectors.html rename to core/src/main/resources/templates/execConnectors.html diff --git a/src/main/resources/templates/execRegisteredUsers.html b/core/src/main/resources/templates/execRegisteredUsers.html similarity index 100% rename from src/main/resources/templates/execRegisteredUsers.html rename to core/src/main/resources/templates/execRegisteredUsers.html diff --git a/src/main/resources/templates/execSchemas.html b/core/src/main/resources/templates/execSchemas.html similarity index 100% rename from src/main/resources/templates/execSchemas.html rename to core/src/main/resources/templates/execSchemas.html diff --git a/src/main/resources/templates/execTopics.html b/core/src/main/resources/templates/execTopics.html similarity index 100% rename from src/main/resources/templates/execTopics.html rename to core/src/main/resources/templates/execTopics.html diff --git a/src/main/resources/templates/feedback.html b/core/src/main/resources/templates/feedback.html similarity index 100% rename from src/main/resources/templates/feedback.html rename to core/src/main/resources/templates/feedback.html diff --git a/src/main/resources/templates/forgotPassword.html b/core/src/main/resources/templates/forgotPassword.html similarity index 100% rename from src/main/resources/templates/forgotPassword.html rename to core/src/main/resources/templates/forgotPassword.html diff --git a/src/main/resources/templates/helpwizard.html b/core/src/main/resources/templates/helpwizard.html similarity index 100% rename from src/main/resources/templates/helpwizard.html rename to core/src/main/resources/templates/helpwizard.html diff --git a/src/main/resources/templates/index.html b/core/src/main/resources/templates/index.html similarity index 100% rename from src/main/resources/templates/index.html rename to core/src/main/resources/templates/index.html diff --git a/src/main/resources/templates/kafkaConnectors.html b/core/src/main/resources/templates/kafkaConnectors.html similarity index 100% rename from src/main/resources/templates/kafkaConnectors.html rename to core/src/main/resources/templates/kafkaConnectors.html diff --git a/src/main/resources/templates/kwmetrics.html b/core/src/main/resources/templates/kwmetrics.html similarity index 100% rename from src/main/resources/templates/kwmetrics.html rename to core/src/main/resources/templates/kwmetrics.html diff --git a/src/main/resources/templates/login.html b/core/src/main/resources/templates/login.html similarity index 100% rename from src/main/resources/templates/login.html rename to core/src/main/resources/templates/login.html diff --git a/src/main/resources/templates/loginSaas.html b/core/src/main/resources/templates/loginSaas.html similarity index 100% rename from src/main/resources/templates/loginSaas.html rename to core/src/main/resources/templates/loginSaas.html diff --git a/src/main/resources/templates/modifyCluster.html b/core/src/main/resources/templates/modifyCluster.html similarity index 100% rename from src/main/resources/templates/modifyCluster.html rename to core/src/main/resources/templates/modifyCluster.html diff --git a/src/main/resources/templates/modifyEnv.html b/core/src/main/resources/templates/modifyEnv.html similarity index 100% rename from src/main/resources/templates/modifyEnv.html rename to core/src/main/resources/templates/modifyEnv.html diff --git a/src/main/resources/templates/modifyTeam.html b/core/src/main/resources/templates/modifyTeam.html similarity index 100% rename from src/main/resources/templates/modifyTeam.html rename to core/src/main/resources/templates/modifyTeam.html diff --git a/src/main/resources/templates/modifyUser.html b/core/src/main/resources/templates/modifyUser.html similarity index 100% rename from src/main/resources/templates/modifyUser.html rename to core/src/main/resources/templates/modifyUser.html diff --git a/src/main/resources/templates/monitorEnvs.html b/core/src/main/resources/templates/monitorEnvs.html similarity index 100% rename from src/main/resources/templates/monitorEnvs.html rename to core/src/main/resources/templates/monitorEnvs.html diff --git a/src/main/resources/templates/myAclRequests.html b/core/src/main/resources/templates/myAclRequests.html similarity index 100% rename from src/main/resources/templates/myAclRequests.html rename to core/src/main/resources/templates/myAclRequests.html diff --git a/src/main/resources/templates/myConnectorRequests.html b/core/src/main/resources/templates/myConnectorRequests.html similarity index 100% rename from src/main/resources/templates/myConnectorRequests.html rename to core/src/main/resources/templates/myConnectorRequests.html diff --git a/src/main/resources/templates/myProfile.html b/core/src/main/resources/templates/myProfile.html similarity index 100% rename from src/main/resources/templates/myProfile.html rename to core/src/main/resources/templates/myProfile.html diff --git a/src/main/resources/templates/mySchemaRequests.html b/core/src/main/resources/templates/mySchemaRequests.html similarity index 100% rename from src/main/resources/templates/mySchemaRequests.html rename to core/src/main/resources/templates/mySchemaRequests.html diff --git a/src/main/resources/templates/myTopicRequests.html b/core/src/main/resources/templates/myTopicRequests.html similarity index 100% rename from src/main/resources/templates/myTopicRequests.html rename to core/src/main/resources/templates/myTopicRequests.html diff --git a/src/main/resources/templates/newADUser.html b/core/src/main/resources/templates/newADUser.html similarity index 100% rename from src/main/resources/templates/newADUser.html rename to core/src/main/resources/templates/newADUser.html diff --git a/src/main/resources/templates/oauthLogin.html b/core/src/main/resources/templates/oauthLogin.html similarity index 100% rename from src/main/resources/templates/oauthLogin.html rename to core/src/main/resources/templates/oauthLogin.html diff --git a/src/main/resources/templates/permissions.html b/core/src/main/resources/templates/permissions.html similarity index 100% rename from src/main/resources/templates/permissions.html rename to core/src/main/resources/templates/permissions.html diff --git a/src/main/resources/templates/register.html b/core/src/main/resources/templates/register.html similarity index 100% rename from src/main/resources/templates/register.html rename to core/src/main/resources/templates/register.html diff --git a/src/main/resources/templates/registerLdap.html b/core/src/main/resources/templates/registerLdap.html similarity index 100% rename from src/main/resources/templates/registerLdap.html rename to core/src/main/resources/templates/registerLdap.html diff --git a/src/main/resources/templates/registerSaas.html b/core/src/main/resources/templates/registerSaas.html similarity index 100% rename from src/main/resources/templates/registerSaas.html rename to core/src/main/resources/templates/registerSaas.html diff --git a/src/main/resources/templates/registrationReview.html b/core/src/main/resources/templates/registrationReview.html similarity index 100% rename from src/main/resources/templates/registrationReview.html rename to core/src/main/resources/templates/registrationReview.html diff --git a/src/main/resources/templates/registrationReviewSaas.html b/core/src/main/resources/templates/registrationReviewSaas.html similarity index 100% rename from src/main/resources/templates/registrationReviewSaas.html rename to core/src/main/resources/templates/registrationReviewSaas.html diff --git a/src/main/resources/templates/requestAcls.html b/core/src/main/resources/templates/requestAcls.html similarity index 100% rename from src/main/resources/templates/requestAcls.html rename to core/src/main/resources/templates/requestAcls.html diff --git a/src/main/resources/templates/requestConnector.html b/core/src/main/resources/templates/requestConnector.html similarity index 100% rename from src/main/resources/templates/requestConnector.html rename to core/src/main/resources/templates/requestConnector.html diff --git a/src/main/resources/templates/requestSchema.html b/core/src/main/resources/templates/requestSchema.html similarity index 100% rename from src/main/resources/templates/requestSchema.html rename to core/src/main/resources/templates/requestSchema.html diff --git a/src/main/resources/templates/requestTopics.html b/core/src/main/resources/templates/requestTopics.html similarity index 100% rename from src/main/resources/templates/requestTopics.html rename to core/src/main/resources/templates/requestTopics.html diff --git a/src/main/resources/templates/roles.html b/core/src/main/resources/templates/roles.html similarity index 100% rename from src/main/resources/templates/roles.html rename to core/src/main/resources/templates/roles.html diff --git a/src/main/resources/templates/serverConfig.html b/core/src/main/resources/templates/serverConfig.html similarity index 100% rename from src/main/resources/templates/serverConfig.html rename to core/src/main/resources/templates/serverConfig.html diff --git a/src/main/resources/templates/showTeams.html b/core/src/main/resources/templates/showTeams.html similarity index 100% rename from src/main/resources/templates/showTeams.html rename to core/src/main/resources/templates/showTeams.html diff --git a/src/main/resources/templates/showUsers.html b/core/src/main/resources/templates/showUsers.html similarity index 100% rename from src/main/resources/templates/showUsers.html rename to core/src/main/resources/templates/showUsers.html diff --git a/src/main/resources/templates/syncBackAcls.html b/core/src/main/resources/templates/syncBackAcls.html similarity index 100% rename from src/main/resources/templates/syncBackAcls.html rename to core/src/main/resources/templates/syncBackAcls.html diff --git a/src/main/resources/templates/syncBackTopics.html b/core/src/main/resources/templates/syncBackTopics.html similarity index 100% rename from src/main/resources/templates/syncBackTopics.html rename to core/src/main/resources/templates/syncBackTopics.html diff --git a/src/main/resources/templates/synchronizeAcls.html b/core/src/main/resources/templates/synchronizeAcls.html similarity index 100% rename from src/main/resources/templates/synchronizeAcls.html rename to core/src/main/resources/templates/synchronizeAcls.html diff --git a/src/main/resources/templates/synchronizeConnectors.html b/core/src/main/resources/templates/synchronizeConnectors.html similarity index 100% rename from src/main/resources/templates/synchronizeConnectors.html rename to core/src/main/resources/templates/synchronizeConnectors.html diff --git a/src/main/resources/templates/synchronizeTopics.html b/core/src/main/resources/templates/synchronizeTopics.html similarity index 100% rename from src/main/resources/templates/synchronizeTopics.html rename to core/src/main/resources/templates/synchronizeTopics.html diff --git a/src/main/resources/templates/tenantInfo.html b/core/src/main/resources/templates/tenantInfo.html similarity index 100% rename from src/main/resources/templates/tenantInfo.html rename to core/src/main/resources/templates/tenantInfo.html diff --git a/src/main/resources/templates/tenants.html b/core/src/main/resources/templates/tenants.html similarity index 100% rename from src/main/resources/templates/tenants.html rename to core/src/main/resources/templates/tenants.html diff --git a/src/main/resources/templates/terms.html b/core/src/main/resources/templates/terms.html similarity index 100% rename from src/main/resources/templates/terms.html rename to core/src/main/resources/templates/terms.html diff --git a/src/main/resources/templates/userActivation.html b/core/src/main/resources/templates/userActivation.html similarity index 100% rename from src/main/resources/templates/userActivation.html rename to core/src/main/resources/templates/userActivation.html diff --git a/src/test/java/io/aiven/klaw/EnvsClustersTenantsControllerIT.java b/core/src/test/java/io/aiven/klaw/EnvsClustersTenantsControllerIT.java similarity index 100% rename from src/test/java/io/aiven/klaw/EnvsClustersTenantsControllerIT.java rename to core/src/test/java/io/aiven/klaw/EnvsClustersTenantsControllerIT.java diff --git a/src/test/java/io/aiven/klaw/MockMethods.java b/core/src/test/java/io/aiven/klaw/MockMethods.java similarity index 100% rename from src/test/java/io/aiven/klaw/MockMethods.java rename to core/src/test/java/io/aiven/klaw/MockMethods.java diff --git a/src/test/java/io/aiven/klaw/RolesPermissionsControllerIT.java b/core/src/test/java/io/aiven/klaw/RolesPermissionsControllerIT.java similarity index 100% rename from src/test/java/io/aiven/klaw/RolesPermissionsControllerIT.java rename to core/src/test/java/io/aiven/klaw/RolesPermissionsControllerIT.java diff --git a/src/test/java/io/aiven/klaw/TopicAclControllerIT.java b/core/src/test/java/io/aiven/klaw/TopicAclControllerIT.java similarity index 100% rename from src/test/java/io/aiven/klaw/TopicAclControllerIT.java rename to core/src/test/java/io/aiven/klaw/TopicAclControllerIT.java diff --git a/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java b/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java similarity index 100% rename from src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java rename to core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java diff --git a/src/test/java/io/aiven/klaw/UtilMethods.java b/core/src/test/java/io/aiven/klaw/UtilMethods.java similarity index 100% rename from src/test/java/io/aiven/klaw/UtilMethods.java rename to core/src/test/java/io/aiven/klaw/UtilMethods.java diff --git a/src/test/java/io/aiven/klaw/controller/AclControllerTest.java b/core/src/test/java/io/aiven/klaw/controller/AclControllerTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/controller/AclControllerTest.java rename to core/src/test/java/io/aiven/klaw/controller/AclControllerTest.java diff --git a/src/test/java/io/aiven/klaw/controller/SchemaRegstryControllerTest.java b/core/src/test/java/io/aiven/klaw/controller/SchemaRegstryControllerTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/controller/SchemaRegstryControllerTest.java rename to core/src/test/java/io/aiven/klaw/controller/SchemaRegstryControllerTest.java diff --git a/src/test/java/io/aiven/klaw/controller/ServerConfigControllerTest.java b/core/src/test/java/io/aiven/klaw/controller/ServerConfigControllerTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/controller/ServerConfigControllerTest.java rename to core/src/test/java/io/aiven/klaw/controller/ServerConfigControllerTest.java diff --git a/src/test/java/io/aiven/klaw/controller/TopicControllerTest.java b/core/src/test/java/io/aiven/klaw/controller/TopicControllerTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/controller/TopicControllerTest.java rename to core/src/test/java/io/aiven/klaw/controller/TopicControllerTest.java diff --git a/src/test/java/io/aiven/klaw/controller/UiConfigControllerTest.java b/core/src/test/java/io/aiven/klaw/controller/UiConfigControllerTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/controller/UiConfigControllerTest.java rename to core/src/test/java/io/aiven/klaw/controller/UiConfigControllerTest.java diff --git a/src/test/java/io/aiven/klaw/controller/UtilControllerTest.java b/core/src/test/java/io/aiven/klaw/controller/UtilControllerTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/controller/UtilControllerTest.java rename to core/src/test/java/io/aiven/klaw/controller/UtilControllerTest.java diff --git a/src/test/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbcTest.java b/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbcTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbcTest.java rename to core/src/test/java/io/aiven/klaw/helpers/db/rdbms/DeleteDataJdbcTest.java diff --git a/src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java b/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java rename to core/src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java diff --git a/src/test/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbcTest.java b/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbcTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbcTest.java rename to core/src/test/java/io/aiven/klaw/helpers/db/rdbms/SelectDataJdbcTest.java diff --git a/src/test/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbcTest.java b/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbcTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbcTest.java rename to core/src/test/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbcTest.java diff --git a/src/test/java/io/aiven/klaw/model/ValidationTest.java b/core/src/test/java/io/aiven/klaw/model/ValidationTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/model/ValidationTest.java rename to core/src/test/java/io/aiven/klaw/model/ValidationTest.java diff --git a/src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java rename to core/src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java diff --git a/src/test/java/io/aiven/klaw/service/ClusterApiServiceTest.java b/core/src/test/java/io/aiven/klaw/service/ClusterApiServiceTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/service/ClusterApiServiceTest.java rename to core/src/test/java/io/aiven/klaw/service/ClusterApiServiceTest.java diff --git a/src/test/java/io/aiven/klaw/service/MailUtilsTest.java b/core/src/test/java/io/aiven/klaw/service/MailUtilsTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/service/MailUtilsTest.java rename to core/src/test/java/io/aiven/klaw/service/MailUtilsTest.java diff --git a/src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java rename to core/src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java diff --git a/src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java b/core/src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java rename to core/src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java diff --git a/src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java rename to core/src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java diff --git a/src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java similarity index 100% rename from src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java rename to core/src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java diff --git a/src/test/resources/test-application-rdbms.properties b/core/src/test/resources/test-application-rdbms.properties similarity index 98% rename from src/test/resources/test-application-rdbms.properties rename to core/src/test/resources/test-application-rdbms.properties index cd34a42c07..7184686ee2 100644 --- a/src/test/resources/test-application-rdbms.properties +++ b/core/src/test/resources/test-application-rdbms.properties @@ -25,7 +25,7 @@ spring.liquibase.change-log=classpath:db/changelog/changelog.yaml # licensing info klaw.org.name=Our Organization -klaw.version=1.0.0 +klaw.version=1.1.0 # Spring JPA properties mysql # Spring JPA properties filedb @@ -105,7 +105,6 @@ klaw.reloadclusterstatus.interval=1800000 # ClusterApi access klaw.clusterapi.access.username=kwclusterapiuser -klaw.clusterapi.access.password=d7DtnvRR7jq05ODBkvxLIGO6Qa/bVpkW # Monitoring klaw.monitoring.metrics.enable=false diff --git a/src/test/resources/test-application-rdbms1.properties b/core/src/test/resources/test-application-rdbms1.properties similarity index 98% rename from src/test/resources/test-application-rdbms1.properties rename to core/src/test/resources/test-application-rdbms1.properties index d7fae560c9..82a862be75 100644 --- a/src/test/resources/test-application-rdbms1.properties +++ b/core/src/test/resources/test-application-rdbms1.properties @@ -25,7 +25,7 @@ spring.liquibase.change-log=classpath:db/changelog/changelog.yaml # licensing info klaw.org.name=Our Organization -klaw.version=1.0.0 +klaw.version=1.1.0 # Spring JPA properties mysql # Spring JPA properties filedb @@ -105,7 +105,6 @@ klaw.reloadclusterstatus.interval=1800000 # ClusterApi access klaw.clusterapi.access.username=kwclusterapiuser -klaw.clusterapi.access.password=d7DtnvRR7jq05ODBkvxLIGO6Qa/bVpkW # Monitoring klaw.monitoring.metrics.enable=false diff --git a/pom.xml b/pom.xml index bb8a8ce43c..d325d427af 100644 --- a/pom.xml +++ b/pom.xml @@ -3,10 +3,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 io.aiven - klaw - 1.0.0 - jar - Klaw + klaw-project + 1.1.0 + pom + Klaw Project Aiven Klaw - Selfservice, Governance for Kafka https://github.com/aiven/klaw @@ -47,28 +47,25 @@ 11 ${java.version} ${java.version} - - 2.11.0 - 5.2.3 + 3.23.1 - 1.10.0 3.1.0 - 2.9.0 1.15.0 31.1-jre - 2.1.214 0.8.8 - 3.0.4 0.11.5 - 2.22.2 2.22.2 - 4.1.80.Final - 1.19.0 + 2.22.2 + 1.33 3.9.1.2184 2.27.2 - 2.1.0 + + core + cluster-api + + org.springframework.boot @@ -83,30 +80,47 @@ org.springframework.boot spring-boot-starter-web + - org.springframework.boot - spring-boot-starter-thymeleaf + org.projectlombok + lombok + - org.springframework.boot - spring-boot-starter-actuator + com.google.guava + guava + ${guava.version} - org.springframework.boot - spring-boot-starter-data-jpa + org.apache.httpcomponents + httpclient - mysql - mysql-connector-java + io.jsonwebtoken + jjwt-api + ${jjwt.version} + + + + io.jsonwebtoken + jjwt-impl + ${jjwt.version} + runtime + + + + io.jsonwebtoken + jjwt-jackson + ${jjwt.version} + runtime org.springframework.boot spring-boot-starter-test test - junit @@ -121,163 +135,25 @@ test - - com.google.code.gson - gson - - - - - - - - - org.projectlombok - lombok - - - - org.apache.commons - commons-text - ${commons-text.version} - - - - com.google.guava - guava - ${guava.version} - - org.assertj assertj-core ${assertj-core.version} test - - - com.h2database - h2 - - - - org.springframework.security - spring-security-test - test - - - - org.springframework.ldap - spring-ldap-core - - - org.springframework.security - spring-security-ldap - - - org.apache.poi - poi - ${apachepoi.version} - - - org.apache.poi - poi-ooxml - ${apachepoi.version} - - - commons-io - commons-io - ${apachecommons.version} - - - com.github.ulisesbocchio - jasypt-spring-boot-starter - ${jasyptencrypt.version} - - - com.zaxxer - HikariCP - - - org.springframework.boot - spring-boot-starter-oauth2-client - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - - - - org.springframework - spring-webflux - - - io.projectreactor.netty - reactor-netty - - - org.apache.httpcomponents - httpclient - - - org.springframework.boot - spring-boot-starter-cache - - - com.github.ben-manes.caffeine - caffeine - - - org.liquibase - liquibase-core - - - javax.mail - javax.mail-api - - - io.jsonwebtoken - jjwt-api - ${jjwt.version} - - - io.jsonwebtoken - jjwt-impl - ${jjwt.version} - runtime - - - io.jsonwebtoken - jjwt-jackson - ${jjwt.version} - runtime - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - uglifyjs-files - - java - - test - - io.aiven.klaw.uglify.UglifyFiles - - - - org.springframework.boot spring-boot-maven-plugin + + org.jacoco + jacoco-maven-plugin + ${jacoco-maven-plugin.version} + org.apache.maven.plugins maven-surefire-plugin @@ -305,11 +181,6 @@ - - org.jacoco - jacoco-maven-plugin - ${jacoco-maven-plugin.version} - org.sonarsource.scanner.maven sonar-maven-plugin