Skip to content

Commit 3570268

Browse files
committed
exclude resource types which do not support list operation or require resource model properties
1 parent be61838 commit 3570268

File tree

3 files changed

+158
-1
lines changed

3 files changed

+158
-1
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// Resource types which do not support List operation via Cloud Control API
2+
// source: https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/supported-resources.html
3+
export const NO_LIST_SUPPORT: ReadonlySet<string> = new Set([
4+
'AWS::ACMPCA::Certificate',
5+
'AWS::ACMPCA::CertificateAuthorityActivation',
6+
'AWS::ACMPCA::Permission',
7+
'AWS::ApiGateway::Account',
8+
'AWS::ApiGateway::Method',
9+
'AWS::AppStream::AppBlock',
10+
'AWS::AppStream::Application',
11+
'AWS::AppStream::ApplicationEntitlementAssociation',
12+
'AWS::AppStream::ApplicationFleetAssociation',
13+
'AWS::AppStream::Entitlement',
14+
'AWS::AppSync::DomainNameApiAssociation',
15+
'AWS::Bedrock::GuardrailVersion',
16+
'AWS::CertificateManager::Account',
17+
'AWS::CloudFormation::ModuleVersion',
18+
'AWS::CloudFront::MonitoringSubscription',
19+
'AWS::CloudTrail::ResourcePolicy',
20+
'AWS::Cognito::LogDeliveryConfiguration',
21+
'AWS::Cognito::ManagedLoginBranding',
22+
'AWS::Cognito::UserPoolDomain',
23+
'AWS::Cognito::UserPoolRiskConfigurationAttachment',
24+
'AWS::Cognito::UserPoolUICustomizationAttachment',
25+
'AWS::Cognito::UserPoolUserToGroupAttachment',
26+
'AWS::Connect::Rule',
27+
'AWS::Connect::UserHierarchyStructure',
28+
'AWS::DataZone::FormType',
29+
'AWS::EC2::GatewayRouteTableAssociation',
30+
'AWS::EC2::VPCBlockPublicAccessOptions',
31+
'AWS::ECS::PrimaryTaskSet',
32+
'AWS::ECS::TaskSet',
33+
'AWS::EMR::Step',
34+
'AWS::EventSchemas::RegistryPolicy',
35+
'AWS::Evidently::Experiment',
36+
'AWS::Evidently::Feature',
37+
'AWS::Evidently::Launch',
38+
'AWS::Evidently::Project',
39+
'AWS::IAM::GroupPolicy',
40+
'AWS::IAM::RolePolicy',
41+
'AWS::IAM::ServiceLinkedRole',
42+
'AWS::IAM::UserPolicy',
43+
'AWS::Inspector::ResourceGroup',
44+
'AWS::Kinesis::ResourcePolicy',
45+
'AWS::LakeFormation::PrincipalPermissions',
46+
'AWS::LakeFormation::TagAssociation',
47+
'AWS::MediaConnect::BridgeOutput',
48+
'AWS::MediaConnect::BridgeSource',
49+
'AWS::MediaPackageV2::ChannelPolicy',
50+
'AWS::MediaPackageV2::OriginEndpointPolicy',
51+
'AWS::MediaTailor::ChannelPolicy',
52+
'AWS::NetworkFirewall::LoggingConfiguration',
53+
'AWS::OpenSearchService::Domain',
54+
'AWS::Panorama::PackageVersion',
55+
'AWS::ResourceExplorer2::DefaultViewAssociation',
56+
'AWS::S3ObjectLambda::AccessPointPolicy',
57+
'AWS::S3Outposts::BucketPolicy',
58+
'AWS::SageMaker::Device',
59+
'AWS::SageMaker::DeviceFleet',
60+
'AWS::ServiceCatalog::CloudFormationProvisionedProduct',
61+
'AWS::SES::VdmAttributes',
62+
'AWS::SNS::TopicInlinePolicy',
63+
'AWS::SQS::QueueInlinePolicy',
64+
'AWS::VpcLattice::AuthPolicy',
65+
'AWS::VpcLattice::ResourcePolicy',
66+
'AWS::WAFv2::WebACLAssociation',
67+
'AWS::WorkSpaces::ConnectionAlias',
68+
]);
69+
70+
// Resource types which require properties to be included in order to be listed
71+
// source: https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/resource-operations-list.html#resource-operations-list-containers
72+
export const REQUIRES_RESOURCE_MODEL: ReadonlySet<string> = new Set([
73+
'AWS::ApiGateway::DocumentationVersion',
74+
'AWS::ApiGateway::Step',
75+
'AWS::CloudFormation::ResourceVersion',
76+
'AWS::CustomerProfiles::Integration',
77+
'AWS::CustomerProfiles::ObjectType',
78+
'AWS::EC2::TransitGatewayMulticastGroupMember',
79+
'AWS::EC2::TransitGatewayMulticastGroupSource',
80+
'AWS::ECS::TaskSet',
81+
'AWS::EKS::AddOn',
82+
'AWS::EKS::FargateProfile',
83+
'AWS::ElasticLoadBalancingV2::Listener',
84+
'AWS::ElasticLoadBalancingV2::ListenerRule',
85+
'AWS::Glue::Attach::SchemaVersion',
86+
'AWS::Glue::Attach::SchemaVersionMetadata',
87+
'AWS::IoTSiteWise::AccessPolicy',
88+
'AWS::IoTSiteWise::Dashboard',
89+
'AWS::IoTSiteWise::Project',
90+
'AWS::Kendra::DataSource',
91+
'AWS::Kendra::Faq',
92+
'AWS::MediaConnect::FlowEntitlement',
93+
'AWS::MediaConnect::FlowOutput',
94+
'AWS::MediaConnect::FlowSource',
95+
'AWS::MediaConnect::FlowVpcInterface',
96+
'AWS::MediaPackage::Asset',
97+
'AWS::MediaPackage::PackagingConfiguration',
98+
'AWS::NetworkFirewall::LoggingConfiguration',
99+
'AWS::QuickSight::Analysis',
100+
'AWS::QuickSight::Dashboard',
101+
'AWS::QuickSight::DataSet',
102+
'AWS::QuickSight::DataSource',
103+
'AWS::QuickSight::Template',
104+
'AWS::QuickSight::Theme',
105+
'AWS::RDS::DBProxyTargetGroup',
106+
'AWS::S3Outposts::AccessPoint',
107+
'AWS::S3Outposts::Bucket',
108+
'AWS::SSO::Assignment',
109+
'AWS::SSO::InstanceAccessControlAttributeConfiguration',
110+
'AWS::SSO::PermissionSet',
111+
'AWS::WAFv2::WebACL',
112+
]);

