2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.asdctool.impl;
23 import java.io.BufferedReader;
24 import java.io.BufferedWriter;
26 import java.io.FileReader;
27 import java.io.FileWriter;
28 import java.io.IOException;
29 import java.io.PrintWriter;
30 import java.lang.reflect.Type;
31 import java.net.MalformedURLException;
32 import java.net.URISyntaxException;
34 import java.nio.file.Files;
35 import java.nio.file.Paths;
36 import java.text.ParseException;
37 import java.text.SimpleDateFormat;
38 import java.util.Date;
39 import java.util.EnumMap;
41 import java.util.TimeZone;
43 import org.apache.commons.lang.SystemUtils;
44 import org.elasticsearch.action.search.SearchResponse;
45 import org.elasticsearch.cluster.metadata.IndexMetaData;
46 import org.elasticsearch.common.collect.ImmutableOpenMap;
47 import org.elasticsearch.common.settings.Settings;
48 import org.elasticsearch.common.unit.TimeValue;
49 import org.elasticsearch.index.query.QueryBuilder;
50 import org.elasticsearch.index.query.QueryBuilders;
51 import org.elasticsearch.search.SearchHit;
52 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
53 import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
54 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
55 import org.openecomp.sdc.be.dao.cassandra.schema.Table;
56 import org.openecomp.sdc.be.dao.es.ElasticSearchClient;
57 import org.openecomp.sdc.be.resources.data.ESArtifactData;
58 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
59 import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent;
60 import org.openecomp.sdc.be.resources.data.auditing.AuditingGetUebClusterEvent;
61 import org.openecomp.sdc.be.resources.data.auditing.AuditingTypesConstants;
62 import org.openecomp.sdc.be.resources.data.auditing.AuthEvent;
63 import org.openecomp.sdc.be.resources.data.auditing.CategoryEvent;
64 import org.openecomp.sdc.be.resources.data.auditing.ConsumerEvent;
65 import org.openecomp.sdc.be.resources.data.auditing.DistributionDeployEvent;
66 import org.openecomp.sdc.be.resources.data.auditing.DistributionDownloadEvent;
67 import org.openecomp.sdc.be.resources.data.auditing.DistributionEngineEvent;
68 import org.openecomp.sdc.be.resources.data.auditing.DistributionNotificationEvent;
69 import org.openecomp.sdc.be.resources.data.auditing.DistributionStatusEvent;
70 import org.openecomp.sdc.be.resources.data.auditing.GetCategoryHierarchyEvent;
71 import org.openecomp.sdc.be.resources.data.auditing.GetUsersListEvent;
72 import org.openecomp.sdc.be.resources.data.auditing.ResourceAdminEvent;
73 import org.openecomp.sdc.be.resources.data.auditing.UserAccessEvent;
74 import org.openecomp.sdc.be.resources.data.auditing.UserAdminEvent;
75 import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
76 import org.slf4j.Logger;
77 import org.slf4j.LoggerFactory;
78 import org.springframework.beans.factory.annotation.Autowired;
80 import com.carrotsearch.hppc.cursors.ObjectCursor;
81 import com.fasterxml.jackson.databind.ObjectMapper;
82 import com.google.gson.Gson;
83 import com.google.gson.reflect.TypeToken;
85 import fj.data.Either;
88 * Created by mlando on 5/16/2016.
90 public class DataMigration {
92 private Gson gson = new Gson();
94 private ObjectMapper jsonMapper = new ObjectMapper();
96 private static Logger log = LoggerFactory.getLogger(DataMigration.class.getName());
98 protected ElasticSearchClient elasticSearchClient;
100 protected AuditCassandraDao auditCassandraDao;
102 protected ArtifactCassandraDao artifactCassandraDao;
103 private static final String dateFormatPattern = "yyyy-MM-dd HH:mm:ss.SSS z";
104 private static SimpleDateFormat simpleDateFormat;
107 * the method exports and imports the records from ES to cassandra the flow
108 * will check to see if the files are not empty if the files are not empty
109 * the export will be skiped and the flow will use the existing files. the
110 * flow will check if the tables in cassandra are empty, if the tables are
111 * not empty the proces will stop and exit. if the tables are empty the
112 * method will import the records from the files. in case of a fail the flow
113 * will exit and clear all the Cassandra tables.
115 * @param appConfigDir
116 * the location of the dir in wich the output files will be
118 * @param exportFromEs
119 * should the es be exported again and overwrite the old export
120 * @param importToCassandra
121 * should we import the data into cassandra
122 * @return true in case the operation was successful.
124 public boolean migrateDataESToCassndra(String appConfigDir, boolean exportFromEs, boolean importToCassandra) {
128 Map<Table, File> files = createOutPutFiles(appConfigDir, exportFromEs);
132 if (exportFromEs && filesEmpty(files)) {
133 Map<Table, PrintWriter> printerWritersMap = createWriters(files);
134 if (printerWritersMap == null) {
138 ImmutableOpenMap<String, IndexMetaData> indexData = getIndexData();
139 for (ObjectCursor<String> key : indexData.keys()) {
140 if ("resources".equalsIgnoreCase(key.value)) {
141 if (!exportArtifacts(key.value, printerWritersMap)) {
144 } else if (key.value.startsWith("auditingevents")) {
145 if (!exportAudit(key.value, printerWritersMap)) {
151 if (elasticSearchClient != null) {
152 elasticSearchClient.close();
154 for (PrintWriter writer : printerWritersMap.values()) {
159 if (importToCassandra && !importToCassndra(files)) {
166 private void initFormater() {
167 simpleDateFormat = new SimpleDateFormat(dateFormatPattern);
168 simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
171 private boolean initEsClient() {
172 String configHome = System.getProperty("config.home");
174 Settings settings = null;
176 if (SystemUtils.IS_OS_WINDOWS) {
177 url = new URL("file:///" + configHome + "/elasticsearch.yml");
179 url = new URL("file:" + configHome + "/elasticsearch.yml");
181 log.debug("URL {}", url);
182 settings = Settings.settingsBuilder().loadFromPath(Paths.get(url.toURI())).build();
183 } catch (MalformedURLException | URISyntaxException e1) {
184 log.error("Failed to create URL in order to load elasticsearch yml", e1);
188 this.elasticSearchClient = new ElasticSearchClient();
189 this.elasticSearchClient.setClusterName(settings.get("cluster.name"));
190 this.elasticSearchClient.setLocal(settings.get("elasticSearch.local"));
191 this.elasticSearchClient.setTransportClient(settings.get("elasticSearch.transportclient"));
193 elasticSearchClient.initialize();
194 } catch (URISyntaxException e) {
202 * the method clears all the cassandra tables
204 private void truncateCassandraTable() {
205 log.info("import failed. truncating Cassandra tables.");
206 artifactCassandraDao.deleteAllArtifacts();
207 auditCassandraDao.deleteAllAudit();
211 * the method imports the records from the files into cassandra
214 * a map of files holding
215 * @return true if the operation was successful
217 private boolean importToCassndra(Map<Table, File> files) {
218 log.info("starting to import date into Cassandra.");
219 if (!validtaTablsNotEmpty(files))
221 for (Table table : files.keySet()) {
222 log.info("importing recordes into {}", table.getTableDescription().getTableName());
223 if (!handleImport(files, table)) {
224 truncateCassandraTable();
228 log.info("finished to import date into Cassandra.");
232 private boolean validtaTablsNotEmpty(Map<Table, File> files) {
233 for (Table table : files.keySet()) {
234 Either<Boolean, CassandraOperationStatus> isTableEmptyRes = checkIfTableIsEmpty(table);
235 if (isTableEmptyRes.isRight() || !isTableEmptyRes.left().value()) {
236 log.error("Cassandra table {} is not empty operation aborted.",
237 table.getTableDescription().getTableName());
245 * the method retrieves the fields from the given map and praprs them for
246 * storage as an audit according to the table name
249 * the map from which we will retrive the fields enum values
251 * the table we are going to store the record in.
252 * @return a enummap representing the audit record that is going to be
255 private EnumMap<AuditingFieldsKeysEnum, Object> createAuditMap(Map<String, String> map, Table table) {
256 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<>(AuditingFieldsKeysEnum.class);
258 case USER_ADMIN_EVENT:
259 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
260 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
261 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
262 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
263 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
264 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
265 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_USER_AFTER, map.get("USER_AFTER"));
266 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_USER_BEFORE, map.get("USER_BEFORE"));
267 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
269 case USER_ACCESS_EVENT:
270 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
271 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
272 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
273 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
274 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
275 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
276 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_USER_UID, map.get("USER"));
278 case RESOURCE_ADMIN_EVENT:
279 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
280 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
281 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
282 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_INVARIANT_UUID, map.get("INVARIANT_UUID"));
283 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
284 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
285 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
286 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_VERSION, map.get("CURR_VERSION"));
287 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_STATE, map.get("CURR_STATE"));
288 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, map.get("DID"));
289 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
290 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_PREV_VERSION, map.get("PREV_VERSION"));
291 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_PREV_STATE, map.get("PREV_STATE"));
292 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, map.get("RESOURCE_NAME"));
293 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TYPE, map.get("RESOURCE_TYPE"));
294 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DPREV_STATUS, map.get("DPREV_STATUS"));
295 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DCURR_STATUS, map.get("DCURR_STATUS"));
296 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TOSCA_NODE_TYPE, map.get("TOSCA_NODE_TYPE"));
297 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, map.get("COMMENT"));
298 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ARTIFACT_DATA, map.get("ARTIFACT_DATA"));
299 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_PREV_ARTIFACT_UUID, map.get("PREV_ARTIFACT_UUID"));
300 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_CURR_ARTIFACT_UUID, map.get("CURR_ARTIFACT_UUID"));
302 case DISTRIBUTION_DOWNLOAD_EVENT:
303 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
304 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
305 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
306 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
307 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
308 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
309 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_RESOURCE_URL, map.get("RESOURCE_URL"));
310 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_CONSUMER_ID, map.get("CONSUMER_ID"));
312 case DISTRIBUTION_ENGINE_EVENT:
313 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
314 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
315 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
316 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
317 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
318 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
319 if (map.get("TOPIC_NAME") != null) {
320 if (map.get("TOPIC_NAME").contains("-STATUS-")) {
321 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_STATUS_TOPIC_NAME,
322 map.get("TOPIC_NAME"));
324 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_NOTIFICATION_TOPIC_NAME,
325 map.get("TOPIC_NAME"));
328 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_STATUS_TOPIC_NAME,
329 map.get("DSTATUS_TOPIC"));
330 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_NOTIFICATION_TOPIC_NAME,
331 map.get("DNOTIF_TOPIC"));
333 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_TOPIC_NAME, map.get("TOPIC_NAME"));
334 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ROLE, map.get("ROLE"));
335 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_API_KEY, map.get("API_KEY"));
336 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ENVRIONMENT_NAME, map.get("D_ENV"));
337 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_CONSUMER_ID, map.get("CONSUMER_ID"));
339 case DISTRIBUTION_NOTIFICATION_EVENT:
340 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
341 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
342 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
343 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
344 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
345 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
346 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_STATE, map.get("CURR_STATE"));
347 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_VERSION, map.get("CURR_VERSION"));
348 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, map.get("DID"));
349 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
350 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, map.get("RESOURCE_NAME"));
351 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TYPE, map.get("RESOURCE_TYPE"));
352 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_TOPIC_NAME, map.get("TOPIC_NAME"));
354 case DISTRIBUTION_STATUS_EVENT:
355 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
356 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
357 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
358 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
359 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
360 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
361 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_RESOURCE_URL, map.get("RESOURCE_URL"));
362 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, map.get("DID"));
363 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_TOPIC_NAME, map.get("TOPIC_NAME"));
364 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_CONSUMER_ID, map.get("CONSUMER_ID"));
365 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_STATUS_TIME, map.get("STATUS_TIME"));
367 case DISTRIBUTION_DEPLOY_EVENT:
368 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
369 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
370 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
371 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
372 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
373 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
374 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, map.get("DID"));
375 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, map.get("RESOURCE_NAME"));
376 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TYPE, map.get("RESOURCE_TYPE"));
377 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
378 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_VERSION, map.get("CURR_VERSION"));
380 case DISTRIBUTION_GET_UEB_CLUSTER_EVENT:
381 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
382 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
383 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
384 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
385 if (map.get("STATUS_DESC") != null) {
386 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("STATUS_DESC"));
388 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
390 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
391 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_CONSUMER_ID, map.get("CONSUMER_ID"));
394 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
395 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
396 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
397 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
398 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
399 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_AUTH_USER, map.get("USER"));
400 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_AUTH_URL, map.get("URL"));
401 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_AUTH_STATUS, map.get("AUTH_STATUS"));
402 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_AUTH_REALM, map.get("REALM"));
405 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
406 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
407 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
408 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
409 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
410 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
411 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ECOMP_USER, map.get("ECOMP_USER"));
414 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
415 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
416 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
417 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
418 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
419 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
420 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SERVICE_INSTANCE_ID, map.get("SERVICE_INSTANCE_ID"));
421 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_CATEGORY_NAME, map.get("CATEGORY_NAME"));
422 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_SUB_CATEGORY_NAME, map.get("SUB_CATEGORY_NAME"));
423 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_GROUPING_NAME, map.get("GROUPING_NAME"));
424 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TYPE, map.get("RESOURCE_TYPE"));
426 case GET_USERS_LIST_EVENT:
427 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
428 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
429 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
430 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
431 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
432 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
433 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DETAILS, map.get("DETAILS"));
435 case GET_CATEGORY_HIERARCHY_EVENT:
436 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP, map.get("TIMESTAMP"));
437 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION, map.get("ACTION"));
438 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DESC, map.get("DESC"));
439 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, map.get("STATUS"));
440 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, map.get("MODIFIER"));
441 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, map.get("REQUEST_ID"));
442 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DETAILS, map.get("DETAILS"));
445 auditingFields = null;
448 return auditingFields;
452 * the method reads the content of the file intended for a given table, and
453 * sores them in cassandra
456 * a map of files from which the recordes will be retrieved.
458 * the name of the table we want to look up in the files and sore
459 * in Cassandra // * @param store the function to call when
460 * storing recordes in cassndra
461 * @return true if the operation was successful
463 private boolean handleImport(Map<Table, File> files, Table table) {
464 BufferedReader br = null;
466 br = new BufferedReader(new FileReader(files.get(table)));
468 while ((line = br.readLine()) != null) {
469 CassandraOperationStatus res = null;
470 if (Table.ARTIFACT.equals(table)) {
471 res = artifactCassandraDao.saveArtifact(jsonMapper.readValue(line, ESArtifactData.class));
473 Type type = new TypeToken<Map<String, String>>() {
475 Map<String, String> map = gson.fromJson(line, type);
476 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = createAuditMap(map, table);
477 AuditingGenericEvent recordForCassandra = null;
479 recordForCassandra = createAuditRecord(auditingFields);
480 } catch (ParseException e) {
481 log.error("filed to parse time stemp in recored {}", auditingFields);
485 res = auditCassandraDao.saveRecord(recordForCassandra);
487 if (!res.equals(CassandraOperationStatus.OK)) {
488 log.error("save recored to cassndra {} failed with status {} aborting.",
489 table.getTableDescription().getTableName(), res);
494 } catch (IOException e) {
495 log.error("failed to read file", e);
501 } catch (IOException e) {
502 log.error("failed to close file reader", e);
509 * the method checks if the given table is empty
512 * the name of the table we want to check
513 * @return true if the table is empty
515 private Either<Boolean, CassandraOperationStatus> checkIfTableIsEmpty(Table table) {
516 if (Table.ARTIFACT.equals(table)) {
517 return artifactCassandraDao.isTableEmpty(table.getTableDescription().getTableName());
519 return auditCassandraDao.isTableEmpty(table.getTableDescription().getTableName());
523 private boolean filesEmpty(Map<Table, File> files) {
524 for (Table table : files.keySet()) {
525 File file = files.get(table);
526 if (file.length() != 0) {
527 log.info("file:{} is not empty skipping export", table.getTableDescription().getTableName());
535 * the method reads the records from es index of audit's into a file as
539 * the name of the index we want
540 * @param printerWritersMap
541 * a map of the writers we use to write to a file.
542 * @return true in case the export was successful.
544 private boolean exportAudit(String value, Map<Table, PrintWriter> printerWritersMap) {
545 log.info("stratng to export audit data from es index{} to file.", value);
546 QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
547 SearchResponse scrollResp = elasticSearchClient.getClient().prepareSearch(value).setScroll(new TimeValue(60000))
548 .setQuery(queryBuilder).setSize(100).execute().actionGet();
550 for (SearchHit hit : scrollResp.getHits().getHits()) {
551 PrintWriter out = printerWritersMap.get(TypeToTableMapping.getTableByType(hit.getType()));
552 out.println(hit.getSourceAsString());
554 scrollResp = elasticSearchClient.getClient().prepareSearchScroll(scrollResp.getScrollId())
555 .setScroll(new TimeValue(60000)).execute().actionGet();
556 if (scrollResp.getHits().getHits().length == 0) {
562 log.info("export audit data from es to file. finished succsesfully");
567 * the method reads the records from es index of resources into a file as
571 * the name of the index we want to read
572 * @param printerWritersMap
573 * a map of the writers we use to write to a file.
574 * @return true in case the export was successful.
576 private boolean exportArtifacts(String index, Map<Table, PrintWriter> printerWritersMap) {
577 log.info("stratng to export artifact data from es to file.");
578 PrintWriter out = printerWritersMap.get(Table.ARTIFACT);
579 QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
580 SearchResponse scrollResp = elasticSearchClient.getClient().prepareSearch(index).setScroll(new TimeValue(60000))
581 .setQuery(queryBuilder).setSize(100).execute().actionGet();
583 for (SearchHit hit : scrollResp.getHits().getHits()) {
585 out.println(hit.getSourceAsString());
587 scrollResp = elasticSearchClient.getClient().prepareSearchScroll(scrollResp.getScrollId())
588 .setScroll(new TimeValue(60000)).execute().actionGet();
589 if (scrollResp.getHits().getHits().length == 0) {
595 log.info("export artifact data from es to file. finished succsesfully");
600 * the method retrieves all the indexes from elasticsearch
602 * @return a map of indexes and there metadata
604 private ImmutableOpenMap<String, IndexMetaData> getIndexData() {
605 return elasticSearchClient.getClient().admin().cluster().prepareState().get().getState().getMetaData()
610 * the method creates all the files and dir which holds them. in case the
611 * files exist they will not be created again.
613 * @param appConfigDir
614 * the base path under which the output dir will be created and
615 * the export result files the created filesa are named according
616 * to the name of the table into which it will be imported.
618 * if true all the export files will be recreated
619 * @returnthe returns a map of tables and the files representing them them
621 private Map<Table, File> createOutPutFiles(String appConfigDir, boolean exportToEs) {
622 Map<Table, File> result = new EnumMap<Table, File>(Table.class);
623 File outputDir = new File(appConfigDir + "/output/");
624 if (!createOutPutFolder(outputDir)) {
627 for (Table table : Table.values()) {
628 File file = new File(outputDir + "/" + table.getTableDescription().getTableName());
632 Files.delete(file.toPath());
634 } catch (IOException e) {
635 log.error("failed to delete output file {}", file.getAbsolutePath(), e);
638 file = new File(outputDir + "/" + table.getTableDescription().getTableName());
640 if (!file.exists()) {
642 file.createNewFile();
643 } catch (IOException e) {
644 log.error("failed to create output file {}", file.getAbsolutePath(), e);
648 result.put(table, file);
655 * the method create the writers to each file
658 * a map of the files according to table
659 * @return returns a map of writers according to table.
661 private Map<Table, PrintWriter> createWriters(Map<Table, File> files) {
662 Map<Table, PrintWriter> printerWritersMap = new EnumMap<>(Table.class);
664 for (Table table : files.keySet()) {
665 log.info("creating writer for {}", table);
666 File file = files.get(table);
667 FileWriter fw = new FileWriter(file, true);
668 BufferedWriter bw = new BufferedWriter(fw);
669 PrintWriter out = new PrintWriter(bw);
670 printerWritersMap.put(table, out);
671 log.info("creating writer for {} was successful", table);
673 } catch (IOException e) {
674 log.error("create writer to file failed", e);
677 return printerWritersMap;
681 * the method creates the output dir in case it does not exist
684 * the path under wich the directory will be created.
685 * @return true in case the create was succsesful or the dir already exists
687 private boolean createOutPutFolder(File outputDir) {
688 if (!outputDir.exists()) {
689 log.info("creating output dir {}", outputDir.getAbsolutePath());
691 Files.createDirectories(outputDir.toPath());
692 } catch (IOException e) {
693 log.error("failed to create output dir {}", outputDir.getAbsolutePath(), e);
700 public enum TypeToTableMapping {
701 USER_ADMIN_EVENT_TYPE(AuditingTypesConstants.USER_ADMIN_EVENT_TYPE,
702 Table.USER_ADMIN_EVENT), USER_ACCESS_EVENT_TYPE(AuditingTypesConstants.USER_ACCESS_EVENT_TYPE,
703 Table.USER_ACCESS_EVENT), RESOURCE_ADMIN_EVENT_TYPE(
704 AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE,
705 Table.RESOURCE_ADMIN_EVENT), DISTRIBUTION_DOWNLOAD_EVENT_TYPE(
706 AuditingTypesConstants.DISTRIBUTION_DOWNLOAD_EVENT_TYPE,
707 Table.DISTRIBUTION_DOWNLOAD_EVENT), DISTRIBUTION_ENGINE_EVENT_TYPE(
708 AuditingTypesConstants.DISTRIBUTION_ENGINE_EVENT_TYPE,
709 Table.DISTRIBUTION_ENGINE_EVENT), DISTRIBUTION_NOTIFICATION_EVENT_TYPE(
710 AuditingTypesConstants.DISTRIBUTION_NOTIFICATION_EVENT_TYPE,
711 Table.DISTRIBUTION_NOTIFICATION_EVENT), DISTRIBUTION_STATUS_EVENT_TYPE(
712 AuditingTypesConstants.DISTRIBUTION_STATUS_EVENT_TYPE,
713 Table.DISTRIBUTION_STATUS_EVENT), DISTRIBUTION_DEPLOY_EVENT_TYPE(
714 AuditingTypesConstants.DISTRIBUTION_DEPLOY_EVENT_TYPE,
715 Table.DISTRIBUTION_DEPLOY_EVENT), DISTRIBUTION_GET_UEB_CLUSTER_EVENT_TYPE(
716 AuditingTypesConstants.DISTRIBUTION_GET_UEB_CLUSTER_EVENT_TYPE,
717 Table.DISTRIBUTION_GET_UEB_CLUSTER_EVENT), AUTH_EVENT_TYPE(
718 AuditingTypesConstants.AUTH_EVENT_TYPE,
719 Table.AUTH_EVENT), CONSUMER_EVENT_TYPE(
720 AuditingTypesConstants.CONSUMER_EVENT_TYPE,
721 Table.CONSUMER_EVENT), CATEGORY_EVENT_TYPE(
722 AuditingTypesConstants.CATEGORY_EVENT_TYPE,
723 Table.CATEGORY_EVENT), GET_USERS_LIST_EVENT_TYPE(
724 AuditingTypesConstants.GET_USERS_LIST_EVENT_TYPE,
725 Table.GET_USERS_LIST_EVENT), GET_CATEGORY_HIERARCHY_EVENT_TYPE(
726 AuditingTypesConstants.GET_CATEGORY_HIERARCHY_EVENT_TYPE,
727 Table.GET_CATEGORY_HIERARCHY_EVENT);
732 TypeToTableMapping(String typeName, Table table) {
733 this.typeName = typeName;
737 public String getTypeName() {
741 public Table getTable() {
745 public static Table getTableByType(String type) {
746 for (TypeToTableMapping mapping : TypeToTableMapping.values()) {
747 if (mapping.getTypeName().equalsIgnoreCase(type)) {
748 return mapping.getTable();
755 public static AuditingGenericEvent createAuditRecord(EnumMap<AuditingFieldsKeysEnum, Object> auditingFields)
756 throws ParseException {
757 AuditingActionEnum actionEnum = AuditingActionEnum
758 .getActionByName((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_ACTION));
759 String tableName = actionEnum.getAuditingEsType();
760 AuditingGenericEvent event = null;
763 case AuditingTypesConstants.USER_ADMIN_EVENT_TYPE:
764 UserAdminEvent userAdminEvent = new UserAdminEvent(auditingFields);
765 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
766 userAdminEvent.setTimestamp1(date);
767 event = userAdminEvent;
769 case AuditingTypesConstants.AUTH_EVENT_TYPE:
770 AuthEvent authEvent = new AuthEvent(auditingFields);
771 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
772 authEvent.setTimestamp1(date);
775 case AuditingTypesConstants.CATEGORY_EVENT_TYPE:
776 CategoryEvent categoryEvent = new CategoryEvent(auditingFields);
777 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
778 categoryEvent.setTimestamp1(date);
779 event = categoryEvent;
781 case AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE:
782 ResourceAdminEvent resourceAdminEvent = new ResourceAdminEvent(auditingFields);
783 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
784 resourceAdminEvent.setTimestamp1(date);
785 event = resourceAdminEvent;
787 case AuditingTypesConstants.USER_ACCESS_EVENT_TYPE:
788 event = new UserAccessEvent(auditingFields);
789 UserAccessEvent userAccessEvent = new UserAccessEvent(auditingFields);
790 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
791 userAccessEvent.setTimestamp1(date);
792 event = userAccessEvent;
794 case AuditingTypesConstants.DISTRIBUTION_STATUS_EVENT_TYPE:
795 DistributionStatusEvent distributionStatusEvent = new DistributionStatusEvent(auditingFields);
796 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
797 distributionStatusEvent.setTimestamp1(date);
798 event = distributionStatusEvent;
800 case AuditingTypesConstants.DISTRIBUTION_DOWNLOAD_EVENT_TYPE:
801 DistributionDownloadEvent distributionDownloadEvent = new DistributionDownloadEvent(auditingFields);
802 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
803 distributionDownloadEvent.setTimestamp1(date);
804 event = distributionDownloadEvent;
806 case AuditingTypesConstants.DISTRIBUTION_ENGINE_EVENT_TYPE:
807 DistributionEngineEvent distributionEngineEvent = new DistributionEngineEvent(auditingFields);
808 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
809 distributionEngineEvent.setTimestamp1(date);
810 event = distributionEngineEvent;
812 case AuditingTypesConstants.DISTRIBUTION_NOTIFICATION_EVENT_TYPE:
813 DistributionNotificationEvent distributionNotificationEvent = new DistributionNotificationEvent(
815 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
816 distributionNotificationEvent.setTimestamp1(date);
817 event = distributionNotificationEvent;
819 case AuditingTypesConstants.DISTRIBUTION_DEPLOY_EVENT_TYPE:
820 DistributionDeployEvent distributionDeployEvent = new DistributionDeployEvent(auditingFields);
821 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
822 distributionDeployEvent.setTimestamp1(date);
823 event = distributionDeployEvent;
825 case AuditingTypesConstants.DISTRIBUTION_GET_UEB_CLUSTER_EVENT_TYPE:
826 AuditingGetUebClusterEvent auditingGetUebClusterEvent = new AuditingGetUebClusterEvent(auditingFields);
827 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
828 auditingGetUebClusterEvent.setTimestamp1(date);
829 event = auditingGetUebClusterEvent;
831 case AuditingTypesConstants.CONSUMER_EVENT_TYPE:
832 ConsumerEvent consumerEvent = new ConsumerEvent(auditingFields);
833 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
834 consumerEvent.setTimestamp1(date);
835 event = consumerEvent;
837 case AuditingTypesConstants.GET_USERS_LIST_EVENT_TYPE:
838 GetUsersListEvent getUsersListEvent = new GetUsersListEvent(auditingFields);
839 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
840 getUsersListEvent.setTimestamp1(date);
841 event = getUsersListEvent;
843 case AuditingTypesConstants.GET_CATEGORY_HIERARCHY_EVENT_TYPE:
844 GetCategoryHierarchyEvent getCategoryHierarchyEvent = new GetCategoryHierarchyEvent(auditingFields);
845 date = simpleDateFormat.parse((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_TIMESTAMP));
846 getCategoryHierarchyEvent.setTimestamp1(date);
847 event = getCategoryHierarchyEvent;