Skip to content

Commit 1c042ec

Browse files
authored
Merge pull request #5007 from microsoft/master
Merge back to master after release v3.50.0
2 parents 44c16e2 + d58e49d commit 1c042ec

File tree

20 files changed

+146
-43
lines changed

20 files changed

+146
-43
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ All notable changes to "Azure Toolkit for IntelliJ IDEA" will be documented in t
6868
## 3.50.0
6969

7070
### Added
71-
- Azure MySQL resource connector feature
71+
- Development workflow for Azure Database for MySQL
72+
- Connect Azure Database for MySQL Server to local project from Azure Explorer or application.properties file
73+
- Automatically inject datasource connection properties into runtime environment for local run
74+
- Publish Azure Web App with datasource connection properties in application settings
7275

7376
## 3.49.0
7477

PluginsAndFeatures/azure-toolkit-for-intellij/resources/META-INF/plugin.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@
2727
<h3>3.50.0</h3>
2828
<h4>Added</h4>
2929
<ul>
30-
<li>Add Azure MySQL resource connector</li>
30+
<li>Development workflow for Azure Database for MySQL
31+
<ul>
32+
<li>Connect Azure Database for MySQL Server to local project from Azure Explorer or application.properties file</li>
33+
<li>Automatically inject datasource connection properties into runtime environment for local run</li>
34+
<li>Publish Azure Web App with datasource connection properties in application settings</li>
35+
</ul>
36+
</li>
3137
</ul>
3238
<p>You may get the full change log <a
3339
href="https://github.com/Microsoft/azure-tools-for-java/blob/develop/CHANGELOG.md">here</a></p>

PluginsAndFeatures/azure-toolkit-for-intellij/resources/whatsnew/whatsnew.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1-
<!-- Version: 3.47.0 -->
1+
<!-- Version: 3.50.0 -->
22
# What's new in Azure Toolkit for IntelliJ
33

44
## 3.50.0
55

66
### Added
7-
- Azure MySQL resource connector
7+
<img src="https://user-images.githubusercontent.com/19339116/109937625-11666400-7d0a-11eb-9850-82a62d65f3fa.gif" width="840" height="525" />
8+
9+
- Development workflow for Azure Database for MySQL
10+
- Connect Azure Database for MySQL Server to local project from Azure Explorer or application.properties file
11+
- Automatically inject datasource connection properties into runtime environment for local run
12+
- Publish Azure Web App with datasource connection properties in application settings
813