src/resourceState/ResourceStateManager.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { LoggerFactory } from '../telemetry/LoggerFactory';
99
import { ScopedTelemetry } from '../telemetry/ScopedTelemetry';
1010
import { Telemetry, Measure } from '../telemetry/TelemetryDecorator';
1111
import { Closeable } from '../utils/Closeable';
12+
import { NO_LIST_SUPPORT, REQUIRES_RESOURCE_MODEL } from './ListResourcesExclusionTypes';
1213
import { ListResourcesResult, RefreshResourcesResult } from './ResourceStateTypes';
1314

1415
const log = LoggerFactory.getLogger('ResourceStateManager');
@@ -156,7 +157,8 @@ export class ResourceStateManager implements SettingsConfigurable, Closeable {
156157

157158
public getResourceTypes(): string[] {
158159
const schemas = this.schemaRetriever.getDefault().schemas;
159-
return [...schemas.keys()];
160+
const allTypes = new Set(schemas.keys());
161+
return [...allTypes].filter((type) => !NO_LIST_SUPPORT.has(type) && !REQUIRES_RESOURCE_MODEL.has(type));
160162
}
161163

162164
private storeResourceState(typeName: ResourceType, id: ResourceId, state: ResourceState) {

tst/unit/resourceState/ResourceStateManager.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { GetResourceCommandOutput, ResourceNotFoundException } from '@aws-sdk/cl
22
import { DateTime } from 'luxon';
33
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
44
import { ResourceStateManager } from '../../../src/resourceState/ResourceStateManager';
5+
import { CombinedSchemas } from '../../../src/schema/CombinedSchemas';
56
import { CcapiService } from '../../../src/services/CcapiService';
67
import { createMockSchemaRetriever } from '../../utils/MockServerComponents';
78

@@ -98,4 +99,46 @@ describe('ResourceStateManager', () => {
9899
expect(result).toBeUndefined();
99100
});
100101
});
102+
103+
describe('getResourceTypes()', () => {
104+
it('should filter out resource types without list support', () => {
105+
const mockSchemas: CombinedSchemas = {
106+
schemas: new Map([
107+
['AWS::S3::Bucket', {}],
108+
['AWS::IAM::Role', {}],
109+
['AWS::IAM::RolePolicy', {}],
110+
]),
111+
} as CombinedSchemas;
112+
const managerWithSchemas = new ResourceStateManager(
113+
mockCcapiService,
114+
createMockSchemaRetriever(mockSchemas),
115+
);
116+
117+
const result = managerWithSchemas.getResourceTypes();
118+
119+
expect(result).toContain('AWS::S3::Bucket');
120+
expect(result).toContain('AWS::IAM::Role');
121+
expect(result).not.toContain('AWS::IAM::RolePolicy');
122+
});
123+
124+
it('should filter out resource types requiring resource model properties', () => {
125+
const mockSchemas: CombinedSchemas = {
126+
schemas: new Map([
127+
['AWS::S3::Bucket', {}],
128+
['AWS::EKS::Cluster', {}],
129+
['AWS::EKS::AddOn', {}],
130+
]),
131+
} as CombinedSchemas;
132+
const managerWithSchemas = new ResourceStateManager(
133+
mockCcapiService,
134+
createMockSchemaRetriever(mockSchemas),
135+
);
136+
137+
const result = managerWithSchemas.getResourceTypes();
138+
139+
expect(result).toContain('AWS::S3::Bucket');
140+
expect(result).toContain('AWS::EKS::Cluster');
141+
expect(result).not.toContain('AWS::EKS::AddOn');
142+
});
143+
});
101144
});

0 commit comments

Comments
 (0)