@@ -15,6 +15,7 @@ import software.aws.toolkits.core.utils.getLogger
1515import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1616import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
1717import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
18+ import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
1819import software.aws.toolkits.jetbrains.utils.isQExpired
1920
2021@Service
@@ -103,37 +104,49 @@ class CodeWhispererFeatureConfigService {
103104 }
104105 }
105106
106- fun validateCustomizationOverride (project : Project , customization : FeatureContext ) {
107- val customizationArnOverride = customization.value.stringValue()
108- val connection = connection(project) ? : return
109- if (customizationArnOverride != null ) {
110- // Double check if server-side wrongly returns a customizationArn to BID users
111- calculateIfBIDConnection(project) {
112- featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME )
113- }
114- val availableCustomizations =
115- calculateIfIamIdentityCenterConnection(project) {
116- try {
107+ fun validateCustomizationOverride (project : Project , featOverrideContext : FeatureContext ): CodeWhispererCustomization ? {
108+ val customizationArnOverride = featOverrideContext.value.stringValue()
109+ connection(project) ? : return null
110+ customizationArnOverride ? : return null
111+
112+ // Double check if server-side wrongly returns a customizationArn to BID users
113+ calculateIfBIDConnection(project) {
114+ featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME )
115+ }
116+ val availableCustomizations =
117+ calculateIfIamIdentityCenterConnection(project) {
118+ try {
119+ val profiles = QRegionProfileManager .getInstance().listRegionProfiles(project)
120+ ? : error(" Attempted to fetch profiles while there does not exist" )
121+
122+ val customs = profiles.flatMap { profile ->
117123 QRegionProfileManager .getInstance().getQClient<CodeWhispererRuntimeClient >(project)
118- .listAvailableCustomizationsPaginator {}
119- .flatMap { resp ->
120- resp.customizations().map {
121- it.arn()
122- }
124+ .listAvailableCustomizations { it.profileArn(profile.arn) }.customizations().map { originalCustom ->
125+ CodeWhispererCustomization (
126+ arn = originalCustom.arn(),
127+ name = originalCustom.name(),
128+ description = originalCustom.description(),
129+ profile = profile
130+ )
123131 }
124- } catch (e: Exception ) {
125- LOG .debug(e) { " Failed to list available customizations" }
126- null
127132 }
128- }
129133
130- // If customizationArn from A/B is not available in listAvailableCustomizations response, don't use this value
131- if (availableCustomizations?.contains(customizationArnOverride) == false ) {
132- LOG .debug {
133- " Customization arn $customizationArnOverride not available in listAvailableCustomizations, not using "
134+ customs
135+ } catch (e : Exception ) {
136+ LOG .debug(e) { " encountered error while validating customization override " }
137+ null
134138 }
135- featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME )
136139 }
140+
141+ val isValidOverride = availableCustomizations != null && availableCustomizations.any { it.arn == customizationArnOverride }
142+
143+ // If customizationArn from A/B is not available in listAvailableCustomizations response, don't use this value
144+ return if (! isValidOverride) {
145+ LOG .debug { " Customization arn $customizationArnOverride not available in listAvailableCustomizations, not using" }
146+ featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME )
147+ null
148+ } else {
149+ availableCustomizations?.find { it.arn == customizationArnOverride }
137150 }
138151 }
139152
0 commit comments