This repository was archived by the owner on Dec 9, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathcodecommit_events.js
167 lines (145 loc) · 7.55 KB
/
codecommit_events.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
'use strict';
const LOGGER = new (require('./lib/logger'))();
/**
* Transform AWS CloudWatch events from AWS CodeCommit
*/
let transformCodeCommitEvents = (data, recordNumber) => {
LOGGER.log('INFO', 'Start transforming CodeCommit CW Event ' + recordNumber.toString());
let detailData = {};
let requestParametersData = {};
let transformedRecord = {};
let transformedDetail = {};
//Process event data
for (let key in data) {
//Keep all key values that are not under detail tag as they are common in all cloudwatch events
if (key !== 'detail') {
transformedRecord = getCWEventCommonData(key, data, transformedRecord);
}
//process key values under detail tag that are specific only for this event
else {
detailData = data['detail'];
transformedDetail = getEventName(detailData, transformedDetail);
transformedDetail = getCommandLineGitCommitData(detailData, transformedDetail);
const consoleGitCommitData = getCodeCommitConsoleGitCommitData(detailData, transformedDetail, requestParametersData);
// If empty json object is found, stop further processing but return empty json object to drop this record
if (Object.keys(consoleGitCommitData[0]).length === 0) return {};
requestParametersData = consoleGitCommitData[0];
transformedDetail = consoleGitCommitData[1];
transformedDetail = getCodeCommitConsoleCommitID(detailData, transformedDetail);
transformedDetail = getCommandLineGitCommitAdditionalData(detailData, transformedDetail, requestParametersData);
// if no commit Id (possibly due to codecommit error or other reasons), return empty json object to drop this record
if (!transformedDetail.hasOwnProperty('commitId')) {
return {};
}
} //end else
} //end for loop
transformedRecord['detail'] = transformedDetail;
LOGGER.log('DEBUG', 'Transformed record: ' + JSON.stringify(transformedRecord, null, 2));
LOGGER.log('INFO', 'End transforming CodeCommit CW Event ' + recordNumber.toString());
return transformedRecord;
};
/**
* Keep all key values that are not under detail tag as they are common in all cloudwatch events
* @param {string} key - key in the CodeCommit CloudWatch raw event
* @param {json} data - CodeCommit CloudWatch raw event
* @param {json} transformedRecord - Transformed CodeCommit record
*/
const getCWEventCommonData = (key, data, transformedRecord) => {
if (!transformedRecord.hasOwnProperty(key)) {
if (key !== 'detail-type') transformedRecord[key] = data[key];
//rename key detail-type to detail_type to support athena query
else transformedRecord['detail_type'] = data[key];
}
return transformedRecord;
};
/**
* Get eventName from CodeCommit CloudWatch raw event data under detail key
* @param {json} detailData - CodeCommit CloudWatch raw event data under detail key
* @param {json} transformedDetail - Transformed CodeCommit record under detail key
*/
const getEventName = (detailData, transformedDetail) => {
if (detailData.hasOwnProperty('eventName')) transformedDetail['eventName'] = detailData['eventName'];
return transformedDetail;
};
/**
* Process commits made from command line git commands
* @param {json} detailData - CodeCommit CloudWatch raw event data under detail key
* @param {json} transformedDetail - Transformed CodeCommit record under detail key
*/
const getCommandLineGitCommitData = (detailData, transformedDetail) => {
if (!detailData['userIdentity']) return transformedDetail;
let userIdentity = detailData['userIdentity'];
if (userIdentity['userName'] != null) transformedDetail['authorName'] = userIdentity['userName'];
//Fix missing userName in codecommit event when pushes are made by assumed role credentials
else if (userIdentity['sessionContext']['sessionIssuer']['userName'] != null)
transformedDetail['authorName'] = userIdentity['sessionContext']['sessionIssuer']['userName'];
else if (userIdentity['principalId'] != null)
transformedDetail['authorName'] = userIdentity['principalId'].split(':')[1];
return transformedDetail;
};
/**
* Process commits made from AWS CodeCommit console
* @param {json} detailData - CodeCommit CloudWatch raw event data under detail key
* @param {json} transformedDetail - Transformed CodeCommit record under detail key
* @param {json} requestParametersData - data under requestParameters key
*/
const getCodeCommitConsoleGitCommitData = (detailData, transformedDetail, requestParametersData) => {
if (detailData.hasOwnProperty('requestParameters') && detailData['requestParameters'] != null) {
requestParametersData = detailData['requestParameters'];
if (requestParametersData.hasOwnProperty('repositoryName'))
transformedDetail['repositoryName'] = requestParametersData['repositoryName'];
if (requestParametersData.hasOwnProperty('branchName'))
transformedDetail['branchName'] = requestParametersData['branchName'];
if (requestParametersData.hasOwnProperty('name'))
transformedDetail['authorName'] = requestParametersData['name'];
if (requestParametersData.hasOwnProperty('commitId'))
transformedDetail['commitId'] = requestParametersData['commitId'];
return [requestParametersData, transformedDetail]
}
// If requestParameters is not found in source data, return empty json object to drop this record
else {
return [{},{}];
}
}
/**
* Get commit id for git commit made from AWS CodeCommit console
* @param {json} detailData - CodeCommit CloudWatch raw event data under detail key
* @param {json} transformedDetail - Transformed CodeCommit record under detail key
* @param {json} requestParametersData - data under requestParameters key
*/
const getCodeCommitConsoleCommitID = (detailData, transformedDetail) => {
//process commits made from aws codecommit console
let responseElementsData = {}
if (detailData.hasOwnProperty('responseElements') && detailData['responseElements'] != null) {
responseElementsData = detailData['responseElements'];
if (!transformedDetail.hasOwnProperty('commitId') && responseElementsData.hasOwnProperty('commitId'))
transformedDetail['commitId'] = responseElementsData['commitId'];
}
return transformedDetail;
};
/**
* Extract additional data from commits made from command line git commands
* @param {json} detailData - CodeCommit CloudWatch raw event data under detail key
* @param {json} transformedDetail - Transformed CodeCommit record under detail key
* @param {json} requestParametersData - data under requestParameters key
*/
const getCommandLineGitCommitAdditionalData = (detailData, transformedDetail, requestParametersData) => {
if (Object.keys(requestParametersData).length > 0 && requestParametersData.hasOwnProperty('references')) {
let references = requestParametersData['references'][0];
if (references.hasOwnProperty('commit') && !transformedDetail.hasOwnProperty('commitId'))
transformedDetail['commitId'] = references['commit'];
if (references.hasOwnProperty('ref') && !transformedDetail.hasOwnProperty('branchName'))
transformedDetail['branchName'] = references['ref'].split('/').pop();
}
if (detailData.hasOwnProperty('additionalEventData')) {
let additionalEventData = detailData['additionalEventData'];
if (additionalEventData.hasOwnProperty('repositoryName') && !transformedDetail.hasOwnProperty('repositoryName'))
transformedDetail['repositoryName'] = additionalEventData['repositoryName'];
}
return transformedDetail;
};
module.exports = {
transformCodeCommitEvents: transformCodeCommitEvents
};