@aws-cdk/cloudformation-diff
Version:
Utilities to diff CDK stacks against CloudFormation templates
96 lines • 12.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SecurityGroupRule = void 0;
/**
* A single security group rule, either egress or ingress
*/
class SecurityGroupRule {
constructor(ruleObject, groupRef) {
this.ipProtocol = ruleObject.IpProtocol?.toString() || '*unknown*';
this.fromPort = ruleObject.FromPort;
this.toPort = ruleObject.ToPort;
this.groupId = ruleObject.GroupId || groupRef || '*unknown*'; // In case of an inline rule
this.peer =
findFirst(ruleObject, ['CidrIp', 'CidrIpv6'], (ip) => ({ kind: 'cidr-ip', ip }))
||
findFirst(ruleObject, ['DestinationSecurityGroupId', 'SourceSecurityGroupId'], (securityGroupId) => ({ kind: 'security-group', securityGroupId }))
||
findFirst(ruleObject, ['DestinationPrefixListId', 'SourcePrefixListId'], (prefixListId) => ({ kind: 'prefix-list', prefixListId }));
}
equal(other) {
return this.ipProtocol === other.ipProtocol
&& this.fromPort === other.fromPort
&& this.toPort === other.toPort
&& peerEqual(this.peer, other.peer);
}
describeProtocol() {
if (this.ipProtocol === '-1') {
return 'Everything';
}
const ipProtocol = this.ipProtocol.toUpperCase();
if (this.fromPort === -1) {
return `All ${ipProtocol}`;
}
if (this.fromPort === this.toPort) {
return `${ipProtocol} ${this.fromPort}`;
}
return `${ipProtocol} ${this.fromPort}-${this.toPort}`;
}
describePeer() {
if (this.peer) {
switch (this.peer.kind) {
case 'cidr-ip':
if (this.peer.ip === '0.0.0.0/0') {
return 'Everyone (IPv4)';
}
if (this.peer.ip === '::/0') {
return 'Everyone (IPv6)';
}
return `${this.peer.ip}`;
case 'prefix-list': return `${this.peer.prefixListId}`;
case 'security-group': return `${this.peer.securityGroupId}`;
}
}
return '?';
}
toJson() {
return {
groupId: this.groupId,
ipProtocol: this.ipProtocol,
fromPort: this.fromPort,
toPort: this.toPort,
peer: this.peer,
};
}
}
exports.SecurityGroupRule = SecurityGroupRule;
function peerEqual(a, b) {
if ((a === undefined) !== (b === undefined)) {
return false;
}
if (a === undefined) {
return true;
}
if (a.kind !== b.kind) {
return false;
}
switch (a.kind) {
case 'cidr-ip': return a.ip === b.ip;
case 'security-group': return a.securityGroupId === b.securityGroupId;
case 'prefix-list': return a.prefixListId === b.prefixListId;
}
}
function findFirst(obj, keys, fn) {
for (const key of keys) {
try {
if (key in obj) {
return fn(obj[key]);
}
}
catch (e) {
debugger;
}
}
return undefined;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktZ3JvdXAtcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5LWdyb3VwLXJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQTBCNUIsWUFBWSxVQUFlLEVBQUUsUUFBaUI7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsNEJBQTRCO1FBRTFGLElBQUksQ0FBQyxJQUFJO1lBQ0wsU0FBUyxDQUFDLFVBQVUsRUFDbEIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQ3RCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQWlCLENBQUEsQ0FBQzs7b0JBRWxELFNBQVMsQ0FBQyxVQUFVLEVBQ2xCLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLENBQUMsRUFDdkQsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUF3QixDQUFBLENBQUM7O29CQUUxRixTQUFTLENBQUMsVUFBVSxFQUNsQixDQUFDLHlCQUF5QixFQUFFLG9CQUFvQixDQUFDLEVBQ2pELENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQXFCLENBQUEsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBd0I7UUFDbkMs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LENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFlLEtBQU0sQ0FBYyxDQUFDLGVBQWUsQ0FBQztRQUNwRixLQUFLLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksS0FBTSxDQUFjLENBQUMsWUFBWSxDQUFDO0lBQzdFLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUksR0FBUSxFQUFFLElBQWMsRUFBRSxFQUFvQjtJQUNsRSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQztZQUNILElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNmLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLFFBQVEsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzaW5nbGUgc2VjdXJpdHkgZ3JvdXAgcnVsZSwgZWl0aGVyIGVncmVzcyBvciBpbmdyZXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWN1cml0eUdyb3VwUnVsZSB7XG4gIC8qKlxuICAgKiBHcm91cCBJRCBvZiB0aGUgZ3JvdXAgdGhpcyBydWxlIGFwcGxpZXMgdG9cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBncm91cElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElQIHByb3RvY29sIHRoaXMgcnVsZSBhcHBsaWVzIHRvXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXBQcm90b2NvbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdGFydCBvZiBwb3J0IHJhbmdlIHRoaXMgcnVsZSBhcHBsaWVzIHRvLCBvciBJQ01QIHR5cGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmcm9tUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogRW5kIG9mIHBvcnQgcmFuZ2UgdGhpcyBydWxlIGFwcGxpZXMgdG8sIG9yIElDTVAgY29kZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogUGVlciBvZiB0aGlzIHJ1bGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZWVyPzogUnVsZVBlZXI7XG5cbiAgY29uc3RydWN0b3IocnVsZU9iamVjdDogYW55LCBncm91cFJlZj86IHN0cmluZykge1xuICAgIHRoaXMuaXBQcm90b2NvbCA9IHJ1bGVPYmplY3QuSXBQcm90b2NvbD8udG9TdHJpbmcoKSB8fCAnKnVua25vd24qJztcbiAgICB0aGlzLmZyb21Qb3J0ID0gcnVsZU9iamVjdC5Gcm9tUG9ydDtcbiAgICB0aGlzLnRvUG9ydCA9IHJ1bGVPYmplY3QuVG9Qb3J0O1xuICAgIHRoaXMuZ3JvdXBJZCA9IHJ1bGVPYmplY3QuR3JvdXBJZCB8fCBncm91cFJlZiB8fCAnKnVua25vd24qJzsgLy8gSW4gY2FzZSBvZiBhbiBpbmxpbmUgcnVsZVxuXG4gICAgdGhpcy5wZWVyID1cbiAgICAgICAgZmluZEZpcnN0KHJ1bGVPYmplY3QsXG4gICAgICAgICAgWydDaWRySXAnLCAnQ2lkcklwdjYnXSxcbiAgICAgICAgICAoaXApID0+ICh7IGtpbmQ6ICdjaWRyLWlwJywgaXAgfSBhcyBDaWRySXBQZWVyKSlcbiAgICAgICAgfHxcbiAgICAgICAgZmluZEZpcnN0KHJ1bGVPYmplY3QsXG4gICAgICAgICAgWydEZXN0aW5hdGlvblNlY3VyaXR5R3JvdXBJZCcsICdTb3VyY2VTZWN1cml0eUdyb3VwSWQnXSxcbiAgICAgICAgICAoc2VjdXJpdHlHcm91cElkKSA9PiAoeyBraW5kOiAnc2VjdXJpdHktZ3JvdXAnLCBzZWN1cml0eUdyb3VwSWQgfSBhcyBTZWN1cml0eUdyb3VwUGVlcikpXG4gICAgICAgIHx8XG4gICAgICAgIGZpbmRGaXJzdChydWxlT2JqZWN0LFxuICAgICAgICAgIFsnRGVzdGluYXRpb25QcmVmaXhMaXN0SWQnLCAnU291cmNlUHJlZml4TGlzdElkJ10sXG4gICAgICAgICAgKHByZWZpeExpc3RJZCkgPT4gKHsga2luZDogJ3ByZWZpeC1saXN0JywgcHJlZml4TGlzdElkIH0gYXMgUHJlZml4TGlzdFBlZXIpKTtcbiAgfVxuXG4gIHB1YmxpYyBlcXVhbChvdGhlcjogU2VjdXJpdHlHcm91cFJ1bGUpIHtcbiAgICByZXR1cm4gdGhpcy5pcFByb3RvY29sID09PSBvdGhlci5pcFByb3RvY29sXG4gICAgICAgICYmIHRoaXMuZnJvbVBvcnQgPT09IG90aGVyLmZyb21Qb3J0XG4gICAgICAgICYmIHRoaXMudG9Qb3J0ID09PSBvdGhlci50b1BvcnRcbiAgICAgICAgJiYgcGVlckVxdWFsKHRoaXMucGVlciwgb3RoZXIucGVlcik7XG4gIH1cblxuICBwdWJsaWMgZGVzY3JpYmVQcm90b2NvbCgpIHtcbiAgICBpZiAodGhpcy5pcFByb3RvY29sID09PSAnLTEnKSB7XG4gICAgICByZXR1cm4gJ0V2ZXJ5dGhpbmcnO1xuICAgIH1cblxuICAgIGNvbnN0IGlwUHJvdG9jb2wgPSB0aGlzLmlwUHJvdG9jb2wudG9VcHBlckNhc2UoKTtcblxuICAgIGlmICh0aGlzLmZyb21Qb3J0ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGBBbGwgJHtpcFByb3RvY29sfWA7XG4gICAgfVxuICAgIGlmICh0aGlzLmZyb21Qb3J0ID09PSB0aGlzLnRvUG9ydCkge1xuICAgICAgcmV0dXJuIGAke2lwUHJvdG9jb2x9ICR7dGhpcy5mcm9tUG9ydH1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7aXBQcm90b2NvbH0gJHt0aGlzLmZyb21Qb3J0fS0ke3RoaXMudG9Qb3J0fWA7XG4gIH1cblxuICBwdWJsaWMgZGVzY3JpYmVQZWVyKCkge1xuICAgIGlmICh0aGlzLnBlZXIpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wZWVyLmtpbmQpIHtcbiAgICAgICAgY2FzZSAnY2lkci1pcCc6XG4gICAgICAgICAgaWYgKHRoaXMucGVlci5pcCA9PT0gJzAuMC4wLjAvMCcpIHtcbiAgICAgICAgICAgIHJldHVybiAnRXZlcnlvbmUgKElQdjQpJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMucGVlci5pcCA9PT0gJzo6LzAnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0V2ZXJ5b25lIChJUHY2KSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBgJHt0aGlzLnBlZXIuaXB9YDtcbiAgICAgICAgY2FzZSAncHJlZml4LWxpc3QnOiByZXR1cm4gYCR7dGhpcy5wZWVyLnByZWZpeExpc3RJZH1gO1xuICAgICAgICBjYXNlICdzZWN1cml0eS1ncm91cCc6IHJldHVybiBgJHt0aGlzLnBlZXIuc2VjdXJpdHlHcm91cElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICc/JztcbiAgfVxuXG4gIHB1YmxpYyB0b0pzb24oKTogUnVsZUpzb24ge1xuICAgIHJldHVybiB7XG4gICAgICBncm91cElkOiB0aGlzLmdyb3VwSWQsXG4gICAgICBpcFByb3RvY29sOiB0aGlzLmlwUHJvdG9jb2wsXG4gICAgICBmcm9tUG9ydDogdGhpcy5mcm9tUG9ydCxcbiAgICAgIHRvUG9ydDogdGhpcy50b1BvcnQsXG4gICAgICBwZWVyOiB0aGlzLnBlZXIsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENpZHJJcFBlZXIge1xuICBraW5kOiAnY2lkci1pcCc7XG4gIGlwOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlHcm91cFBlZXIge1xuICBraW5kOiAnc2VjdXJpdHktZ3JvdXAnO1xuICBzZWN1cml0eUdyb3VwSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVmaXhMaXN0UGVlciB7XG4gIGtpbmQ6ICdwcmVmaXgtbGlzdCc7XG4gIHByZWZpeExpc3RJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSdWxlUGVlciA9IENpZHJJcFBlZXIgfCBTZWN1cml0eUdyb3VwUGVlciB8IFByZWZpeExpc3RQZWVyO1xuXG5mdW5jdGlvbiBwZWVyRXF1YWwoYT86IFJ1bGVQZWVyLCBiPzogUnVsZVBlZXIpIHtcbiAgaWYgKChhID09PSB1bmRlZmluZWQpICE9PSAoYiA9PT0gdW5kZWZpbmVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYS5raW5kICE9PSBiIS5raW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN3aXRjaCAoYS5raW5kKSB7XG4gICAgY2FzZSAnY2lkci1pcCc6IHJldHVybiBhLmlwID09PSAoYiBhcyB0eXBlb2YgYSkuaXA7XG4gICAgY2FzZSAnc2VjdXJpdHktZ3JvdXAnOiByZXR1cm4gYS5zZWN1cml0eUdyb3VwSWQgPT09IChiIGFzIHR5cGVvZiBhKS5zZWN1cml0eUdyb3VwSWQ7XG4gICAgY2FzZSAncHJlZml4LWxpc3QnOiByZXR1cm4gYS5wcmVmaXhMaXN0SWQgPT09IChiIGFzIHR5cGVvZiBhKS5wcmVmaXhMaXN0SWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEZpcnN0PFQ+KG9iajogYW55LCBrZXlzOiBzdHJpbmdbXSwgZm46ICh4OiBzdHJpbmcpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICByZXR1cm4gZm4ob2JqW2tleV0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnZ2VyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVKc29uIHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBpcFByb3RvY29sOiBzdHJpbmc7XG4gIGZyb21Qb3J0PzogbnVtYmVyO1xuICB0b1BvcnQ/OiBudW1iZXI7XG4gIHBlZXI/OiBSdWxlUGVlcjtcbn1cbiJdfQ==