914
## 3.49.0
1015

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/appservice/AppServiceMonitorPanel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void setWebServerLogVisible(boolean visible) {
9292
public MonitorConfig getData() {
9393
MonitorConfig config = MonitorConfig.builder().build();
9494
final ApplicationInsightsConfig insightsConfig =
95-
(rdoEnableApplicationInsights.isSelected() && titleAppServiceLog.isVisible()) ? applicationInsightsComboBox.getValue() : null;
95+
(rdoEnableApplicationInsights.isSelected() && titleApplicationInsights.isVisible()) ? applicationInsightsComboBox.getValue() : null;
9696
config.setApplicationInsightsConfig(insightsConfig);
9797
config.setEnableWebServerLogging(rdoEnableWebServerLog.isSelected() && lblWebServerLog.isVisible());
9898
config.setWebServerLogQuota(txtQuota.getValue());

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/runner/IntelliJFunctionContext.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import com.microsoft.azure.common.project.IProject;
99
import com.microsoft.azure.management.Azure;
10-
import com.microsoft.azuretools.authmanage.AuthMethodManager;
1110
import com.microsoft.azure.toolkit.intellij.function.runner.library.IFunctionContext;
11+
import com.microsoft.azuretools.authmanage.AuthMethodManager;
1212
import lombok.Data;
1313

1414
import java.util.HashMap;
@@ -37,8 +37,12 @@ public class IntelliJFunctionContext implements IFunctionContext {
3737

3838
private String deployment;
3939

40+
// todo: remove app settings and related codes
41+
@Deprecated
4042
private Map<String, String> appSettings = new HashMap<>();
4143

44+
private String appSettingsKey;
45+
4246
private String moduleName;
4347

4448
private String insightsName;

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/runner/core/FunctionUtils.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.microsoft.azuretools.azurecommons.helpers.Nullable;
3535
import com.microsoft.azuretools.utils.JsonUtils;
3636
import com.microsoft.azuretools.utils.WebAppUtils;
37+
import com.microsoft.intellij.secure.IdeaSecureStore;
3738
import com.sun.tools.sjavac.Log;
3839
import org.apache.commons.collections.MapUtils;
3940
import org.apache.commons.io.FileUtils;
@@ -75,6 +76,22 @@ public class FunctionUtils {
7576
REQUIRED_ATTRIBUTE_MAP.put(BindingEnum.HttpTrigger, Arrays.asList("authLevel"));
7677
}
7778

79+
public static void saveAppSettingsToSecurityStorage(String key, Map<String, String> appSettings) {
80+
if (StringUtils.isEmpty(key)) {
81+
return;
82+
}
83+
final String appSettingsJsonValue = JsonUtils.toJsonString(appSettings);
84+
IdeaSecureStore.getInstance().savePassword(FunctionApp.class.getName(), key, appSettingsJsonValue);
85+
}
86+
87+
public static Map<String, String> loadAppSettingsFromSecurityStorage(String key) {
88+
if (StringUtils.isEmpty(key)) {
89+
return new HashMap<>();
90+
}
91+
final String value = IdeaSecureStore.getInstance().loadPassword(FunctionApp.class.getName(), key);
92+
return StringUtils.isEmpty(value) ? new HashMap<>() : JsonUtils.fromJson(value, Map.class);
93+
}
94+
7895
public static String getFunctionJavaVersion(FunctionApp functionApp) {
7996
if (!WebAppUtils.isJavaWebApp(functionApp)) {
8097
return null;

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/runner/deploy/FunctionDeployConfiguration.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,14 @@ public String getInsightsName() {
216216
return functionDeployModel.getInsightsName();
217217
}
218218

219+
public String getAppSettingsKey() {
220+
return functionDeployModel.getAppSettingsKey();
221+
}
222+
223+
public void setAppSettingsKey(String appSettingsStorageKey) {
224+
functionDeployModel.setAppSettingsKey(appSettingsStorageKey);
225+
}
226+
219227
public void saveModel(FunctionAppComboBoxModel functionAppComboBoxModel) {
220228
if (functionAppComboBoxModel.getFunctionDeployModel() != null) {
221229
setFunctionDeployModel(functionAppComboBoxModel.getFunctionDeployModel());

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/runner/deploy/ui/FunctionDeploymentPanel.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.Arrays;
3030
import java.util.Collections;
3131
import java.util.Map;
32+
import java.util.UUID;
3233

3334
import static com.microsoft.intellij.CommonConst.EMPTY_TEXT;
3435
import static com.microsoft.intellij.CommonConst.LOADING_TEXT;
@@ -46,6 +47,7 @@ public class FunctionDeploymentPanel extends AzureSettingPanel<FunctionDeployCon
4647
private FunctionAppComboBox functionAppComboBox;
4748
private AppSettingsTable appSettingsTable;
4849
private FunctionAppComboBoxModel appSettingsFunctionApp;
50+
private String appSettingsKey = UUID.randomUUID().toString();
4951

5052

5153
public FunctionDeploymentPanel(@NotNull Project project, @NotNull FunctionDeployConfiguration functionDeployConfiguration) {
@@ -124,6 +126,10 @@ protected void resetFromConfig(@NotNull FunctionDeployConfiguration configuratio
124126
if (MapUtils.isNotEmpty(configuration.getAppSettings())) {
125127
appSettingsTable.setAppSettings(configuration.getAppSettings());
126128
}
129+
if (StringUtils.isNotEmpty(configuration.getAppSettingsKey())) {
130+
this.appSettingsKey = configuration.getAppSettingsKey();
131+
appSettingsTable.setAppSettings(FunctionUtils.loadAppSettingsFromSecurityStorage(appSettingsKey));
132+
}
127133
if (StringUtils.isAllEmpty(configuration.getFunctionId(), configuration.getAppName())) {
128134
functionAppComboBox.refreshItems();
129135
} else {
@@ -147,7 +153,10 @@ protected void resetFromConfig(@NotNull FunctionDeployConfiguration configuratio
147153
@Override
148154
protected void apply(@NotNull FunctionDeployConfiguration configuration) {
149155
configuration.saveTargetModule((Module) cbFunctionModule.getSelectedItem());
150-
configuration.setAppSettings(appSettingsTable.getAppSettings());
156+
FunctionUtils.saveAppSettingsToSecurityStorage(appSettingsKey, appSettingsTable.getAppSettings());
157+
// save app settings storage key instead of real value
158+
configuration.setAppSettings(Collections.EMPTY_MAP);
159+
configuration.setAppSettingsKey(appSettingsKey);
151160
final FunctionAppComboBoxModel functionModel = functionAppComboBox.getValue();
152161
if (functionModel != null) {
153162
configuration.saveModel(functionModel);

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/runner/library/function/CreateFunctionHandler.java

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
import org.apache.commons.lang3.StringUtils;
3131

3232
import java.io.IOException;
33+
import java.util.Collections;
3334
import java.util.Map;
34-
import java.util.function.Consumer;
3535

3636
import static com.microsoft.intellij.ui.messages.AzureBundle.message;
3737

@@ -85,9 +85,12 @@ private FunctionApp createFunctionApp() {
8585
final String action = "confirm if the web app is properly configured";
8686
throw new AzureToolkitRuntimeException(error, e, action);
8787
}
88-
bindingApplicationInsights();
8988
configureApplicationLog(withCreate);
90-
configureAppSettings(withCreate::withAppSettings, getAppSettingsWithDefaultValue());
89+
90+
final Map<String, String> appSettings = getAppSettingsWithDefaultValue();
91+
appSettings.putAll(bindingApplicationInsights());
92+
withCreate.withAppSettings(appSettings);
93+
9194
FunctionApp result = withCreate.create();
9295
Log.prompt(message("function.create.hint.functionCreated", ctx.getAppName()));
9396
return result;
@@ -108,9 +111,9 @@ private WithCreate configureApplicationLog(WithCreate withCreate) {
108111
params = {"@ctx.getAppName()"},
109112
type = AzureOperation.Type.SERVICE
110113
)
111-
private void bindingApplicationInsights() {
114+
private Map<String, String> bindingApplicationInsights() {
112115
if (StringUtils.isAllEmpty(ctx.getInsightsName(), ctx.getInstrumentationKey())) {
113-
return;
116+
return Collections.emptyMap();
114117
}
115118
String instrumentationKey = ctx.getInstrumentationKey();
116119
if (StringUtils.isEmpty(instrumentationKey)) {
@@ -123,13 +126,7 @@ private void bindingApplicationInsights() {
123126
Log.prompt(message("function.create.error.createApplicationInsightsFailed", ctx.getAppName()));
124127
}
125128
}
126-
ctx.getAppSettings().put(APP_INSIGHTS_INSTRUMENTATION_KEY, instrumentationKey);
127-
}
128-
129-
private void configureAppSettings(final Consumer<Map> withAppSettings, final Map appSettings) {
130-
if (appSettings != null && !appSettings.isEmpty()) {
131-
withAppSettings.accept(appSettings);
132-
}
129+
return Collections.singletonMap(APP_INSIGHTS_INSTRUMENTATION_KEY, instrumentationKey);
133130
}
134131

135132
// endregion
@@ -215,11 +212,12 @@ private FunctionExtensionVersion getFunctionExtensionVersion() throws AzureExecu
215212

216213
// region get App Settings
217214
private Map getAppSettingsWithDefaultValue() {
218-
final Map settings = ctx.getAppSettings();
215+
final Map settings =
216+
com.microsoft.azure.toolkit.intellij.function.runner.core.FunctionUtils.loadAppSettingsFromSecurityStorage(ctx.getAppSettingsKey());
219217
overrideDefaultAppSetting(settings, FUNCTIONS_WORKER_RUNTIME_NAME, message("function.hint.setFunctionWorker"),
220-
FUNCTIONS_WORKER_RUNTIME_VALUE, message("function.hint.changeFunctionWorker"));
218+
FUNCTIONS_WORKER_RUNTIME_VALUE, message("function.hint.changeFunctionWorker"));
221219
setDefaultAppSetting(settings, FUNCTIONS_EXTENSION_VERSION_NAME, message("function.hint.setFunctionVersion"),
222-
FUNCTIONS_EXTENSION_VERSION_VALUE);
220+
FUNCTIONS_EXTENSION_VERSION_VALUE);
223221
return settings;
224222
}
225223
}

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/runner/library/function/DeployFunctionHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ private FunctionApp getFunctionApp() {
194194

195195
// region get App Settings
196196
private Map getAppSettingsWithDefaultValue() {
197-
final Map settings = model.getAppSettings();
197+
final Map settings =
198+
com.microsoft.azure.toolkit.intellij.function.runner.core.FunctionUtils.loadAppSettingsFromSecurityStorage(model.getAppSettingsKey());
198199
overrideDefaultAppSetting(settings, FUNCTIONS_WORKER_RUNTIME_NAME, message("function.hint.setFunctionWorker"),
199200
FUNCTIONS_WORKER_RUNTIME_VALUE, message("function.hint.changeFunctionWorker"));
200201
setDefaultAppSetting(settings, FUNCTIONS_EXTENSION_VERSION_NAME, message("function.hint.setFunctionVersion"),

0 commit comments

Comments
 (0)